Files
xTeVe/src/backup.go
marmei 3730d1187d v2.0.0.0007-beta
Add CLI: info
Add CLI: restore
Improves UPnP support for Plex
CSS: Add min-width for Ch.No.
Fixed missing images on cache for localhost
2019-08-07 12:35:56 +02:00

275 lines
5.3 KiB
Go

package src
import (
b64 "encoding/base64"
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"time"
)
func xTeVeAutoBackup() (err error) {
var archiv = "xteve_auto_backup_" + time.Now().Format("20060102_1504") + ".zip"
var target string
var sourceFiles = make([]string, 0)
var oldBackupFiles = make([]string, 0)
var debug string
if len(Settings.BackupPath) > 0 {
System.Folder.Backup = Settings.BackupPath
}
showInfo("Backup Path:" + System.Folder.Backup)
err = checkFolder(System.Folder.Backup)
if err != nil {
ShowError(err, 1070)
return
}
// Alte Backups löschen
files, err := ioutil.ReadDir(System.Folder.Backup)
if err == nil {
for _, file := range files {
if filepath.Ext(file.Name()) == ".zip" && strings.Contains(file.Name(), "xteve_auto_backup") {
oldBackupFiles = append(oldBackupFiles, file.Name())
}
}
// Alle Backups löschen
var end int
switch Settings.BackupKeep {
case 0:
end = 0
default:
end = Settings.BackupKeep - 1
}
for i := 0; i < len(oldBackupFiles)-end; i++ {
os.RemoveAll(System.Folder.Backup + oldBackupFiles[i])
debug = fmt.Sprintf("Delete backup file:%s", oldBackupFiles[i])
showDebug(debug, 1)
}
if Settings.BackupKeep == 0 {
return
}
} else {
return
}
// Backup erstellen
if err == nil {
target = System.Folder.Backup + archiv
for _, i := range SystemFiles {
sourceFiles = append(sourceFiles, System.Folder.Config+i)
}
sourceFiles = append(sourceFiles, System.Folder.ImagesUpload)
err = zipFiles(sourceFiles, target)
if err == nil {
debug = fmt.Sprintf("Create backup file:%s", target)
showDebug(debug, 1)
showInfo("Backup file:" + target)
}
}
return
}
func xteveBackup() (archiv string, err error) {
err = checkFolder(System.Folder.Temp)
if err != nil {
return
}
archiv = "xteve_backup_" + time.Now().Format("20060102_1504") + ".zip"
var target = System.Folder.Temp + archiv
var sourceFiles = make([]string, 0)
for _, i := range SystemFiles {
sourceFiles = append(sourceFiles, System.Folder.Config+i)
}
sourceFiles = append(sourceFiles, System.Folder.Data)
err = zipFiles(sourceFiles, target)
if err != nil {
ShowError(err, 0)
return
}
return
}
func xteveRestore(archive string) (newWebURL string, err error) {
var newPort, oldPort, backupVersion, tmpRestore string
tmpRestore = System.Folder.Temp + "restore" + string(os.PathSeparator)
err = checkFolder(tmpRestore)
if err != nil {
return
}
// Zip Archiv in tmp entpacken
err = extractZIP(archive, tmpRestore)
if err != nil {
return
}
// Neue Config laden um den Port und die Version zu überprüfen
newConfig, err := loadJSONFileToMap(tmpRestore + "settings.json")
if err != nil {
ShowError(err, 0)
return
}
backupVersion = newConfig["version"].(string)
if backupVersion < System.Compatibility {
err = errors.New(getErrMsg(1013))
return
}
// Zip Archiv in den Config Ordner entpacken
err = extractZIP(archive, System.Folder.Config)
if err != nil {
return
}
// Neue Config laden um den Port und die Version zu überprüfen
newConfig, err = loadJSONFileToMap(System.Folder.Config + "settings.json")
if err != nil {
ShowError(err, 0)
return
}
newPort = newConfig["port"].(string)
oldPort = Settings.Port
if newPort == oldPort {
if err != nil {
ShowError(err, 0)
}
loadSettings()
err := Init()
if err != nil {
ShowError(err, 0)
return "", err
}
err = StartSystem(true)
if err != nil {
ShowError(err, 0)
return "", err
}
return "", err
}
var url = System.URLBase + "/web/"
newWebURL = strings.Replace(url, ":"+oldPort, ":"+newPort, 1)
os.RemoveAll(tmpRestore)
return
}
func xteveRestoreFromWeb(input string) (newWebURL string, err error) {
// Base64 Json String in base64 umwandeln
b64data := input[strings.IndexByte(input, ',')+1:]
// Base64 in bytes umwandeln und speichern
sDec, err := b64.StdEncoding.DecodeString(b64data)
if err != nil {
return
}
var archive = System.Folder.Temp + "restore.zip"
err = writeByteToFile(archive, sDec)
if err != nil {
return
}
newWebURL, err = xteveRestore(archive)
return
}
// XteveRestoreFromCLI : Wiederherstellung über die Kommandozeile
func XteveRestoreFromCLI(archive string) (err error) {
var confirm string
println()
showInfo(fmt.Sprintf("Version:%s Build: %s", System.Version, System.Build))
showInfo(fmt.Sprintf("Backup File:%s", archive))
showInfo(fmt.Sprintf("System Folder:%s", getPlatformPath(System.Folder.Config)))
println()
fmt.Print("All data will be replaced with those from the backup. Should the files be restored? [yes|no]:")
fmt.Scanln(&confirm)
switch strings.ToLower(confirm) {
case "yes":
break
case "no":
return
default:
fmt.Println("Invalid input")
return
}
if len(System.Folder.Config) > 0 {
err = checkFilePermission(System.Folder.Config)
if err != nil {
return
}
_, err = xteveRestore(archive)
if err != nil {
return
}
showHighlight(fmt.Sprintf("Restor:Backup was successfully restored. %s can now be started normally", System.Name))
}
return
}