view src/kaigo/horori/searcher/server/server_backup.go @ 65:0369656be06c default tip

many changes.
author pyon@macmini
date Fri, 20 May 2022 06:30:34 +0900
parents
children
line wrap: on
line source

 /*
  Last Change: 2022-05-17 Tue 22:56:41.
 */

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"path"
	"path/filepath"
	"strings"
)

var (
	server string
	hhsdb string
	indexdb string
	imagedir string
	lastymd string
)

func init() {
	hhsdb = "hhsdb.csv"
	indexdb = "index.csv"
	imagedir = "images"
	lastymd = "20000101"
}

func main() {
	if len(os.Args) != 2 {
		fmt.Fprintln(os.Stderr, "[usage] > server_backup 192.168.0.1:8080")
		os.Exit(1)
	}

	dirs, err := os.ReadDir(imagedir)
	if err != nil {
		log.Fatal(err)
	}

	for _, dir := range dirs {
		if strings.Compare(dir.Name(), lastymd) > 0 {
			lastymd = dir.Name()
		}
	}
	fmt.Println("last date :", lastymd)

	server = "http://" + os.Args[1] + "/"

	// Get /ha/ -> hhsdb.csv
	os.Rename(hhsdb, hhsdb + ".bak")
	if err := http_get("/ha/", hhsdb); err != nil {
		os.Rename(hhsdb + ".bak", hhsdb)
		log.Fatal(err)
	}
	fmt.Println("get hhsdb.csv : done.")

	// Get /d/  -> index.csv
	os.Rename(indexdb, indexdb + ".bak")
	if err := http_get("/d/", indexdb); err != nil {
		os.Rename(indexdb + ".bak", indexdb)
		log.Fatal(err)
	}
	fmt.Println("get index.csv : done.")

	// Get /i/20200110/0800012345.tgz
	var tgzs []string

	b, err := os.ReadFile(indexdb)
	if err != nil {
		log.Fatal(err)
	}
	rd := csv.NewReader(strings.NewReader(string(b)))
	for {
		record, err := rd.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		if strings.HasPrefix(record[0], "0") && strings.Compare(record[1], lastymd) > 0 {
			tgz := path.Join(record[1], record[0]) + ".tgz"
			tgzs = append(tgzs, tgz)
		}
	}

	for _, tgz := range tgzs {
		url := "/i/" + tgz
		file := filepath.Join(imagedir, filepath.FromSlash(tgz))
		dir, _ := filepath.Split(file)
		err := os.MkdirAll(dir, 0755)
		if err != nil && !os.IsExist(err) {
			log.Fatal(err)
		}
		http_get(url, file)
		fmt.Println("get image :", tgz)
	}
	// bye
}

func http_get(url, file string) error {
	res, err := http.Get(server + url)
	if err != nil {
		return err
	}
	body, err := io.ReadAll(res.Body)
	res.Body.Close()
	if res.StatusCode > 299 {
		log.Fatalf("Response failed with status code: %d and\nbody: %s\n", res.StatusCode, body)
	}
	if err != nil {
		return err
	}

	err = os.WriteFile(file, body, 0666)
	if err != nil {
		return err
	}
	return nil
}