view go/client.go @ 7:29829e98d510

add net.cpp
author pyon@macmini
date Fri, 26 Oct 2018 21:05:11 +0900
parents 06342fc544e4
children 82f9af6aa7e4
line wrap: on
line source

/*
 client.go  : client-program.
 Version    : 1.1
 Last Change: 2018-10-24 水 17:21:52.

 install to: rsearcher_root/

 rsearcher_root/client.exe
               + grsearcher.exe
               + app.conf
               + verup.bat
               + auth.db ( temporary )
               + hhs.db  ( temporary )
               + index.db ( 10 days )
               + image/*.png, *.jpg
               + doc/
               + .cache/* ( temporary )

 $ client.exe -r 192.168.0.1:3910   # get new release
 $ client.exe -u 192.168.0.1:3910   # get new dbs
 $ client.exe 192.168.0.1:3910 0800012345 20171231  # get images
*/
package main

import (
    "archive/tar"
    "bytes"
    "compress/gzip"
	"flag"
	"fmt"
	"io"
	"io/ioutil"
	"log"
    "net/http"
	"os"
    "path/filepath"
	"regexp"
    "time"
)

var version string

func init() {
	version = "1.1"
}

func main() {
    var upgrade  = flag.Bool( "r", false, "" )  // get grsearcher.exe, crypto.exe client.exe
    var update   = flag.Bool( "u", false, "" )  // get auth.db, hhs.db, index.db(14,28)
    var upload   = flag.Bool( "a", false, "" )  // post somefile
    var printver = flag.Bool( "v", false, "" )  // print version
	flag.Parse()

	// print version
	if *printver {
		fmt.Println( "client ( version ", version, ")" )
		os.Exit( 0 )
	}

	// upload
    if *upload {
        if flag.NArg() != 2 {
            fmt.Fprintf( os.Stderr, "bad host or file.\n" )
            os.Exit( 1 )
        }
        host := flag.Args()[0]
        file := flag.Args()[1]
        fmt.Printf( "Sending %s...", file )
		f, err := os.Open( file )
		if err != nil {
			log.Fatal( err )
		}
		defer f.Close()

		res, err := http.Post( "http://" + host + "/upload", "binary/octet-stream", f )
		if err != nil {
			log.Fatal( err )
		}
		defer res.Body.Close()
		message, _ := ioutil.ReadAll( res.Body )
		fmt.Println( string( message ) )

		os.Exit( 0 )
	}

	// software upgrade
    if *upgrade {
        if flag.NArg() != 1 {
            fmt.Fprintf( os.Stderr, "bad remote host.\n" )
            os.Exit( 1 )
        }
        fmt.Print( "Getting grsearcher.exe..." )
        host := flag.Args()[0]
        if _, err := get_file( host, "/release/grsearcher.exe", "grsearcher.exe" ); err != nil {
            log.Fatal( err )
        }
        fmt.Print( "Getting crypto.exe..." )
        if _, err := get_file( host, "/release/crypto.exe", "crypto.exe" ); err != nil {
            log.Fatal( err )
        }
        fmt.Print( "Getting client.exe..." )
        if _, err := get_file( host, "/release/client.exe", "client1.exe" ); err != nil {
            log.Fatal( err )
        }
        os.Exit( 0 )
    }

	// database update
	if *update {
        if flag.NArg() != 1 {
            fmt.Fprintf( os.Stderr, "bad remote host.\n" )
            os.Exit( 1 )
        }
        fmt.Print( "Getting auth.db..." )
        host := flag.Args()[0]
        if _, err := get_file( host, "/db/auth.db", "auth.db" ); err != nil {
            log.Fatal( err )
        }
        fmt.Print( "Getting hhs.db..." )
        if _, err := get_file( host, "/db/hhs.db", "hhs.db" ); err != nil {
            log.Fatal( err )
        }

        if time.Now().Day() % 14 == 0 {
            fmt.Print( "Getting index.db..." )
            if _, err := get_file( host, "/db/index.db", "index.db" ); err != nil {
                log.Fatal( err )
            }
        }
		os.Exit( 0 )
	}

    // main : image download
	if flag.NArg() != 3 {
		fmt.Fprintf( os.Stderr, "bad argument.\n" )
		os.Exit( 1 )
	}

	host := flag.Args()[0]
	h := flag.Args()[1]
	d := flag.Args()[2]

	r, err := regexp.Compile( "^0[1238][0-9]{8}$" )
	if err != nil {
		log.Fatal( err )
	}
	m := r.FindString( h )
	if len( m ) == 0 {
		fmt.Fprintf( os.Stderr, "bad hno.\n" )
		os.Exit( 1 )
	}

    rfile := "/images/" + d + "/" + h + ".tgz"
    b, err := get_file( host, rfile, "" )
	if err != nil {
		log.Fatal( err )
	}
    if err := untgz_images( d, b ); err != nil {
		log.Fatal( err )
    }
}

/* Subroutines */
// HTTP GET
func get_file( host, rfile, lfile string ) ( []byte, error ) {
    res, err := http.Get( "http://" + host + "/" + rfile )
    if err != nil {
        return nil, err
    }
    fmt.Println( "\t[" + res.Status + "]" )
    if res.StatusCode == http.StatusNotFound {
        return nil, nil
    }
    b, err := ioutil.ReadAll( res.Body )
    res.Body.Close()
    if err != nil {
        return nil, err
    }
    if lfile != "" {
        if err := ioutil.WriteFile( lfile, b, 0644 ); err != nil {
            return nil, err
        }
        return nil, nil
    }
    return b, nil
}

// Un-Tar/Gzip
func untgz_images( d string, b []byte ) error {
	br := bytes.NewReader( b )
    zr, err := gzip.NewReader( br )
	if err != nil {
        return err
	}

	tr := tar.NewReader( zr )
    for i := 1; ; i++ {
		//hdr, err := tr.Next()
		_, err := tr.Next()
		if err == io.EOF {
			break // End of archive
		}
		if err != nil {
            return err
		}
        //f, _ :=  os.Create( hdr.Name )
        fn := fmt.Sprintf( "%s_%d", d, i )	// 1.0a

        fn = filepath.Join( ".cache", fn )
        f, _ :=  os.Create( fn )
		if _, err := io.Copy( f, tr ); err != nil {
            return err
		}
        f.Close()
	}

	if err := zr.Close(); err != nil {
        return err
	}
    return nil
}