P2.2: remove PySentry legacy systemd + desktop autostart from Linux
Drop cleanupLegacySystemdAutostart, cleanupLegacyDesktopAutostart, legacySystemdAutostartExists, legacyDesktopAutostartExists, and their path helpers; remove calls from SetAutostart and AutostartStatus; drop the os/exec import. Remove TestLinuxAutostartRemovesLegacyDesktopEntry which referenced the deleted legacyAutostartDesktopPath function. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -89,7 +89,7 @@ These land together because both edit `domain/job.go` and `storage/store.go`.
|
||||
|
||||
### Phase 2 — PySentry legacy removal
|
||||
- [x] P2.1 — Windows autostart legacy code
|
||||
- [ ] P2.2 — Linux autostart legacy code
|
||||
- [x] P2.2 — Linux autostart legacy code
|
||||
- [ ] P2.3 — Delete legacy autostart tests
|
||||
- [ ] P2.4 — `.gitignore` / `.dockerignore`
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ package autostart
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -27,25 +26,12 @@ func (linuxManager) Status(expectedEnabled bool, executablePath string) (bool, s
|
||||
}
|
||||
|
||||
const autostartDesktopFileName = "gosentry.desktop"
|
||||
const legacyAutostartDesktopFileName = "pysentry.desktop"
|
||||
|
||||
func SetAutostart(enabled bool, executablePath string, iconPath string) error {
|
||||
desktopPath, err := autostartDesktopPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// A desktop scheduler with a tray icon belongs to the graphical session, so
|
||||
// Linux autostart is implemented through XDG Autostart instead of a systemd
|
||||
// user service. systemd is tempting because it is explicit and scriptable,
|
||||
// but it is the wrong owner for a windowed app that should inherit the
|
||||
// desktop session environment and appear in the tray predictably.
|
||||
if err := cleanupLegacySystemdAutostart(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := cleanupLegacyDesktopAutostart(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if enabled {
|
||||
if err := os.MkdirAll(filepath.Dir(desktopPath), 0o755); err != nil {
|
||||
return err
|
||||
@@ -73,12 +59,6 @@ func AutostartStatus(expectedEnabled bool, executablePath string) (bool, string)
|
||||
if err != nil {
|
||||
return false, "Cannot resolve XDG autostart directory"
|
||||
}
|
||||
if legacySystemdAutostartExists() {
|
||||
return false, "Legacy systemd autostart entry still exists"
|
||||
}
|
||||
if legacyDesktopAutostartExists() {
|
||||
return false, "Legacy desktop autostart entry still exists"
|
||||
}
|
||||
data, readErr := os.ReadFile(desktopPath)
|
||||
|
||||
if !expectedEnabled {
|
||||
@@ -109,18 +89,6 @@ func autostartDesktopPath() (string, error) {
|
||||
return filepath.Join(configHome, "autostart", autostartDesktopFileName), nil
|
||||
}
|
||||
|
||||
func legacyAutostartDesktopPath() (string, error) {
|
||||
configHome := os.Getenv("XDG_CONFIG_HOME")
|
||||
if configHome == "" {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
configHome = filepath.Join(home, ".config")
|
||||
}
|
||||
return filepath.Join(configHome, "autostart", legacyAutostartDesktopFileName), nil
|
||||
}
|
||||
|
||||
func quoteDesktopExec(path string) string {
|
||||
return strconv.Quote(path)
|
||||
}
|
||||
@@ -132,67 +100,3 @@ func desktopIconLine(iconPath string) string {
|
||||
return "Icon=" + iconPath
|
||||
}
|
||||
|
||||
func cleanupLegacySystemdAutostart() error {
|
||||
unitPath, err := legacySystemdUnitPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := os.Stat(unitPath); os.IsNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Older PySentry builds used a systemd user unit for autostart. The current
|
||||
// GoSentry implementation uses XDG Autostart because it is a GUI/tray
|
||||
// application and should be launched by the desktop session. Disable and
|
||||
// remove the old unit so the two mechanisms do not fight or start duplicates.
|
||||
_ = exec.Command("systemctl", "--user", "disable", "pysentry.service").Run()
|
||||
if err := os.Remove(unitPath); err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
_ = exec.Command("systemctl", "--user", "daemon-reload").Run()
|
||||
return nil
|
||||
}
|
||||
|
||||
func cleanupLegacyDesktopAutostart() error {
|
||||
desktopPath, err := legacyAutostartDesktopPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// The old PySentry desktop file is removed proactively instead of tolerated
|
||||
// alongside the new one. Leaving both files in place would risk duplicate
|
||||
// launches or confusing status diagnostics after the rename.
|
||||
if err := os.Remove(desktopPath); err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func legacyDesktopAutostartExists() bool {
|
||||
desktopPath, err := legacyAutostartDesktopPath()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
_, err = os.Stat(desktopPath)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func legacySystemdAutostartExists() bool {
|
||||
unitPath, err := legacySystemdUnitPath()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
_, err = os.Stat(unitPath)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func legacySystemdUnitPath() (string, error) {
|
||||
configHome := os.Getenv("XDG_CONFIG_HOME")
|
||||
if configHome == "" {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
configHome = filepath.Join(home, ".config")
|
||||
}
|
||||
return filepath.Join(configHome, "systemd", "user", "pysentry.service"), nil
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ package autostart
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
@@ -34,24 +33,3 @@ func TestLinuxAutostartStartsInTray(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestLinuxAutostartRemovesLegacyDesktopEntry(t *testing.T) {
|
||||
t.Setenv("XDG_CONFIG_HOME", t.TempDir())
|
||||
|
||||
legacyPath, err := legacyAutostartDesktopPath()
|
||||
if err != nil {
|
||||
t.Fatalf("resolve legacy desktop path: %v", err)
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Dir(legacyPath), 0o755); err != nil {
|
||||
t.Fatalf("create legacy desktop directory: %v", err)
|
||||
}
|
||||
if err := os.WriteFile(legacyPath, []byte("[Desktop Entry]\nName=PySentry\n"), 0o644); err != nil {
|
||||
t.Fatalf("write legacy desktop entry: %v", err)
|
||||
}
|
||||
|
||||
if err := SetAutostart(true, "/opt/gosentry/gosentry", ""); err != nil {
|
||||
t.Fatalf("enable autostart: %v", err)
|
||||
}
|
||||
if _, err := os.Stat(legacyPath); !os.IsNotExist(err) {
|
||||
t.Fatalf("legacy desktop entry still exists or cannot be checked: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user