GoFTP/main.go

79 lines
1.8 KiB
Go
Executable File

// Copyright 2018 The goftp Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
// This is a very simple ftpd server using this library as an example
// and as something to run tests against.
package main
import (
"flag"
"log"
"os/exec"
"time"
filedriver "github.com/goftp/file-driver"
"github.com/goftp/server"
)
func main() {
var (
root = flag.String("root", "./tmp", "Root directory to serve")
user = flag.String("user", "admin", "Username for login")
pass = flag.String("pass", "123456", "Password for login")
port = flag.Int("port", 2121, "Port")
host = flag.String("host", "", "Host")
)
flag.Parse()
if *root == "" {
log.Fatalf("Please set a root to serve with -root")
}
factory := &filedriver.FileDriverFactory{
RootPath: *root,
Perm: server.NewSimplePerm("user", "group"),
}
opts := &server.ServerOpts{
Factory: factory,
Port: *port,
Hostname: *host,
Auth: &callbackAuth{
realAuth: &server.SimpleAuth{
Name: *user,
Password: *pass,
},
callback: func() {
go func() {
time.Sleep(time.Second * 5)
log.Printf("callback: %v", exec.Command("sh", "-c", "cd /wiki; git add -A :/; git commit -m \"ftp upload\"").Run())
}()
},
},
}
log.Printf("Starting ftp server on %v:%v", opts.Hostname, opts.Port)
log.Printf("Username %v, Password %v", *user, *pass)
server := server.NewServer(opts)
err := server.ListenAndServe()
if err != nil {
log.Fatal("Error starting server:", err)
}
}
type callbackAuth struct {
realAuth server.Auth
callback func()
}
func (ca *callbackAuth) CheckPasswd(u, p string) (bool, error) {
ok, err := ca.realAuth.CheckPasswd(u, p)
if !ok || err != nil {
return ok, err
}
if ca.callback != nil {
ca.callback()
}
return ok, err
}