view src/gf/gf.go @ 35:a4a54931b6fa

add gf.go.
author pyon@macmini
date Wed, 20 Nov 2019 06:19:13 +0900
parents
children a2e33e922a54
line wrap: on
line source

/*
Last Change: 2019-11-20 Wed 05:44:47.

 gf.go: Get Files (ver.0.3)

 ./gf.json: server & file list
 e.g.
 {
   "Server": {
     "Address": "sdm.sakura.ne.jp",
     "Port": "80"
   },
   "Files": [
     "mahjong.html",
     "gammon",
     "gammon/backgammon.html"
   ]
 }

 TODO:
  * goroutine
  * make dir option [-r]
  * json file option [-j]
*/
package main

import (
    "encoding/json"
    "fmt"
    "flag"
    "io/ioutil"
    "log"
    "os"
    "path"
    "net/http"
)

const version = "0.3"
const defaultjson = "gf.json"

type SV struct {
    Address string
    Port string
}

func (sv SV) String() string {
    return sv.Address + ":" + sv.Port
}

type GF struct {
    Server SV
    Files []string
}

var (
    ver bool
    quiet bool
    jsonfile string
)

func init() {
    flag.BoolVar(&ver, "v", false, "version.")
    flag.BoolVar(&quiet, "s", false, "silence.")
    flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.")
}

func main() {
    flag.Parse()

    if ver {
        fmt.Println("gf", version)
        os.Exit(0)
    }

    content, err := ioutil.ReadFile(jsonfile)
    if err != nil {
        log.Fatal(err)
    }

    var gf GF

    err = json.Unmarshal(content, &gf)
    if err != nil {
        log.Fatal(err)
    }
    n := len(gf.Files)
    if n > 1 {
        print_msg(fmt.Sprintf("%d files downloading\n", n), quiet)
    }

    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)
        }
    }
}

func http_get(server, file string) (string, error) {
    url := "http://" + server + "/" + file
    res, err := http.Get(url)
    if err != nil {
        return "", err
    }

    content, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        return "", err
    }
    if res.StatusCode != http.StatusOK {
        return res.Status, nil
    }

    err = ioutil.WriteFile(path.Base(file), content, 0644)
    if err != nil {
        return "", err
    }
    return res.Status, nil
}

func print_msg(msg string, q bool) {
    if !q {
        fmt.Print(msg)
    }
}