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