Files
pg/cmd/pgcli/share/share.go
2024-11-09 10:36:42 +08:00

93 lines
2.3 KiB
Go

package share
import (
"context"
"errors"
"flag"
"fmt"
"log/slog"
"os"
"os/signal"
"syscall"
"time"
"github.com/schollz/progressbar/v3"
"github.com/sigcn/pg/fileshare"
)
func Run() error {
flagSet := flag.NewFlagSet("share", flag.ExitOnError)
flagSet.Usage = func() {
fmt.Printf("Usage: %s [flags] [files...]\n\n", flagSet.Name())
fmt.Printf("Flags:\n")
flagSet.PrintDefaults()
}
fileManager := fileshare.FileManager{ListenUDPPort: 28878, ProgressBar: createBar}
flagSet.StringVar(&fileManager.Server, "s", "", "peermap server")
flagSet.StringVar(&fileManager.Network, "pubnet", "public", "peermap public network")
flagSet.StringVar(&fileManager.PrivateKey, "key", "", "curve25519 private key in base58 format (default generate a new one)")
var logLevel int
flagSet.IntVar(&logLevel, "loglevel", 0, "log level")
flagSet.Parse(flag.Args()[1:])
slog.SetLogLoggerLevel(slog.Level(logLevel))
if len(fileManager.Server) == 0 {
fileManager.Server = os.Getenv("PG_SERVER")
if len(fileManager.Server) == 0 {
return errors.New("unknown peermap server")
}
}
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer cancel()
for _, file := range flagSet.Args() {
if err := fileManager.Add(file); err != nil {
slog.Warn("AddFile", "path", file, "err", err)
}
}
listener, err := fileManager.ListenNetwork()
if err != nil {
return err
}
sharedURLs, err := fileManager.SharedURLs()
if err != nil {
return err
}
for _, url := range sharedURLs {
fmt.Println("ShareURL:", url)
}
return fileManager.Serve(ctx, listener)
}
func createBar(total int64, desc string) fileshare.ProgressBar {
return progressbar.NewOptions64(
total,
progressbar.OptionSetDescription(desc),
progressbar.OptionSetWriter(os.Stderr),
progressbar.OptionShowBytes(true),
progressbar.OptionSetWidth(10),
progressbar.OptionThrottle(200*time.Millisecond),
progressbar.OptionShowCount(),
progressbar.OptionShowElapsedTimeOnFinish(),
progressbar.OptionOnCompletion(func() {
fmt.Fprint(os.Stderr, "\n")
}),
progressbar.OptionSetTheme(progressbar.Theme{
Saucer: "=",
SaucerHead: ">",
SaucerPadding: " ",
BarStart: "[",
BarEnd: "]",
}),
progressbar.OptionSpinnerType(14),
progressbar.OptionFullWidth(),
progressbar.OptionSetRenderBlankState(true),
)
}