| | |
| | | package service |
| | | |
| | | import ( |
| | | "context" |
| | | "fmt" |
| | | "os" |
| | | "os/exec" |
| | | "path/filepath" |
| | | "time" |
| | | "vamicro/extend/util" |
| | | "vamicro/version-control/models" |
| | | |
| | | "basic.com/valib/logger.git" |
| | | ) |
| | | |
| | | /* |
| | | 系统备份、备份还原、按设置周期性备份 |
| | | 备份的数据主要包括sqlite数据、config以及exe(按需要) |
| | | 按钮可以触发立即备份 |
| | | 参数: |
| | | 1.备份开关 |
| | | 2.备份目录文件夹(/opt/vasystem/backup_auto) |
| | | 3.备份周期(每7天备份一次,备份时间是夜间0点) |
| | | 4.备份数据保存时间 |
| | | */ |
| | | func BakSchedule(ctx context.Context) { |
| | | // tk := time.NewTicker(time.Minute) |
| | | tk := time.Tick(24 * time.Hour) |
| | | for { |
| | | select { |
| | | case <-ctx.Done(): |
| | | return |
| | | case <-tk: |
| | | removeCheck() |
| | | backupCheck() |
| | | } |
| | | } |
| | | } |
| | | |
| | | //自动清理大于保存时间的备份数据 |
| | | func removeCheck() { |
| | | var ab models.AutoBackupConf |
| | | i, e := ab.Select() |
| | | if e != nil || i <= 0 { |
| | | return |
| | | } |
| | | if ab.Dir == "" { |
| | | logger.Error("备份目录未配置") |
| | | return |
| | | } |
| | | |
| | | if ab.Period < 1 || ab.SaveDays < 1 { |
| | | logger.Error("周期和保存天数不合法") |
| | | return |
| | | } |
| | | |
| | | t := time.Now() |
| | | err := filepath.Walk(ab.Dir, func(src string, f os.FileInfo, err error) error { |
| | | if f.IsDir() { |
| | | nt, e := time.ParseInLocation("2006-01-02-15-04-05", f.Name(), time.Local) |
| | | if e != nil { |
| | | return e |
| | | } |
| | | |
| | | if int(t.Sub(nt).Hours()) > ab.SaveDays*24 { |
| | | os.RemoveAll(ab.Dir + "/" + f.Name()) |
| | | } |
| | | } |
| | | return nil |
| | | }) |
| | | if err != nil { |
| | | logger.Error(err) |
| | | } |
| | | } |
| | | |
| | | func backupCheck() { |
| | | //检查当前时间 |
| | | t := time.Now() |
| | | if t.Hour() > 1 { |
| | | return |
| | | } |
| | | var ab models.AutoBackupConf |
| | | i, e := ab.Select() |
| | | if e != nil || i <= 0 { |
| | | return |
| | | } |
| | | if !ab.Enable { |
| | | logger.Info("自动备份开关未打开") |
| | | return |
| | | } |
| | | if ab.Dir == "" { |
| | | logger.Error("备份目录未配置") |
| | | return |
| | | } |
| | | if ab.Period < 1 || ab.SaveDays < 1 { |
| | | logger.Error("周期和保存天数不合法") |
| | | return |
| | | } |
| | | |
| | | if !util.DirExists(ab.Dir) { |
| | | os.Mkdir(ab.Dir, os.ModePerm) |
| | | } |
| | | lbd, err := exec.Command(fmt.Sprintf("ls %s | sort -r|head -1", ab.Dir)).Output() |
| | | if err != nil { |
| | | logger.Error("get last auto backup day err:", err) |
| | | return |
| | | } |
| | | |
| | | sbd := string(lbd) |
| | | if sbd == "" { //未备份过,则执行备份 |
| | | DoAutoBackup(&ab) |
| | | } else { |
| | | tl, _ := time.ParseInLocation("2006-01-02-15-04-05", sbd, time.Local) |
| | | if int(t.Sub(tl).Hours()) >= ab.Period*24 { |
| | | DoAutoBackup(&ab) |
| | | } |
| | | } |
| | | } |
| | | |
| | | func DoAutoBackup(ab *models.AutoBackupConf) error { |
| | | backDirName := time.Now().Format("2006-01-02-15-04-05") |
| | | dir := ab.Dir + "/" + backDirName |
| | | if !util.DirExists(dir) { |
| | | if err := os.Mkdir(dir, os.ModePerm); err != nil { |
| | | return err |
| | | } |
| | | } |
| | | //备份数据库和配置文件 |
| | | _, err := util.CopyDirByCmd("/opt/vasystem/config", dir) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | return nil |
| | | } |
| | | func DoBackupRecover(dir string) error { |
| | | //防止还原失败,做一个还原点备份 |
| | | //先停止所有进程 |
| | | //还原 |
| | | //重启系统 |
| | | recoverBakDir := util.GetVamicroPath() + "/recover_backup" |
| | | if util.DirExists(recoverBakDir) { |
| | | os.RemoveAll(recoverBakDir) |
| | | } |
| | | os.Mkdir(recoverBakDir, os.ModePerm) |
| | | util.CopyDirByCmd("/opt/vasystem/config", recoverBakDir) |
| | | |
| | | _, err := exec.Command("/bin/sh", "-c", fmt.Sprintf(` |
| | | /opt/vasystem/procs/killAllProcs.sh && |
| | | cp -rf %s/* /opt/vasystem/config/ && |
| | | /opt/vasystem/daemon.sh`, dir)).Output() |
| | | return err |
| | | } |
| | | package service
|
| | |
|
| | | import (
|
| | | "context"
|
| | | "fmt"
|
| | | "os"
|
| | | "os/exec"
|
| | | "path/filepath"
|
| | | "time"
|
| | | "vamicro/extend/util"
|
| | | "vamicro/version-control/models"
|
| | |
|
| | | "basic.com/valib/logger.git"
|
| | | )
|
| | |
|
| | | /*
|
| | | 系统备份、备份还原、按设置周期性备份
|
| | | 备份的数据主要包括sqlite数据、config以及exe(按需要)
|
| | | 按钮可以触发立即备份
|
| | | 参数:
|
| | | 1.备份开关
|
| | | 2.备份目录文件夹(/opt/vasystem/backup_auto)
|
| | | 3.备份周期(每7天备份一次,备份时间是夜间0点)
|
| | | 4.备份数据保存时间
|
| | | */
|
| | | func BakSchedule(ctx context.Context) {
|
| | | // tk := time.NewTicker(time.Minute)
|
| | | tk := time.Tick(24 * time.Hour)
|
| | | for {
|
| | | select {
|
| | | case <-ctx.Done():
|
| | | return
|
| | | case <-tk:
|
| | | removeCheck()
|
| | | backupCheck()
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //自动清理大于保存时间的备份数据
|
| | | func removeCheck() {
|
| | | var ab models.AutoBackupConf
|
| | | i, e := ab.Select()
|
| | | if e != nil || i <= 0 {
|
| | | return
|
| | | }
|
| | | if ab.Dir == "" {
|
| | | logger.Error("备份目录未配置")
|
| | | return
|
| | | }
|
| | |
|
| | | if ab.Period < 1 || ab.SaveDays < 1 {
|
| | | logger.Error("周期和保存天数不合法")
|
| | | return
|
| | | }
|
| | |
|
| | | t := time.Now()
|
| | | err := filepath.Walk(ab.Dir, func(src string, f os.FileInfo, err error) error {
|
| | | if f.IsDir() {
|
| | | nt, e := time.ParseInLocation("2006-01-02-15-04-05", f.Name(), time.Local)
|
| | | if e != nil {
|
| | | return e
|
| | | }
|
| | |
|
| | | if int(t.Sub(nt).Hours()) > ab.SaveDays*24 {
|
| | | os.RemoveAll(ab.Dir + "/" + f.Name())
|
| | | }
|
| | | }
|
| | | return nil
|
| | | })
|
| | | if err != nil {
|
| | | logger.Error(err)
|
| | | }
|
| | | }
|
| | |
|
| | | func backupCheck() {
|
| | | //检查当前时间
|
| | | t := time.Now()
|
| | | if t.Hour() > 1 {
|
| | | return
|
| | | }
|
| | | var ab models.AutoBackupConf
|
| | | i, e := ab.Select()
|
| | | if e != nil || i <= 0 {
|
| | | return
|
| | | }
|
| | | if !ab.Enable {
|
| | | logger.Info("自动备份开关未打开")
|
| | | return
|
| | | }
|
| | | if ab.Dir == "" {
|
| | | logger.Error("备份目录未配置")
|
| | | return
|
| | | }
|
| | | if ab.Period < 1 || ab.SaveDays < 1 {
|
| | | logger.Error("周期和保存天数不合法")
|
| | | return
|
| | | }
|
| | |
|
| | | if !util.DirExists(ab.Dir) {
|
| | | os.Mkdir(ab.Dir, os.ModePerm)
|
| | | }
|
| | | lbd, err := exec.Command(fmt.Sprintf("ls %s | sort -r|head -1", ab.Dir)).Output()
|
| | | if err != nil {
|
| | | logger.Error("get last auto backup day err:", err)
|
| | | return
|
| | | }
|
| | |
|
| | | sbd := string(lbd)
|
| | | if sbd == "" { //未备份过,则执行备份
|
| | | DoAutoBackup(&ab)
|
| | | } else {
|
| | | tl, _ := time.ParseInLocation("2006-01-02-15-04-05", sbd, time.Local)
|
| | | if int(t.Sub(tl).Hours()) >= ab.Period*24 {
|
| | | DoAutoBackup(&ab)
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | func DoAutoBackup(ab *models.AutoBackupConf) error {
|
| | | backDirName := time.Now().Format("2006-01-02-15-04-05")
|
| | | dir := ab.Dir + "/" + backDirName
|
| | | if !util.DirExists(dir) {
|
| | | if err := os.Mkdir(dir, os.ModePerm); err != nil {
|
| | | return err
|
| | | }
|
| | | }
|
| | | //备份数据库和配置文件
|
| | | _, err := util.CopyDirByCmd("/opt/vasystem/config", dir)
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | | return nil
|
| | | }
|
| | | func DoBackupRecover(dir string) error {
|
| | | //防止还原失败,做一个还原点备份
|
| | | //先停止所有进程
|
| | | //还原
|
| | | //重启系统
|
| | | recoverBakDir := util.GetVamicroPath() + "/recover_backup"
|
| | | if util.DirExists(recoverBakDir) {
|
| | | os.RemoveAll(recoverBakDir)
|
| | | }
|
| | | os.Mkdir(recoverBakDir, os.ModePerm)
|
| | | util.CopyDirByCmd("/opt/vasystem/config", recoverBakDir)
|
| | |
|
| | | _, err := exec.Command("/bin/sh", "-c", fmt.Sprintf(`
|
| | | /opt/vasystem/procs/killAllProcs.sh && |
| | | cp -rf %s/* /opt/vasystem/config/ && |
| | | /opt/vasystem/daemon.sh`, dir)).Output()
|
| | | return err
|
| | | }
|