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 |