view go/server.go @ 14:c1dc1fcee7fe

print zoom.
author pyon@macmini
date Sun, 09 Dec 2018 14:38:15 +0900
parents f5ffc34f045a
children c262e17de9b1
line wrap: on
line source

/*
 server.go  : server-program.
 Version    : 1.4
 Last Change: 2018-12-05 水 08:08:02.

 install to: server_root/

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

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

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

func init() {
	version = "1.4"	// 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 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 )
}