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
|
### Phase 2 — PySentry legacy removal
|
||||||
- [x] P2.1 — Windows autostart legacy code
|
- [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.3 — Delete legacy autostart tests
|
||||||
- [ ] P2.4 — `.gitignore` / `.dockerignore`
|
- [ ] P2.4 — `.gitignore` / `.dockerignore`
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ package autostart
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -27,25 +26,12 @@ func (linuxManager) Status(expectedEnabled bool, executablePath string) (bool, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
const autostartDesktopFileName = "gosentry.desktop"
|
const autostartDesktopFileName = "gosentry.desktop"
|
||||||
const legacyAutostartDesktopFileName = "pysentry.desktop"
|
|
||||||
|
|
||||||
func SetAutostart(enabled bool, executablePath string, iconPath string) error {
|
func SetAutostart(enabled bool, executablePath string, iconPath string) error {
|
||||||
desktopPath, err := autostartDesktopPath()
|
desktopPath, err := autostartDesktopPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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 enabled {
|
||||||
if err := os.MkdirAll(filepath.Dir(desktopPath), 0o755); err != nil {
|
if err := os.MkdirAll(filepath.Dir(desktopPath), 0o755); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -73,12 +59,6 @@ func AutostartStatus(expectedEnabled bool, executablePath string) (bool, string)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false, "Cannot resolve XDG autostart directory"
|
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)
|
data, readErr := os.ReadFile(desktopPath)
|
||||||
|
|
||||||
if !expectedEnabled {
|
if !expectedEnabled {
|
||||||
@@ -109,18 +89,6 @@ func autostartDesktopPath() (string, error) {
|
|||||||
return filepath.Join(configHome, "autostart", autostartDesktopFileName), nil
|
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 {
|
func quoteDesktopExec(path string) string {
|
||||||
return strconv.Quote(path)
|
return strconv.Quote(path)
|
||||||
}
|
}
|
||||||
@@ -132,67 +100,3 @@ func desktopIconLine(iconPath string) string {
|
|||||||
return "Icon=" + iconPath
|
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 (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"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