Mercurial > mercurial > hgweb_rsearcher.cgi
view go/server.go @ 14:c1dc1fcee7fe
print zoom.
author | pyon@macmini |
---|---|
date | Sun, 09 Dec 2018 14:38:15 +0900 |
parents | f5ffc34f045a |
children | c262e17de9b1 |
line wrap: on
line source
/* server.go : server-program. Version : 1.4 Last Change: 2018-12-05 水 08:08:02. install to: server_root/ server_root/server + db/ + release/ + images/ */ package main import( "bufio" "flag" "fmt" "io" "log" "net" "net/http" "os" "path/filepath" "time" ) var ( version string server string port string server_root string logfile string not_ac bool wlfile string ) func init() { version = "1.4" // 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 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 ) }