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 }