Mercurial > mercurial > hgweb_rsearcher.cgi
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 14:c1dc1fcee7fe | 15:c262e17de9b1 |
|---|---|
| 1 /* | 1 /* |
| 2 server.go : server-program. | 2 server.go : server-program. |
| 3 Version : 1.4 | 3 Version : 1.5 |
| 4 Last Change: 2018-12-05 水 08:08:02. | 4 Last Change: 2019-05-29 水 08:58:19. |
| 5 | 5 |
| 6 install to: server_root/ | 6 install to: server_root/ |
| 7 | 7 |
| 8 server_root/server | 8 server_root/server |
| 9 + db/ | 9 + db/ |
| 20 "log" | 20 "log" |
| 21 "net" | 21 "net" |
| 22 "net/http" | 22 "net/http" |
| 23 "os" | 23 "os" |
| 24 "path/filepath" | 24 "path/filepath" |
| 25 "strings" | |
| 25 "time" | 26 "time" |
| 26 ) | 27 ) |
| 27 | 28 |
| 28 var ( | 29 var ( |
| 29 version string | 30 version string |
| 34 not_ac bool | 35 not_ac bool |
| 35 wlfile string | 36 wlfile string |
| 36 ) | 37 ) |
| 37 | 38 |
| 38 func init() { | 39 func init() { |
| 39 version = "1.4" // piece-image version | 40 version = "1.5" // piece-image version |
| 40 port = ":3910" | 41 port = ":3910" |
| 41 server_root = filepath.Dir( os.Args[0] ) | 42 server_root = filepath.Dir(os.Args[0]) |
| 42 logfile = filepath.Join( server_root, "rsearcher.log" ) | 43 logfile = filepath.Join(server_root, "rsearcher.log") |
| 43 wlfile = "rsearcher.whitelist" | 44 wlfile = "rsearcher.whitelist" |
| 44 } | 45 } |
| 45 | 46 |
| 46 func main() { | 47 func main() { |
| 47 | 48 |
| 48 flag.BoolVar( ¬_ac, "d", false, "no access control ( for debug )" ) | 49 flag.BoolVar(¬_ac, "d", false, "no access control ( for debug )") |
| 49 flag.Parse() | 50 flag.Parse() |
| 50 | 51 |
| 51 // setting IP-Address & Port | 52 // setting IP-Address & Port |
| 52 addrs, err := net.InterfaceAddrs() | 53 addrs, err := net.InterfaceAddrs() |
| 53 if err != nil { | 54 if err != nil { |
| 54 log.Fatal( err ) | 55 log.Fatal(err) |
| 55 } | 56 } |
| 56 for _, a := range addrs { | 57 for _, a := range addrs { |
| 57 if ipnet, ok := a.( *net.IPNet ); ok && !ipnet.IP.IsLoopback() { | 58 if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { |
| 59 if strings.HasPrefix(ipnet.IP.String(), "169.254") { | |
| 60 continue | |
| 61 } | |
| 58 if ipnet.IP.To4() != nil { | 62 if ipnet.IP.To4() != nil { |
| 59 server = ipnet.IP.String() + port | 63 server = ipnet.IP.String() + port |
| 60 } | 64 } |
| 61 } | 65 } |
| 62 } | 66 } |
| 63 | 67 |
| 64 // start Web-server | 68 // start Web-server |
| 65 fmt.Println( "server start [", server, "] ( program version", version, ")" ) | 69 fmt.Println("server start [", server, "] ( program version", version, ")") |
| 66 http.HandleFunc( "/", handler ) | 70 http.HandleFunc("/", handler ) |
| 67 http.HandleFunc( "/upload/", upload_handler ) | 71 http.HandleFunc("/upload/", upload_handler) |
| 68 http.HandleFunc( "/mngdb/", mngdb_handler ) | 72 http.HandleFunc("/mngdb/", mngdb_handler ) |
| 69 log.Fatal( http.ListenAndServe( server, nil ) ) | 73 log.Fatal(http.ListenAndServe(server, nil)) |
| 70 } | 74 } |
| 71 | 75 |
| 72 func handler( w http.ResponseWriter, r *http.Request ) { | 76 func handler(w http.ResponseWriter, r *http.Request) { |
| 73 if !not_ac && !is_valid_host( r.RemoteAddr ) { | 77 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 74 http.NotFound( w, r ) | 78 http.NotFound(w, r) |
| 75 return | 79 return |
| 76 } | 80 } |
| 77 | 81 |
| 78 file := filepath.Join( server_root, filepath.FromSlash( r.URL.Path ) ) | 82 file := filepath.Join(server_root, filepath.FromSlash(r.URL.Path)) |
| 79 img := r.URL.Query().Get( "q" ) | 83 //img := r.URL.Query().Get("q") |
| 80 | 84 |
| 81 fmt.Println( "[access]", r.RemoteAddr, "|", time.Now().Format( "2006-01-02 15:04" ), "|", file ) | 85 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", file) |
| 82 fmt.Println( "--", img , "--") | 86 //fmt.Println("--", img , "--") |
| 83 write_log( "[access] " + r.RemoteAddr + " " + file ) | 87 write_log("[access] " + r.RemoteAddr + " " + file) |
| 84 | 88 |
| 85 f, err := os.Open( file ) | 89 f, err := os.Open(file) |
| 86 if err != nil { | 90 if err != nil { |
| 87 http.NotFound( w, r ) | 91 http.NotFound(w, r) |
| 88 return | 92 return |
| 89 } | 93 } |
| 90 defer f.Close() | 94 defer f.Close() |
| 91 | 95 |
| 92 fi, _ := f.Stat() | 96 fi, _ := f.Stat() |
| 93 | 97 |
| 94 w.Header().Set( "Content-Type", "rsearcher/octet-stream" ) | 98 w.Header().Set("Content-Type", "rsearcher/octet-stream") |
| 95 w.Header().Set( "Content-Length", fmt.Sprintf( "%d", fi.Size() ) ) | 99 w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) |
| 96 io.Copy( w, f ) | 100 io.Copy(w, f) |
| 97 } | 101 } |
| 98 | 102 |
| 99 func upload_handler( w http.ResponseWriter, r *http.Request ) { | 103 func upload_handler(w http.ResponseWriter, r *http.Request) { |
| 100 if !not_ac && !is_valid_host( r.RemoteAddr ) { | 104 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 101 http.NotFound( w, r ) | 105 http.NotFound(w, r) |
| 102 return | 106 return |
| 103 } | 107 } |
| 104 | 108 |
| 105 fmt.Println( "[access]", r.RemoteAddr, "|", time.Now().Format( "2006-01-02 15:04" ), "|", "/upload" ) | 109 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", "/upload") |
| 106 now := time.Now().Format( "20060102_150405" ) | 110 now := time.Now().Format("20060102_150405") |
| 107 file := filepath.Join( server_root, "upload", now ) | 111 file := filepath.Join(server_root, "upload", now) |
| 108 f, err := os.Create( file ) | 112 f, err := os.Create(file) |
| 109 if err != nil { | 113 if err != nil { |
| 110 http.NotFound( w, r ) | 114 http.NotFound(w, r) |
| 111 return | 115 return |
| 112 } | 116 } |
| 113 n, err := io.Copy( f, r.Body ) | 117 n, err := io.Copy(f, r.Body) |
| 114 if err != nil { | 118 if err != nil { |
| 115 http.NotFound( w, r ) | 119 http.NotFound(w, r) |
| 116 return | 120 return |
| 117 } | 121 } |
| 118 f.Close() | 122 f.Close() |
| 119 w.Write( []byte( fmt.Sprintf( "%d bytes are recieved.\n", n ) ) ) | 123 w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) |
| 120 } | 124 } |
| 121 | 125 |
| 122 func mngdb_handler( w http.ResponseWriter, r *http.Request ) { | 126 func mngdb_handler(w http.ResponseWriter, r *http.Request) { |
| 123 if !not_ac && !is_valid_host( r.RemoteAddr ) { | 127 if !not_ac && !is_valid_host(r.RemoteAddr) { |
| 124 http.NotFound( w, r ) | 128 http.NotFound(w, r) |
| 125 return | 129 return |
| 126 } | 130 } |
| 127 | 131 |
| 128 fmt.Println( "[access]", r.RemoteAddr, "|", time.Now().Format( "2006-01-02 15:04" ), "|", "/mngdb" ) | 132 fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/mngdb") |
| 129 write_log( "[access] " + r.RemoteAddr + "manage-db" ) | 133 write_log("[access] " + r.RemoteAddr + "manage-db") |
| 130 db := r.URL.Path[ len( "/mngdb/" ): ] | 134 db := r.URL.Path[len("/mngdb/"):] |
| 131 | 135 |
| 132 file := filepath.Join( server_root, "db", db ) | 136 file := filepath.Join(server_root, "db", db) |
| 133 | 137 |
| 134 f, err := os.Create( file ) | 138 f, err := os.Create(file) |
| 135 if err != nil { | 139 if err != nil { |
| 136 http.NotFound( w, r ) | 140 http.NotFound(w, r) |
| 137 return | 141 return |
| 138 } | 142 } |
| 139 _, err = io.Copy( f, r.Body ) | 143 _, err = io.Copy(f, r.Body) |
| 140 if err != nil { | 144 if err != nil { |
| 141 http.NotFound( w, r ) | 145 http.NotFound(w, r) |
| 142 return | 146 return |
| 143 } | 147 } |
| 144 f.Close() | 148 f.Close() |
| 145 } | 149 } |
| 146 | 150 |
| 147 func is_valid_host( host string ) bool { | 151 func is_valid_host(host string) bool { |
| 148 f, _ := os.Open( wlfile ) | 152 f, _ := os.Open(wlfile) |
| 149 defer f.Close() | 153 defer f.Close() |
| 150 input := bufio.NewScanner( f ) | 154 input := bufio.NewScanner(f) |
| 151 for input.Scan() { | 155 for input.Scan() { |
| 152 if input.Text() == host { | 156 if input.Text() == host { |
| 153 return true | 157 return true |
| 154 } | 158 } |
| 155 } | 159 } |
| 156 return false | 160 return false |
| 157 } | 161 } |
| 158 | 162 |
| 159 func write_log( msg string ) { | 163 func write_log(msg string) { |
| 160 f, err := os.OpenFile( logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644 ) | 164 f, err := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) |
| 161 if err != nil { | 165 if err != nil { |
| 162 log.Fatal( err ) | 166 log.Fatal(err) |
| 163 } | 167 } |
| 164 defer f.Close() | 168 defer f.Close() |
| 165 | 169 |
| 166 logger := log.New( f, "", log.LstdFlags ) | 170 logger := log.New(f, "", log.LstdFlags) |
| 167 logger.Println( msg ) | 171 logger.Println(msg) |
| 168 } | 172 } |
| 169 | 173 |
