65
|
1 /*
|
|
2 Last Change: 2022-05-17 Tue 22:56:41.
|
|
3 */
|
|
4
|
|
5 package main
|
|
6
|
|
7 import (
|
|
8 "encoding/csv"
|
|
9 "fmt"
|
|
10 "io"
|
|
11 "log"
|
|
12 "net/http"
|
|
13 "os"
|
|
14 "path"
|
|
15 "path/filepath"
|
|
16 "strings"
|
|
17 )
|
|
18
|
|
19 var (
|
|
20 server string
|
|
21 hhsdb string
|
|
22 indexdb string
|
|
23 imagedir string
|
|
24 lastymd string
|
|
25 )
|
|
26
|
|
27 func init() {
|
|
28 hhsdb = "hhsdb.csv"
|
|
29 indexdb = "index.csv"
|
|
30 imagedir = "images"
|
|
31 lastymd = "20000101"
|
|
32 }
|
|
33
|
|
34 func main() {
|
|
35 if len(os.Args) != 2 {
|
|
36 fmt.Fprintln(os.Stderr, "[usage] > server_backup 192.168.0.1:8080")
|
|
37 os.Exit(1)
|
|
38 }
|
|
39
|
|
40 dirs, err := os.ReadDir(imagedir)
|
|
41 if err != nil {
|
|
42 log.Fatal(err)
|
|
43 }
|
|
44
|
|
45 for _, dir := range dirs {
|
|
46 if strings.Compare(dir.Name(), lastymd) > 0 {
|
|
47 lastymd = dir.Name()
|
|
48 }
|
|
49 }
|
|
50 fmt.Println("last date :", lastymd)
|
|
51
|
|
52 server = "http://" + os.Args[1] + "/"
|
|
53
|
|
54 // Get /ha/ -> hhsdb.csv
|
|
55 os.Rename(hhsdb, hhsdb + ".bak")
|
|
56 if err := http_get("/ha/", hhsdb); err != nil {
|
|
57 os.Rename(hhsdb + ".bak", hhsdb)
|
|
58 log.Fatal(err)
|
|
59 }
|
|
60 fmt.Println("get hhsdb.csv : done.")
|
|
61
|
|
62 // Get /d/ -> index.csv
|
|
63 os.Rename(indexdb, indexdb + ".bak")
|
|
64 if err := http_get("/d/", indexdb); err != nil {
|
|
65 os.Rename(indexdb + ".bak", indexdb)
|
|
66 log.Fatal(err)
|
|
67 }
|
|
68 fmt.Println("get index.csv : done.")
|
|
69
|
|
70 // Get /i/20200110/0800012345.tgz
|
|
71 var tgzs []string
|
|
72
|
|
73 b, err := os.ReadFile(indexdb)
|
|
74 if err != nil {
|
|
75 log.Fatal(err)
|
|
76 }
|
|
77 rd := csv.NewReader(strings.NewReader(string(b)))
|
|
78 for {
|
|
79 record, err := rd.Read()
|
|
80 if err == io.EOF {
|
|
81 break
|
|
82 }
|
|
83 if err != nil {
|
|
84 log.Fatal(err)
|
|
85 }
|
|
86 if strings.HasPrefix(record[0], "0") && strings.Compare(record[1], lastymd) > 0 {
|
|
87 tgz := path.Join(record[1], record[0]) + ".tgz"
|
|
88 tgzs = append(tgzs, tgz)
|
|
89 }
|
|
90 }
|
|
91
|
|
92 for _, tgz := range tgzs {
|
|
93 url := "/i/" + tgz
|
|
94 file := filepath.Join(imagedir, filepath.FromSlash(tgz))
|
|
95 dir, _ := filepath.Split(file)
|
|
96 err := os.MkdirAll(dir, 0755)
|
|
97 if err != nil && !os.IsExist(err) {
|
|
98 log.Fatal(err)
|
|
99 }
|
|
100 http_get(url, file)
|
|
101 fmt.Println("get image :", tgz)
|
|
102 }
|
|
103 // bye
|
|
104 }
|
|
105
|
|
106 func http_get(url, file string) error {
|
|
107 res, err := http.Get(server + url)
|
|
108 if err != nil {
|
|
109 return err
|
|
110 }
|
|
111 body, err := io.ReadAll(res.Body)
|
|
112 res.Body.Close()
|
|
113 if res.StatusCode > 299 {
|
|
114 log.Fatalf("Response failed with status code: %d and\nbody: %s\n", res.StatusCode, body)
|
|
115 }
|
|
116 if err != nil {
|
|
117 return err
|
|
118 }
|
|
119
|
|
120 err = os.WriteFile(file, body, 0666)
|
|
121 if err != nil {
|
|
122 return err
|
|
123 }
|
|
124 return nil
|
|
125 }
|
|
126
|