// 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 }