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