mirror of
https://github.com/outbackdingo/debos.git
synced 2026-01-28 10:18:43 +00:00
Disabled services start/stop for commands running in chroot. This also prevents services from start during packages install. Signed-off-by: Denis Pynkin <denis.pynkin@collabora.com>
75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
package debos
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
const debianPolicyHelper = "/usr/sbin/policy-rc.d"
|
|
|
|
/*
|
|
ServiceHelper is used to manage services.
|
|
Currently supports only debian-based family.
|
|
*/
|
|
|
|
type ServiceHelper struct {
|
|
Rootdir string
|
|
}
|
|
|
|
type ServicesManager interface {
|
|
Allow() error
|
|
Deny() error
|
|
}
|
|
|
|
/*
|
|
Allow() allows to start/stop services on OS level.
|
|
*/
|
|
func (s *ServiceHelper) Allow() error {
|
|
|
|
helperFile := path.Join(s.Rootdir, debianPolicyHelper)
|
|
|
|
if _, err := os.Stat(helperFile); os.IsNotExist(err) {
|
|
return nil
|
|
}
|
|
if err := os.Remove(helperFile); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/*
|
|
Deny() prohibits to start/stop services on OS level.
|
|
*/
|
|
func (s *ServiceHelper) Deny() error {
|
|
|
|
helperFile := path.Join(s.Rootdir, debianPolicyHelper)
|
|
var helper = []byte(`#!/bin/sh
|
|
|
|
exit 101
|
|
`)
|
|
|
|
if _, err := os.Stat(helperFile); os.IsExist(err) {
|
|
return fmt.Errorf("Policy helper file '%s' exists already", debianPolicyHelper)
|
|
}
|
|
if _, err := os.Stat(path.Dir(helperFile)); os.IsNotExist(err) {
|
|
// do not try to do something if ".../usr/sbin" is not exists
|
|
return nil
|
|
}
|
|
pf, err := os.Create(helperFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer pf.Close()
|
|
|
|
if _, err := pf.Write(helper); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := pf.Chmod(0755); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|