-
-
Notifications
You must be signed in to change notification settings - Fork 151
/
Copy pathsystray.go
103 lines (88 loc) · 2.95 KB
/
systray.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Copyright 2022 Arduino SA
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package systray
import (
"fmt"
"os"
"strings"
"github.com/arduino/go-paths-helper"
log "github.com/sirupsen/logrus"
)
// Systray manages the systray icon with its menu and actions. It also handles the pause/resume behaviour of the agent
type Systray struct {
// Whether the Agent is in Pause mode
Hibernate bool
// The version of the Agent, displayed in the trayicon menu
Version string
// The url of the debug page. It's a function because it could change port
DebugURL func() string
// The active configuration file
AdditionalConfig string
// The path to the directory containing the configuration files
ConfigDir *paths.Path
// The path of the exe (only used in update)
path string
// The path of the configuration file
currentConfigFilePath *paths.Path
}
// Restart restarts the program
// it works by finding the executable path and launching it before quitting
func (s *Systray) Restart() {
if s.path == "" {
log.Println("Update binary path not set")
var err error
s.path, err = os.Executable()
if err != nil {
log.Printf("Error getting exe path using os lib. err: %v\n", err)
}
} else {
log.Println("Starting updated binary: ", s.path)
}
// Trim newlines (needed on osx)
s.path = strings.Trim(s.path, "\n")
// Build args
args := []string{"-ls", fmt.Sprintf("--hibernate=%v", s.Hibernate)}
if s.AdditionalConfig != "" {
args = append(args, fmt.Sprintf("--additional-config=%s", s.AdditionalConfig))
}
// Launch executable
err := execApp(s.path, args...)
if err != nil {
log.Printf("Error restarting process: %v\n", err)
return
}
// If everything was fine, quit
s.Quit()
}
// Pause restarts the program with the hibernate flag set to true
func (s *Systray) Pause() {
s.Hibernate = true
s.Restart()
}
// Resume restarts the program with the hibernate flag set to false
func (s *Systray) Resume() {
s.Hibernate = false
s.Restart()
}
// RestartWith restarts the program with the given path
func (s *Systray) RestartWith(path string) {
s.path = path
s.Restart()
}
// SetCurrentConfigFile allows to specify the path of the configuration file the agent
// is using. The tray menu with this info can display an "open config file" option.
func (s *Systray) SetCurrentConfigFile(configPath *paths.Path) {
s.currentConfigFilePath = configPath
}