changeset 36:a2e33e922a54

ver up gf.go.
author pyon@macmini
date Thu, 21 Nov 2019 02:12:18 +0900
parents a4a54931b6fa
children 43adde439537
files src/gf/gf.go
diffstat 1 files changed, 97 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/gf/gf.go	Wed Nov 20 06:19:13 2019 +0900
+++ b/src/gf/gf.go	Thu Nov 21 02:12:18 2019 +0900
@@ -1,13 +1,13 @@
 /*
-Last Change: 2019-11-20 Wed 05:44:47.
+Last Change: 2019-11-21 Thu 02:11:35.
 
- gf.go: Get Files (ver.0.3)
+ gf.go: Get Files (ver.0.6)
 
  ./gf.json: server & file list
  e.g.
  {
    "Server": {
-     "Address": "sdm.sakura.ne.jp",
+     "Address": "hoge.com",
      "Port": "80"
    },
    "Files": [
@@ -18,9 +18,8 @@
  }
 
  TODO:
-  * goroutine
-  * make dir option [-r]
-  * json file option [-j]
+  + reserve dirtree option [-r]
+  + gunzip/untar option 
 */
 package main
 
@@ -32,11 +31,22 @@
     "log"
     "os"
     "path"
+	"path/filepath"
     "net/http"
 )
 
-const version = "0.3"
+const version = "0.6"
 const defaultjson = "gf.json"
+const samplejson = `{
+  "Server": {
+    "Address": "hoge.com",
+    "Port": "80"
+  },
+  "Files": [
+    "mahjong.html",
+    "gammon/backgammon.html"
+  ]
+}`
 
 type SV struct {
     Address string
@@ -52,16 +62,29 @@
     Files []string
 }
 
+type HO struct {	// html object
+	Status string
+	StatusCode int
+	Content []byte
+}
+
+// option valiables
 var (
     ver bool
     quiet bool
     jsonfile string
+	sample bool
+	somefile string
+	tdir string
 )
 
 func init() {
     flag.BoolVar(&ver, "v", false, "version.")
     flag.BoolVar(&quiet, "s", false, "silence.")
     flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.")
+    flag.BoolVar(&sample, "p", false, "print json sample.")
+    flag.StringVar(&somefile, "o", "", "get specity file.")
+    flag.StringVar(&tdir, "d", "", "specity save directory.")
 }
 
 func main() {
@@ -69,9 +92,24 @@
 
     if ver {
         fmt.Println("gf", version)
+		flag.PrintDefaults()
         os.Exit(0)
     }
 
+	if sample {
+		fmt.Println(samplejson)
+        os.Exit(0)
+	}
+
+	if somefile != "" {
+		ho, err := http_get(somefile)
+		if err != nil {
+			log.Fatal(err)
+		}
+		fmt.Print(string(ho.Content))
+        os.Exit(0)
+	}
+
     content, err := ioutil.ReadFile(jsonfile)
     if err != nil {
         log.Fatal(err)
@@ -83,48 +121,77 @@
     if err != nil {
         log.Fatal(err)
     }
+
+	if tdir != "" {
+		if err := os.Mkdir(tdir, 0755); err != nil {
+			log.Fatal(err)
+		}
+	}
+
     n := len(gf.Files)
     if n > 1 {
-        print_msg(fmt.Sprintf("%d files downloading\n", n), quiet)
+        print_msg(fmt.Sprintf("%d files downloading", n))
     }
 
+	ch := make(chan string)
     for _, f := range gf.Files {
-        print_msg(" getting " + f + "...", quiet)
-        status, err := http_get(gf.Server.String(), f)
-        if err != nil {
-            print_msg(fmt.Sprintf(" [ERROR] %s\n", err), quiet)
-        } else {
-            print_msg(" [" + status + "]\n", quiet)
-        }
+		go http_gets(gf.Server.String(), f, ch)
     }
+
+    for range gf.Files {
+		print_msg(<-ch)
+	}
 }
 
-func http_get(server, file string) (string, error) {
-    url := "http://" + server + "/" + file
+func http_get(url string) (HO, error) {
+	var ho HO
+
     res, err := http.Get(url)
     if err != nil {
-        return "", err
+        return ho, err
     }
 
     content, err := ioutil.ReadAll(res.Body)
     res.Body.Close()
     if err != nil {
-        return "", err
-    }
-    if res.StatusCode != http.StatusOK {
-        return res.Status, nil
+        return ho, err
     }
 
-    err = ioutil.WriteFile(path.Base(file), content, 0644)
-    if err != nil {
-        return "", err
-    }
-    return res.Status, nil
+	ho.Status = res.Status
+	ho.StatusCode = res.StatusCode
+	ho.Content = content
+
+	return ho, nil
 }
 
-func print_msg(msg string, q bool) {
-    if !q {
-        fmt.Print(msg)
+func http_gets(server, file string, ch chan<- string) {
+	msg := " getting " + file + "... "
+
+    url := "http://" + server + "/" + file
+
+	ho, err := http_get(url)
+	if err != nil {
+		ch <- msg + fmt.Sprint(err)
+        return
+	}
+
+    if ho.StatusCode == http.StatusOK {
+		file = path.Base(file)
+		if tdir != "" {
+			file = filepath.Join(tdir, file)
+		}
+		if err := ioutil.WriteFile(file, ho.Content, 0644); err != nil {
+			ch <- msg + fmt.Sprint(err)
+			return
+		}
+    }
+
+	ch <- msg + "[" + ho.Status + "]"
+}
+
+func print_msg(msg string) {
+    if !quiet {
+        fmt.Println(msg)
     }
 }