view go/client.go @ 2:7fe3417cefc8

GUI.
author pyon@macmini
date Tue, 02 Oct 2018 21:20:05 +0900
parents eaa27e4ed5be
children db4813125eb8
line wrap: on
line source

/*
 client.go  : client-program.
 Version    : 1.0
 Last Change: 2018-10-01 Mon 21:45:18.

 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
               + doc/
               + .cache/*.jpg ( 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"
)

func main() {
    var upgrade  = flag.Bool( "r", false, "" )  // get grsearcher.exe, client.exe
    var update   = flag.Bool( "u", false, "" )  // get auth.db, hhs.db, index.db(5day)
	flag.Parse()

    if *upgrade {
        if flag.NArg() != 1 {
            fmt.Fprintf( os.Stderr, "no 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 client.exe..." )
        if _, err := get_file( host, "/release/client.exe", "client1.exe" ); err != nil {
            log.Fatal( err )
        }
        os.Exit( 0 )
    }

	if *update {
        if flag.NArg() != 1 {
            fmt.Fprintf( os.Stderr, "no 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() % 10 == 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
	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.jpg", d, i )
        fn = fmt.Sprintf( "00000000_%d", i )    // for test

        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
}