Skip to content

Instantly share code, notes, and snippets.

@zaz600
Last active August 29, 2015 14:23
Show Gist options
  • Save zaz600/32bbd1f903f384fdac80 to your computer and use it in GitHub Desktop.
Save zaz600/32bbd1f903f384fdac80 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"io/ioutil"
"log"
"math/rand"
"os"
"path/filepath"
"strings"
"time"
)
type Config struct {
Src_dir string `json:"src_dir"`
Dst_dir string `json:"dst_dir"`
Timeout int `json:"timeout"`
IfExists string `json:"ifexists"`
User string `json:"user"`
Password string `json:"password"`
}
type Global_config struct {
Dirs []Config `json:"dirs"`
}
func readconfig() (x *Global_config, err error) {
var file []byte
if file, err = ioutil.ReadFile("gotosser.json"); err != nil {
return nil, err
}
x = new(Global_config)
if err = json.Unmarshal(file, &x); err != nil {
return nil, err
}
return x, nil
}
func MoveFileToLocalDst(src_file string, c Config) {
// Перемещает файл из каталога источника в каталог назначения
log_id := 100000 + rand.Intn(900000)
log.Printf("%d Перемещаем файл %s в %s", log_id, src_file, c.Dst_dir)
// Полный пусть к файлу.
full_src_path := filepath.Join(c.Src_dir, src_file)
full_dst_path := filepath.Join(c.Dst_dir, src_file)
// проверка, что файл уже существует
if _, err := os.Stat(full_dst_path); err == nil {
if c.IfExists == "overwrite" {
log.Printf("%d Файл существует. ifexists=%s. Удаляем файл в конечном каталоге.\n", log_id, c.IfExists)
err = os.Remove(full_dst_path)
if err != nil {
log.Println(log_id, err)
}
}
}
err := os.Rename(full_src_path, full_dst_path)
if err != nil {
log.Println(log_id, err)
}
log.Printf("%d Перемещение завершено", log_id)
}
func ScanLocalDir(c Config) {
// Сканирует локальный каталог или сетевой диск
// Бесконечный цикл
for {
log.Printf("Обрабатываем входящий каталог %s\n", c.Src_dir)
items, err := ioutil.ReadDir(c.Src_dir)
if err == nil {
for _, item := range items {
// обрабатываем только файлы. Не каталоги, символические ссылки и т.п.
if item.Mode().IsRegular() {
src_file := item.Name()
if !strings.HasPrefix(c.Dst_dir, "ftp://") {
MoveFileToLocalDst(src_file, c)
}
}
}
} else {
log.Println(err)
}
time.Sleep(time.Duration(c.Timeout) * time.Second)
}
}
func main() {
rand.Seed(123321)
cfg, err := readconfig()
if err != nil {
log.Println("readconfig:", err)
os.Exit(-1)
}
for _, c := range cfg.Dirs {
// Если каталог-источник не FTP
if !strings.HasPrefix(c.Src_dir, "ftp://") {
// запускаем в отдельном потоке бесконечный цикл сканирования каталога
go ScanLocalDir(c)
}
}
// бесконечный цикл в главном потоке, чтобы программа не завершалась
for {
time.Sleep(60 * time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment