view 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
line wrap: on
line source

/*
 server.go  : server-program.
 Version    : 1.5
 Last Change: 2019-05-29 水 08:58:19.

 install to: server_root/

 server_root/server
            + db/
            + release/
            + images/
*/
package main

import(
	"bufio"
	"flag"
	"fmt"
	"io"
	"log"
	"net"
    "net/http"
	"os"
    "path/filepath"
	"strings"
	"time"
)

var (
	version string
	server string
	port   string
	server_root string
	logfile string
	not_ac bool
	wlfile string
)

func init() {
	version = "1.5"	// piece-image version
	port = ":3910"
    server_root = filepath.Dir(os.Args[0])
	logfile = filepath.Join(server_root, "rsearcher.log")
	wlfile = "rsearcher.whitelist"
}

func main() {

    flag.BoolVar(&not_ac, "d", false, "no access control ( for debug )")
	flag.Parse()

	// setting IP-Address & Port
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		log.Fatal(err)
	}
	for _, a := range addrs {
		if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if strings.HasPrefix(ipnet.IP.String(), "169.254") {
				continue
			}
			if ipnet.IP.To4() != nil {
				server = ipnet.IP.String() + port
			}
		}
	}

	// start Web-server
	fmt.Println("server start [", server, "] ( program version", version, ")")
	http.HandleFunc("/",        handler       )
	http.HandleFunc("/upload/", upload_handler)
	http.HandleFunc("/mngdb/",  mngdb_handler )
	log.Fatal(http.ListenAndServe(server, nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
	if !not_ac && !is_valid_host(r.RemoteAddr) {
		http.NotFound(w, r)
		return
	}

	file := filepath.Join(server_root, filepath.FromSlash(r.URL.Path))
	//img := r.URL.Query().Get("q")

	fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", file)
	//fmt.Println("--", img , "--")
	write_log("[access] " + r.RemoteAddr + " " + file)

	f, err := os.Open(file)
	if err != nil {
		http.NotFound(w, r)
		return
	}
	defer f.Close()

	fi, _ := f.Stat()

	w.Header().Set("Content-Type",   "rsearcher/octet-stream")
	w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size()))
	io.Copy(w, f)
}

func upload_handler(w http.ResponseWriter, r *http.Request) {
	if !not_ac && !is_valid_host(r.RemoteAddr) {
		http.NotFound(w, r)
		return
	}

	fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04"), "|", "/upload")
	now := time.Now().Format("20060102_150405")
	file := filepath.Join(server_root, "upload", now)
	f, err := os.Create(file)
	if err != nil {
		http.NotFound(w, r)
		return
	}
	n, err := io.Copy(f, r.Body)
	if err != nil {
		http.NotFound(w, r)
		return
	}
	f.Close()
	w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n)))
}

func mngdb_handler(w http.ResponseWriter, r *http.Request) {
	if !not_ac && !is_valid_host(r.RemoteAddr) {
		http.NotFound(w, r)
		return
	}

	fmt.Println("[access]", r.RemoteAddr, "|", time.Now().Format("2006-01-02 15:04" ), "|", "/mngdb")
	write_log("[access] " + r.RemoteAddr + "manage-db")
	db := r.URL.Path[len("/mngdb/"):]

	file := filepath.Join(server_root, "db", db)

	f, err := os.Create(file)
	if err != nil {
		http.NotFound(w, r)
		return
	}
	_, err = io.Copy(f, r.Body)
	if err != nil {
		http.NotFound(w, r)
		return
	}
	f.Close()
}

func is_valid_host(host string) bool {
	f, _ := os.Open(wlfile)
	defer f.Close()
	input := bufio.NewScanner(f)
	for input.Scan() {
		if input.Text() == host {
			return true
		}
	}
	return false
}

func write_log(msg string) {
	f, err := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	logger := log.New(f, "", log.LstdFlags)
	logger.Println(msg)
}