Validate all executables

This commit is contained in:
Christian Muehlhaeuser 2018-03-13 04:21:25 +01:00
parent 024a9d59b0
commit a7f679bf11
No known key found for this signature in database
GPG Key ID: BA4CF857DD4117E9

View File

@ -141,25 +141,58 @@ var (
} }
) )
func validateExecutables(executable string, allowEmpty bool) (string, error) {
executable = strings.TrimSpace(executable)
if len(executable) == 0 {
if allowEmpty {
return executable, nil
}
return executable, fmt.Errorf("Need an executable to create a service for")
}
stat, err := os.Stat(executable)
if os.IsNotExist(err) {
return executable, fmt.Errorf("Could not find executable: %s is not a file", executable)
}
if stat.IsDir() {
return executable, fmt.Errorf("Could not find executable: %s is a directory", executable)
}
if stat.Mode()&0111 == 0 {
return executable, fmt.Errorf("%s is not executable", executable)
}
return executable, nil
}
func validate() error { func validate() error {
ts, err := targets() ts, err := targets()
if err != nil { if err != nil {
return fmt.Errorf("Can't find systemd targets: %s", err) return fmt.Errorf("Can't find systemd targets: %s", err)
} }
// Exec check // Executable checks
if len(strings.TrimSpace(createOpts.Exec)) == 0 { createOpts.Exec, err = validateExecutables(createOpts.Exec, false)
return fmt.Errorf("Need an executable to create a service for") if err != nil {
return err
} }
stat, err := os.Stat(createOpts.Exec) createOpts.ExecReload, err = validateExecutables(createOpts.ExecReload, true)
if os.IsNotExist(err) { if err != nil {
return fmt.Errorf("Could not find executable: %s is not a file", createOpts.Exec) return err
} }
if stat.IsDir() { createOpts.ExecStartPre, err = validateExecutables(createOpts.ExecStartPre, true)
return fmt.Errorf("Could not find executable: %s is a directory", createOpts.Exec) if err != nil {
return err
} }
if stat.Mode()&0111 == 0 { createOpts.ExecStartPost, err = validateExecutables(createOpts.ExecStartPost, true)
return fmt.Errorf("%s is not executable", createOpts.Exec) if err != nil {
return err
}
createOpts.ExecStop, err = validateExecutables(createOpts.ExecStop, true)
if err != nil {
return err
}
createOpts.ExecStopPost, err = validateExecutables(createOpts.ExecStopPost, true)
if err != nil {
return err
} }
// Description check // Description check