Mercurial > mercurial > hgweb_golang.cgi
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 35:a4a54931b6fa | 36:a2e33e922a54 |
|---|---|
| 1 /* | 1 /* |
| 2 Last Change: 2019-11-20 Wed 05:44:47. | 2 Last Change: 2019-11-21 Thu 02:11:35. |
| 3 | 3 |
| 4 gf.go: Get Files (ver.0.3) | 4 gf.go: Get Files (ver.0.6) |
| 5 | 5 |
| 6 ./gf.json: server & file list | 6 ./gf.json: server & file list |
| 7 e.g. | 7 e.g. |
| 8 { | 8 { |
| 9 "Server": { | 9 "Server": { |
| 10 "Address": "sdm.sakura.ne.jp", | 10 "Address": "hoge.com", |
| 11 "Port": "80" | 11 "Port": "80" |
| 12 }, | 12 }, |
| 13 "Files": [ | 13 "Files": [ |
| 14 "mahjong.html", | 14 "mahjong.html", |
| 15 "gammon", | 15 "gammon", |
| 16 "gammon/backgammon.html" | 16 "gammon/backgammon.html" |
| 17 ] | 17 ] |
| 18 } | 18 } |
| 19 | 19 |
| 20 TODO: | 20 TODO: |
| 21 * goroutine | 21 + reserve dirtree option [-r] |
| 22 * make dir option [-r] | 22 + gunzip/untar option |
| 23 * json file option [-j] | |
| 24 */ | 23 */ |
| 25 package main | 24 package main |
| 26 | 25 |
| 27 import ( | 26 import ( |
| 28 "encoding/json" | 27 "encoding/json" |
| 30 "flag" | 29 "flag" |
| 31 "io/ioutil" | 30 "io/ioutil" |
| 32 "log" | 31 "log" |
| 33 "os" | 32 "os" |
| 34 "path" | 33 "path" |
| 34 "path/filepath" | |
| 35 "net/http" | 35 "net/http" |
| 36 ) | 36 ) |
| 37 | 37 |
| 38 const version = "0.3" | 38 const version = "0.6" |
| 39 const defaultjson = "gf.json" | 39 const defaultjson = "gf.json" |
| 40 const samplejson = `{ | |
| 41 "Server": { | |
| 42 "Address": "hoge.com", | |
| 43 "Port": "80" | |
| 44 }, | |
| 45 "Files": [ | |
| 46 "mahjong.html", | |
| 47 "gammon/backgammon.html" | |
| 48 ] | |
| 49 }` | |
| 40 | 50 |
| 41 type SV struct { | 51 type SV struct { |
| 42 Address string | 52 Address string |
| 43 Port string | 53 Port string |
| 44 } | 54 } |
| 50 type GF struct { | 60 type GF struct { |
| 51 Server SV | 61 Server SV |
| 52 Files []string | 62 Files []string |
| 53 } | 63 } |
| 54 | 64 |
| 65 type HO struct { // html object | |
| 66 Status string | |
| 67 StatusCode int | |
| 68 Content []byte | |
| 69 } | |
| 70 | |
| 71 // option valiables | |
| 55 var ( | 72 var ( |
| 56 ver bool | 73 ver bool |
| 57 quiet bool | 74 quiet bool |
| 58 jsonfile string | 75 jsonfile string |
| 76 sample bool | |
| 77 somefile string | |
| 78 tdir string | |
| 59 ) | 79 ) |
| 60 | 80 |
| 61 func init() { | 81 func init() { |
| 62 flag.BoolVar(&ver, "v", false, "version.") | 82 flag.BoolVar(&ver, "v", false, "version.") |
| 63 flag.BoolVar(&quiet, "s", false, "silence.") | 83 flag.BoolVar(&quiet, "s", false, "silence.") |
| 64 flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") | 84 flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") |
| 85 flag.BoolVar(&sample, "p", false, "print json sample.") | |
| 86 flag.StringVar(&somefile, "o", "", "get specity file.") | |
| 87 flag.StringVar(&tdir, "d", "", "specity save directory.") | |
| 65 } | 88 } |
| 66 | 89 |
| 67 func main() { | 90 func main() { |
| 68 flag.Parse() | 91 flag.Parse() |
| 69 | 92 |
| 70 if ver { | 93 if ver { |
| 71 fmt.Println("gf", version) | 94 fmt.Println("gf", version) |
| 95 flag.PrintDefaults() | |
| 72 os.Exit(0) | 96 os.Exit(0) |
| 73 } | 97 } |
| 98 | |
| 99 if sample { | |
| 100 fmt.Println(samplejson) | |
| 101 os.Exit(0) | |
| 102 } | |
| 103 | |
| 104 if somefile != "" { | |
| 105 ho, err := http_get(somefile) | |
| 106 if err != nil { | |
| 107 log.Fatal(err) | |
| 108 } | |
| 109 fmt.Print(string(ho.Content)) | |
| 110 os.Exit(0) | |
| 111 } | |
| 74 | 112 |
| 75 content, err := ioutil.ReadFile(jsonfile) | 113 content, err := ioutil.ReadFile(jsonfile) |
| 76 if err != nil { | 114 if err != nil { |
| 77 log.Fatal(err) | 115 log.Fatal(err) |
| 78 } | 116 } |
| 81 | 119 |
| 82 err = json.Unmarshal(content, &gf) | 120 err = json.Unmarshal(content, &gf) |
| 83 if err != nil { | 121 if err != nil { |
| 84 log.Fatal(err) | 122 log.Fatal(err) |
| 85 } | 123 } |
| 124 | |
| 125 if tdir != "" { | |
| 126 if err := os.Mkdir(tdir, 0755); err != nil { | |
| 127 log.Fatal(err) | |
| 128 } | |
| 129 } | |
| 130 | |
| 86 n := len(gf.Files) | 131 n := len(gf.Files) |
| 87 if n > 1 { | 132 if n > 1 { |
| 88 print_msg(fmt.Sprintf("%d files downloading\n", n), quiet) | 133 print_msg(fmt.Sprintf("%d files downloading", n)) |
| 89 } | 134 } |
| 90 | 135 |
| 136 ch := make(chan string) | |
| 91 for _, f := range gf.Files { | 137 for _, f := range gf.Files { |
| 92 print_msg(" getting " + f + "...", quiet) | 138 go http_gets(gf.Server.String(), f, ch) |
| 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 } | 139 } |
| 140 | |
| 141 for range gf.Files { | |
| 142 print_msg(<-ch) | |
| 143 } | |
| 100 } | 144 } |
| 101 | 145 |
| 102 func http_get(server, file string) (string, error) { | 146 func http_get(url string) (HO, error) { |
| 103 url := "http://" + server + "/" + file | 147 var ho HO |
| 148 | |
| 104 res, err := http.Get(url) | 149 res, err := http.Get(url) |
| 105 if err != nil { | 150 if err != nil { |
| 106 return "", err | 151 return ho, err |
| 107 } | 152 } |
| 108 | 153 |
| 109 content, err := ioutil.ReadAll(res.Body) | 154 content, err := ioutil.ReadAll(res.Body) |
| 110 res.Body.Close() | 155 res.Body.Close() |
| 111 if err != nil { | 156 if err != nil { |
| 112 return "", err | 157 return ho, err |
| 113 } | |
| 114 if res.StatusCode != http.StatusOK { | |
| 115 return res.Status, nil | |
| 116 } | 158 } |
| 117 | 159 |
| 118 err = ioutil.WriteFile(path.Base(file), content, 0644) | 160 ho.Status = res.Status |
| 119 if err != nil { | 161 ho.StatusCode = res.StatusCode |
| 120 return "", err | 162 ho.Content = content |
| 121 } | 163 |
| 122 return res.Status, nil | 164 return ho, nil |
| 123 } | 165 } |
| 124 | 166 |
| 125 func print_msg(msg string, q bool) { | 167 func http_gets(server, file string, ch chan<- string) { |
| 126 if !q { | 168 msg := " getting " + file + "... " |
| 127 fmt.Print(msg) | 169 |
| 170 url := "http://" + server + "/" + file | |
| 171 | |
| 172 ho, err := http_get(url) | |
| 173 if err != nil { | |
| 174 ch <- msg + fmt.Sprint(err) | |
| 175 return | |
| 176 } | |
| 177 | |
| 178 if ho.StatusCode == http.StatusOK { | |
| 179 file = path.Base(file) | |
| 180 if tdir != "" { | |
| 181 file = filepath.Join(tdir, file) | |
| 182 } | |
| 183 if err := ioutil.WriteFile(file, ho.Content, 0644); err != nil { | |
| 184 ch <- msg + fmt.Sprint(err) | |
| 185 return | |
| 186 } | |
| 187 } | |
| 188 | |
| 189 ch <- msg + "[" + ho.Status + "]" | |
| 190 } | |
| 191 | |
| 192 func print_msg(msg string) { | |
| 193 if !quiet { | |
| 194 fmt.Println(msg) | |
| 128 } | 195 } |
| 129 } | 196 } |
| 130 | 197 |
