# HG changeset patch # User pyon@macmini # Date 1574198353 -32400 # Node ID a4a54931b6facd1d871e3df4bdb3c87148812ab7 # Parent 8a9ffd02a148c53211dc194a9c3f02cd04399abd add gf.go. diff -r 8a9ffd02a148 -r a4a54931b6fa src/gf/gf.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gf/gf.go Wed Nov 20 06:19:13 2019 +0900 @@ -0,0 +1,130 @@ +/* +Last Change: 2019-11-20 Wed 05:44:47. + + gf.go: Get Files (ver.0.3) + + ./gf.json: server & file list + e.g. + { + "Server": { + "Address": "sdm.sakura.ne.jp", + "Port": "80" + }, + "Files": [ + "mahjong.html", + "gammon", + "gammon/backgammon.html" + ] + } + + TODO: + * goroutine + * make dir option [-r] + * json file option [-j] +*/ +package main + +import ( + "encoding/json" + "fmt" + "flag" + "io/ioutil" + "log" + "os" + "path" + "net/http" +) + +const version = "0.3" +const defaultjson = "gf.json" + +type SV struct { + Address string + Port string +} + +func (sv SV) String() string { + return sv.Address + ":" + sv.Port +} + +type GF struct { + Server SV + Files []string +} + +var ( + ver bool + quiet bool + jsonfile string +) + +func init() { + flag.BoolVar(&ver, "v", false, "version.") + flag.BoolVar(&quiet, "s", false, "silence.") + flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") +} + +func main() { + flag.Parse() + + if ver { + fmt.Println("gf", version) + 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) + } + n := len(gf.Files) + if n > 1 { + print_msg(fmt.Sprintf("%d files downloading\n", n), quiet) + } + + for _, f := range gf.Files { + print_msg(" getting " + f + "...", quiet) + status, err := http_get(gf.Server.String(), f) + if err != nil { + print_msg(fmt.Sprintf(" [ERROR] %s\n", err), quiet) + } else { + print_msg(" [" + status + "]\n", quiet) + } + } +} + +func http_get(server, file string) (string, error) { + url := "http://" + server + "/" + file + res, err := http.Get(url) + if err != nil { + return "", err + } + + content, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + return "", err + } + if res.StatusCode != http.StatusOK { + return res.Status, nil + } + + err = ioutil.WriteFile(path.Base(file), content, 0644) + if err != nil { + return "", err + } + return res.Status, nil +} + +func print_msg(msg string, q bool) { + if !q { + fmt.Print(msg) + } +} +