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