77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package instruction
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
var actions = []string{"enable", "disable", "start", "stop", "reload", "restart"}
|
|
|
|
type service struct {
|
|
raw string
|
|
Action string
|
|
Services []string
|
|
}
|
|
|
|
func (d *service) Raw() string { return strings.Join([]string{"service", d.raw}, " ") }
|
|
|
|
func (d *service) Build(_args string) error {
|
|
|
|
// 1. extract action (sub command)
|
|
split := strings.Split(_args, " ")
|
|
|
|
// 2. check action
|
|
if len(split) < 2 {
|
|
return fmt.Errorf("invalid syntax, missing action or unit")
|
|
}
|
|
|
|
// 3. fail if unknown action
|
|
known := false
|
|
for _, act := range actions {
|
|
if split[0] == act {
|
|
known = true
|
|
break
|
|
}
|
|
}
|
|
if !known {
|
|
return fmt.Errorf("unknown action '%s'", split[0])
|
|
}
|
|
|
|
d.Action = split[0]
|
|
|
|
// 4. Store services
|
|
d.Services = split[1:]
|
|
d.raw = _args
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d service) Exec(ctx ExecutionContext) ([]byte, error) {
|
|
|
|
// delete all packages
|
|
for _, service := range d.Services {
|
|
|
|
if err := ctx.ServiceManager.Exec(d.Action, service); err != nil {
|
|
return nil, fmt.Errorf("cannot %s '%s' | %s", d.Action, service, err)
|
|
}
|
|
|
|
}
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
func (d service) DryRun(ctx ExecutionContext) ([]byte, error) {
|
|
|
|
// fail if a service does not exist
|
|
for _, service := range d.Services {
|
|
|
|
if err := ctx.ServiceManager.Exec("status", service); err != nil {
|
|
return nil, fmt.Errorf("cannot find service '%s' | %s", service, err)
|
|
}
|
|
|
|
}
|
|
|
|
return nil, nil
|
|
|
|
}
|