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