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( &not_ac, "d", false, "no access control ( for debug )" ) 49 flag.BoolVar(&not_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