Remove upgrade mechanism from pmctl
This commit is contained in:
@@ -89,35 +89,5 @@ func initPmCtl(cmd *cobra.Command, args []string) error {
|
|||||||
return errors.New("please supply the database directory using the --db flag")
|
return errors.New("please supply the database directory using the --db flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we are root/admin for self upgrade
|
|
||||||
userInfo, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "linux":
|
|
||||||
if userInfo.Username != "root" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
case "windows":
|
|
||||||
if !strings.HasSuffix(userInfo.Username, "SYSTEM") { // is this correct?
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = removeOldBin()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("%s warning: failed to remove old upgrade: %s\n", logPrefix, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
update := checkForUpgrade()
|
|
||||||
if update != nil {
|
|
||||||
err = doSelfUpgrade(update)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("%s failed to upgrade self: %s", logPrefix, err)
|
|
||||||
}
|
|
||||||
fmt.Println("upgraded portmaster-control")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
124
pmctl/upgrade.go
124
pmctl/upgrade.go
@@ -1,124 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"github.com/safing/portbase/info"
|
|
||||||
"github.com/safing/portmaster/updates"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
oldBinSuffix = "-old"
|
|
||||||
)
|
|
||||||
|
|
||||||
func checkForUpgrade() (update *updates.File) {
|
|
||||||
info := info.GetInfo()
|
|
||||||
file, err := updates.GetLocalPlatformFile("control/portmaster-control")
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if info.Version != file.Version() {
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func doSelfUpgrade(file *updates.File) error {
|
|
||||||
|
|
||||||
// FIXME: fix permissions if needed
|
|
||||||
|
|
||||||
// get destination
|
|
||||||
dst, err := os.Executable()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dst, err = filepath.EvalSymlinks(dst)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// mv destination
|
|
||||||
err = os.Rename(dst, dst+oldBinSuffix)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// hard link
|
|
||||||
err = os.Link(file.Path(), dst)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("%s failed to hardlink self upgrade: %s, will copy...\n", logPrefix, err)
|
|
||||||
err = copyFile(file.Path(), dst)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check permission
|
|
||||||
if runtime.GOOS != "windows" {
|
|
||||||
info, err := os.Stat(dst)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get file info on %s: %s", dst, err)
|
|
||||||
}
|
|
||||||
if info.Mode() != 0755 {
|
|
||||||
err := os.Chmod(dst, 0755)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to set permissions on %s: %s", dst, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func copyFile(srcPath, dstPath string) (err error) {
|
|
||||||
srcFile, err := os.Open(srcPath)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer srcFile.Close()
|
|
||||||
|
|
||||||
dstFile, err := os.Create(dstPath)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
closeErr := dstFile.Close()
|
|
||||||
if err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
_, err = io.Copy(dstFile, srcFile)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = dstFile.Sync()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeOldBin() error {
|
|
||||||
// get location
|
|
||||||
dst, err := os.Executable()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dst, err = filepath.EvalSymlinks(dst)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete old
|
|
||||||
err = os.Remove(dst + oldBinSuffix)
|
|
||||||
if err != nil {
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("removed previous portmaster-control")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user