Skip to content

Commit

Permalink
Merge pull request #130 from jkaninda/refactor
Browse files Browse the repository at this point in the history
Refactor
  • Loading branch information
jkaninda authored Oct 20, 2024
2 parents c16ee3a + 1dcb958 commit 40557af
Show file tree
Hide file tree
Showing 13 changed files with 44 additions and 11 deletions.
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ TZ=Europe/Paris

### Backup Cron Expression
#BACKUP_CRON_EXPRESSION=@midnight
##Delete old backup created more than specified days ago
#BACKUP_RETENTION_DAYS=7

####SSH Storage
#SSH_HOST_NAME=
Expand Down
2 changes: 1 addition & 1 deletion cmd/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var BackupCmd = &cobra.Command{
if len(args) == 0 {
pkg.StartBackup(cmd)
} else {
utils.Fatal("Error, no argument required")
utils.Fatal(`"backup" accepts no argument %q`, args)
}
},
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ var MigrateCmd = &cobra.Command{
if len(args) == 0 {
pkg.StartMigration(cmd)
} else {
utils.Fatal("Error, no argument required")
utils.Fatal(`"migrate" accepts no argument %q`, args)

}

Expand Down
2 changes: 1 addition & 1 deletion cmd/restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ var RestoreCmd = &cobra.Command{
if len(args) == 0 {
pkg.StartRestore(cmd)
} else {
utils.Fatal("Error, no argument required")
utils.Fatal(`"restore" accepts no argument %q`, args)

}

Expand Down
2 changes: 2 additions & 0 deletions docs/how-tos/backup-to-s3.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ services:
- AWS_ACCESS_KEY=xxxx
- AWS_SECRET_KEY=xxxxx
# - BACKUP_CRON_EXPRESSION=0 1 * * * # Optional
#Delete old backup created more than specified days ago
#- BACKUP_RETENTION_DAYS=7
## In case you are using S3 alternative such as Minio and your Minio instance is not secured, you change it to true
- AWS_DISABLE_SSL="false"
# mysql-bkup container must be connected to the same network with your database
Expand Down
2 changes: 2 additions & 0 deletions docs/how-tos/backup-to-ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ services:
- REMOTE_PATH=/home/jkaninda/backups
- SSH_IDENTIFY_FILE=/tmp/id_ed25519
# - BACKUP_CRON_EXPRESSION=0 1 * * * # Optional
#Delete old backup created more than specified days ago
#- BACKUP_RETENTION_DAYS=7
## We advise you to use a private jey instead of password
#- SSH_PASSWORD=password
# mysql-bkup container must be connected to the same network with your database
Expand Down
2 changes: 2 additions & 0 deletions docs/how-tos/backup.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ services:
- DB_USERNAME=username
- DB_PASSWORD=password
- BACKUP_CRON_EXPRESSION=0 1 * * *
#Delete old backup created more than specified days ago
#- BACKUP_RETENTION_DAYS=7
# mysql-bkup container must be connected to the same network with your database
networks:
- web
Expand Down
3 changes: 1 addition & 2 deletions docs/reference/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ Backup, restore and migrate targets, schedule and retention are configured using
| --dbname | -d | Database name |
| --port | -p | Database port (default: 3306) |
| --disable-compression | | Disable database backup compression |
| --prune | | Delete old backup, default disabled |
| --keep-last | | Delete old backup created more than specified days ago, default 7 days |
| --cron-expression | | Backup cron expression, eg: (* * * * *) or @daily |
| --help | -h | Print this help message and exit |
| --version | -V | Print version information and exit |
Expand All @@ -52,6 +50,7 @@ Backup, restore and migrate targets, schedule and retention are configured using
| GPG_PASSPHRASE | Optional, required to encrypt and restore backup | GPG passphrase |
| GPG_PUBLIC_KEY | Optional, required to encrypt backup | GPG public key, used to encrypt backup (/config/public_key.asc) |
| BACKUP_CRON_EXPRESSION | Optional if it was provided from the `--cron-expression` flag | Backup cron expression for docker in scheduled mode |
| BACKUP_RETENTION_DAYS | Optional | Delete old backup created more than specified days ago |
| SSH_HOST | Optional, required for SSH storage | ssh remote hostname or ip |
| SSH_USER | Optional, required for SSH storage | ssh remote user |
| SSH_PASSWORD | Optional, required for SSH storage | ssh remote user's password |
Expand Down
6 changes: 6 additions & 0 deletions pkg/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ func StartBackup(cmd *cobra.Command) {
func scheduledMode(db *dbConfig, config *BackupConfig) {
utils.Info("Running in Scheduled mode")
utils.Info("Backup cron expression: %s", config.cronExpression)
utils.Info("The next scheduled time is: %v", utils.CronNextTime(config.cronExpression).Format(timeFormat))
utils.Info("Storage type %s ", config.storage)

//Test backup
Expand All @@ -58,6 +59,8 @@ func scheduledMode(db *dbConfig, config *BackupConfig) {

_, err := c.AddFunc(config.cronExpression, func() {
BackupTask(db, config)
utils.Info("Next backup time is: %v", utils.CronNextTime(config.cronExpression).Format(timeFormat))

})
if err != nil {
return
Expand Down Expand Up @@ -119,6 +122,7 @@ func startMultiBackup(bkConfig *BackupConfig, configFile string) {
if utils.IsValidCronExpression(bkConfig.cronExpression) {
utils.Info("Running MultiBackup in Scheduled mode")
utils.Info("Backup cron expression: %s", bkConfig.cronExpression)
utils.Info("The next scheduled time is: %v", utils.CronNextTime(bkConfig.cronExpression).Format(timeFormat))
utils.Info("Storage type %s ", bkConfig.storage)

//Test backup
Expand All @@ -132,6 +136,8 @@ func startMultiBackup(bkConfig *BackupConfig, configFile string) {
_, err := c.AddFunc(bkConfig.cronExpression, func() {
// Create a channel
multiBackupTask(conf.Databases, bkConfig)
utils.Info("Next backup time is: %v", utils.CronNextTime(bkConfig.cronExpression).Format(timeFormat))

})
if err != nil {
return
Expand Down
1 change: 0 additions & 1 deletion pkg/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ func initAWSConfig() *AWSConfig {
func initBackupConfig(cmd *cobra.Command) *BackupConfig {
utils.SetEnv("STORAGE_PATH", storagePath)
utils.GetEnv(cmd, "cron-expression", "BACKUP_CRON_EXPRESSION")
utils.GetEnv(cmd, "period", "BACKUP_CRON_EXPRESSION")
utils.GetEnv(cmd, "path", "REMOTE_PATH")
//Get flag value and set env
remotePath := utils.GetEnvVariable("REMOTE_PATH", "SSH_REMOTE_PATH")
Expand Down
1 change: 1 addition & 0 deletions pkg/var.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const algorithm = "aes256"
const gpgHome = "/config/gnupg"
const gpgExtension = "gpg"
const workingDir = "/config"
const timeFormat = "2006-01-02 at 15:04:05"

var (
storage = "local"
Expand Down
5 changes: 0 additions & 5 deletions utils/notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"encoding/json"
"fmt"
"github.com/go-mail/mail"
"github.com/robfig/cron/v3"
"html/template"
"io/ioutil"
"net/http"
Expand Down Expand Up @@ -177,7 +176,3 @@ func getTgUrl() string {
return fmt.Sprintf("https://api.telegram.org/bot%s", os.Getenv("TG_TOKEN"))

}
func IsValidCronExpression(cronExpr string) bool {
_, err := cron.ParseStandard(cronExpr)
return err == nil
}
25 changes: 25 additions & 0 deletions utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ package utils

import (
"fmt"
"github.com/robfig/cron/v3"
"github.com/spf13/cobra"
"io"
"io/fs"
"os"
"strconv"
"time"
)

// FileExists checks if the file does exist
Expand Down Expand Up @@ -187,3 +189,26 @@ func EnvWithDefault(envName string, defaultValue string) string {
}
return value
}

// IsValidCronExpression verify cronExpression and returns boolean
func IsValidCronExpression(cronExpr string) bool {
// Parse the cron expression
_, err := cron.ParseStandard(cronExpr)
return err == nil
}

// CronNextTime returns cronExpression next time
func CronNextTime(cronExpr string) time.Time {
// Parse the cron expression
schedule, err := cron.ParseStandard(cronExpr)
if err != nil {
Error("Error parsing cron expression:", err)
return time.Time{}
}
// Get the current time
now := time.Now()
// Get the next scheduled time
next := schedule.Next(now)
//Info("The next scheduled time is: %v\n", next)
return next
}

0 comments on commit 40557af

Please sign in to comment.