]> ruderich.org/simon Gitweb - safcm/safcm.git/blob - cmd/safcm-remote/sync/sync.go
706791f3969e0dbc98e02d9b0d5f6a9b873ebbb3
[safcm/safcm.git] / cmd / safcm-remote / sync / sync.go
1 // MsgSyncReq: sync data on the remote host
2
3 // Copyright (C) 2021  Simon Ruderich
4 //
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 package sync
19
20 import (
21         "fmt"
22         "os/user"
23
24         "ruderich.org/simon/safcm"
25         "ruderich.org/simon/safcm/cmd/safcm-remote/log"
26         "ruderich.org/simon/safcm/cmd/safcm-remote/run"
27 )
28
29 type Sync struct {
30         req  safcm.MsgSyncReq
31         resp safcm.MsgSyncResp
32
33         defaultUser  string
34         defaultGroup string
35
36         triggers       []string
37         triggersActive map[string]bool
38
39         cmd *run.Cmd
40         log *log.Logger
41 }
42
43 const logPrefix = "sync remote:"
44
45 func Handle(req safcm.MsgSyncReq,
46         runner run.Runner, fun log.LogFunc) safcm.MsgSyncResp {
47
48         s := &Sync{
49                 req: req,
50                 log: log.NewLogger(logPrefix, fun),
51         }
52         s.cmd = run.NewCmd(runner, s.log)
53
54         err := s.setDefaults()
55         if err != nil {
56                 s.resp.Error = fmt.Sprintf("%s %s", logPrefix, err)
57                 return s.resp
58         }
59
60         err = s.syncFiles()
61         if err != nil {
62                 s.resp.Error = fmt.Sprintf("%s files: %s", logPrefix, err)
63                 return s.resp
64         }
65         err = s.syncPackages()
66         if err != nil {
67                 s.resp.Error = fmt.Sprintf("%s packages: %s", logPrefix, err)
68                 return s.resp
69         }
70         err = s.syncServices()
71         if err != nil {
72                 s.resp.Error = fmt.Sprintf("%s services: %s", logPrefix, err)
73                 return s.resp
74         }
75         err = s.syncCommands()
76         if err != nil {
77                 s.resp.Error = fmt.Sprintf("%s commands: %s", logPrefix, err)
78                 return s.resp
79         }
80         return s.resp
81 }
82
83 func (s *Sync) setDefaults() error {
84         u, err := user.Current()
85         if err != nil {
86                 return err
87         }
88         s.defaultUser = u.Username
89         g, err := user.LookupGroupId(u.Gid)
90         if err != nil {
91                 return err
92         }
93         s.defaultGroup = g.Name
94
95         s.triggersActive = make(map[string]bool)
96
97         return nil
98 }