mirror of
https://github.com/netbirdio/netbird.git
synced 2026-03-31 06:24:18 -04:00
76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
//go:build windows || darwin
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/netbirdio/netbird/client/internal/updatemanager/installer"
|
|
"github.com/netbirdio/netbird/util"
|
|
)
|
|
|
|
var (
|
|
updateCmd = &cobra.Command{
|
|
Use: "update",
|
|
Short: "Update the NetBird client application",
|
|
RunE: updateFunc,
|
|
}
|
|
|
|
tempDirFlag string
|
|
installerFile string
|
|
serviceDirFlag string
|
|
dryRunFlag bool
|
|
)
|
|
|
|
func init() {
|
|
updateCmd.Flags().StringVar(&tempDirFlag, "temp-dir", "", "temporary dir")
|
|
updateCmd.Flags().StringVar(&installerFile, "installer-file", "", "installer file")
|
|
updateCmd.Flags().StringVar(&serviceDirFlag, "service-dir", "", "service directory")
|
|
updateCmd.Flags().BoolVar(&dryRunFlag, "dry-run", false, "dry run the update process without making any changes")
|
|
}
|
|
|
|
// isUpdateBinary checks if the current executable is named "update" or "update.exe"
|
|
func isUpdateBinary() bool {
|
|
// Remove extension for cross-platform compatibility
|
|
execPath, err := os.Executable()
|
|
if err != nil {
|
|
return false
|
|
}
|
|
baseName := filepath.Base(execPath)
|
|
name := strings.TrimSuffix(baseName, filepath.Ext(baseName))
|
|
|
|
return name == installer.UpdaterBinaryNameWithoutExtension()
|
|
}
|
|
|
|
func updateFunc(cmd *cobra.Command, args []string) error {
|
|
if err := setupLogToFile(tempDirFlag); err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Infof("updater started: %s", serviceDirFlag)
|
|
updater := installer.NewWithDir(tempDirFlag)
|
|
if err := updater.Setup(context.Background(), dryRunFlag, installerFile, serviceDirFlag); err != nil {
|
|
log.Errorf("failed to update application: %v", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func setupLogToFile(dir string) error {
|
|
logFile := filepath.Join(dir, installer.LogFile)
|
|
|
|
if _, err := os.Stat(logFile); err == nil {
|
|
if err := os.Remove(logFile); err != nil {
|
|
log.Errorf("failed to remove existing log file: %v\n", err)
|
|
}
|
|
}
|
|
|
|
return util.InitLog(logLevel, util.LogConsole, logFile)
|
|
}
|