Mercurial > mercurial > hgweb_golang.cgi
comparison src/gf/gf.go @ 35:a4a54931b6fa
add gf.go.
| author | pyon@macmini |
|---|---|
| date | Wed, 20 Nov 2019 06:19:13 +0900 |
| parents | |
| children | a2e33e922a54 |
comparison
equal
deleted
inserted
replaced
| 34:8a9ffd02a148 | 35:a4a54931b6fa |
|---|---|
| 1 /* | |
| 2 Last Change: 2019-11-20 Wed 05:44:47. | |
| 3 | |
| 4 gf.go: Get Files (ver.0.3) | |
| 5 | |
| 6 ./gf.json: server & file list | |
| 7 e.g. | |
| 8 { | |
| 9 "Server": { | |
| 10 "Address": "sdm.sakura.ne.jp", | |
| 11 "Port": "80" | |
| 12 }, | |
| 13 "Files": [ | |
| 14 "mahjong.html", | |
| 15 "gammon", | |
| 16 "gammon/backgammon.html" | |
| 17 ] | |
| 18 } | |
| 19 | |
| 20 TODO: | |
| 21 * goroutine | |
| 22 * make dir option [-r] | |
| 23 * json file option [-j] | |
| 24 */ | |
| 25 package main | |
| 26 | |
| 27 import ( | |
| 28 "encoding/json" | |
| 29 "fmt" | |
| 30 "flag" | |
| 31 "io/ioutil" | |
| 32 "log" | |
| 33 "os" | |
| 34 "path" | |
| 35 "net/http" | |
| 36 ) | |
| 37 | |
| 38 const version = "0.3" | |
| 39 const defaultjson = "gf.json" | |
| 40 | |
| 41 type SV struct { | |
| 42 Address string | |
| 43 Port string | |
| 44 } | |
| 45 | |
| 46 func (sv SV) String() string { | |
| 47 return sv.Address + ":" + sv.Port | |
| 48 } | |
| 49 | |
| 50 type GF struct { | |
| 51 Server SV | |
| 52 Files []string | |
| 53 } | |
| 54 | |
| 55 var ( | |
| 56 ver bool | |
| 57 quiet bool | |
| 58 jsonfile string | |
| 59 ) | |
| 60 | |
| 61 func init() { | |
| 62 flag.BoolVar(&ver, "v", false, "version.") | |
| 63 flag.BoolVar(&quiet, "s", false, "silence.") | |
| 64 flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") | |
| 65 } | |
| 66 | |
| 67 func main() { | |
| 68 flag.Parse() | |
| 69 | |
| 70 if ver { | |
| 71 fmt.Println("gf", version) | |
| 72 os.Exit(0) | |
| 73 } | |
| 74 | |
| 75 content, err := ioutil.ReadFile(jsonfile) | |
| 76 if err != nil { | |
| 77 log.Fatal(err) | |
| 78 } | |
| 79 | |
| 80 var gf GF | |
| 81 | |
| 82 err = json.Unmarshal(content, &gf) | |
| 83 if err != nil { | |
| 84 log.Fatal(err) | |
| 85 } | |
| 86 n := len(gf.Files) | |
| 87 if n > 1 { | |
| 88 print_msg(fmt.Sprintf("%d files downloading\n", n), quiet) | |
| 89 } | |
| 90 | |
| 91 for _, f := range gf.Files { | |
| 92 print_msg(" getting " + f + "...", quiet) | |
| 93 status, err := http_get(gf.Server.String(), f) | |
| 94 if err != nil { | |
| 95 print_msg(fmt.Sprintf(" [ERROR] %s\n", err), quiet) | |
| 96 } else { | |
| 97 print_msg(" [" + status + "]\n", quiet) | |
| 98 } | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 func http_get(server, file string) (string, error) { | |
| 103 url := "http://" + server + "/" + file | |
| 104 res, err := http.Get(url) | |
| 105 if err != nil { | |
| 106 return "", err | |
| 107 } | |
| 108 | |
| 109 content, err := ioutil.ReadAll(res.Body) | |
| 110 res.Body.Close() | |
| 111 if err != nil { | |
| 112 return "", err | |
| 113 } | |
| 114 if res.StatusCode != http.StatusOK { | |
| 115 return res.Status, nil | |
| 116 } | |
| 117 | |
| 118 err = ioutil.WriteFile(path.Base(file), content, 0644) | |
| 119 if err != nil { | |
| 120 return "", err | |
| 121 } | |
| 122 return res.Status, nil | |
| 123 } | |
| 124 | |
| 125 func print_msg(msg string, q bool) { | |
| 126 if !q { | |
| 127 fmt.Print(msg) | |
| 128 } | |
| 129 } | |
| 130 |
