filebrowser/config/commands.go
Henrique Dias 4526aeeaa9 Possibly fix #79
Former-commit-id: 448fc22e05a58cf627cf1f553170a010899b7609 [formerly d4a2c9b18746d2d14ac203c7d71f60251a2d9d18] [formerly 7632da5ecace133715b76d9506cc1b75c89bd659 [formerly 056ea2b8bd3b073887f0fb173b78faa4bce48087]]
Former-commit-id: 08e76feb0c947f494ce8c9aaaa6f8b8026b8816c [formerly c4dd6fb80ed0ed9d7890e51d1983ca03adf6b7a2]
Former-commit-id: 5d04fdd2c6ed7cf4468cd82909a6605ecbe853ba
2017-04-15 14:00:41 +01:00

63 lines
1.3 KiB
Go

package config
import (
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/mholt/caddy"
)
// CommandFunc ...
type CommandFunc func(r *http.Request, c *Config, u *User) error
// CommandRunner ...
func CommandRunner(c *caddy.Controller) (CommandFunc, error) {
fn := func(r *http.Request, c *Config, u *User) error { return nil }
args := c.RemainingArgs()
if len(args) == 0 {
return fn, c.ArgErr()
}
nonblock := false
if len(args) > 1 && args[len(args)-1] == "&" {
// Run command in background; non-blocking
nonblock = true
args = args[:len(args)-1]
}
command, args, err := caddy.SplitCommandAndArgs(strings.Join(args, " "))
if err != nil {
return fn, c.Err(err.Error())
}
fn = func(r *http.Request, c *Config, u *User) error {
path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1)
path = u.Scope + "/" + path
path = filepath.Clean(path)
for i := range args {
args[i] = strings.Replace(args[i], "{path}", path, -1)
}
cmd := exec.Command(command, args...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if nonblock {
log.Printf("[INFO] Nonblocking Command:\"%s %s\"", command, strings.Join(args, " "))
return cmd.Start()
}
log.Printf("[INFO] Blocking Command:\"%s %s\"", command, strings.Join(args, " "))
return cmd.Run()
}
return fn, nil
}