Mercurial > mercurial > hgweb_golang.cgi
view src/gf/gf.go @ 36:a2e33e922a54
ver up gf.go.
author | pyon@macmini |
---|---|
date | Thu, 21 Nov 2019 02:12:18 +0900 |
parents | a4a54931b6fa |
children | 43adde439537 |
line wrap: on
line source
/* Last Change: 2019-11-21 Thu 02:11:35. gf.go: Get Files (ver.0.6) ./gf.json: server & file list e.g. { "Server": { "Address": "hoge.com", "Port": "80" }, "Files": [ "mahjong.html", "gammon", "gammon/backgammon.html" ] } TODO: + reserve dirtree option [-r] + gunzip/untar option */ package main import ( "encoding/json" "fmt" "flag" "io/ioutil" "log" "os" "path" "path/filepath" "net/http" ) const version = "0.6" const defaultjson = "gf.json" const samplejson = `{ "Server": { "Address": "hoge.com", "Port": "80" }, "Files": [ "mahjong.html", "gammon/backgammon.html" ] }` type SV struct { Address string Port string } func (sv SV) String() string { return sv.Address + ":" + sv.Port } type GF struct { Server SV Files []string } type HO struct { // html object Status string StatusCode int Content []byte } // option valiables var ( ver bool quiet bool jsonfile string sample bool somefile string tdir string ) func init() { flag.BoolVar(&ver, "v", false, "version.") flag.BoolVar(&quiet, "s", false, "silence.") flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") flag.BoolVar(&sample, "p", false, "print json sample.") flag.StringVar(&somefile, "o", "", "get specity file.") flag.StringVar(&tdir, "d", "", "specity save directory.") } func main() { flag.Parse() if ver { fmt.Println("gf", version) flag.PrintDefaults() os.Exit(0) } if sample { fmt.Println(samplejson) os.Exit(0) } if somefile != "" { ho, err := http_get(somefile) if err != nil { log.Fatal(err) } fmt.Print(string(ho.Content)) os.Exit(0) } content, err := ioutil.ReadFile(jsonfile) if err != nil { log.Fatal(err) } var gf GF err = json.Unmarshal(content, &gf) if err != nil { log.Fatal(err) } if tdir != "" { if err := os.Mkdir(tdir, 0755); err != nil { log.Fatal(err) } } n := len(gf.Files) if n > 1 { print_msg(fmt.Sprintf("%d files downloading", n)) } ch := make(chan string) for _, f := range gf.Files { go http_gets(gf.Server.String(), f, ch) } for range gf.Files { print_msg(<-ch) } } func http_get(url string) (HO, error) { var ho HO res, err := http.Get(url) if err != nil { return ho, err } content, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { return ho, err } ho.Status = res.Status ho.StatusCode = res.StatusCode ho.Content = content return ho, nil } func http_gets(server, file string, ch chan<- string) { msg := " getting " + file + "... " url := "http://" + server + "/" + file ho, err := http_get(url) if err != nil { ch <- msg + fmt.Sprint(err) return } if ho.StatusCode == http.StatusOK { file = path.Base(file) if tdir != "" { file = filepath.Join(tdir, file) } if err := ioutil.WriteFile(file, ho.Content, 0644); err != nil { ch <- msg + fmt.Sprint(err) return } } ch <- msg + "[" + ho.Status + "]" } func print_msg(msg string) { if !quiet { fmt.Println(msg) } }