123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package update
- /*
- Update.go
- This module handle cross version updates that contains breaking changes
- update command should always exit after the update is completed
- */
- import (
- "fmt"
- "os"
- "strconv"
- "strings"
- "imuslab.com/zoraxy/mod/utils"
- )
- // Run config update. Version numbers are int. For example
- // to update 3.0.7 to 3.0.8, use RunConfigUpdate(307, 308)
- // This function support cross versions updates (e.g. 307 -> 310)
- func RunConfigUpdate(fromVersion int, toVersion int) {
- versionFile := "./conf/version"
- isFirstTimeInit, _ := isFirstTimeInitialize("./conf/proxy/")
- if isFirstTimeInit {
- //Create version file and exit
- os.MkdirAll("./conf/", 0775)
- os.WriteFile(versionFile, []byte(strconv.Itoa(toVersion)), 0775)
- return
- }
- if fromVersion == 0 {
- //Run auto previous version detection
- fromVersion = 307
- if utils.FileExists(versionFile) {
- //Read the version file
- previousVersionText, err := os.ReadFile(versionFile)
- if err != nil {
- panic("Unable to read version file at " + versionFile)
- }
- //Convert the version to int
- versionInt, err := strconv.Atoi(strings.TrimSpace(string(previousVersionText)))
- if err != nil {
- panic("Unable to read version file at " + versionFile)
- }
- fromVersion = versionInt
- }
- if fromVersion == toVersion {
- //No need to update
- return
- }
- }
- //Do iterate update
- for i := fromVersion; i < toVersion; i++ {
- oldVersion := i
- newVersion := i + 1
- fmt.Println("Updating from v", oldVersion, " to v", newVersion)
- runUpdateRoutineWithVersion(oldVersion, newVersion)
- //Write the updated version to file
- os.WriteFile(versionFile, []byte(strconv.Itoa(newVersion)), 0775)
- }
- fmt.Println("Update completed")
- }
- func GetVersionIntFromVersionNumber(version string) int {
- versionNumberOnly := strings.ReplaceAll(version, ".", "")
- versionInt, _ := strconv.Atoi(versionNumberOnly)
- return versionInt
- }
- // Check if the folder "./conf/proxy/" exists and contains files
- func isFirstTimeInitialize(path string) (bool, error) {
- // Check if the folder exists
- info, err := os.Stat(path)
- if os.IsNotExist(err) {
- // The folder does not exist
- return true, nil
- }
- if err != nil {
- // Some other error occurred
- return false, err
- }
- // Check if it is a directory
- if !info.IsDir() {
- // The path is not a directory
- return false, fmt.Errorf("%s is not a directory", path)
- }
- // Read the directory contents
- files, err := os.ReadDir(path)
- if err != nil {
- return false, err
- }
- // Check if the directory is empty
- if len(files) == 0 {
- // The folder exists but is empty
- return true, nil
- }
- // The folder exists and contains files
- return false, nil
- }
|