-
Notifications
You must be signed in to change notification settings - Fork 10
/
sync_linux.go
134 lines (109 loc) · 3.21 KB
/
sync_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// +build linux
package goos
import (
"bytes"
"errors"
"fmt"
"html/template"
"log"
"os"
"path/filepath"
unisontmpl "github.com/ironstar-io/tokaido/services/unison/templates"
"github.com/ironstar-io/tokaido/system/console"
"github.com/ironstar-io/tokaido/system/daemon"
"github.com/ironstar-io/tokaido/system/fs"
)
var bgSyncFailMsg = `
😓 The background sync service is not running
Tokaido will run, but your environment and local host will not be synchronised
Use 'tok up' to repair, or 'tok sync' to sync manually
`
// UnisonSvc ...
type UnisonSvc struct {
SyncName string
SyncDir string
Filename string
Filepath string
Systemdpath string
}
// NewUnisonSvc - Return a new instance of `UnisonSvc`.
func NewUnisonSvc(syncName, syncDir string) UnisonSvc {
s := UnisonSvc{
SyncName: syncName,
SyncDir: syncDir,
Filename: getServiceFilename(syncName),
Filepath: getServicePath(syncName),
Systemdpath: filepath.Join(fs.HomeDir(), "/.config/systemd/user/"),
}
return s
}
func getServiceFilename(syncName string) string {
return "tokaido-sync-" + syncName + ".service"
}
func getServicePath(syncName string) string {
return filepath.Join(fs.HomeDir(), "/.config/systemd/user/") + getServiceFilename(syncName)
}
// CreateSyncFile creates the systemd path (if necessary) and file
func (s UnisonSvc) CreateSyncFile() {
tmpl := template.New(s.SyncName)
tmpl, err := tmpl.Parse(unisontmpl.SyncTemplateStr)
if err != nil {
log.Fatal("Parse: ", err)
return
}
var tpl bytes.Buffer
if err := tmpl.Execute(&tpl, s); err != nil {
log.Fatal("Parse: ", err)
return
}
// Create the systemd path if it doesn't not exist
if _, pErr := os.Stat(s.Systemdpath); os.IsNotExist(pErr) {
mErr := os.MkdirAll(s.Systemdpath, os.ModePerm)
if mErr != nil {
log.Fatalf("There was an error creating the systemd path [%s]\nError: %v", s.Systemdpath, mErr)
}
}
fs.TouchOrReplace(filepath.Join(s.Systemdpath, s.Filename), tpl.Bytes())
daemon.ReloadServices()
}
// CreateSyncService Register a launchd or systemctl service for Unison active sync
func (s UnisonSvc) CreateSyncService() {
s.RegisterSyncService()
s.StartSyncService()
}
// RegisterSyncService Register the unison sync service for systemd
func (s UnisonSvc) RegisterSyncService() {
s.CreateSyncFile()
}
// StartSyncService Start the systemd service after it is created
func (s UnisonSvc) StartSyncService() {
daemon.StartService(s.Filename)
}
// RestartSyncService ...
func (s UnisonSvc) RestartSyncService() {
daemon.StopService(s.Filename)
daemon.StartService(s.Filename)
}
// UnloadSyncService Remove the unison sync service
func (s UnisonSvc) UnloadSyncService() {
return
}
// SyncServiceStatus ...
func (s UnisonSvc) SyncServiceStatus() string {
return daemon.ServiceStatus(s.Filename)
}
// StopSyncService ...
func (s UnisonSvc) StopSyncService() {
daemon.StopService(s.Filename)
daemon.DeleteService(s.Filepath)
}
// CheckSyncService a verbose sync status check used for tok status
func (s UnisonSvc) CheckSyncService() error {
c := s.SyncServiceStatus()
if c == "running" {
console.Println("✅ Background sync service is running", "√")
return nil
}
fmt.Println(bgSyncFailMsg)
return errors.New(bgSyncFailMsg)
}