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