Skip to content

Commit 9c98028

Browse files
l3uddznemchik
andauthored
feat: --daisy-chain flag for sync command and standalone dedupe command (#27)
* build: use latest goreleaser * Add systemd services * Update README.md * feat: add dedupe command --no-dedupe also added to upload command. * build: remove artifact cleanup action * feat(sync): add daisy-chain parameter * chore: module updates Co-authored-by: Eric Nemchik <[email protected]>
1 parent 637dce0 commit 9c98028

File tree

18 files changed

+511
-79
lines changed

18 files changed

+511
-79
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,19 @@ jobs:
2121
- name: dependencies
2222
run: |
2323
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sudo sh -s -- -b /usr/local/bin v1.24.0
24-
curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sudo sh -s -- -b /usr/local/bin v0.139.0
24+
curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sudo sh -s -- -b /usr/local/bin
2525
2626
# checkout
2727
- name: checkout
2828
uses: actions/checkout@v2
29-
30-
# unshallow (for goreleaser)
31-
- name: unshallow
32-
run: git fetch --prune --unshallow
29+
with:
30+
fetch-depth: 0
3331

3432
# setup go
3533
- name: go
3634
uses: actions/setup-go@v1
3735
with:
38-
go-version: 1.14
36+
go-version: 1.15
3937

4038
- name: go_version
4139
run: go version

.github/workflows/remove-old-artifacts.yml

Lines changed: 0 additions & 18 deletions
This file was deleted.

.goreleaser.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ changelog:
4242
exclude:
4343
- "^docs:"
4444
- "^test:"
45+
- "^Merge branch"

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ rclone:
3939
- '--use-mmap'
4040
- '--no-update-modtime'
4141
- '--drive-chunk-size=128M'
42-
- '--drive-use-trash=false'
4342
dedupe:
4443
- '--dedupe-mode=newest'
4544
- '--tpslimit=5'
@@ -134,9 +133,9 @@ syncer:
134133

135134
- Manual - Perform manual sync/copy job(s)
136135

137-
`crop manual --copy --src remote1:/Backups --dst remote2:/Backups --sa /opt/service_accounts -- --dry-run --drive-use-trash=false`
136+
`crop manual --copy --src remote1:/Backups --dst remote2:/Backups --sa /opt/service_accounts -- --dry-run`
138137

139-
`crop manual --sync --src remote1:/Backups --dst remote2:/Backups --sa /opt/service_accounts --dedupe -- --drive-use-trash=false`
138+
`crop manual --sync --src remote1:/Backups --dst remote2:/Backups --sa /opt/service_accounts --dedupe --`
140139

141140
***
142141

cmd/dedupe.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package cmd
2+
3+
import (
4+
"github.com/dustin/go-humanize"
5+
"github.com/l3uddz/crop/config"
6+
"github.com/l3uddz/crop/uploader"
7+
"github.com/pkg/errors"
8+
"github.com/spf13/cobra"
9+
"strings"
10+
"time"
11+
)
12+
13+
var dedupeCmd = &cobra.Command{
14+
Use: "dedupe",
15+
Short: "Perform dedupe associated with uploader(s)",
16+
Long: `This command can be used to trigger a dedupe associated with uploader(s).`,
17+
18+
Run: func(cmd *cobra.Command, args []string) {
19+
// init core
20+
initCore(true)
21+
defer releaseFileLock()
22+
23+
// iterate uploader's
24+
started := time.Now().UTC()
25+
26+
for _, uploaderConfig := range config.Config.Uploader {
27+
log := log.WithField("uploader", uploaderConfig.Name)
28+
29+
// skip disabled uploader(s)
30+
if !uploaderConfig.Enabled {
31+
log.Debug("Skipping disabled uploader")
32+
continue
33+
}
34+
35+
// skip uploader specific chosen
36+
if flagUploader != "" && !strings.EqualFold(uploaderConfig.Name, flagUploader) {
37+
log.Debugf("Skipping uploader as not: %q", flagUploader)
38+
continue
39+
}
40+
41+
// create uploader
42+
upload, err := uploader.New(config.Config, &uploaderConfig, uploaderConfig.Name)
43+
if err != nil {
44+
log.WithError(err).Error("Failed initializing uploader, skipping...")
45+
continue
46+
}
47+
48+
log.Info("Dedupe commencing...")
49+
50+
// perform upload
51+
if err := performDedupe(upload); err != nil {
52+
upload.Log.WithError(err).Error("Error occurred while running dedupe, skipping...")
53+
continue
54+
}
55+
}
56+
57+
log.Infof("Finished in: %v", humanize.RelTime(started, time.Now().UTC(), "", ""))
58+
},
59+
}
60+
61+
func init() {
62+
rootCmd.AddCommand(dedupeCmd)
63+
64+
dedupeCmd.Flags().StringVarP(&flagUploader, "uploader", "u", "", "Run for a specific uploader")
65+
}
66+
67+
func performDedupe(u *uploader.Uploader) error {
68+
u.Log.Info("Running dedupe...")
69+
70+
/* Dedupe */
71+
err := u.Dedupe(nil)
72+
if err != nil {
73+
return errors.Wrap(err, "failed dedupe remotes")
74+
}
75+
76+
u.Log.Info("Finished dedupe!")
77+
return nil
78+
}

cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var (
2626
flagLogFile = "activity.log"
2727
flagLockFile = "crop.lock"
2828
flagDryRun bool
29+
flagNoDedupe bool
2930

3031
// Global command specific
3132
flagUploader string

cmd/sync.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
var (
1919
flagSyncer string
2020
flagParallelism int
21-
flagNoDedupe bool
21+
flagDaisyChain bool
2222
)
2323

2424
var syncCmd = &cobra.Command{
@@ -114,6 +114,7 @@ func init() {
114114
syncCmd.Flags().StringVarP(&flagSyncer, "syncer", "s", "", "Run for a specific syncer")
115115
syncCmd.Flags().IntVarP(&flagParallelism, "parallelism", "p", 1, "Max parallel syncers")
116116

117+
syncCmd.Flags().BoolVar(&flagDaisyChain, "daisy-chain", false, "Daisy chain source remotes")
117118
syncCmd.Flags().BoolVar(&flagNoDedupe, "no-dedupe", false, "Ignore dedupe tasks for syncer")
118119
}
119120

@@ -147,7 +148,7 @@ func performSync(s *syncer.Syncer) error {
147148
if len(s.Config.Remotes.Copy) > 0 {
148149
s.Log.Info("Running copies...")
149150

150-
if err := s.Copy(liveRotateParams); err != nil {
151+
if err := s.Copy(liveRotateParams, flagDaisyChain); err != nil {
151152
return errors.WithMessage(err, "failed performing all copies")
152153
}
153154

@@ -158,7 +159,7 @@ func performSync(s *syncer.Syncer) error {
158159
if len(s.Config.Remotes.Sync) > 0 {
159160
s.Log.Info("Running syncs...")
160161

161-
if err := s.Sync(liveRotateParams); err != nil {
162+
if err := s.Sync(liveRotateParams, flagDaisyChain); err != nil {
162163
return errors.WithMessage(err, "failed performing all syncs")
163164
}
164165

cmd/upload.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ func init() {
162162
uploadCmd.Flags().StringVarP(&flagUploader, "uploader", "u", "", "Run for a specific uploader")
163163

164164
uploadCmd.Flags().BoolVar(&flagNoCheck, "no-check", false, "Ignore check and run")
165+
uploadCmd.Flags().BoolVar(&flagNoDedupe, "no-dedupe", false, "Ignore dedupe tasks for uploader")
165166
}
166167

167168
func performUpload(u *uploader.Uploader, forced bool) error {
@@ -240,7 +241,7 @@ func performUpload(u *uploader.Uploader, forced bool) error {
240241
}
241242

242243
/* Dedupe */
243-
if len(u.Config.Remotes.Dedupe) > 0 {
244+
if !flagNoDedupe && len(u.Config.Remotes.Dedupe) > 0 {
244245
u.Log.Info("Running dedupes...")
245246

246247
if err := u.Dedupe(nil); err != nil {

go.mod

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@ go 1.14
44

55
require (
66
github.com/DataDog/zstd v1.4.5 // indirect
7-
github.com/ReneKroon/ttlcache v1.6.0
7+
github.com/ReneKroon/ttlcache v1.7.0
88
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
99
github.com/blang/semver v3.5.1+incompatible
10-
github.com/dgraph-io/badger/v2 v2.0.3 // indirect
10+
github.com/dgraph-io/badger/v2 v2.2007.2 // indirect
1111
github.com/dgraph-io/ristretto v0.0.3 // indirect
1212
github.com/dustin/go-humanize v1.0.0
1313
github.com/fsnotify/fsnotify v1.4.9 // indirect
1414
github.com/go-cmd/cmd v1.2.1
1515
github.com/go-ole/go-ole v1.2.4 // indirect
16-
github.com/gofiber/fiber v1.12.6
17-
github.com/gofiber/recover v0.1.1
18-
github.com/golang/protobuf v1.4.2 // indirect
19-
github.com/klauspost/compress v1.10.10 // indirect
16+
github.com/gofiber/fiber v1.14.6
17+
github.com/gofiber/recover v0.1.2
18+
github.com/golang/snappy v0.0.2 // indirect
19+
github.com/gorilla/schema v1.2.0 // indirect
20+
github.com/klauspost/compress v1.11.0 // indirect
2021
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
2122
github.com/natefinch/lumberjack v2.0.0+incompatible
2223
github.com/nightlyone/lockfile v1.0.0
@@ -25,21 +26,19 @@ require (
2526
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
2627
github.com/pkg/errors v0.9.1
2728
github.com/rhysd/go-github-selfupdate v1.2.2
28-
github.com/shirou/gopsutil v2.20.6+incompatible
29+
github.com/shirou/gopsutil v2.20.8+incompatible
2930
github.com/sirupsen/logrus v1.6.0
3031
github.com/sony/sonyflake v1.0.0 // indirect
3132
github.com/spf13/cobra v1.0.0
3233
github.com/spf13/pflag v1.0.5 // indirect
33-
github.com/ulikunitz/xz v0.5.7 // indirect
34+
github.com/ulikunitz/xz v0.5.8 // indirect
3435
github.com/x-cray/logrus-prefixed-formatter v0.5.2
3536
github.com/yale8848/gorpool v0.1.0
3637
github.com/zippoxer/bow v0.0.0-20200229231453-bf1012ae7ab9
37-
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 // indirect
38-
golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect
39-
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
40-
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae
41-
google.golang.org/appengine v1.6.6 // indirect
42-
google.golang.org/protobuf v1.25.0 // indirect
38+
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect
39+
golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321 // indirect
40+
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect
41+
golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c
4342
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
4443
gopkg.in/yaml.v2 v2.3.0
4544
)

0 commit comments

Comments
 (0)