FileManager

Former-commit-id: 780a1395987d55b7b3a8e16887b1565c7823f908 [formerly 68a764f60734158904a12ca8894d2e304d97cc45] [formerly dcc09fb513bea1790efecfb78862ebca1c690f1a [formerly 6aaa99d37787bb99b78bee485918b0035f5d9c3b]]
Former-commit-id: 88c025593528765843af499389da2236f70ae9fd [formerly 14902b1a3447014c648771ccd1a94f1dba97ca61]
Former-commit-id: ed209b9ef6781a8008e907bab6b4262cf7b828c1
This commit is contained in:
Henrique Dias
2017-07-08 15:25:33 +01:00
parent e58a174662
commit 63eeadd35d
2 changed files with 88 additions and 56 deletions

View File

@@ -4,10 +4,10 @@
package filemanager
import (
"log"
"crypto/sha256"
"encoding/hex"
"net/http"
"os"
"os/exec"
"path/filepath"
"strings"
@@ -69,13 +69,9 @@ func parse(c *caddy.Controller) ([]*config, error) {
)
for c.Next() {
// TODO:
// filemanager [baseurl] [baseScope] {
// database path
// }
baseURL := "/"
baseScope := "."
database := ""
// Get the baseURL and baseScope
args := c.RemainingArgs()
@@ -88,7 +84,38 @@ func parse(c *caddy.Controller) ([]*config, error) {
baseScope = args[1]
}
fm, err := New("./this.db", User{
for c.NextBlock() {
switch c.Val() {
case "database":
if !c.NextArg() {
return nil, c.ArgErr()
}
database = c.Val()
}
}
caddyConf := httpserver.GetConfig(c)
// If there is no database path on the settings,
// store one in .caddy/filemanager/name.db.
if database == "" {
path := filepath.Join(caddy.AssetsPath(), "filemanager")
err := os.MkdirAll(path, 0700)
if err != nil {
return nil, err
}
// The name of the database is the hashed value of a string composed
// by the host, address path and the baseurl of this File Manager
// instance.
hasher := sha256.New()
hasher.Write([]byte(caddyConf.Addr.Host + caddyConf.Addr.Path + baseURL))
sha := hex.EncodeToString(hasher.Sum(nil))
database = filepath.Join(path, sha+".db")
}
fm, err := New(database, User{
Username: "admin",
Password: "admin",
AllowCommands: true,
@@ -108,8 +135,6 @@ func parse(c *caddy.Controller) ([]*config, error) {
return nil, err
}
caddyConf := httpserver.GetConfig(c)
m := &config{FileManager: fm}
m.SetBaseURL(baseURL)
m.SetPrefixURL(strings.TrimSuffix(caddyConf.Addr.Path, "/"))
@@ -120,49 +145,3 @@ func parse(c *caddy.Controller) ([]*config, error) {
return configs, nil
}
func makeCommand(c *caddy.Controller, m *config) (Command, error) {
fn := func(r *http.Request, c *FileManager, 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 *FileManager, u *User) error {
path := strings.Replace(r.URL.Path, m.baseURL+"/files", "", 1)
path = string(u.FileSystem) + "/" + 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
}