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 |