Last active
August 29, 2015 14:23
-
-
Save zaz600/32bbd1f903f384fdac80 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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