From 5ddecf000d65bdfc34ba7b74d3114600ee3521ce Mon Sep 17 00:00:00 2001 From: Fred Date: Sat, 4 Jul 2020 00:44:20 +0100 Subject: [PATCH] generate schedule for darwin --- examples/dev.yaml | 9 +++--- schedule/schedule_darwin.go | 60 ++++++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/examples/dev.yaml b/examples/dev.yaml index c029adef..3b93a61b 100644 --- a/examples/dev.yaml +++ b/examples/dev.yaml @@ -16,6 +16,7 @@ default: repository: /Volumes/RAMDisk documents: + inherit: default backup: source: ~/Documents initialize: false @@ -58,13 +59,13 @@ root: - dev self: + inherit: default + schedule: "*:0,15,30,45" backup: source: ./ - initialize: false - repository: ../backup + initialize: true snapshots: - tag: - - self + tag: self src: lock: "/tmp/resticprofile-profile-src.lock" diff --git a/schedule/schedule_darwin.go b/schedule/schedule_darwin.go index 3360f97b..4d3b2130 100644 --- a/schedule/schedule_darwin.go +++ b/schedule/schedule_darwin.go @@ -19,6 +19,7 @@ import ( // Default paths for launchd files const ( + LaunchCtl = "launchctl" UserAgentPath = "Library/LaunchAgents" GlobalAgentPath = "/Library/LaunchAgents" GlobalDaemons = "/Library/LaunchDaemons" @@ -63,7 +64,7 @@ func (j *Job) createJob() error { binary := absolutePathToBinary(wd, os.Args[0]) - name := namePrefix + strings.ToLower(j.profile.Name) + name := getJobName(j.profile.Name) job := &LaunchJob{ Label: name, Program: binary, @@ -96,6 +97,25 @@ func (j *Job) createJob() error { return err } + // load the service + filename := path.Join(home, UserAgentPath, name+agentExtension) + cmd := exec.Command(LaunchCtl, "load", filename) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + return err + } + + // start the service + cmd = exec.Command(LaunchCtl, "start", name) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + return err + } + return nil } @@ -105,19 +125,38 @@ func RemoveJob(profileName string) error { if err != nil { return err } - name := namePrefix + strings.ToLower(profileName) + name := getJobName(profileName) - stop := exec.Command("launchctl", "stop", name) + // stop the service + stop := exec.Command(LaunchCtl, "stop", name) + stop.Stdout = os.Stdout + stop.Stderr = os.Stderr + // keep going if there's an error here _ = stop.Run() - unload := exec.Command("launchctl", "unload", name) - _ = unload.Run() + // unload the service + filename := path.Join(home, UserAgentPath, name+agentExtension) + unload := exec.Command(LaunchCtl, "unload", filename) + unload.Stdout = os.Stdout + unload.Stderr = os.Stderr + err = unload.Run() + if err != nil { + return err + } - return os.Remove(path.Join(home, UserAgentPath, name+agentExtension)) + return os.Remove(filename) } func (j *Job) displayStatus() error { - return nil + cmd := exec.Command(LaunchCtl, "list", getJobName(j.profile.Name)) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + return err +} + +func getJobName(profileName string) string { + return namePrefix + strings.ToLower(profileName) } func loadSchedules(schedules []string) ([]*calendar.Event, error) { @@ -127,6 +166,13 @@ func loadSchedules(schedules []string) ([]*calendar.Event, error) { return events, errors.New("empty schedule") } fmt.Printf("\nAnalyzing schedule %d/%d\n========================\n", index+1, len(schedules)) + event := calendar.NewEvent() + err := event.Parse(schedule) + if err != nil { + return events, err + } + fmt.Printf("schedule event: %s\n", event.String()) + events = append(events, event) } return events, nil }