init
This commit is contained in:
		
						commit
						46bc9dd6ff
					
				| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
package cmd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"file_monitoring/config"
 | 
			
		||||
	"git.hpds.cc/Component/logging"
 | 
			
		||||
	"github.com/fsnotify/fsnotify"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
	"log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ConfigFile string = "./config/config.yaml"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Run() *cobra.Command {
 | 
			
		||||
	//创建一个监控对象
 | 
			
		||||
	watch, err := fsnotify.NewWatcher()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		//log.Fatal(err)
 | 
			
		||||
		logging.L().Error("new watcher err", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
	defer watch.Close()
 | 
			
		||||
	//添加要监控的对象,文件或文件夹
 | 
			
		||||
	err = watch.Add(config.DefaultMonitoringDirectory)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logging.L().Error("new watcher err", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
	//我们另启一个goroutine来处理监控对象的事件
 | 
			
		||||
	go func() {
 | 
			
		||||
		for {
 | 
			
		||||
			select {
 | 
			
		||||
			case ev := <-watch.Events:
 | 
			
		||||
				{
 | 
			
		||||
					//判断事件发生的类型,如下5种
 | 
			
		||||
					// Create 创建
 | 
			
		||||
					// Write 写入
 | 
			
		||||
					// Remove 删除
 | 
			
		||||
					// Rename 重命名
 | 
			
		||||
					// Chmod 修改权限
 | 
			
		||||
					if ev.Op&fsnotify.Create == fsnotify.Create {
 | 
			
		||||
						logging.L().Info("创建文件", zap.String("文件名", ev.Name))
 | 
			
		||||
						//log.Println("创建文件 : ", ev.Name)
 | 
			
		||||
					}
 | 
			
		||||
					if ev.Op&fsnotify.Write == fsnotify.Write {
 | 
			
		||||
						logging.L().Info("写入文件", zap.String("文件名", ev.Name))
 | 
			
		||||
						//log.Println("写入文件 : ", ev.Name)
 | 
			
		||||
					}
 | 
			
		||||
					if ev.Op&fsnotify.Remove == fsnotify.Remove {
 | 
			
		||||
						logging.L().Info("删除文件", zap.String("文件名", ev.Name))
 | 
			
		||||
						//log.Println("删除文件 : ", ev.Name)
 | 
			
		||||
					}
 | 
			
		||||
					if ev.Op&fsnotify.Rename == fsnotify.Rename {
 | 
			
		||||
						logging.L().Info("重命名文件", zap.String("文件名", ev.Name))
 | 
			
		||||
						//log.Println("重命名文件 : ", ev.Name)
 | 
			
		||||
					}
 | 
			
		||||
					if ev.Op&fsnotify.Chmod == fsnotify.Chmod {
 | 
			
		||||
						logging.L().Info("修改权限", zap.String("文件名", ev.Name))
 | 
			
		||||
						//log.Println("修改权限 : ", ev.Name)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case err := <-watch.Errors:
 | 
			
		||||
				{
 | 
			
		||||
					log.Println("error : ", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	//循环
 | 
			
		||||
	select {}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"git.hpds.cc/Component/logging"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	MonitoringConf MonitoringDirectoryConfig
 | 
			
		||||
	TransferConf   TransferConfig
 | 
			
		||||
	Log            *logging.Logger
 | 
			
		||||
}
 | 
			
		||||
type MonitoringDirectoryConfig struct {
 | 
			
		||||
	Path string `json:"path" yaml:"path" toml:"path"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type TransferConfig struct {
 | 
			
		||||
	Proto   string `json:"proto" yaml:"proto" toml:"proto"`
 | 
			
		||||
	Address string `json:"address" yaml:"address" toml:"address"`
 | 
			
		||||
	Port    int    `json:"port" yaml:"port" toml:"port"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	DefaultMonitoringDirectory = "./tmp/"
 | 
			
		||||
 | 
			
		||||
	DefaultTransfer = TransferConfig{
 | 
			
		||||
		Proto:   "MQTT",
 | 
			
		||||
		Address: "127.0.0.1",
 | 
			
		||||
		Port:    6060,
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DefaultConfig return the default configuration.
 | 
			
		||||
// If config file is not provided, hpds_mqd will start with DefaultConfig.
 | 
			
		||||
func DefaultConfig() Config {
 | 
			
		||||
	path, err := os.Getwd()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	vp := viper.New()
 | 
			
		||||
	vp.AddConfigPath(".")
 | 
			
		||||
	vp.AddConfigPath(path)
 | 
			
		||||
	vp.AddConfigPath(path + "/cmd")
 | 
			
		||||
	vp.AddConfigPath(path + "/config")
 | 
			
		||||
	vp.SetConfigName("config")
 | 
			
		||||
	vp.SetConfigType("yaml")
 | 
			
		||||
	if err := vp.ReadInConfig(); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	DefaultMonitoringDirectory = vp.GetString("path")
 | 
			
		||||
	DefaultTransfer = TransferConfig{
 | 
			
		||||
		Proto:   vp.GetString("transfer.proto"),
 | 
			
		||||
		Address: vp.GetString("transfer.address"),
 | 
			
		||||
		Port:    vp.GetInt("transfer.port"),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c := Config{
 | 
			
		||||
		MonitoringConf: MonitoringDirectoryConfig{Path: DefaultMonitoringDirectory},
 | 
			
		||||
		TransferConf:   DefaultTransfer,
 | 
			
		||||
		Log:            ParseLoggingConfig(vp),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ParseLoggingConfig(vp *viper.Viper) *logging.Logger {
 | 
			
		||||
	logger := logging.NewLogger(
 | 
			
		||||
		logging.SetPath(vp.GetString("log.path")),
 | 
			
		||||
		logging.SetPrefix(vp.GetString("log.prefix")),
 | 
			
		||||
		logging.SetDevelopment(vp.GetBool("log.development")),
 | 
			
		||||
		logging.SetDebugFileSuffix(vp.GetString("log.debugFileSuffix")),
 | 
			
		||||
		logging.SetWarnFileSuffix(vp.GetString("log.warnFileSuffix")),
 | 
			
		||||
		logging.SetErrorFileSuffix(vp.GetString("log.errorFileSuffix")),
 | 
			
		||||
		logging.SetInfoFileSuffix(vp.GetString("log.infoFileSuffix")),
 | 
			
		||||
		logging.SetMaxAge(vp.GetInt("log.maxAge")),
 | 
			
		||||
		logging.SetMaxBackups(vp.GetInt("log.maxBackups")),
 | 
			
		||||
		logging.SetMaxSize(vp.GetInt("log.maxSize")),
 | 
			
		||||
		logging.SetLevel(logging.LogLevel[vp.GetString("log.level")]),
 | 
			
		||||
	)
 | 
			
		||||
	return logger
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
path: "./tmp/"
 | 
			
		||||
 | 
			
		||||
transfer:
 | 
			
		||||
  proto: "mqtt"
 | 
			
		||||
  address: "127.0.0.1"
 | 
			
		||||
  port: 6060
 | 
			
		||||
 | 
			
		||||
log:
 | 
			
		||||
  # 日志级别:debug/info/error/warn
 | 
			
		||||
  level: debug # debug | info | warn | error
 | 
			
		||||
  path : "./logs"
 | 
			
		||||
  # 日志文件前缀
 | 
			
		||||
  prefix : "hpds_mq"
 | 
			
		||||
  # 是否为开发者模式
 | 
			
		||||
  development : true
 | 
			
		||||
  # debug日志文件后缀
 | 
			
		||||
  debugFileSuffix : "debug.log"
 | 
			
		||||
  # warn日志文件后缀
 | 
			
		||||
  warnFileSuffix : "warn.log"
 | 
			
		||||
  # error日志文件后缀
 | 
			
		||||
  errorFileSuffix : "error.log"
 | 
			
		||||
  # info日志文件后缀
 | 
			
		||||
  infoFileSuffix : "info.log"
 | 
			
		||||
  # 保存的最大天数
 | 
			
		||||
  maxAge : 180
 | 
			
		||||
  # 最多存在多少个切片文件
 | 
			
		||||
  maxBackups : 3000
 | 
			
		||||
  # 日日志文件大小(M)
 | 
			
		||||
  maxSize : 100
 | 
			
		||||
  # whether to dump MQTT packet in debug level
 | 
			
		||||
  dump_packet: false
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
package config
 | 
			
		||||
 | 
			
		||||
// The git commit that was compiled. This will be filled in by the compiler.
 | 
			
		||||
var GitCommit string
 | 
			
		||||
 | 
			
		||||
// The main version number that is being run at the moment.
 | 
			
		||||
const Version = ""
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
module file_monitoring
 | 
			
		||||
 | 
			
		||||
go 1.18
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	git.hpds.cc/Component/logging v0.0.0-20220803091419-ba6a18ff2e88
 | 
			
		||||
	github.com/fsnotify/fsnotify v1.5.4
 | 
			
		||||
	github.com/spf13/cobra v1.5.0
 | 
			
		||||
	github.com/spf13/viper v1.12.0
 | 
			
		||||
	go.uber.org/zap v1.21.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
			
		||||
	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 | 
			
		||||
	github.com/magiconair/properties v1.8.6 // indirect
 | 
			
		||||
	github.com/mitchellh/mapstructure v1.5.0 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml v1.9.5 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml/v2 v2.0.1 // indirect
 | 
			
		||||
	github.com/spf13/afero v1.8.2 // indirect
 | 
			
		||||
	github.com/spf13/cast v1.5.0 // indirect
 | 
			
		||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
			
		||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
			
		||||
	github.com/subosito/gotenv v1.3.0 // indirect
 | 
			
		||||
	go.uber.org/atomic v1.7.0 // indirect
 | 
			
		||||
	go.uber.org/multierr v1.6.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
 | 
			
		||||
	golang.org/x/text v0.3.7 // indirect
 | 
			
		||||
	gopkg.in/ini.v1 v1.66.4 // indirect
 | 
			
		||||
	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"file_monitoring/cmd"
 | 
			
		||||
	"file_monitoring/config"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	rootCmd = &cobra.Command{
 | 
			
		||||
		Use:     "file_monitoring",
 | 
			
		||||
		Long:    "file_monitoring is a file monitoring and transfer tool",
 | 
			
		||||
		Version: config.Version,
 | 
			
		||||
	}
 | 
			
		||||
	enablePprof bool
 | 
			
		||||
	pprofAddr   = "127.0.0.1:6060"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	config.DefaultConfig()
 | 
			
		||||
	rootCmd.PersistentFlags().StringVarP(&cmd.ConfigFile, "config", "c", cmd.ConfigFile, "The configuration file path")
 | 
			
		||||
	rootCmd.AddCommand(cmd.Run())
 | 
			
		||||
	//rootCmd.AddCommand(cmd.NewReloadCommand())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	if enablePprof {
 | 
			
		||||
		go func() {
 | 
			
		||||
			http.ListenAndServe(pprofAddr, nil)
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
	if err := rootCmd.Execute(); err != nil {
 | 
			
		||||
		fmt.Fprint(os.Stderr, err.Error())
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue