diff --git a/application/config.go b/application/config.go index c469177..cab25d1 100644 --- a/application/config.go +++ b/application/config.go @@ -14,7 +14,7 @@ const ( ModeMove Mode = "move" ) -var supportedModes = []Mode{ModeHardlink, ModeSymlink, ModeMove, ModeCopy} +var SupportedModes = []Mode{ModeHardlink, ModeSymlink, ModeMove, ModeCopy} type Config struct { SourceDir string @@ -36,8 +36,8 @@ func (c *Config) Validate() error { return fmt.Errorf("target dir is required") } - if !slices.Contains(supportedModes, c.Mode) { - return fmt.Errorf("invalid mode %s, supported modes: %s", c.Mode, supportedModes) + if !slices.Contains(SupportedModes, c.Mode) { + return fmt.Errorf("invalid mode %s, supported modes: %s", c.Mode, SupportedModes) } if c.SkipFullSync && !c.Watch { diff --git a/init/systemd/photocatalog.service b/init/systemd/photocatalog.service index d69fa63..038eaca 100644 --- a/init/systemd/photocatalog.service +++ b/init/systemd/photocatalog.service @@ -7,5 +7,5 @@ WantedBy=default.target [Service] Type=simple EnvironmentFile=/home/%u/.config/photocatalog -ExecStart=photocatalog -mode $MODE -target $TARGET -monitor $MONITOR -update_mtime $UPDATECTIME -ExecStartPre=photocatalog -mode $MODE -target $TARGET ${MONITOR} +ExecStart=photocatalog -mode $MODE -target $TARGET -watch -source $MONITOR -skip-full-sync +ExecStartPre=photocatalog -mode $MODE -target $TARGET -source ${MONITOR} diff --git a/main.go b/main.go index 5521530..3d6e3da 100644 --- a/main.go +++ b/main.go @@ -3,8 +3,10 @@ package main import ( "context" "flag" + "fmt" "log" "os/signal" + "slices" "strconv" "sync" "syscall" @@ -39,36 +41,48 @@ func loadCfg() application.Config { flag.StringVar(&cfg.TargetDir, "target", "", "Target directory") flag.BoolVar(&cfg.Overwrite, "overwrite", false, "Overwrite existing files") flag.BoolVar(&cfg.Watch, "watch", false, "Watch for changes in the source directory") + flag.BoolVar(&cfg.Watch, "monitor", false, "Watch for changes in the source directory") // Legacy option flag.BoolVar(&cfg.SkipFullSync, "skip-full-sync", false, "Skip full sync at startup") - var ( - dirMode string - fileMode string - mode string - ) + flag.Func("dir-mode", "Mode bits for directories can be created while syncing", func(s string) error { + var err error - flag.StringVar(&dirMode, "dir-mode", "0777", "Mode bits for directories can be created while syncing") - flag.StringVar(&fileMode, "file-mode", "0644", "Mode bits for files created while syncing (not applicable for hardlink mode)") - flag.StringVar(&mode, "mode", "hardlink", "Organizing mode") + cfg.DirMode, err = strconv.ParseUint(s, 8, 32) + if err != nil { + return err + } + + return nil + }) + + flag.Func("file-mode", "Mode bits for files created while syncing (not applicable for hardlink mode)", func(s string) error { + var err error + + cfg.FileMode, err = strconv.ParseUint(s, 8, 32) + if err != nil { + return err + } + + return nil + }) + + flag.Func("mode", "Organizing mode", func(s string) error { + cfg.Mode = application.Mode(s) + + if !slices.Contains(application.SupportedModes, cfg.Mode) { + return fmt.Errorf("invalid mode, supported modes: %s", application.SupportedModes) + } + + return nil + }) flag.Parse() - cfg.Mode = application.Mode(mode) + // Legacy fallback + if cfg.SourceDir == "" { + log.Println("Source directory not specified. May be using old systemd unit file.") - var err error - - cfg.DirMode, err = strconv.ParseUint(dirMode, 8, 32) - if err != nil { - log.Println("Parse -dir-mode failed:", err) - - cfg.DirMode = 0o777 - } - - cfg.FileMode, err = strconv.ParseUint(fileMode, 8, 32) - if err != nil { - log.Println("Parse -file-mode failed:", err) - - cfg.DirMode = 0o644 + cfg.SourceDir = flag.Arg(0) } return cfg