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 |