diff --git a/worker/config.go b/worker/config.go index a2fe1bd..4c5e0bb 100644 --- a/worker/config.go +++ b/worker/config.go @@ -48,18 +48,24 @@ func (p *ProviderEnum) UnmarshalText(text []byte) error { type Config struct { Global globalConfig `toml:"global"` + Manager managerConfig `toml:"manager"` Mirrors []mirrorConfig `toml:"mirrors"` } type globalConfig struct { Name string `toml:"name"` - Token string `toml:"token"` LogDir string `toml:"log_dir"` MirrorDir string `toml:"mirror_dir"` Concurrent int `toml:"concurrent"` Interval int `toml:"interval"` } +type managerConfig struct { + APIBase string `toml:"api_base"` + CACert string `toml:"ca_cert"` + Token string `toml:"token"` +} + type mirrorConfig struct { Name string `toml:"name"` Provider ProviderEnum `toml:"provider"` diff --git a/worker/config_test.go b/worker/config_test.go index bcf43b9..c5ac4f3 100644 --- a/worker/config_test.go +++ b/worker/config_test.go @@ -12,12 +12,15 @@ func TestConfig(t *testing.T) { var cfgBlob = ` [global] name = "test_worker" -token = "some_token" -log_dir = "/var/log/tunasync" +log_dir = "/var/log/tunasync/{{.Name}}" mirror_dir = "/data/mirrors" concurrent = 10 interval = 240 +[manager] +api_base = "https://127.0.0.1:5000" +token = "some_token" + [[mirrors]] name = "AOSP" provider = "command" @@ -64,6 +67,8 @@ exclude_file = "/etc/tunasync.d/fedora-exclude.txt" So(cfg.Global.Interval, ShouldEqual, 240) So(cfg.Global.MirrorDir, ShouldEqual, "/data/mirrors") + So(cfg.Manager.APIBase, ShouldEqual, "https://127.0.0.1:5000") + m := cfg.Mirrors[0] So(m.Name, ShouldEqual, "AOSP") So(m.MirrorDir, ShouldEqual, "/data/git/AOSP") diff --git a/worker/main.go b/worker/main.go index b1d1453..df5ad9e 100644 --- a/worker/main.go +++ b/worker/main.go @@ -1,9 +1,82 @@ package worker -import "time" +import ( + "bytes" + "errors" + "html/template" + "path/filepath" + "time" +) // toplevel module for workers +func initProviders(c *Config) []mirrorProvider { + + formatLogDir := func(logDir string, m mirrorConfig) string { + tmpl, err := template.New("logDirTmpl-" + m.Name).Parse(logDir) + if err != nil { + panic(err) + } + var formatedLogDir bytes.Buffer + tmpl.Execute(&formatedLogDir, m) + return formatedLogDir.String() + } + + providers := []mirrorProvider{} + + for _, mirror := range c.Mirrors { + logDir := mirror.LogDir + mirrorDir := mirror.MirrorDir + if logDir == "" { + logDir = c.Global.LogDir + } + if mirrorDir == "" { + mirrorDir = c.Global.MirrorDir + } + logDir = formatLogDir(logDir, mirror) + switch mirror.Provider { + case ProvCommand: + pc := cmdConfig{ + name: mirror.Name, + upstreamURL: mirror.Upstream, + command: mirror.Command, + workingDir: filepath.Join(mirrorDir, mirror.Name), + logDir: logDir, + logFile: filepath.Join(logDir, "latest.log"), + interval: time.Duration(mirror.Interval) * time.Minute, + env: mirror.Env, + } + p, err := newCmdProvider(pc) + if err != nil { + panic(err) + } + providers = append(providers, p) + case ProvRsync: + rc := rsyncConfig{ + name: mirror.Name, + upstreamURL: mirror.Upstream, + password: mirror.Password, + excludeFile: mirror.ExcludeFile, + workingDir: filepath.Join(mirrorDir, mirror.Name), + logDir: logDir, + logFile: filepath.Join(logDir, "latest.log"), + useIPv6: mirror.UseIPv6, + interval: time.Duration(mirror.Interval) * time.Minute, + } + p, err := newRsyncProvider(rc) + if err != nil { + panic(err) + } + providers = append(providers, p) + default: + panic(errors.New("Invalid mirror provider")) + + } + + } + return providers +} + func main() { for { diff --git a/worker/rsync_provider.go b/worker/rsync_provider.go index ba8dcf1..cf35a91 100644 --- a/worker/rsync_provider.go +++ b/worker/rsync_provider.go @@ -35,11 +35,16 @@ func newRsyncProvider(c rsyncConfig) (*rsyncProvider, error) { } // TODO: implement this -func (p *rsyncProvider) Start() { - +func (p *rsyncProvider) Start() error { + return nil } // TODO: implement this -func (p *rsyncProvider) Terminate() { - +func (p *rsyncProvider) Terminate() error { + return nil +} + +// TODO: implement this +func (p *rsyncProvider) Wait() error { + return nil }