79 lines
1.8 KiB
Go
Executable File
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
|
|
}
|