Skip to content

Commit

Permalink
generate schedule for darwin
Browse files Browse the repository at this point in the history
  • Loading branch information
creativeprojects committed Jul 3, 2020
1 parent c73ccb3 commit 5ddecf0
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 11 deletions.
9 changes: 5 additions & 4 deletions examples/dev.yaml
Expand Up @@ -16,6 +16,7 @@ default:
repository: /Volumes/RAMDisk

documents:
inherit: default
backup:
source: ~/Documents
initialize: false
Expand Down Expand Up @@ -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"
Expand Down
60 changes: 53 additions & 7 deletions schedule/schedule_darwin.go
Expand Up @@ -19,6 +19,7 @@ import (

// Default paths for launchd files
const (
LaunchCtl = "launchctl"
UserAgentPath = "Library/LaunchAgents"
GlobalAgentPath = "/Library/LaunchAgents"
GlobalDaemons = "/Library/LaunchDaemons"
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
}

Expand All @@ -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) {
Expand All @@ -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
}

0 comments on commit 5ddecf0

Please sign in to comment.