-
Notifications
You must be signed in to change notification settings - Fork 14
/
login.go
81 lines (75 loc) · 2.48 KB
/
login.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
package system
import (
"fmt"
"os/exec"
"strings"
)
// GetCurrentLogins returns the user ids of the currently logged in users
func GetCurrentLogins() []string {
uID := []string{}
cmdName := "/usr/bin/loginctl"
cmdArgs := []string{"--no-pager", "--no-legend", "--no-ask-password", "list-users"}
if !CmdIsAvailable(cmdName) {
WarningLog("command '%s' not found", cmdName)
return uID
}
running, err := IsSystemRunning()
if err != nil {
ErrorLog("%v - Failed to call command systemctl", err)
return uID
}
if running {
cmdOut, err := exec.Command(cmdName, cmdArgs...).CombinedOutput()
if err != nil {
WarningLog("failed to invoke external command '%s %v': %v, output: %s", cmdName, cmdArgs, err, string(cmdOut))
return uID
}
for _, logins := range strings.Split(string(cmdOut), "\n") {
if logins == "" {
continue
}
user := strings.Split(strings.TrimSpace(logins), " ")
uID = append(uID, user[0])
}
}
return uID
}
// GetTasksMax returns the current limit of TasksMax for a given user id
// which is the value for UserTasksMax
func GetTasksMax(userID string) string {
//systemctl show -p TasksMax user-<uid>.slice
uSlice := "user-" + userID + ".slice"
cmdName := "/usr/bin/systemctl"
cmdArgs := []string{"show", "-p", "TasksMax", uSlice}
DebugLog("GetTasksMax - calling '%s' with '%s' args", cmdName, strings.Join(cmdArgs, " "))
if !CmdIsAvailable(cmdName) {
WarningLog("command '%s' not found", cmdName)
return ""
}
cmdOut, err := exec.Command(cmdName, cmdArgs...).CombinedOutput()
if err != nil {
WarningLog("failed to invoke external command '%s %v': %v, output: %s", cmdName, cmdArgs, err, string(cmdOut))
return ""
}
tasksMax := strings.Split(strings.TrimSpace(string(cmdOut)), "=")
DebugLog("GetTasksMax - cmd returns '%+v'", tasksMax)
// The result of strings.Split of an 'empty' string is a slice with
// one element - the empty string.
if len(tasksMax) == 1 && tasksMax[0] == "" {
return tasksMax[0]
}
return tasksMax[1]
}
// SetTasksMax sets the limit of TasksMax for a given user id to 'limit'
func SetTasksMax(userID, limit string) error {
//systemctl --runtime set-property user-<uid>.slice TasksMax=infinity
uSlice := "user-" + userID + ".slice"
tmLimit := "TasksMax=" + limit
cmdName := "/usr/bin/systemctl"
cmdArgs := []string{"--runtime", "set-property", uSlice, tmLimit}
if !CmdIsAvailable(cmdName) {
return fmt.Errorf("command '%s' not found", cmdName)
}
_, err := exec.Command(cmdName, cmdArgs...).CombinedOutput()
return err
}