Files
1Panel/agent/utils/vm/helper/embedded.go
ssongliu c06c4e338b feat(vm): enable community virtual machines and migrate xpack data (#14279)
* feat(vm): enable community virtual machines and migrate xpack data

* fix(vm): stop ISO download polling on failure or cancellation

* fix(vm): respect deleteFile when deleting failed ISO imports
2026-11-02 18:22:58 +08:00

59 lines
1.3 KiB
Go

package helper
import (
"crypto/sha256"
"fmt"
"os"
"path/filepath"
"github.com/1Panel-dev/1Panel/agent/utils/vm/protocol"
)
func EnsureEmbeddedHelper() (string, bool, error) {
bin, ok := embeddedHelperBytes()
if !ok {
return "", false, nil
}
target, err := embeddedHelperPath()
if err != nil {
return "", true, err
}
if sameFileContent(target, bin) {
if err := os.Chmod(target, 0755); err != nil {
return "", true, err
}
return target, true, nil
}
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
return "", true, err
}
tmp := target + ".tmp"
if err := os.WriteFile(tmp, bin, 0755); err != nil {
return "", true, err
}
if err := os.Rename(tmp, target); err != nil {
_ = os.Remove(tmp)
return "", true, err
}
if err := os.Chmod(target, 0755); err != nil {
return "", true, err
}
return target, true, nil
}
func embeddedHelperPath() (string, error) {
self, err := os.Executable()
if err != nil {
return "", fmt.Errorf("load executable path: %w", err)
}
return filepath.Join(filepath.Dir(self), protocol.HelperBinary), nil
}
func sameFileContent(path string, expected []byte) bool {
current, err := os.ReadFile(path)
if err != nil {
return false
}
return sha256.Sum256(current) == sha256.Sum256(expected)
}