From e62cf137603c791e867a4bc74edac3af6ed70914 Mon Sep 17 00:00:00 2001 From: Audrius Butkevicius Date: Mon, 27 Jul 2015 19:00:22 +0100 Subject: [PATCH] Add stwatchfile --- cmd/stwatchfile/main.go | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 cmd/stwatchfile/main.go diff --git a/cmd/stwatchfile/main.go b/cmd/stwatchfile/main.go new file mode 100644 index 00000000..3ceb7a01 --- /dev/null +++ b/cmd/stwatchfile/main.go @@ -0,0 +1,98 @@ +// Copyright (C) 2015 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package main + +import ( + "bytes" + "crypto/md5" + "flag" + "fmt" + "io" + "os" + "time" +) + +func getmd5(filePath string) ([]byte, error) { + var result []byte + file, err := os.Open(filePath) + if err != nil { + return result, err + } + defer file.Close() + + hash := md5.New() + if _, err := io.Copy(hash, file); err != nil { + return result, err + } + + return hash.Sum(result), nil +} + +func main() { + period := flag.Duration("period", 200*time.Millisecond, "Sleep period between checks") + flag.Parse() + + file := flag.Arg(0) + + if file == "" { + fmt.Println("Expects a path as an argument") + return + } + + exists := true + size := int64(0) + mtime := time.Time{} + hash := []byte{} + + for { + time.Sleep(*period) + + newExists := true + fi, err := os.Stat(file) + if err != nil && os.IsNotExist(err) { + newExists = false + } else if err != nil { + fmt.Println("stat:", err) + return + } + + if newExists != exists { + exists = newExists + if !newExists { + fmt.Println(file, "does not exist") + } else { + fmt.Println(file, "appeared") + } + } + + if !exists { + size = 0 + mtime = time.Time{} + hash = []byte{} + continue + } + + if fi.IsDir() { + fmt.Println(file, "is directory") + return + } + newSize := fi.Size() + newMtime := fi.ModTime() + + newHash, err := getmd5(file) + if err != nil { + fmt.Println("getmd5:", err) + } + + if newSize != size || newMtime != mtime || !bytes.Equal(newHash, hash) { + fmt.Println(file, "Size:", newSize, "Mtime:", newMtime, "Hash:", fmt.Sprintf("%x", newHash)) + hash = newHash + size = newSize + mtime = newMtime + } + } +}