Files
xTeVe/src/update.go
2019-09-27 19:24:31 +02:00

308 lines
6.1 KiB
Go

package src
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
up2date "../src/internal/up2date/client"
"reflect"
)
// BinaryUpdate : Binary Update Prozess. Git Branch master und beta wird von GitHub geladen.
func BinaryUpdate() (err error) {
if System.GitHub.Update == false {
showWarning(2099)
return
}
var debug string
var updater = &up2date.Updater
updater.Name = System.Update.Name
updater.Branch = System.Branch
up2date.Init()
switch System.Branch {
// Update von GitHub
case "master", "beta":
var gitInfo = fmt.Sprintf("%s/%s/info.json?raw=true", System.Update.Git, System.Branch)
var zipFile = fmt.Sprintf("%s/%s/%s_%s_%s.zip?raw=true", System.Update.Git, System.Branch, System.AppName, System.OS, System.ARCH)
var body []byte
var git GitStruct
resp, err := http.Get(gitInfo)
if err != nil {
ShowError(err, 6003)
return nil
}
if resp.StatusCode != http.StatusOK {
if resp.StatusCode == 404 {
err = fmt.Errorf(fmt.Sprintf("Update Server: %s (%s)", http.StatusText(resp.StatusCode), gitInfo))
ShowError(err, 6003)
return nil
}
err = fmt.Errorf(fmt.Sprintf("%d: %s (%s)", resp.StatusCode, http.StatusText(resp.StatusCode), gitInfo))
return err
}
body, err = ioutil.ReadAll(resp.Body)
err = json.Unmarshal(body, &git)
if err != nil {
return err
}
updater.Response.Status = true
updater.Response.UpdateZIP = zipFile
updater.Response.Version = git.Version
updater.Response.Filename = git.Filename
// Update vom eigenen Server
default:
updater.URL = Settings.UpdateURL
if len(updater.URL) == 0 {
showInfo(fmt.Sprintf("Update URL:No server URL specified, update will not be performed. Branch: %s", System.Branch))
return
}
showInfo("Update URL:" + updater.URL)
fmt.Println("-----------------")
// Versionsinformationen vom Server laden
err = up2date.GetVersion()
if err != nil {
debug = fmt.Sprintf(err.Error())
showDebug(debug, 1)
return nil
}
if len(updater.Response.Reason) > 0 {
err = fmt.Errorf(fmt.Sprintf("Update Server: %s", updater.Response.Reason))
ShowError(err, 6002)
return nil
}
}
var currentVersion = System.Version + "." + System.Build
// Versionsnummer überprüfen
if updater.Response.Version > currentVersion && updater.Response.Status == true {
if Settings.XteveAutoUpdate == true {
// Update durchführen
var fileType, url string
showInfo(fmt.Sprintf("Update Available:Version: %s", updater.Response.Version))
switch System.Branch {
// Update von GitHub
case "master", "beta":
showInfo(fmt.Sprintf("Update Server:GitHub"))
// Update vom eigenen Server
default:
showInfo(fmt.Sprintf("Update Server:%s", Settings.UpdateURL))
}
showInfo(fmt.Sprintf("Start Update:Branch: %s", updater.Branch))
// Neue Version als BIN Datei herunterladen
if len(updater.Response.UpdateBIN) > 0 {
url = updater.Response.UpdateBIN
fileType = "bin"
}
// Neue Version als ZIP Datei herunterladen
if len(updater.Response.UpdateZIP) > 0 {
url = updater.Response.UpdateZIP
fileType = "zip"
}
if len(url) > 0 {
err = up2date.DoUpdate(fileType, updater.Response.Filename)
if err != nil {
ShowError(err, 6002)
}
}
} else {
// Hinweis ausgeben
showWarning(6004)
}
}
return nil
}
func conditionalUpdateChanges() (err error) {
checkVersion:
settingsMap, err := loadJSONFileToMap(System.File.Settings)
if err != nil || len(settingsMap) == 0 {
return
}
if settingsVersion, ok := settingsMap["version"].(string); ok {
if settingsVersion > System.DBVersion {
showInfo("Settings DB Version:" + settingsVersion)
showInfo("System DB Version:" + System.DBVersion)
err = errors.New(getErrMsg(1031))
return
}
// Letzte Kompatible Version (1.4.4)
if settingsVersion < System.Compatibility {
err = errors.New(getErrMsg(1013))
return
}
switch settingsVersion {
case "1.4.4":
// UUID Wert in xepg.json setzen
err = setValueForUUID()
if err != nil {
return
}
// Neuer Filter (WebUI). Alte Filtereinstellungen werden konvertiert
if oldFilter, ok := settingsMap["filter"].([]interface{}); ok {
var newFilterMap = convertToNewFilter(oldFilter)
settingsMap["filter"] = newFilterMap
settingsMap["version"] = "2.0.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.0.0":
if oldBuffer, ok := settingsMap["buffer"].(bool); ok {
var newBuffer string
switch oldBuffer {
case true:
newBuffer = "xteve"
case false:
newBuffer = "-"
}
settingsMap["buffer"] = newBuffer
settingsMap["version"] = "2.1.0"
err = saveMapToJSONFile(System.File.Settings, settingsMap)
if err != nil {
return
}
goto checkVersion
} else {
err = errors.New(getErrMsg(1030))
return
}
case "2.1.0":
// Falls es in einem späteren Update Änderungen an der Datenbank gibt, geht es hier weiter
break
}
} else {
// settings.json ist zu alt (älter als Version 1.4.4)
err = errors.New(getErrMsg(1013))
}
return
}
func convertToNewFilter(oldFilter []interface{}) (newFilterMap map[int]interface{}) {
newFilterMap = make(map[int]interface{})
switch reflect.TypeOf(oldFilter).Kind() {
case reflect.Slice:
s := reflect.ValueOf(oldFilter)
for i := 0; i < s.Len(); i++ {
var newFilter FilterStruct
newFilter.Active = true
newFilter.Name = fmt.Sprintf("Custom filter %d", i+1)
newFilter.Filter = s.Index(i).Interface().(string)
newFilter.Type = "custom-filter"
newFilter.CaseSensitive = false
newFilterMap[i] = newFilter
}
}
return
}
func setValueForUUID() (err error) {
xepg, err := loadJSONFileToMap(System.File.XEPG)
for _, c := range xepg {
var xepgChannel = c.(map[string]interface{})
if uuidKey, ok := xepgChannel["_uuid.key"].(string); ok {
if value, ok := xepgChannel[uuidKey].(string); ok {
if len(value) > 0 {
xepgChannel["_uuid.value"] = value
}
}
}
}
err = saveMapToJSONFile(System.File.XEPG, xepg)
return
}