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