File: restart.go

package info (click to toggle)
slinkwatch 1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 180 kB
  • sloc: makefile: 17; sh: 14
file content (81 lines) | stat: -rw-r--r-- 2,345 bytes parent folder | download | duplicates (2)
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 slinkwatch

// This file is part of slinkwatch.
//
// slinkwatch is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// slinkwatch 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
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with slinkwatch; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.

import (
	"fmt"
	"os/exec"

	"github.com/coreos/go-systemd/dbus"
	"github.com/coreos/go-systemd/util"
	log "github.com/sirupsen/logrus"
)

// RestartManager encapsulates interaction with the init system to restart the
// Suricata process on request.
type RestartManager struct {
	IsSystemd      bool
	RestartCommand string
	ServiceName    string
}

// MakeRestartManager returns a new RestartManager with restart command and
// service name preconfigured.
func MakeRestartManager(restartCommand string, serviceName string) (*RestartManager, error) {
	r := &RestartManager{
		IsSystemd:      util.IsRunningSystemd(),
		RestartCommand: restartCommand,
		ServiceName:    serviceName,
	}
	if !r.IsSystemd {
		log.Infoln("Not running systemd, will rely on restart command")
	} else {
		log.Infoln("systemd is available")
	}
	if !r.IsSystemd && len(restartCommand) == 0 {
		return nil, fmt.Errorf("Not running systemd but no restart command given")
	}
	return r, nil
}

// RestartSuricata triggers a Suricata restart, using the most appropriate
// method.
func (rm *RestartManager) RestartSuricata() error {
	if !rm.IsSystemd {
		cmd := exec.Command("sh", "-c", rm.RestartCommand)
		err := cmd.Run()
		if err != nil {
			return fmt.Errorf("Cannot restart Suricata: %v", err)
		}
		return nil
	}

	conn, err := dbus.New()
	if err != nil {
		return err
	}
	finishChan := make(chan string)
	_, err = conn.TryRestartUnit(rm.ServiceName, "replace", finishChan)
	if err != nil {
		return err
	}
	go func(ch chan string) {
		log.Infof("restart result: %s", <-ch)

	}(finishChan)
	return nil
}