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