Skip to content

Commit 91bc13f

Browse files
committed
feat: support run REAPER as daemon and handle cron internally
1 parent b235e69 commit 91bc13f

8 files changed

Lines changed: 77 additions & 9 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.idea
22
build
33

4-
.reaper
4+
.reaper
5+
repo

cmd/daemon/daemon.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package daemon
2+
3+
import (
4+
"github.com/go-co-op/gocron"
5+
"github.com/leslieleung/reaper/internal/config"
6+
"github.com/leslieleung/reaper/internal/rip"
7+
"github.com/leslieleung/reaper/internal/ui"
8+
"github.com/spf13/cobra"
9+
"time"
10+
)
11+
12+
var Cmd = &cobra.Command{
13+
Use: "daemon",
14+
Short: "daemon runs as a daemon to monitor git repositories",
15+
Run: runDaemon,
16+
}
17+
18+
func runDaemon(cmd *cobra.Command, args []string) {
19+
storageMap := config.GetStorageMap()
20+
21+
s := gocron.NewScheduler(time.Local)
22+
s.SetMaxConcurrentJobs(3, gocron.WaitMode)
23+
24+
for _, repo := range config.GetRepositories() {
25+
if repo.Cron == "" {
26+
continue
27+
}
28+
storages := make([]config.MultiStorage, 0)
29+
for _, storage := range repo.Storage {
30+
if s, ok := storageMap[storage]; !ok {
31+
continue
32+
} else {
33+
storages = append(storages, s)
34+
}
35+
}
36+
_, err := s.Cron(repo.Cron).Do(rip.Rip, repo, storages)
37+
if err != nil {
38+
ui.Errorf("Error scheduling %s, %s", repo.Name, err)
39+
}
40+
ui.Printf("Scheduled %s, cron: %s", repo.Name, repo.Cron)
41+
}
42+
ui.Printf("Starting daemon")
43+
s.StartBlocking()
44+
}

cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"fmt"
5+
"github.com/leslieleung/reaper/cmd/daemon"
56
"github.com/leslieleung/reaper/cmd/rip"
67
"github.com/leslieleung/reaper/cmd/run"
78
"github.com/leslieleung/reaper/internal/config"
@@ -25,6 +26,7 @@ func init() {
2526
// commands
2627
rootCmd.AddCommand(rip.Cmd)
2728
rootCmd.AddCommand(run.Cmd)
29+
rootCmd.AddCommand(daemon.Cmd)
2830
// flags
2931
rootCmd.PersistentFlags().StringVarP(&config.Path, "config", "c", "config.yaml", "config file path")
3032
}

cmd/run/run.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,9 @@ var Cmd = &cobra.Command{
1414
}
1515

1616
func runRun(cmd *cobra.Command, args []string) {
17-
cfg := config.GetIns()
17+
storageMap := config.GetStorageMap()
1818

19-
storageMap := make(map[string]config.MultiStorage)
20-
for _, storage := range cfg.Storage {
21-
storageMap[storage.Name] = storage
22-
}
23-
24-
for _, repo := range cfg.Repository {
19+
for _, repo := range config.GetRepositories() {
2520
storages := make([]config.MultiStorage, 0)
2621
for _, storage := range repo.Storage {
2722
if s, ok := storageMap[storage]; !ok {

config/example.config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
repository:
22
- name: reaper
33
url: github.com/leslieleung/reaper
4+
cron: "0/3 * * * *"
45
storage:
56
- localFile
67
- blackblaze
@@ -9,7 +10,7 @@ storage:
910
- name: localFile
1011
type: file
1112
path: ./repo
12-
- name: blackblaze
13+
- name: backblaze
1314
type: s3
1415
endpoint: s3.us-west-000.backblazeb2.com
1516
region: us-west-000

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ require (
2727
github.com/dustin/go-humanize v1.0.1 // indirect
2828
github.com/emirpasic/gods v1.18.1 // indirect
2929
github.com/fsnotify/fsnotify v1.6.0 // indirect
30+
github.com/go-co-op/gocron v1.35.3 // indirect
3031
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
3132
github.com/go-git/go-billy/v5 v5.5.0 // indirect
3233
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
@@ -52,6 +53,7 @@ require (
5253
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
5354
github.com/pierrec/lz4/v4 v4.1.15 // indirect
5455
github.com/pjbgf/sha1cd v0.3.0 // indirect
56+
github.com/robfig/cron/v3 v3.0.1 // indirect
5557
github.com/rs/xid v1.5.0 // indirect
5658
github.com/sagikazarmark/locafero v0.3.0 // indirect
5759
github.com/sagikazarmark/slog-shim v0.1.0 // indirect

go.sum

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht
7373
github.com/connesc/cipherio v0.2.1 h1:FGtpTPMbKNNWByNrr9aEBtaJtXjqOzkIXNYJp6OEycw=
7474
github.com/connesc/cipherio v0.2.1/go.mod h1:ukY0MWJDFnJEbXMQtOcn2VmTpRfzcTz4OoVrWGGJZcA=
7575
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
76+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
7677
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
7778
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
7879
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -100,6 +101,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4
100101
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
101102
github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
102103
github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
104+
github.com/go-co-op/gocron v1.35.3 h1:it2WjWnabS8eJZ+P68WroBe+ZWyJ3kVjRD6KXdpr5yI=
105+
github.com/go-co-op/gocron v1.35.3/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY=
103106
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
104107
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
105108
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
@@ -210,6 +213,8 @@ github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE
210213
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
211214
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
212215
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
216+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
217+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
213218
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
214219
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
215220
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -245,14 +250,19 @@ github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0
245250
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
246251
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
247252
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
253+
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
248254
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
249255
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
250256
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
251257
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
252258
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
253259
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
254260
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
261+
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
262+
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
255263
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
264+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
265+
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
256266
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
257267
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
258268
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
@@ -292,6 +302,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
292302
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
293303
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
294304
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
305+
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
295306
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
296307
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
297308
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=

internal/config/config.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,15 @@ func Init() {
5353
func GetIns() *Config {
5454
return ins
5555
}
56+
57+
func GetStorageMap() map[string]MultiStorage {
58+
storageMap := make(map[string]MultiStorage)
59+
for _, storage := range ins.Storage {
60+
storageMap[storage.Name] = storage
61+
}
62+
return storageMap
63+
}
64+
65+
func GetRepositories() []Repository {
66+
return ins.Repository
67+
}

0 commit comments

Comments
 (0)