Mercurial > mercurial > hgweb_rsearcher.cgi
view go/server.go @ 15:c262e17de9b1
db download skip-mode.
author | pyon@macmini |
---|---|
date | Sat, 08 Jun 2019 15:50:59 +0900 |
parents | c1dc1fcee7fe |
children | b651aa41b9d4 |
line wrap: on
line source
/* server.go : server-program. Version : 1.5 Last Change: 2019-05-29 水 08:58:19. install to: server_root/ server_root/server + db/ + release/ + images/ */ package main import( "bufio" "flag" "fmt" "io" "log" "net" "net/http" "os" "path/filepath" "strings" "time" ) var ( version string server string port string server_root string logfile string not_ac bool wlfile string ) func init() { version = "1.5" // piece-image version port = ":3910" server_root = filepath.Dir(os.Args[0]) logfile = filepath.Join(server_root, "rsearcher.log") wlfile = "rsearcher.whitelist" } func main() { flag.BoolVar(¬_ac, "d", false, "no access control ( for debug )") flag.Parse() // setting IP-Address & Port addrs, err := net.InterfaceAddrs() if err != nil { log.Fatal(err) } for _, a := range addrs { if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if strings.HasPrefix(ipnet.IP.String(), "169.254") { continue } if ipnet.IP.To4() != nil { server = ipnet.IP.String() + port } } } // start Web-server fmt.Println("server start [", server, "] ( program version", version, ")") http.HandleFunc("/", handler ) http.HandleFunc("/upload/", upload_handler) http.HandleFunc("/mngdb/", mngdb_handler ) log.Fatal(http.ListenAndServe(server, nil)) } func handler(w http.ResponseWriter, r *http.Request) { if !not_ac && !is_valid_host(r.RemoteAddr) { http.NotFound(w, r) return } file := filepath.Join(server_root, filepath.FromSlash(r.URL.Path)) //img := r.URL.Query().Get("q") fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", file) //fmt.Println("--", img , "--") write_log("[access] " + r.RemoteAddr + " " + file) f, err := os.Open(file) if err != nil { http.NotFound(w, r) return } defer f.Close() fi, _ := f.Stat() w.Header().Set("Content-Type", "rsearcher/octet-stream") w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) io.Copy(w, f) } func upload_handler(w http.ResponseWriter, r *http.Request) { if !not_ac && !is_valid_host(r.RemoteAddr) { http.NotFound(w, r) return } fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", "/upload") now := time.Now().Format("20060102_150405") file := filepath.Join(server_root, "upload", now) f, err := os.Create(file) if err != nil { http.NotFound(w, r) return } n, err := io.Copy(f, r.Body) if err != nil { http.NotFound(w, r) return } f.Close() w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) } func mngdb_handler(w http.ResponseWriter, r *http.Request) { if !not_ac && !is_valid_host(r.RemoteAddr) { http.NotFound(w, r) return } fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/mngdb") write_log("[access] " + r.RemoteAddr + "manage-db") db := r.URL.Path[len("/mngdb/"):] file := filepath.Join(server_root, "db", db) f, err := os.Create(file) if err != nil { http.NotFound(w, r) return } _, err = io.Copy(f, r.Body) if err != nil { http.NotFound(w, r) return } f.Close() } func is_valid_host(host string) bool { f, _ := os.Open(wlfile) defer f.Close() input := bufio.NewScanner(f) for input.Scan() { if input.Text() == host { return true } } return false } func write_log(msg string) { f, err := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } defer f.Close() logger := log.New(f, "", log.LstdFlags) logger.Println(msg) }