apply upstream changes (#18)
* apply upstream changes * update translations, fix i18n script * remove installation scripts and related files
This commit is contained in:
		
							parent
							
								
									da3bac31a2
								
							
						
					
					
						commit
						626a7d6059
					
				
							
								
								
									
										27
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								go.mod
									
									
									
									
									
								
							@ -14,6 +14,10 @@ require (
 | 
				
			|||||||
	github.com/hashicorp/go-uuid v1.0.3
 | 
						github.com/hashicorp/go-uuid v1.0.3
 | 
				
			||||||
	github.com/jinzhu/copier v0.4.0
 | 
						github.com/jinzhu/copier v0.4.0
 | 
				
			||||||
	github.com/json-iterator/go v1.1.12
 | 
						github.com/json-iterator/go v1.1.12
 | 
				
			||||||
 | 
						github.com/knadh/koanf/parsers/yaml v0.1.0
 | 
				
			||||||
 | 
						github.com/knadh/koanf/providers/env v1.0.0
 | 
				
			||||||
 | 
						github.com/knadh/koanf/providers/file v1.1.2
 | 
				
			||||||
 | 
						github.com/knadh/koanf/v2 v2.1.2
 | 
				
			||||||
	github.com/libdns/cloudflare v0.1.1
 | 
						github.com/libdns/cloudflare v0.1.1
 | 
				
			||||||
	github.com/libdns/libdns v0.2.2
 | 
						github.com/libdns/libdns v0.2.2
 | 
				
			||||||
	github.com/miekg/dns v1.1.62
 | 
						github.com/miekg/dns v1.1.62
 | 
				
			||||||
@ -23,7 +27,6 @@ require (
 | 
				
			|||||||
	github.com/patrickmn/go-cache v2.1.0+incompatible
 | 
						github.com/patrickmn/go-cache v2.1.0+incompatible
 | 
				
			||||||
	github.com/robfig/cron/v3 v3.0.1
 | 
						github.com/robfig/cron/v3 v3.0.1
 | 
				
			||||||
	github.com/spf13/pflag v1.0.5
 | 
						github.com/spf13/pflag v1.0.5
 | 
				
			||||||
	github.com/spf13/viper v1.18.2
 | 
					 | 
				
			||||||
	github.com/swaggo/files v1.0.1
 | 
						github.com/swaggo/files v1.0.1
 | 
				
			||||||
	github.com/swaggo/gin-swagger v1.6.0
 | 
						github.com/swaggo/gin-swagger v1.6.0
 | 
				
			||||||
	github.com/swaggo/swag v1.16.4
 | 
						github.com/swaggo/swag v1.16.4
 | 
				
			||||||
@ -34,9 +37,9 @@ require (
 | 
				
			|||||||
	golang.org/x/sync v0.8.0
 | 
						golang.org/x/sync v0.8.0
 | 
				
			||||||
	google.golang.org/grpc v1.67.1
 | 
						google.golang.org/grpc v1.67.1
 | 
				
			||||||
	google.golang.org/protobuf v1.35.1
 | 
						google.golang.org/protobuf v1.35.1
 | 
				
			||||||
 | 
						gopkg.in/yaml.v3 v3.0.1
 | 
				
			||||||
	gorm.io/driver/sqlite v1.5.5
 | 
						gorm.io/driver/sqlite v1.5.5
 | 
				
			||||||
	gorm.io/gorm v1.25.10
 | 
						gorm.io/gorm v1.25.10
 | 
				
			||||||
	sigs.k8s.io/yaml v1.4.0
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
@ -47,6 +50,7 @@ require (
 | 
				
			|||||||
	github.com/bytedance/sonic/loader v0.2.0 // indirect
 | 
						github.com/bytedance/sonic/loader v0.2.0 // indirect
 | 
				
			||||||
	github.com/cloudwego/base64x v0.1.4 // indirect
 | 
						github.com/cloudwego/base64x v0.1.4 // indirect
 | 
				
			||||||
	github.com/cloudwego/iasm v0.2.0 // indirect
 | 
						github.com/cloudwego/iasm v0.2.0 // indirect
 | 
				
			||||||
 | 
						github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
				
			||||||
	github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
						github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
				
			||||||
	github.com/gabriel-vasile/mimetype v1.4.5 // indirect
 | 
						github.com/gabriel-vasile/mimetype v1.4.5 // indirect
 | 
				
			||||||
	github.com/gin-contrib/sse v0.1.0 // indirect
 | 
						github.com/gin-contrib/sse v0.1.0 // indirect
 | 
				
			||||||
@ -57,43 +61,36 @@ require (
 | 
				
			|||||||
	github.com/go-playground/locales v0.14.1 // indirect
 | 
						github.com/go-playground/locales v0.14.1 // indirect
 | 
				
			||||||
	github.com/go-playground/universal-translator v0.18.1 // indirect
 | 
						github.com/go-playground/universal-translator v0.18.1 // indirect
 | 
				
			||||||
	github.com/go-playground/validator/v10 v10.22.0 // indirect
 | 
						github.com/go-playground/validator/v10 v10.22.0 // indirect
 | 
				
			||||||
 | 
						github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
 | 
				
			||||||
	github.com/goccy/go-json v0.10.3 // indirect
 | 
						github.com/goccy/go-json v0.10.3 // indirect
 | 
				
			||||||
	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 | 
						github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
					 | 
				
			||||||
	github.com/jinzhu/inflection v1.0.0 // indirect
 | 
						github.com/jinzhu/inflection v1.0.0 // indirect
 | 
				
			||||||
	github.com/jinzhu/now v1.1.5 // indirect
 | 
						github.com/jinzhu/now v1.1.5 // indirect
 | 
				
			||||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
						github.com/josharian/intern v1.0.0 // indirect
 | 
				
			||||||
	github.com/klauspost/cpuid/v2 v2.2.8 // indirect
 | 
						github.com/klauspost/cpuid/v2 v2.2.8 // indirect
 | 
				
			||||||
 | 
						github.com/knadh/koanf/maps v0.1.1 // indirect
 | 
				
			||||||
 | 
						github.com/kr/pretty v0.3.1 // indirect
 | 
				
			||||||
	github.com/leodido/go-urn v1.4.0 // indirect
 | 
						github.com/leodido/go-urn v1.4.0 // indirect
 | 
				
			||||||
	github.com/magiconair/properties v1.8.7 // indirect
 | 
					 | 
				
			||||||
	github.com/mailru/easyjson v0.7.6 // indirect
 | 
						github.com/mailru/easyjson v0.7.6 // indirect
 | 
				
			||||||
	github.com/mattn/go-isatty v0.0.20 // indirect
 | 
						github.com/mattn/go-isatty v0.0.20 // indirect
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.17 // indirect
 | 
						github.com/mattn/go-sqlite3 v1.14.17 // indirect
 | 
				
			||||||
	github.com/mitchellh/mapstructure v1.5.0 // indirect
 | 
						github.com/mitchellh/copystructure v1.2.0 // indirect
 | 
				
			||||||
 | 
						github.com/mitchellh/reflectwalk v1.0.2 // indirect
 | 
				
			||||||
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 | 
						github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 | 
				
			||||||
	github.com/modern-go/reflect2 v1.0.2 // indirect
 | 
						github.com/modern-go/reflect2 v1.0.2 // indirect
 | 
				
			||||||
	github.com/pelletier/go-toml/v2 v2.2.3 // indirect
 | 
						github.com/pelletier/go-toml/v2 v2.2.3 // indirect
 | 
				
			||||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
						github.com/pkg/errors v0.9.1 // indirect
 | 
				
			||||||
	github.com/sagikazarmark/locafero v0.4.0 // indirect
 | 
						github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
				
			||||||
	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
 | 
					 | 
				
			||||||
	github.com/sourcegraph/conc v0.3.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/afero v1.11.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/cast v1.6.0 // indirect
 | 
					 | 
				
			||||||
	github.com/subosito/gotenv v1.6.0 // indirect
 | 
					 | 
				
			||||||
	github.com/tidwall/match v1.1.1 // indirect
 | 
						github.com/tidwall/match v1.1.1 // indirect
 | 
				
			||||||
	github.com/tidwall/pretty v1.2.0 // indirect
 | 
						github.com/tidwall/pretty v1.2.0 // indirect
 | 
				
			||||||
	github.com/tidwall/sjson v1.2.5 // indirect
 | 
						github.com/tidwall/sjson v1.2.5 // indirect
 | 
				
			||||||
	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 | 
						github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 | 
				
			||||||
	github.com/ugorji/go/codec v1.2.12 // indirect
 | 
						github.com/ugorji/go/codec v1.2.12 // indirect
 | 
				
			||||||
	go.uber.org/atomic v1.9.0 // indirect
 | 
					 | 
				
			||||||
	go.uber.org/multierr v1.9.0 // indirect
 | 
					 | 
				
			||||||
	golang.org/x/arch v0.9.0 // indirect
 | 
						golang.org/x/arch v0.9.0 // indirect
 | 
				
			||||||
	golang.org/x/mod v0.18.0 // indirect
 | 
						golang.org/x/mod v0.18.0 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.26.0 // indirect
 | 
						golang.org/x/sys v0.26.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.19.0 // indirect
 | 
						golang.org/x/text v0.19.0 // indirect
 | 
				
			||||||
	golang.org/x/tools v0.22.0 // indirect
 | 
						golang.org/x/tools v0.22.0 // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
 | 
						google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
 | 
				
			||||||
	gopkg.in/ini.v1 v1.67.0 // indirect
 | 
					 | 
				
			||||||
	gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
						gopkg.in/yaml.v2 v2.4.0 // indirect
 | 
				
			||||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										47
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								go.sum
									
									
									
									
									
								
							@ -26,8 +26,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
 | 
				
			|||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0 h1:aYo8nnk3ojoQkP5iErif5Xxv0Mo0Ga/FR5+ffl/7+Nk=
 | 
					github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0 h1:aYo8nnk3ojoQkP5iErif5Xxv0Mo0Ga/FR5+ffl/7+Nk=
 | 
				
			||||||
github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0/go.mod h1:8AuBTZBRSFqEYBPYULd+NN474/zZBLP+6WeT5S9xlAc=
 | 
					github.com/dustinkirkland/golang-petname v0.0.0-20240428194347-eebcea082ee0/go.mod h1:8AuBTZBRSFqEYBPYULd+NN474/zZBLP+6WeT5S9xlAc=
 | 
				
			||||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 | 
					github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
					github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
				
			||||||
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
 | 
					github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
 | 
				
			||||||
@ -63,6 +61,8 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91
 | 
				
			|||||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
 | 
					github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
 | 
				
			||||||
github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao=
 | 
					github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao=
 | 
				
			||||||
github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
 | 
					github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
 | 
				
			||||||
 | 
					github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
 | 
				
			||||||
 | 
					github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
 | 
				
			||||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 | 
					github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 | 
				
			||||||
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
 | 
					github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
 | 
				
			||||||
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
 | 
					github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
 | 
				
			||||||
@ -70,7 +70,6 @@ github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOW
 | 
				
			|||||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 | 
					github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 | 
				
			||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 | 
					github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 | 
				
			||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
					github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
				
			||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
					github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
				
			||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
					github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
				
			||||||
@ -78,8 +77,6 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/
 | 
				
			|||||||
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 | 
					github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 | 
				
			||||||
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
 | 
					github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
 | 
				
			||||||
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
					github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
					 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					 | 
				
			||||||
github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
 | 
					github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
 | 
				
			||||||
github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 | 
					github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 | 
				
			||||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
					github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
				
			||||||
@ -93,6 +90,16 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 | 
				
			|||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
					github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 | 
				
			||||||
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
 | 
					github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
 | 
				
			||||||
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 | 
					github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/parsers/yaml v0.1.0 h1:ZZ8/iGfRLvKSaMEECEBPM1HQslrZADk8fP1XFUxVI5w=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/parsers/yaml v0.1.0/go.mod h1:cvbUDC7AL23pImuQP0oRw/hPuccrNBS2bps8asS0CwY=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/providers/env v1.0.0 h1:ufePaI9BnWH+ajuxGGiJ8pdTG0uLEUWC7/HDDPGLah0=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/providers/env v1.0.0/go.mod h1:mzFyRZueYhb37oPmC1HAv/oGEEuyvJDA98r3XAa8Gak=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/providers/file v1.1.2 h1:aCC36YGOgV5lTtAFz2qkgtWdeQsgfxUkxDOe+2nQY3w=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/providers/file v1.1.2/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ=
 | 
				
			||||||
 | 
					github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo=
 | 
				
			||||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
 | 
					github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
 | 
				
			||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
					github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
					github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
				
			||||||
@ -110,8 +117,6 @@ github.com/libdns/cloudflare v0.1.1 h1:FVPfWwP8zZCqj268LZjmkDleXlHPlFU9KC4OJ3yn0
 | 
				
			|||||||
github.com/libdns/cloudflare v0.1.1/go.mod h1:9VK91idpOjg6v7/WbjkEW49bSCxj00ALesIFDhJ8PBU=
 | 
					github.com/libdns/cloudflare v0.1.1/go.mod h1:9VK91idpOjg6v7/WbjkEW49bSCxj00ALesIFDhJ8PBU=
 | 
				
			||||||
github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
 | 
					github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
 | 
				
			||||||
github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
 | 
					github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
 | 
				
			||||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 | 
					 | 
				
			||||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 | 
					 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 | 
					github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 | 
				
			||||||
@ -123,8 +128,10 @@ github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6
 | 
				
			|||||||
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
 | 
					github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
 | 
				
			||||||
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
 | 
					github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
 | 
				
			||||||
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
 | 
					github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 | 
					github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
					github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
 | 
				
			||||||
 | 
					github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
 | 
				
			||||||
 | 
					github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
@ -154,20 +161,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
 | 
				
			|||||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 | 
					github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 | 
					github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 | 
					github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 | 
				
			||||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
 | 
					 | 
				
			||||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
 | 
					 | 
				
			||||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
 | 
					 | 
				
			||||||
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
 | 
					 | 
				
			||||||
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
 | 
					 | 
				
			||||||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
 | 
					 | 
				
			||||||
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
 | 
					 | 
				
			||||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
 | 
					 | 
				
			||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
					github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
				
			||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
					github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
				
			||||||
github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
 | 
					 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 | 
					github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 | 
				
			||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 | 
					github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 | 
				
			||||||
@ -180,8 +175,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 | 
				
			|||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 | 
					github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 | 
				
			||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 | 
					github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 | 
				
			||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 | 
					github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 | 
				
			||||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 | 
					 | 
				
			||||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
 | 
					 | 
				
			||||||
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
 | 
					github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
 | 
				
			||||||
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
 | 
					github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
 | 
				
			||||||
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
 | 
					github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
 | 
				
			||||||
@ -204,10 +197,6 @@ github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95
 | 
				
			|||||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
 | 
					github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
 | 
				
			||||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
 | 
					github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
 | 
				
			||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
					github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
				
			||||||
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 | 
					 | 
				
			||||||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 | 
					 | 
				
			||||||
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
 | 
					 | 
				
			||||||
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
 | 
					 | 
				
			||||||
golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k=
 | 
					golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k=
 | 
				
			||||||
golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
 | 
					golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
@ -274,8 +263,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
 | 
				
			|||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
					gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
					gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
				
			||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
					gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
				
			||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 | 
					 | 
				
			||||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
					gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
					gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
				
			||||||
@ -289,5 +276,3 @@ gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATa
 | 
				
			|||||||
gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
 | 
					gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
 | 
				
			||||||
gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 | 
					gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 | 
				
			||||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
 | 
					nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
 | 
				
			||||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
					 | 
				
			||||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -5,9 +5,13 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kyaml "github.com/knadh/koanf/parsers/yaml"
 | 
				
			||||||
 | 
						"github.com/knadh/koanf/providers/env"
 | 
				
			||||||
 | 
						"github.com/knadh/koanf/providers/file"
 | 
				
			||||||
 | 
						"github.com/knadh/koanf/v2"
 | 
				
			||||||
 | 
						"gopkg.in/yaml.v3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/naiba/nezha/pkg/utils"
 | 
						"github.com/naiba/nezha/pkg/utils"
 | 
				
			||||||
	"github.com/spf13/viper"
 | 
					 | 
				
			||||||
	"sigs.k8s.io/yaml"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@ -44,19 +48,30 @@ type Config struct {
 | 
				
			|||||||
	CustomCode          string `mapstructure:"custom_code" json:"custom_code,omitempty"`
 | 
						CustomCode          string `mapstructure:"custom_code" json:"custom_code,omitempty"`
 | 
				
			||||||
	CustomCodeDashboard string `mapstructure:"custom_code_dashboard" json:"custom_code_dashboard,omitempty"`
 | 
						CustomCodeDashboard string `mapstructure:"custom_code_dashboard" json:"custom_code_dashboard,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	v *viper.Viper `json:"-"`
 | 
						k        *koanf.Koanf `json:"-"`
 | 
				
			||||||
 | 
						filePath string       `json:"-"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Read 读取配置文件并应用
 | 
					// Read 读取配置文件并应用
 | 
				
			||||||
func (c *Config) Read(path string) error {
 | 
					func (c *Config) Read(path string) error {
 | 
				
			||||||
	c.v = viper.New()
 | 
						c.k = koanf.New(".")
 | 
				
			||||||
	c.v.SetConfigFile(path)
 | 
						c.filePath = path
 | 
				
			||||||
	err := c.v.ReadInConfig()
 | 
					
 | 
				
			||||||
 | 
						err := c.k.Load(env.Provider("NZ_", ".", func(s string) string {
 | 
				
			||||||
 | 
							return strings.Replace(strings.ToLower(strings.TrimPrefix(s, "NZ_")), "_", ".", -1)
 | 
				
			||||||
 | 
						}), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = c.v.Unmarshal(c)
 | 
						if _, err := os.Stat(path); err == nil {
 | 
				
			||||||
 | 
							err = c.k.Load(file.Provider(path), kyaml.Parser())
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = c.k.Unmarshal("", c)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -116,5 +131,5 @@ func (c *Config) Save() error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return os.WriteFile(c.v.ConfigFileUsed(), data, 0600)
 | 
						return os.WriteFile(c.filePath, data, 0600)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2024-11-01 13:32+0800\n"
 | 
					"POT-Creation-Date: 2024-11-23 23:56+0800\n"
 | 
				
			||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
					"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
				
			||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
					"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
				
			||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
					"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
				
			||||||
@ -42,7 +42,7 @@ msgstr ""
 | 
				
			|||||||
msgid "need to configure at least a single rule"
 | 
					msgid "need to configure at least a single rule"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/controller.go:188
 | 
					#: cmd/dashboard/controller/controller.go:195
 | 
				
			||||||
msgid "database error"
 | 
					msgid "database error"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -93,7 +93,7 @@ msgstr ""
 | 
				
			|||||||
msgid "group id %d does not exist"
 | 
					msgid "group id %d does not exist"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/server.go:59
 | 
					#: cmd/dashboard/controller/server.go:60
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "server id %d does not exist"
 | 
					msgid "server id %d does not exist"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -108,7 +108,7 @@ msgstr ""
 | 
				
			|||||||
msgid "server not found"
 | 
					msgid "server not found"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/service.go:86
 | 
					#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23
 | 
				
			||||||
msgid "unauthorized"
 | 
					msgid "unauthorized"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -117,11 +117,11 @@ msgstr ""
 | 
				
			|||||||
msgid "service id %d does not exist"
 | 
					msgid "service id %d does not exist"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:45
 | 
					#: cmd/dashboard/controller/user.go:66
 | 
				
			||||||
msgid "password length must be greater than 6"
 | 
					msgid "password length must be greater than 6"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:48
 | 
					#: cmd/dashboard/controller/user.go:69
 | 
				
			||||||
msgid "username can't be empty"
 | 
					msgid "username can't be empty"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -137,15 +137,15 @@ msgstr ""
 | 
				
			|||||||
msgid "timeout: agent connection not established"
 | 
					msgid "timeout: agent connection not established"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:57
 | 
					#: service/rpc/nezha.go:58
 | 
				
			||||||
msgid "Scheduled Task Executed Successfully"
 | 
					msgid "Scheduled Task Executed Successfully"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:61
 | 
					#: service/rpc/nezha.go:62
 | 
				
			||||||
msgid "Scheduled Task Executed Failed"
 | 
					msgid "Scheduled Task Executed Failed"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:156
 | 
					#: service/rpc/nezha.go:217
 | 
				
			||||||
msgid "IP Changed"
 | 
					msgid "IP Changed"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -157,16 +157,16 @@ msgstr ""
 | 
				
			|||||||
msgid "Resolved"
 | 
					msgid "Resolved"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:52
 | 
					#: service/singleton/crontask.go:53
 | 
				
			||||||
msgid "Tasks failed to register: ["
 | 
					msgid "Tasks failed to register: ["
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:59
 | 
					#: service/singleton/crontask.go:60
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
					"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:150 service/singleton/crontask.go:175
 | 
					#: service/singleton/crontask.go:146 service/singleton/crontask.go:171
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
					msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: \n"
 | 
					"Project-Id-Version: \n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2024-11-01 13:14+0800\n"
 | 
					"POT-Creation-Date: 2024-11-23 23:56+0800\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-11-01 13:20+0800\n"
 | 
					"PO-Revision-Date: 2024-11-01 13:20+0800\n"
 | 
				
			||||||
"Last-Translator: \n"
 | 
					"Last-Translator: \n"
 | 
				
			||||||
"Language-Team: \n"
 | 
					"Language-Team: \n"
 | 
				
			||||||
@ -43,7 +43,7 @@ msgstr "cycle_start is a future value"
 | 
				
			|||||||
msgid "need to configure at least a single rule"
 | 
					msgid "need to configure at least a single rule"
 | 
				
			||||||
msgstr "need to configure at least a single rule"
 | 
					msgstr "need to configure at least a single rule"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/controller.go:188
 | 
					#: cmd/dashboard/controller/controller.go:195
 | 
				
			||||||
msgid "database error"
 | 
					msgid "database error"
 | 
				
			||||||
msgstr "database error"
 | 
					msgstr "database error"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -94,7 +94,7 @@ msgstr "have invalid notification id"
 | 
				
			|||||||
msgid "group id %d does not exist"
 | 
					msgid "group id %d does not exist"
 | 
				
			||||||
msgstr "group id %d does not exist"
 | 
					msgstr "group id %d does not exist"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/server.go:59
 | 
					#: cmd/dashboard/controller/server.go:60
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "server id %d does not exist"
 | 
					msgid "server id %d does not exist"
 | 
				
			||||||
msgstr "server id %d does not exist"
 | 
					msgstr "server id %d does not exist"
 | 
				
			||||||
@ -109,7 +109,7 @@ msgstr "have invalid server id"
 | 
				
			|||||||
msgid "server not found"
 | 
					msgid "server not found"
 | 
				
			||||||
msgstr "server not found"
 | 
					msgstr "server not found"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/service.go:86
 | 
					#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23
 | 
				
			||||||
msgid "unauthorized"
 | 
					msgid "unauthorized"
 | 
				
			||||||
msgstr "unauthorized"
 | 
					msgstr "unauthorized"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,11 +118,11 @@ msgstr "unauthorized"
 | 
				
			|||||||
msgid "service id %d does not exist"
 | 
					msgid "service id %d does not exist"
 | 
				
			||||||
msgstr "service id %d does not exist"
 | 
					msgstr "service id %d does not exist"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:45
 | 
					#: cmd/dashboard/controller/user.go:66
 | 
				
			||||||
msgid "password length must be greater than 6"
 | 
					msgid "password length must be greater than 6"
 | 
				
			||||||
msgstr "password length must be greater than 6"
 | 
					msgstr "password length must be greater than 6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:48
 | 
					#: cmd/dashboard/controller/user.go:69
 | 
				
			||||||
msgid "username can't be empty"
 | 
					msgid "username can't be empty"
 | 
				
			||||||
msgstr "username can't be empty"
 | 
					msgstr "username can't be empty"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,15 +138,15 @@ msgstr "timeout: user connection not established"
 | 
				
			|||||||
msgid "timeout: agent connection not established"
 | 
					msgid "timeout: agent connection not established"
 | 
				
			||||||
msgstr "timeout: agent connection not established"
 | 
					msgstr "timeout: agent connection not established"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:57
 | 
					#: service/rpc/nezha.go:58
 | 
				
			||||||
msgid "Scheduled Task Executed Successfully"
 | 
					msgid "Scheduled Task Executed Successfully"
 | 
				
			||||||
msgstr "Scheduled Task Executed Successfully"
 | 
					msgstr "Scheduled Task Executed Successfully"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:61
 | 
					#: service/rpc/nezha.go:62
 | 
				
			||||||
msgid "Scheduled Task Executed Failed"
 | 
					msgid "Scheduled Task Executed Failed"
 | 
				
			||||||
msgstr "Scheduled Task Executed Failed"
 | 
					msgstr "Scheduled Task Executed Failed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:156
 | 
					#: service/rpc/nezha.go:217
 | 
				
			||||||
msgid "IP Changed"
 | 
					msgid "IP Changed"
 | 
				
			||||||
msgstr "IP Changed"
 | 
					msgstr "IP Changed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,17 +158,17 @@ msgstr "Incident"
 | 
				
			|||||||
msgid "Resolved"
 | 
					msgid "Resolved"
 | 
				
			||||||
msgstr "Resolved"
 | 
					msgstr "Resolved"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:52
 | 
					#: service/singleton/crontask.go:53
 | 
				
			||||||
msgid "Tasks failed to register: ["
 | 
					msgid "Tasks failed to register: ["
 | 
				
			||||||
msgstr "Tasks failed to register: ["
 | 
					msgstr "Tasks failed to register: ["
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:59
 | 
					#: service/singleton/crontask.go:60
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
					"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
					"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:150 service/singleton/crontask.go:175
 | 
					#: service/singleton/crontask.go:146 service/singleton/crontask.go:171
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
					msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
				
			||||||
msgstr "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
					msgstr "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: \n"
 | 
					"Project-Id-Version: \n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2024-11-01 13:14+0800\n"
 | 
					"POT-Creation-Date: 2024-11-23 23:56+0800\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-11-01 13:20+0800\n"
 | 
					"PO-Revision-Date: 2024-11-01 13:20+0800\n"
 | 
				
			||||||
"Last-Translator: \n"
 | 
					"Last-Translator: \n"
 | 
				
			||||||
"Language-Team: \n"
 | 
					"Language-Team: \n"
 | 
				
			||||||
@ -43,7 +43,7 @@ msgstr "cycle_start 是未来值"
 | 
				
			|||||||
msgid "need to configure at least a single rule"
 | 
					msgid "need to configure at least a single rule"
 | 
				
			||||||
msgstr "需要至少定义一条规则"
 | 
					msgstr "需要至少定义一条规则"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/controller.go:188
 | 
					#: cmd/dashboard/controller/controller.go:195
 | 
				
			||||||
msgid "database error"
 | 
					msgid "database error"
 | 
				
			||||||
msgstr "数据库错误"
 | 
					msgstr "数据库错误"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -94,7 +94,7 @@ msgstr "通知方式 id 无效"
 | 
				
			|||||||
msgid "group id %d does not exist"
 | 
					msgid "group id %d does not exist"
 | 
				
			||||||
msgstr "组 id %d 不存在"
 | 
					msgstr "组 id %d 不存在"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/server.go:59
 | 
					#: cmd/dashboard/controller/server.go:60
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "server id %d does not exist"
 | 
					msgid "server id %d does not exist"
 | 
				
			||||||
msgstr "服务器 id %d 不存在"
 | 
					msgstr "服务器 id %d 不存在"
 | 
				
			||||||
@ -109,7 +109,7 @@ msgstr "服务器 id 无效"
 | 
				
			|||||||
msgid "server not found"
 | 
					msgid "server not found"
 | 
				
			||||||
msgstr "未找到服务器"
 | 
					msgstr "未找到服务器"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/service.go:86
 | 
					#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23
 | 
				
			||||||
msgid "unauthorized"
 | 
					msgid "unauthorized"
 | 
				
			||||||
msgstr "未授权"
 | 
					msgstr "未授权"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,11 +118,11 @@ msgstr "未授权"
 | 
				
			|||||||
msgid "service id %d does not exist"
 | 
					msgid "service id %d does not exist"
 | 
				
			||||||
msgstr "服务 id %d 不存在"
 | 
					msgstr "服务 id %d 不存在"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:45
 | 
					#: cmd/dashboard/controller/user.go:66
 | 
				
			||||||
msgid "password length must be greater than 6"
 | 
					msgid "password length must be greater than 6"
 | 
				
			||||||
msgstr "密码长度必须大于 6"
 | 
					msgstr "密码长度必须大于 6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:48
 | 
					#: cmd/dashboard/controller/user.go:69
 | 
				
			||||||
msgid "username can't be empty"
 | 
					msgid "username can't be empty"
 | 
				
			||||||
msgstr "用户名不能为空"
 | 
					msgstr "用户名不能为空"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,15 +138,15 @@ msgstr "超时:用户连接未建立"
 | 
				
			|||||||
msgid "timeout: agent connection not established"
 | 
					msgid "timeout: agent connection not established"
 | 
				
			||||||
msgstr "超时:agent 连接未建立"
 | 
					msgstr "超时:agent 连接未建立"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:57
 | 
					#: service/rpc/nezha.go:58
 | 
				
			||||||
msgid "Scheduled Task Executed Successfully"
 | 
					msgid "Scheduled Task Executed Successfully"
 | 
				
			||||||
msgstr "计划任务执行成功"
 | 
					msgstr "计划任务执行成功"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:61
 | 
					#: service/rpc/nezha.go:62
 | 
				
			||||||
msgid "Scheduled Task Executed Failed"
 | 
					msgid "Scheduled Task Executed Failed"
 | 
				
			||||||
msgstr "计划任务执行失败"
 | 
					msgstr "计划任务执行失败"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:156
 | 
					#: service/rpc/nezha.go:217
 | 
				
			||||||
msgid "IP Changed"
 | 
					msgid "IP Changed"
 | 
				
			||||||
msgstr "IP 变更"
 | 
					msgstr "IP 变更"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,16 +158,16 @@ msgstr "事件"
 | 
				
			|||||||
msgid "Resolved"
 | 
					msgid "Resolved"
 | 
				
			||||||
msgstr "恢复"
 | 
					msgstr "恢复"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:52
 | 
					#: service/singleton/crontask.go:53
 | 
				
			||||||
msgid "Tasks failed to register: ["
 | 
					msgid "Tasks failed to register: ["
 | 
				
			||||||
msgstr "注册失败的任务:["
 | 
					msgstr "注册失败的任务:["
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:59
 | 
					#: service/singleton/crontask.go:60
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
					"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
				
			||||||
msgstr "这些任务将无法正常执行,请进入后台重新修改保存。"
 | 
					msgstr "这些任务将无法正常执行,请进入后台重新修改保存。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:150 service/singleton/crontask.go:175
 | 
					#: service/singleton/crontask.go:146 service/singleton/crontask.go:171
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
					msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
				
			||||||
msgstr "[任务失败] %s,服务器 %s 离线,无法执行"
 | 
					msgstr "[任务失败] %s,服务器 %s 离线,无法执行"
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: \n"
 | 
					"Project-Id-Version: \n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2024-11-01 13:14+0800\n"
 | 
					"POT-Creation-Date: 2024-11-23 23:56+0800\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-11-01 13:19+0800\n"
 | 
					"PO-Revision-Date: 2024-11-01 13:19+0800\n"
 | 
				
			||||||
"Last-Translator: \n"
 | 
					"Last-Translator: \n"
 | 
				
			||||||
"Language-Team: \n"
 | 
					"Language-Team: \n"
 | 
				
			||||||
@ -43,7 +43,7 @@ msgstr "cycle_start 是未來值"
 | 
				
			|||||||
msgid "need to configure at least a single rule"
 | 
					msgid "need to configure at least a single rule"
 | 
				
			||||||
msgstr "需要至少定義一條規則"
 | 
					msgstr "需要至少定義一條規則"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/controller.go:188
 | 
					#: cmd/dashboard/controller/controller.go:195
 | 
				
			||||||
msgid "database error"
 | 
					msgid "database error"
 | 
				
			||||||
msgstr "資料庫錯誤"
 | 
					msgstr "資料庫錯誤"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -94,7 +94,7 @@ msgstr "通知方式 id 無效"
 | 
				
			|||||||
msgid "group id %d does not exist"
 | 
					msgid "group id %d does not exist"
 | 
				
			||||||
msgstr "組 id %d 不存在"
 | 
					msgstr "組 id %d 不存在"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/server.go:59
 | 
					#: cmd/dashboard/controller/server.go:60
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "server id %d does not exist"
 | 
					msgid "server id %d does not exist"
 | 
				
			||||||
msgstr "伺服器 id %d 不存在"
 | 
					msgstr "伺服器 id %d 不存在"
 | 
				
			||||||
@ -109,7 +109,7 @@ msgstr "伺服器 id 無效"
 | 
				
			|||||||
msgid "server not found"
 | 
					msgid "server not found"
 | 
				
			||||||
msgstr "未找到伺服器"
 | 
					msgstr "未找到伺服器"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/service.go:86
 | 
					#: cmd/dashboard/controller/service.go:86 cmd/dashboard/controller/user.go:23
 | 
				
			||||||
msgid "unauthorized"
 | 
					msgid "unauthorized"
 | 
				
			||||||
msgstr "未授權"
 | 
					msgstr "未授權"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,11 +118,11 @@ msgstr "未授權"
 | 
				
			|||||||
msgid "service id %d does not exist"
 | 
					msgid "service id %d does not exist"
 | 
				
			||||||
msgstr "服務 id %d 不存在"
 | 
					msgstr "服務 id %d 不存在"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:45
 | 
					#: cmd/dashboard/controller/user.go:66
 | 
				
			||||||
msgid "password length must be greater than 6"
 | 
					msgid "password length must be greater than 6"
 | 
				
			||||||
msgstr "密碼長度必須大於 6"
 | 
					msgstr "密碼長度必須大於 6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: cmd/dashboard/controller/user.go:48
 | 
					#: cmd/dashboard/controller/user.go:69
 | 
				
			||||||
msgid "username can't be empty"
 | 
					msgid "username can't be empty"
 | 
				
			||||||
msgstr "使用者名稱不能為空"
 | 
					msgstr "使用者名稱不能為空"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,15 +138,15 @@ msgstr "超時:使用者連線未建立"
 | 
				
			|||||||
msgid "timeout: agent connection not established"
 | 
					msgid "timeout: agent connection not established"
 | 
				
			||||||
msgstr "超時:agent 連線未建立"
 | 
					msgstr "超時:agent 連線未建立"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:57
 | 
					#: service/rpc/nezha.go:58
 | 
				
			||||||
msgid "Scheduled Task Executed Successfully"
 | 
					msgid "Scheduled Task Executed Successfully"
 | 
				
			||||||
msgstr "排程任務執行成功"
 | 
					msgstr "排程任務執行成功"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:61
 | 
					#: service/rpc/nezha.go:62
 | 
				
			||||||
msgid "Scheduled Task Executed Failed"
 | 
					msgid "Scheduled Task Executed Failed"
 | 
				
			||||||
msgstr "排程任務執行失敗"
 | 
					msgstr "排程任務執行失敗"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/rpc/nezha.go:156
 | 
					#: service/rpc/nezha.go:217
 | 
				
			||||||
msgid "IP Changed"
 | 
					msgid "IP Changed"
 | 
				
			||||||
msgstr "IP 變更"
 | 
					msgstr "IP 變更"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,16 +158,16 @@ msgstr "事件"
 | 
				
			|||||||
msgid "Resolved"
 | 
					msgid "Resolved"
 | 
				
			||||||
msgstr "恢復"
 | 
					msgstr "恢復"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:52
 | 
					#: service/singleton/crontask.go:53
 | 
				
			||||||
msgid "Tasks failed to register: ["
 | 
					msgid "Tasks failed to register: ["
 | 
				
			||||||
msgstr "註冊失敗的任務:["
 | 
					msgstr "註冊失敗的任務:["
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:59
 | 
					#: service/singleton/crontask.go:60
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
					"] These tasks will not execute properly. Fix them in the admin dashboard."
 | 
				
			||||||
msgstr "這些任務將無法正常執行,請進入後台重新修改儲存。"
 | 
					msgstr "這些任務將無法正常執行,請進入後台重新修改儲存。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: service/singleton/crontask.go:150 service/singleton/crontask.go:175
 | 
					#: service/singleton/crontask.go:146 service/singleton/crontask.go:171
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
					msgid "[Task failed] %s: server %s is offline and cannot execute the task"
 | 
				
			||||||
msgstr "[任務失敗] %s,伺服器 %s 離線,無法執行"
 | 
					msgstr "[任務失敗] %s,伺服器 %s 離線,無法執行"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +0,0 @@
 | 
				
			|||||||
version: "3.3"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					 | 
				
			||||||
  dashboard:
 | 
					 | 
				
			||||||
    image: nz_image_url
 | 
					 | 
				
			||||||
    restart: always
 | 
					 | 
				
			||||||
    volumes:
 | 
					 | 
				
			||||||
      - ./data:/dashboard/data
 | 
					 | 
				
			||||||
      - ./static-custom/static:/dashboard/resource/static/custom:ro
 | 
					 | 
				
			||||||
      - ./theme-custom/template:/dashboard/resource/template/theme-custom:ro
 | 
					 | 
				
			||||||
      - ./dashboard-custom/template:/dashboard/resource/template/dashboard-custom:ro
 | 
					 | 
				
			||||||
    ports:
 | 
					 | 
				
			||||||
      - nz_site_port:80
 | 
					 | 
				
			||||||
      - nz_grpc_port:nz_grpc_port
 | 
					 | 
				
			||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LANG=()
 | 
					mapfile -t LANG < <(ls pkg/i18n/translations)
 | 
				
			||||||
while IFS='' read -r line; do LANG+=("$line"); done < <(ls pkg/i18n/translations)
 | 
					 | 
				
			||||||
TEMPLATE="pkg/i18n/template.pot"
 | 
					TEMPLATE="pkg/i18n/template.pot"
 | 
				
			||||||
PODIR="pkg/i18n/translations/%s/LC_MESSAGES"
 | 
					PODIR="pkg/i18n/translations/%s/LC_MESSAGES"
 | 
				
			||||||
GIT_ROOT=$(git rev-parse --show-toplevel)
 | 
					GIT_ROOT=$(git rev-parse --show-toplevel)
 | 
				
			||||||
@ -38,7 +37,7 @@ generate() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
generate_template() {
 | 
					generate_template() {
 | 
				
			||||||
	read -ra src < <(find . -name "*.go" | sort)
 | 
						mapfile -t src < <(find . -name "*.go" | sort)
 | 
				
			||||||
	xgettext -C --add-comments=TRANSLATORS: -kErrorT -kT -kTf -kN:1,2 --from-code=UTF-8 -o $TEMPLATE "${src[@]}"
 | 
						xgettext -C --add-comments=TRANSLATORS: -kErrorT -kT -kTf -kN:1,2 --from-code=UTF-8 -o $TEMPLATE "${src[@]}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,7 +51,7 @@ generate_en() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
compile() {
 | 
					compile() {
 | 
				
			||||||
	if [[ $# != 0 ]]; then
 | 
						if [[ $# != 0 && "$1" != "" ]]; then
 | 
				
			||||||
		compile_single "$1"
 | 
							compile_single "$1"
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		compile_all
 | 
							compile_all
 | 
				
			||||||
@ -95,7 +94,7 @@ compile_all() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
update() {
 | 
					update() {
 | 
				
			||||||
	if [[ $# != 0 ]]; then
 | 
						if [[ $# != 0 && "$1" != "" ]]; then
 | 
				
			||||||
		update_single "$1"
 | 
							update_single "$1"
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		update_all
 | 
							update_all
 | 
				
			||||||
@ -148,7 +147,14 @@ show_help() {
 | 
				
			|||||||
	echo "  $0 generate en       # Generate en_US locale"
 | 
						echo "  $0 generate en       # Generate en_US locale"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					version() { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main() {
 | 
					main() {
 | 
				
			||||||
 | 
						if [[ $(version "$BASH_VERSION") < $(version "4.0") ]]; then
 | 
				
			||||||
 | 
					  		err "This version of bash does not support mapfile"
 | 
				
			||||||
 | 
							exit 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [[ $PWD != "$GIT_ROOT" ]]; then
 | 
						if [[ $PWD != "$GIT_ROOT" ]]; then
 | 
				
			||||||
		err "Must execute in the project root"
 | 
							err "Must execute in the project root"
 | 
				
			||||||
		exit 1
 | 
							exit 1
 | 
				
			||||||
 | 
				
			|||||||
@ -1,293 +0,0 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
#   System Required: macOS 10.13+
 | 
					 | 
				
			||||||
#   Description: Nezha Agent Install Script (macOS)
 | 
					 | 
				
			||||||
#   Github: https://github.com/naiba/nezha
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NZ_BASE_PATH="/opt/nezha"
 | 
					 | 
				
			||||||
NZ_AGENT_PATH="${NZ_BASE_PATH}/agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
red='\033[0;31m'
 | 
					 | 
				
			||||||
green='\033[0;32m'
 | 
					 | 
				
			||||||
yellow='\033[0;33m'
 | 
					 | 
				
			||||||
plain='\033[0m'
 | 
					 | 
				
			||||||
export PATH=$PATH:/usr/local/bin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check() {
 | 
					 | 
				
			||||||
    # check root
 | 
					 | 
				
			||||||
    [[ $EUID -ne 0 ]] && echo -e "${red}ERROR: ${plain} This script must be run with the root user!\n" && exit 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## os_arch
 | 
					 | 
				
			||||||
    if [[ $(uname -m | grep 'x86_64') != "" ]]; then
 | 
					 | 
				
			||||||
        os_arch="amd64"
 | 
					 | 
				
			||||||
    elif [[ $(uname -m | grep 'arm64\|arm64e') != "" ]]; then
 | 
					 | 
				
			||||||
        os_arch="arm64"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## China_IP
 | 
					 | 
				
			||||||
    if [[ -z "${CN}" ]]; then
 | 
					 | 
				
			||||||
        if [[ $(curl -m 10 -s http://ip-api.com/json |grep 'country' |grep -q 'China') != "" ]]; then
 | 
					 | 
				
			||||||
            echo "According to the information provided by ip-api.com, the current IP may be in China"
 | 
					 | 
				
			||||||
            read -e -r -p "Is the installation done with a Chinese Mirror? [Y/n] (Custom Mirror Input 3):" input
 | 
					 | 
				
			||||||
            case $input in
 | 
					 | 
				
			||||||
            [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
                echo "Use Chinese Mirror"
 | 
					 | 
				
			||||||
                CN=true
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [nN][oO] | [nN])
 | 
					 | 
				
			||||||
                echo "No Use Chinese Mirror"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [3])
 | 
					 | 
				
			||||||
                echo "Use Custom Mirror"
 | 
					 | 
				
			||||||
                read -e -r -p "Please enter a custom image (e.g. :dn-dao-github-mirror.daocloud.io), leave blank to nouse: " input
 | 
					 | 
				
			||||||
                case $input in
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    CUSTOM_MIRROR=$input
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            *)
 | 
					 | 
				
			||||||
                echo "No Use Chinese Mirror"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ -n "${CUSTOM_MIRROR}" ]]; then
 | 
					 | 
				
			||||||
        GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
        GITHUB_URL=$CUSTOM_MIRROR
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        if [[ -z "${CN}" ]]; then
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="raw.githubusercontent.com/naiba/nezha/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="github.com"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="gitee.com"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
before_show_menu() {
 | 
					 | 
				
			||||||
    echo && echo -n -e "${yellow}* Press Enter to return to the main menu *${plain}" && read temp
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_agent() {
 | 
					 | 
				
			||||||
    echo -e "> Install Nezha Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo -e "Obtaining Agent version"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    local version=$(curl -m 10 -sL "https://api.github.com/repos/nezhahq/agent/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ ! -n "$version" ]; then
 | 
					 | 
				
			||||||
        version=$(curl -m 10 -sL "https://gitee.com/api/v5/repos/naibahq/agent/releases/latest" | awk -F '"' '{for(i=1;i<=NF;i++){if($i=="tag_name"){print $(i+2)}}}')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ ! -n "$version" ]; then
 | 
					 | 
				
			||||||
        version=$(curl -m 10 -sL "https://fastly.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ ! -n "$version" ]; then
 | 
					 | 
				
			||||||
        version=$(curl -m 10 -sL "https://gcore.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ ! -n "$version" ]; then
 | 
					 | 
				
			||||||
        echo -e "Fail to obtaine agent version, please check if the network can link https://api.github.com/repos/nezhahq/agent/releases/latest"
 | 
					 | 
				
			||||||
        return 0
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo -e "The current latest version is: ${version}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Nezha Agent Folder
 | 
					 | 
				
			||||||
    mkdir -p $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
    chmod -R 777 $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo -e "Downloading Agent"
 | 
					 | 
				
			||||||
    if [[ -z $CN ]]; then
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/nezhahq/agent/releases/download/${version}/nezha-agent_darwin_${os_arch}.zip"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/naibahq/agent/releases/download/${version}/nezha-agent_darwin_${os_arch}.zip"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    curl -o nezha-agent_darwin_${os_arch}.zip -L -f --retry 2 --retry-max-time 60 $NZ_AGENT_URL >/dev/null 2>&1
 | 
					 | 
				
			||||||
    if [[ $? != 0 ]]; then
 | 
					 | 
				
			||||||
        echo -e "${red}Fail to download agent, please check if the network can link ${GITHUB_URL}${plain}"
 | 
					 | 
				
			||||||
        return 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    unzip -qo nezha-agent_darwin_${os_arch}.zip &&
 | 
					 | 
				
			||||||
        mv nezha-agent $NZ_AGENT_PATH &&
 | 
					 | 
				
			||||||
        rm -rf nezha-agent_darwin_${os_arch}.zip README.md
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
        modify_agent_config "$@"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        modify_agent_config 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
modify_agent_config() {
 | 
					 | 
				
			||||||
    echo -e "> Modify Agent Configuration"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -lt 3 ]; then
 | 
					 | 
				
			||||||
        echo "Please add Agent in the admin panel first, record the secret" &&
 | 
					 | 
				
			||||||
            read -ep "Please enter a domain that resolves to the IP where the panel is located (no CDN sets): " nz_grpc_host &&
 | 
					 | 
				
			||||||
            read -ep "Please enter the panel RPC port (default 5555): " nz_grpc_port &&
 | 
					 | 
				
			||||||
            read -ep "Please enter the Agent secret: " nz_client_secret &&
 | 
					 | 
				
			||||||
            read -ep "Do you want to enable SSL/TLS encryption for the gRPC port (--tls)? Press [y] if yes, the default is not required, and users can press Enter to skip if you don't understand: " nz_grpc_proxy
 | 
					 | 
				
			||||||
        grep -qiw 'Y' <<<"${nz_grpc_proxy}" && args='--tls'
 | 
					 | 
				
			||||||
        if [[ -z "${nz_grpc_host}" || -z "${nz_client_secret}" ]]; then
 | 
					 | 
				
			||||||
            echo -e "${red}All options cannot be empty${plain}"
 | 
					 | 
				
			||||||
            before_show_menu
 | 
					 | 
				
			||||||
            return 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        if [[ -z "${nz_grpc_port}" ]]; then
 | 
					 | 
				
			||||||
            nz_grpc_port=5555
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        nz_grpc_host=$1
 | 
					 | 
				
			||||||
        nz_grpc_port=$2
 | 
					 | 
				
			||||||
        nz_client_secret=$3
 | 
					 | 
				
			||||||
        shift 3
 | 
					 | 
				
			||||||
        if [ $# -gt 0 ]; then
 | 
					 | 
				
			||||||
            args=" $*"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ${NZ_AGENT_PATH}/nezha-agent service install -s "$nz_grpc_host:$nz_grpc_port" -p $nz_client_secret $args >/dev/null 2>&1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $? -ne 0 ]; then
 | 
					 | 
				
			||||||
        ${NZ_AGENT_PATH}/nezha-agent service uninstall >/dev/null 2>&1
 | 
					 | 
				
			||||||
        ${NZ_AGENT_PATH}/nezha-agent service install -s "$nz_grpc_host:$nz_grpc_port" -p $nz_client_secret $args >/dev/null 2>&1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo -e "Agent configuration ${green} modified successfully, please wait for agent self-restart to take effect${plain}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
    #    before_show_menu
 | 
					 | 
				
			||||||
    #fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_agent_log() {
 | 
					 | 
				
			||||||
    echo -e "> > View Agent Log"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tail -n 10 /var/log/nezha-agent.err.log
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_agent() {
 | 
					 | 
				
			||||||
    echo -e "> Uninstall Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ${NZ_AGENT_PATH}/nezha-agent service uninstall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rm -rf $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
    clean_all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_agent() {
 | 
					 | 
				
			||||||
    echo -e "> Restart Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ${NZ_AGENT_PATH}/nezha-agent service restart
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_all() {
 | 
					 | 
				
			||||||
    if [ -z "$(ls -A ${NZ_BASE_PATH})" ]; then
 | 
					 | 
				
			||||||
        rm -rf ${NZ_BASE_PATH}
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_usage() {
 | 
					 | 
				
			||||||
    echo "Nezha Agent Management Script Usage: "
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
    echo "./nezha.sh install_agent              - Install Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh modify_agent_config        - Modify Agent Configuration"
 | 
					 | 
				
			||||||
    echo "./nezha.sh show_agent_log             - View Agent Log"
 | 
					 | 
				
			||||||
    echo "./nezha.sh uninstall_agent            - Uninstall Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh restart_agent              - Restart Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh update_script              - Update Script"
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_menu() {
 | 
					 | 
				
			||||||
    echo -e "
 | 
					 | 
				
			||||||
    ${green}Nezha Agent Management Script${plain} ${red}macOS${plain}
 | 
					 | 
				
			||||||
    --- https://github.com/naiba/nezha ---
 | 
					 | 
				
			||||||
    ${green}1.${plain}  Install Agent
 | 
					 | 
				
			||||||
    ${green}2.${plain}  Modify Agent Configuration
 | 
					 | 
				
			||||||
    ${green}3.${plain}  View Agent Log
 | 
					 | 
				
			||||||
    ${green}4.${plain}  Uninstall Agent
 | 
					 | 
				
			||||||
    ${green}5.${plain}  Restart Agent
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}0.${plain}  Exit Script
 | 
					 | 
				
			||||||
    "
 | 
					 | 
				
			||||||
    echo && read -ep "Please enter [0-5]: " num
 | 
					 | 
				
			||||||
    case "${num}" in
 | 
					 | 
				
			||||||
        0)
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        1)
 | 
					 | 
				
			||||||
            install_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        2)
 | 
					 | 
				
			||||||
            modify_agent_config
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        3)
 | 
					 | 
				
			||||||
            show_agent_log
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        4)
 | 
					 | 
				
			||||||
            uninstall_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        5)
 | 
					 | 
				
			||||||
            restart_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            echo -e "${red}Please enter the correct number [0-5]${plain}"
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [[ $# > 0 ]]; then
 | 
					 | 
				
			||||||
    case $1 in
 | 
					 | 
				
			||||||
        "install_agent")
 | 
					 | 
				
			||||||
            shift
 | 
					 | 
				
			||||||
            if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
                install_agent "$@"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                install_agent 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "modify_agent_config")
 | 
					 | 
				
			||||||
            modify_agent_config 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "show_agent_log")
 | 
					 | 
				
			||||||
            show_agent_log 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "uninstall_agent")
 | 
					 | 
				
			||||||
            uninstall_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "restart_agent")
 | 
					 | 
				
			||||||
            restart_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *) show_usage ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
@ -1,87 +0,0 @@
 | 
				
			|||||||
#Get server and key
 | 
					 | 
				
			||||||
param($server, $key, $tls)
 | 
					 | 
				
			||||||
# Download latest release from github
 | 
					 | 
				
			||||||
if($PSVersionTable.PSVersion.Major -lt 5){
 | 
					 | 
				
			||||||
    Write-Host "Require PS >= 5,your PSVersion:"$PSVersionTable.PSVersion.Major -BackgroundColor DarkGreen -ForegroundColor White
 | 
					 | 
				
			||||||
    Write-Host "Refer to the community article and install manually! https://nyko.me/2020/12/13/nezha-windows-client.html" -BackgroundColor DarkRed -ForegroundColor Green
 | 
					 | 
				
			||||||
    exit
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
$agentrepo = "nezhahq/agent"
 | 
					 | 
				
			||||||
#  x86 or x64 or arm64
 | 
					 | 
				
			||||||
if ([System.Environment]::Is64BitOperatingSystem) {
 | 
					 | 
				
			||||||
    if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") {
 | 
					 | 
				
			||||||
        $file = "nezha-agent_windows_arm64.zip"
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        $file = "nezha-agent_windows_amd64.zip"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else {
 | 
					 | 
				
			||||||
    $file = "nezha-agent_windows_386.zip"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
$agentreleases = "https://api.github.com/repos/$agentrepo/releases"
 | 
					 | 
				
			||||||
#重复运行自动更新
 | 
					 | 
				
			||||||
if (Test-Path "C:\nezha\nezha-agent.exe") {
 | 
					 | 
				
			||||||
    Write-Host "Nezha monitoring already exists, delete and reinstall" -BackgroundColor DarkGreen -ForegroundColor White
 | 
					 | 
				
			||||||
    C:\nezha\nezha-agent.exe service uninstall
 | 
					 | 
				
			||||||
    Remove-Item "C:\nezha" -Recurse
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#TLS/SSL
 | 
					 | 
				
			||||||
Write-Host "Determining latest nezha release" -BackgroundColor DarkGreen -ForegroundColor White
 | 
					 | 
				
			||||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
 | 
					 | 
				
			||||||
$agenttag = (Invoke-WebRequest -Uri $agentreleases -UseBasicParsing | ConvertFrom-Json)[0].tag_name
 | 
					 | 
				
			||||||
if ([string]::IsNullOrWhiteSpace($agenttag)) {
 | 
					 | 
				
			||||||
    $optionUrl = "https://fastly.jsdelivr.net/gh/nezhahq/agent/"
 | 
					 | 
				
			||||||
    Try {
 | 
					 | 
				
			||||||
        $response = Invoke-WebRequest -Uri $optionUrl -UseBasicParsing -TimeoutSec 10
 | 
					 | 
				
			||||||
        if ($response.StatusCode -eq 200) {
 | 
					 | 
				
			||||||
            $versiontext = $response.Content | findstr /c:"option.value"
 | 
					 | 
				
			||||||
            $version = [regex]::Match($versiontext, "@(\d+\.\d+\.\d+)").Groups[1].Value
 | 
					 | 
				
			||||||
            $agenttag = "v" + $version
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } Catch {
 | 
					 | 
				
			||||||
        $optionUrl = "https://gcore.jsdelivr.net/gh/nezhahq/agent/"
 | 
					 | 
				
			||||||
        $response = Invoke-WebRequest -Uri $optionUrl -UseBasicParsing -TimeoutSec 10
 | 
					 | 
				
			||||||
        if ($response.StatusCode -eq 200) {
 | 
					 | 
				
			||||||
            $versiontext = $response.Content | findstr /c:"option.value"
 | 
					 | 
				
			||||||
            $version = [regex]::Match($versiontext, "@(\d+\.\d+\.\d+)").Groups[1].Value
 | 
					 | 
				
			||||||
            $agenttag = "v" + $version
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#Region判断
 | 
					 | 
				
			||||||
$ipapi = ""
 | 
					 | 
				
			||||||
$region = "Unknown"
 | 
					 | 
				
			||||||
foreach ($url in ("https://dash.cloudflare.com/cdn-cgi/trace","https://developers.cloudflare.com/cdn-cgi/trace","https://1.0.0.1/cdn-cgi/trace")) {
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
        $ipapi = Invoke-RestMethod -Uri $url -TimeoutSec 5 -UseBasicParsing
 | 
					 | 
				
			||||||
        if ($ipapi -match "loc=(\w+)" ) {
 | 
					 | 
				
			||||||
            $region = $Matches[1]
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    catch {
 | 
					 | 
				
			||||||
        Write-Host "Error occurred while querying $url : $_"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
echo $ipapi
 | 
					 | 
				
			||||||
if($region -ne "CN"){
 | 
					 | 
				
			||||||
$download = "https://github.com/$agentrepo/releases/download/$agenttag/$file"
 | 
					 | 
				
			||||||
Write-Host "Location:$region,connect directly!" -BackgroundColor DarkRed -ForegroundColor Green
 | 
					 | 
				
			||||||
}else{
 | 
					 | 
				
			||||||
$download = "https://gitee.com/naibahq/agent/releases/download/$agenttag/$file"
 | 
					 | 
				
			||||||
Write-Host "Location:CN,use mirror address" -BackgroundColor DarkRed -ForegroundColor Green
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
echo $download
 | 
					 | 
				
			||||||
Invoke-WebRequest $download -OutFile "C:\nezha.zip"
 | 
					 | 
				
			||||||
#解压
 | 
					 | 
				
			||||||
Expand-Archive "C:\nezha.zip" -DestinationPath "C:\temp" -Force
 | 
					 | 
				
			||||||
if (!(Test-Path "C:\nezha")) { New-Item -Path "C:\nezha" -type directory }
 | 
					 | 
				
			||||||
#整理文件
 | 
					 | 
				
			||||||
Move-Item -Path "C:\temp\nezha-agent.exe" -Destination "C:\nezha\nezha-agent.exe"
 | 
					 | 
				
			||||||
#清理垃圾
 | 
					 | 
				
			||||||
Remove-Item "C:\nezha.zip"
 | 
					 | 
				
			||||||
Remove-Item "C:\temp" -Recurse
 | 
					 | 
				
			||||||
#安装部分
 | 
					 | 
				
			||||||
C:\nezha\nezha-agent.exe service install -s $server -p $key $tls
 | 
					 | 
				
			||||||
#enjoy
 | 
					 | 
				
			||||||
Write-Host "Enjoy It!" -BackgroundColor DarkGreen -ForegroundColor Red
 | 
					 | 
				
			||||||
@ -1,955 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
#   System Required: CentOS 7+ / Debian 8+ / Ubuntu 16+ / Alpine 3+ /
 | 
					 | 
				
			||||||
#     Arch 仅测试了一次,如有问题带截图反馈 dysf888@pm.me
 | 
					 | 
				
			||||||
#   Description: 哪吒监控安装脚本
 | 
					 | 
				
			||||||
#   Github: https://github.com/naiba/nezha
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NZ_BASE_PATH="/opt/nezha"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_PATH="${NZ_BASE_PATH}/dashboard"
 | 
					 | 
				
			||||||
NZ_AGENT_PATH="${NZ_BASE_PATH}/agent"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_SERVICE="/etc/systemd/system/nezha-dashboard.service"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_SERVICERC="/etc/init.d/nezha-dashboard"
 | 
					 | 
				
			||||||
NZ_VERSION="v0.20.2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
red='\033[0;31m'
 | 
					 | 
				
			||||||
green='\033[0;32m'
 | 
					 | 
				
			||||||
yellow='\033[0;33m'
 | 
					 | 
				
			||||||
plain='\033[0m'
 | 
					 | 
				
			||||||
export PATH="$PATH:/usr/local/bin"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
os_arch=""
 | 
					 | 
				
			||||||
[ -e /etc/os-release ] && grep -i "PRETTY_NAME" /etc/os-release | grep -qi "alpine" && os_alpine='1'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sudo() {
 | 
					 | 
				
			||||||
    myEUID=$(id -ru)
 | 
					 | 
				
			||||||
    if [ "$myEUID" -ne 0 ]; then
 | 
					 | 
				
			||||||
        if command -v sudo > /dev/null 2>&1; then
 | 
					 | 
				
			||||||
            command sudo "$@"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            err "错误: 您的系统未安装 sudo,因此无法进行该项操作。"
 | 
					 | 
				
			||||||
            exit 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        "$@"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check_systemd() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ] && ! command -v systemctl >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        echo "不支持此系统:未找到 systemctl 命令"
 | 
					 | 
				
			||||||
        exit 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
err() {
 | 
					 | 
				
			||||||
    printf "${red}%s${plain}\n" "$*" >&2
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
success() {
 | 
					 | 
				
			||||||
    printf "${green}%s${plain}\n" "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
info() {
 | 
					 | 
				
			||||||
    printf "${yellow}%s${plain}\n" "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
geo_check() {
 | 
					 | 
				
			||||||
    api_list="https://blog.cloudflare.com/cdn-cgi/trace https://dash.cloudflare.com/cdn-cgi/trace https://developers.cloudflare.com/cdn-cgi/trace"
 | 
					 | 
				
			||||||
    ua="Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0"
 | 
					 | 
				
			||||||
    set -- "$api_list"
 | 
					 | 
				
			||||||
    for url in $api_list; do
 | 
					 | 
				
			||||||
        text="$(curl -A "$ua" -m 10 -s "$url")"
 | 
					 | 
				
			||||||
        endpoint="$(echo "$text" | sed -n 's/.*h=\([^ ]*\).*/\1/p')"
 | 
					 | 
				
			||||||
        if echo "$text" | grep -qw 'CN'; then
 | 
					 | 
				
			||||||
            isCN=true
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        elif echo "$url" | grep -q "$endpoint"; then
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check() {
 | 
					 | 
				
			||||||
    umask 077
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## os_arch
 | 
					 | 
				
			||||||
    if uname -m | grep -q 'x86_64'; then
 | 
					 | 
				
			||||||
        os_arch="amd64"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'i386\|i686'; then
 | 
					 | 
				
			||||||
        os_arch="386"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'aarch64\|armv8b\|armv8l'; then
 | 
					 | 
				
			||||||
        os_arch="arm64"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'arm'; then
 | 
					 | 
				
			||||||
        os_arch="arm"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 's390x'; then
 | 
					 | 
				
			||||||
        os_arch="s390x"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'riscv64'; then
 | 
					 | 
				
			||||||
        os_arch="riscv64"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## China_IP
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        geo_check
 | 
					 | 
				
			||||||
        if [ -n "$isCN" ]; then
 | 
					 | 
				
			||||||
            echo "根据geoip api提供的信息,当前IP可能在中国"
 | 
					 | 
				
			||||||
            printf "是否选用中国镜像完成安装? [Y/n] (自定义镜像输入 3):"
 | 
					 | 
				
			||||||
            read -r input
 | 
					 | 
				
			||||||
            case $input in
 | 
					 | 
				
			||||||
            [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
                echo "使用中国镜像"
 | 
					 | 
				
			||||||
                CN=true
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [nN][oO] | [nN])
 | 
					 | 
				
			||||||
                echo "不使用中国镜像"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [3])
 | 
					 | 
				
			||||||
                echo "使用自定义镜像"
 | 
					 | 
				
			||||||
                printf "请输入自定义镜像 (例如:dn-dao-github-mirror.daocloud.io),留空为不使用: "
 | 
					 | 
				
			||||||
                read -r input
 | 
					 | 
				
			||||||
                case $input in
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    CUSTOM_MIRROR=$input
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            *)
 | 
					 | 
				
			||||||
                echo "使用中国镜像"
 | 
					 | 
				
			||||||
                CN=true
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -n "$CUSTOM_MIRROR" ]; then
 | 
					 | 
				
			||||||
        GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
        GITHUB_URL=$CUSTOM_MIRROR
 | 
					 | 
				
			||||||
        Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
        Get_Docker_Argu=" -s docker --mirror Aliyun"
 | 
					 | 
				
			||||||
        Docker_IMG="registry.cn-shanghai.aliyuncs.com\/naibahq\/nezha-dashboard"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="raw.githubusercontent.com/naiba/nezha/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="github.com"
 | 
					 | 
				
			||||||
            Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
            Get_Docker_Argu=" "
 | 
					 | 
				
			||||||
            Docker_IMG="ghcr.io\/naiba\/nezha-dashboard"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="gitee.com"
 | 
					 | 
				
			||||||
            Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
            Get_Docker_Argu=" -s docker --mirror Aliyun"
 | 
					 | 
				
			||||||
            Docker_IMG="registry.cn-shanghai.aliyuncs.com\/naibahq\/nezha-dashboard"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
installation_check() {
 | 
					 | 
				
			||||||
    if docker compose version >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        DOCKER_COMPOSE_COMMAND="docker compose"
 | 
					 | 
				
			||||||
        if sudo $DOCKER_COMPOSE_COMMAND ls | grep -qw "$NZ_DASHBOARD_PATH/docker-compose.yaml" >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            NEZHA_IMAGES=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep -w "nezha-dashboard")
 | 
					 | 
				
			||||||
            if [ -n "$NEZHA_IMAGES" ]; then
 | 
					 | 
				
			||||||
                echo "存在带有 nezha-dashboard 仓库的 Docker 镜像:"
 | 
					 | 
				
			||||||
                echo "$NEZHA_IMAGES"
 | 
					 | 
				
			||||||
                IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                FRESH_INSTALL=0
 | 
					 | 
				
			||||||
                return
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                echo "未找到带有 nezha-dashboard 仓库的 Docker 镜像。"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    elif command -v docker-compose >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        DOCKER_COMPOSE_COMMAND="docker-compose"
 | 
					 | 
				
			||||||
        if sudo $DOCKER_COMPOSE_COMMAND -f "$NZ_DASHBOARD_PATH/docker-compose.yaml" config >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            NEZHA_IMAGES=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep -w "nezha-dashboard")
 | 
					 | 
				
			||||||
            if [ -n "$NEZHA_IMAGES" ]; then
 | 
					 | 
				
			||||||
                echo "存在带有 nezha-dashboard 仓库的 Docker 镜像:"
 | 
					 | 
				
			||||||
                echo "$NEZHA_IMAGES"
 | 
					 | 
				
			||||||
                IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                FRESH_INSTALL=0
 | 
					 | 
				
			||||||
                return
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                echo "未找到带有 nezha-dashboard 仓库的 Docker 镜像。"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -f "$NZ_DASHBOARD_PATH/app" ]; then
 | 
					 | 
				
			||||||
        IS_DOCKER_NEZHA=0
 | 
					 | 
				
			||||||
        FRESH_INSTALL=0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
select_version() {
 | 
					 | 
				
			||||||
    if [ -z "$IS_DOCKER_NEZHA" ]; then
 | 
					 | 
				
			||||||
        info "请自行选择您的安装方式(如果你是安装Agent,输入哪个都是一样的):"
 | 
					 | 
				
			||||||
        info "1. Docker"
 | 
					 | 
				
			||||||
        info "2. 独立安装"
 | 
					 | 
				
			||||||
        while true; do
 | 
					 | 
				
			||||||
            printf "请输入选择 [1-2]:"
 | 
					 | 
				
			||||||
            read -r option
 | 
					 | 
				
			||||||
            case "${option}" in
 | 
					 | 
				
			||||||
                1)
 | 
					 | 
				
			||||||
                    IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                    break
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                2)
 | 
					 | 
				
			||||||
                    IS_DOCKER_NEZHA=0
 | 
					 | 
				
			||||||
                    break
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    err "请输入正确的选择 [1-2]"
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
update_script() {
 | 
					 | 
				
			||||||
    echo "> 更新脚本"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    curl -sL https://${GITHUB_RAW_URL}/script/install.sh -o /tmp/nezha.sh
 | 
					 | 
				
			||||||
    new_version=$(grep "NZ_VERSION" /tmp/nezha.sh | head -n 1 | awk -F "=" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$new_version" ]; then
 | 
					 | 
				
			||||||
        echo "脚本获取失败,请检查本机能否链接 https://${GITHUB_RAW_URL}/script/install.sh"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    echo "当前最新版本为: ${new_version}"
 | 
					 | 
				
			||||||
    mv -f /tmp/nezha.sh ./nezha.sh && chmod a+x ./nezha.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "3s后执行新脚本"
 | 
					 | 
				
			||||||
    sleep 3s
 | 
					 | 
				
			||||||
    clear
 | 
					 | 
				
			||||||
    exec ./nezha.sh
 | 
					 | 
				
			||||||
    exit 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
before_show_menu() {
 | 
					 | 
				
			||||||
    echo && info "* 按回车返回主菜单 *" && read temp
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_base() {
 | 
					 | 
				
			||||||
    (command -v curl >/dev/null 2>&1 && command -v wget >/dev/null 2>&1 && command -v unzip >/dev/null 2>&1 && command -v getenforce >/dev/null 2>&1) ||
 | 
					 | 
				
			||||||
        (install_soft curl wget unzip)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_arch() {
 | 
					 | 
				
			||||||
    info "提示:Arch安装libselinux需添加nezha-agent用户,安装完会自动删除,建议手动检查一次"
 | 
					 | 
				
			||||||
    read -r -p "是否安装libselinux? [Y/n] " input
 | 
					 | 
				
			||||||
    case $input in
 | 
					 | 
				
			||||||
    [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
        useradd -m nezha-agent
 | 
					 | 
				
			||||||
        sed -i "$ a\nezha-agent ALL=(ALL ) NOPASSWD:ALL" /etc/sudoers
 | 
					 | 
				
			||||||
        sudo -iu nezha-agent bash -c 'gpg --keyserver keys.gnupg.net --recv-keys 4695881C254508D1;
 | 
					 | 
				
			||||||
                                        cd /tmp; git clone https://aur.archlinux.org/libsepol.git; cd libsepol; makepkg -si --noconfirm --asdeps; cd ..;
 | 
					 | 
				
			||||||
                                        git clone https://aur.archlinux.org/libselinux.git; cd libselinux; makepkg -si --noconfirm; cd ..;
 | 
					 | 
				
			||||||
                                        rm -rf libsepol libselinux'
 | 
					 | 
				
			||||||
        sed -i '/nezha-agent/d' /etc/sudoers && sleep 30s && killall -u nezha-agent && userdel -r nezha-agent
 | 
					 | 
				
			||||||
        echo -e "${red}提示: ${plain}已删除用户nezha-agent,请务必手动核查一遍!\n"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    [nN][oO] | [nN])
 | 
					 | 
				
			||||||
        echo "不安装libselinux"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    *)
 | 
					 | 
				
			||||||
        echo "不安装libselinux"
 | 
					 | 
				
			||||||
        exit 0
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_soft() {
 | 
					 | 
				
			||||||
    (command -v yum >/dev/null 2>&1 && sudo yum makecache && sudo yum install "$@" selinux-policy -y) ||
 | 
					 | 
				
			||||||
        (command -v apt >/dev/null 2>&1 && sudo apt update && sudo apt install "$@" selinux-utils -y) ||
 | 
					 | 
				
			||||||
        (command -v pacman >/dev/null 2>&1 && sudo pacman -Syu "$@" base-devel --noconfirm && install_arch) ||
 | 
					 | 
				
			||||||
        (command -v apt-get >/dev/null 2>&1 && sudo apt-get update && sudo apt-get install "$@" selinux-utils -y) ||
 | 
					 | 
				
			||||||
        (command -v apk >/dev/null 2>&1 && sudo apk update && sudo apk add "$@" -f)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard() {
 | 
					 | 
				
			||||||
    check_systemd
 | 
					 | 
				
			||||||
    install_base
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "> 安装面板"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # 哪吒监控文件夹
 | 
					 | 
				
			||||||
    if [ ! "$FRESH_INSTALL" = 0 ]; then
 | 
					 | 
				
			||||||
        sudo mkdir -p $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "您可能已经安装过面板端,重复安装会覆盖数据,请注意备份。"
 | 
					 | 
				
			||||||
        printf "是否退出安装? [Y/n] "
 | 
					 | 
				
			||||||
        read -r input
 | 
					 | 
				
			||||||
        case $input in
 | 
					 | 
				
			||||||
        [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
            echo "退出安装"
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        [nN][oO] | [nN])
 | 
					 | 
				
			||||||
            echo "继续安装"
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            echo "退出安装"
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        install_dashboard_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        install_dashboard_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    modify_dashboard_config 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard_docker() {
 | 
					 | 
				
			||||||
    if [ ! "$FRESH_INSTALL" = 0 ]; then
 | 
					 | 
				
			||||||
        if ! command -v docker >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            echo "正在安装 Docker"
 | 
					 | 
				
			||||||
            if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
                if ! curl -sL https://${Get_Docker_URL} | sudo bash -s "${Get_Docker_Argu}"; then
 | 
					 | 
				
			||||||
                    err "下载脚本失败,请检查本机能否连接 ${Get_Docker_URL}"
 | 
					 | 
				
			||||||
                    return 0
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
                sudo systemctl enable docker.service
 | 
					 | 
				
			||||||
                sudo systemctl start docker.service
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                sudo apk add docker docker-compose
 | 
					 | 
				
			||||||
                sudo rc-update add docker
 | 
					 | 
				
			||||||
                sudo rc-service docker start
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            success "Docker 安装成功"
 | 
					 | 
				
			||||||
            installation_check
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ ! -d "${NZ_DASHBOARD_PATH}/resource/template/theme-custom" ] || [ ! -d "${NZ_DASHBOARD_PATH}/resource/static/custom" ]; then
 | 
					 | 
				
			||||||
        sudo mkdir -p "${NZ_DASHBOARD_PATH}/resource/template/theme-custom" "${NZ_DASHBOARD_PATH}/resource/static/custom" >/dev/null 2>&1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
selinux() {
 | 
					 | 
				
			||||||
    #Check SELinux
 | 
					 | 
				
			||||||
    if command -v getenforce >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        if getenforce | grep '[Ee]nfor'; then
 | 
					 | 
				
			||||||
            echo "SELinux是开启状态,正在关闭!"
 | 
					 | 
				
			||||||
            sudo setenforce 0 >/dev/null 2>&1
 | 
					 | 
				
			||||||
            find_key="SELINUX="
 | 
					 | 
				
			||||||
            sudo sed -ri "/^$find_key/c${find_key}disabled" /etc/selinux/config
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_agent() {
 | 
					 | 
				
			||||||
    install_base
 | 
					 | 
				
			||||||
    selinux
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "> 安装监控Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "正在获取监控Agent版本号"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _version=$(curl -m 10 -sL "https://api.github.com/repos/nezhahq/agent/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gitee.com/api/v5/repos/naibahq/agent/releases/latest" | awk -F '"' '{for(i=1;i<=NF;i++){if($i=="tag_name"){print $(i+2)}}}')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://fastly.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gcore.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        err "获取版本号失败,请检查本机能否链接 https://api.github.com/repos/nezhahq/agent/releases/latest"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "当前最新版本为: ${_version}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # 哪吒监控文件夹
 | 
					 | 
				
			||||||
    sudo mkdir -p $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "正在下载监控端"
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/nezhahq/agent/releases/download/${_version}/nezha-agent_linux_${os_arch}.zip"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/naibahq/agent/releases/download/${_version}/nezha-agent_linux_${os_arch}.zip"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="wget -t 2 -T 60 -O nezha-agent_linux_${os_arch}.zip $NZ_AGENT_URL >/dev/null 2>&1"
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        err "Release 下载失败,请检查本机能否连接 ${GITHUB_URL}"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo unzip -qo nezha-agent_linux_${os_arch}.zip &&
 | 
					 | 
				
			||||||
        sudo mv nezha-agent $NZ_AGENT_PATH &&
 | 
					 | 
				
			||||||
        sudo rm -rf nezha-agent_linux_${os_arch}.zip README.md
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
        modify_agent_config "$@"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        modify_agent_config 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
modify_agent_config() {
 | 
					 | 
				
			||||||
    echo "> 修改Agent配置"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -lt 3 ]; then
 | 
					 | 
				
			||||||
        echo "请先在管理面板上添加Agent,记录下密钥"
 | 
					 | 
				
			||||||
            printf "请输入一个解析到面板所在IP的域名(不可套CDN): "
 | 
					 | 
				
			||||||
            read -r nz_grpc_host
 | 
					 | 
				
			||||||
            printf "请输入面板RPC端口 (默认值 5555): "
 | 
					 | 
				
			||||||
            read -r nz_grpc_port
 | 
					 | 
				
			||||||
            printf "请输入Agent 密钥: "
 | 
					 | 
				
			||||||
            read -r nz_client_secret
 | 
					 | 
				
			||||||
            printf "是否启用针对 gRPC 端口的 SSL/TLS加密 (--tls),需要请按 [y],默认是不需要,不理解用户可回车跳过: "
 | 
					 | 
				
			||||||
            read -r nz_grpc_proxy
 | 
					 | 
				
			||||||
        echo "${nz_grpc_proxy}" | grep -qiw 'Y' && args='--tls'
 | 
					 | 
				
			||||||
        if [ -z "$nz_grpc_host" ] || [ -z "$nz_client_secret" ]; then
 | 
					 | 
				
			||||||
            err "所有选项都不能为空"
 | 
					 | 
				
			||||||
            before_show_menu
 | 
					 | 
				
			||||||
            return 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        if [ -z "$nz_grpc_port" ]; then
 | 
					 | 
				
			||||||
            nz_grpc_port=5555
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        nz_grpc_host=$1
 | 
					 | 
				
			||||||
        nz_grpc_port=$2
 | 
					 | 
				
			||||||
        nz_client_secret=$3
 | 
					 | 
				
			||||||
        shift 3
 | 
					 | 
				
			||||||
        if [ $# -gt 0 ]; then
 | 
					 | 
				
			||||||
            args="$*"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="sudo ${NZ_AGENT_PATH}/nezha-agent service install -s $nz_grpc_host:$nz_grpc_port -p $nz_client_secret $args >/dev/null 2>&1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        sudo "${NZ_AGENT_PATH}"/nezha-agent service uninstall >/dev/null 2>&1
 | 
					 | 
				
			||||||
        sudo "${NZ_AGENT_PATH}"/nezha-agent service install -s "$nz_grpc_host:$nz_grpc_port" -p "$nz_client_secret" "$args" >/dev/null 2>&1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    success "Agent配置 修改成功,请稍等重启生效"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
    #    before_show_menu
 | 
					 | 
				
			||||||
    #fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
modify_dashboard_config() {
 | 
					 | 
				
			||||||
    echo "> 修改面板配置"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        if [ -n "$DOCKER_COMPOSE_COMMAND" ]; then
 | 
					 | 
				
			||||||
            echo "正在下载 Docker 脚本"
 | 
					 | 
				
			||||||
            _cmd="wget -t 2 -T 60 -O /tmp/nezha-docker-compose.yaml https://${GITHUB_RAW_URL}/script/docker-compose.yaml >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
                err "下载脚本失败,请检查本机能否连接 ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            err "请手动安装 docker-compose。https://docs.docker.com/compose/install/linux/"
 | 
					 | 
				
			||||||
            before_show_menu
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="wget -t 2 -T 60 -O /tmp/nezha-config.yaml https://${GITHUB_RAW_URL}/script/config.yaml >/dev/null 2>&1"
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        err "下载脚本失败,请检查本机能否连接 ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
        return 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "关于 GitHub Oauth2 应用:在 https://github.com/settings/developers 创建,无需审核,Callback 填 http(s)://域名或IP/oauth2/callback"
 | 
					 | 
				
			||||||
        echo "关于 Gitee Oauth2 应用:在 https://gitee.com/oauth/applications 创建,无需审核,Callback 填 http(s)://域名或IP/oauth2/callback"
 | 
					 | 
				
			||||||
        printf "请输入 OAuth2 提供商(github/gitlab/jihulab/gitee,默认 github): "
 | 
					 | 
				
			||||||
        read -r nz_oauth2_type
 | 
					 | 
				
			||||||
        printf "请输入 Oauth2 应用的 Client ID: "
 | 
					 | 
				
			||||||
        read -r nz_github_oauth_client_id
 | 
					 | 
				
			||||||
        printf "请输入 Oauth2 应用的 Client Secret: "
 | 
					 | 
				
			||||||
        read -r nz_github_oauth_client_secret
 | 
					 | 
				
			||||||
        printf "请输入 GitHub/Gitee 登录名作为管理员,多个以逗号隔开: "
 | 
					 | 
				
			||||||
        read -r nz_admin_logins
 | 
					 | 
				
			||||||
        printf "请输入站点标题: "
 | 
					 | 
				
			||||||
        read -r nz_site_title
 | 
					 | 
				
			||||||
        printf "请输入站点访问端口: (默认 8008)"
 | 
					 | 
				
			||||||
        read -r nz_site_port
 | 
					 | 
				
			||||||
        printf "请输入用于 Agent 接入的 RPC 端口: (默认 5555)"
 | 
					 | 
				
			||||||
        read -r nz_grpc_port
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$nz_admin_logins" ] || [ -z "$nz_github_oauth_client_id" ] || [ -z "$nz_github_oauth_client_secret" ] || [ -z "$nz_site_title" ]; then
 | 
					 | 
				
			||||||
        err "所有选项都不能为空"
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$nz_site_port" ]; then
 | 
					 | 
				
			||||||
        nz_site_port=8008
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$nz_grpc_port" ]; then
 | 
					 | 
				
			||||||
        nz_grpc_port=5555
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$nz_oauth2_type" ]; then
 | 
					 | 
				
			||||||
        nz_oauth2_type=github
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sed -i "s/nz_oauth2_type/${nz_oauth2_type}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_admin_logins/${nz_admin_logins}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_grpc_port/${nz_grpc_port}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_github_oauth_client_id/${nz_github_oauth_client_id}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_github_oauth_client_secret/${nz_github_oauth_client_secret}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_language/zh-CN/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_site_title/${nz_site_title}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        sed -i "s/nz_site_port/${nz_site_port}/" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
        sed -i "s/nz_grpc_port/${nz_grpc_port}/g" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
        sed -i "s/nz_image_url/${Docker_IMG}/" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        sed -i "s/80/${nz_site_port}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo mkdir -p $NZ_DASHBOARD_PATH/data
 | 
					 | 
				
			||||||
    sudo mv -f /tmp/nezha-config.yaml ${NZ_DASHBOARD_PATH}/data/config.yaml
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        sudo mv -f /tmp/nezha-docker-compose.yaml ${NZ_DASHBOARD_PATH}/docker-compose.yaml
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        echo "正在下载服务文件"
 | 
					 | 
				
			||||||
        if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
            _download="sudo wget -t 2 -T 60 -O $NZ_DASHBOARD_SERVICE https://${GITHUB_RAW_URL}/script/nezha-dashboard.service >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_download"; then
 | 
					 | 
				
			||||||
                err "文件下载失败,请检查本机能否连接 ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            _download="sudo wget -t 2 -T 60 -O $NZ_DASHBOARD_SERVICERC https://${GITHUB_RAW_URL}/script/nezha-dashboard >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_download"; then
 | 
					 | 
				
			||||||
                err "文件下载失败,请检查本机能否连接 ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            sudo chmod +x $NZ_DASHBOARD_SERVICERC
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    success "面板配置 修改成功,请稍等重启生效"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    restart_and_update
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update() {
 | 
					 | 
				
			||||||
    echo "> 重启并更新面板"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="restart_and_update_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="restart_and_update_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "哪吒监控 重启成功"
 | 
					 | 
				
			||||||
        info "默认管理面板地址:域名:站点访问端口"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "重启失败,可能是因为启动时间超过了两秒,请稍后查看日志信息"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml pull
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml up -d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update_standalone() {
 | 
					 | 
				
			||||||
    _version=$(curl -m 10 -sL "https://api.github.com/repos/naiba/nezha/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gitee.com/api/v5/repos/naibahq/nezha/releases/latest" | awk -F '"' '{for(i=1;i<=NF;i++){if($i=="tag_name"){print $(i+2)}}}')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://fastly.jsdelivr.net/gh/naiba/nezha/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/naiba\/nezha@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gcore.jsdelivr.net/gh/naiba/nezha/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/naiba\/nezha@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        err "获取版本号失败,请检查本机能否链接 https://api.github.com/repos/naiba/nezha/releases/latest"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "当前最新版本为: ${_version}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl daemon-reload
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        NZ_DASHBOARD_URL="https://${GITHUB_URL}/naiba/nezha/releases/download/${_version}/dashboard-linux-${os_arch}.zip"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        NZ_DASHBOARD_URL="https://${GITHUB_URL}/naibahq/nezha/releases/download/${_version}/dashboard-linux-${os_arch}.zip"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo wget -qO $NZ_DASHBOARD_PATH/app.zip "$NZ_DASHBOARD_URL" >/dev/null 2>&1 && sudo unzip -qq -o $NZ_DASHBOARD_PATH/app.zip -d $NZ_DASHBOARD_PATH && sudo mv $NZ_DASHBOARD_PATH/dashboard-linux-$os_arch $NZ_DASHBOARD_PATH/app && sudo rm $NZ_DASHBOARD_PATH/app.zip
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl enable nezha-dashboard
 | 
					 | 
				
			||||||
        sudo systemctl restart nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-update add nezha-dashboard
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard restart
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard() {
 | 
					 | 
				
			||||||
    echo "> 启动面板"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="start_dashboard_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="start_dashboard_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "哪吒监控 启动成功"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "启动失败,请稍后查看日志信息"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml up -d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl start nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard start
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard() {
 | 
					 | 
				
			||||||
    echo "> 停止面板"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="stop_dashboard_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="stop_dashboard_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "哪吒监控 停止成功"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "停止失败,请稍后查看日志信息"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log() {
 | 
					 | 
				
			||||||
    echo "> 获取面板日志"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        show_dashboard_log_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        show_dashboard_log_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml logs -f
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo journalctl -xf -u nezha-dashboard.service
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo tail -n 10 /var/log/nezha-dashboard.err
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard() {
 | 
					 | 
				
			||||||
    echo "> 卸载管理面板"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        uninstall_dashboard_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        uninstall_dashboard_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    clean_all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
    sudo docker rmi -f ghcr.io/naiba/nezha-dashboard >/dev/null 2>&1
 | 
					 | 
				
			||||||
    sudo docker rmi -f registry.cn-shanghai.aliyuncs.com/naibahq/nezha-dashboard >/dev/null 2>&1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard_standalone() {
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl disable nezha-dashboard
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-update del nezha-dashboard
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo rm $NZ_DASHBOARD_SERVICE
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rm $NZ_DASHBOARD_SERVICERC
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_agent_log() {
 | 
					 | 
				
			||||||
    echo "> 获取Agent日志"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo journalctl -xf -u nezha-agent.service
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo tail -n 10 /var/log/nezha-agent.err
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_agent() {
 | 
					 | 
				
			||||||
    echo "> 卸载Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo ${NZ_AGENT_PATH}/nezha-agent service uninstall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
    clean_all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_agent() {
 | 
					 | 
				
			||||||
    echo "> 重启Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo ${NZ_AGENT_PATH}/nezha-agent service restart
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_all() {
 | 
					 | 
				
			||||||
    if [ -z "$(ls -A ${NZ_BASE_PATH})" ]; then
 | 
					 | 
				
			||||||
        sudo rm -rf ${NZ_BASE_PATH}
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_usage() {
 | 
					 | 
				
			||||||
    echo "哪吒监控 管理脚本使用方法: "
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
    echo "./nezha.sh                            - 显示管理菜单"
 | 
					 | 
				
			||||||
    echo "./nezha.sh install_dashboard          - 安装面板端"
 | 
					 | 
				
			||||||
    echo "./nezha.sh modify_dashboard_config    - 修改面板配置"
 | 
					 | 
				
			||||||
    echo "./nezha.sh start_dashboard            - 启动面板"
 | 
					 | 
				
			||||||
    echo "./nezha.sh stop_dashboard             - 停止面板"
 | 
					 | 
				
			||||||
    echo "./nezha.sh restart_and_update         - 重启并更新面板"
 | 
					 | 
				
			||||||
    echo "./nezha.sh show_dashboard_log         - 查看面板日志"
 | 
					 | 
				
			||||||
    echo "./nezha.sh uninstall_dashboard        - 卸载管理面板"
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
    echo "./nezha.sh install_agent              - 安装监控Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh modify_agent_config        - 修改Agent配置"
 | 
					 | 
				
			||||||
    echo "./nezha.sh show_agent_log             - 查看Agent日志"
 | 
					 | 
				
			||||||
    echo "./nezha.sh uninstall_agent            - 卸载Agen"
 | 
					 | 
				
			||||||
    echo "./nezha.sh restart_agent              - 重启Agen"
 | 
					 | 
				
			||||||
    echo "./nezha.sh update_script              - 更新脚本"
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_menu() {
 | 
					 | 
				
			||||||
    printf "
 | 
					 | 
				
			||||||
    ${green}哪吒监控管理脚本${plain} ${red}${NZ_VERSION}${plain}
 | 
					 | 
				
			||||||
    --- https://github.com/naiba/nezha ---
 | 
					 | 
				
			||||||
    ${green}1.${plain}  安装面板端
 | 
					 | 
				
			||||||
    ${green}2.${plain}  修改面板配置
 | 
					 | 
				
			||||||
    ${green}3.${plain}  启动面板
 | 
					 | 
				
			||||||
    ${green}4.${plain}  停止面板
 | 
					 | 
				
			||||||
    ${green}5.${plain}  重启并更新面板
 | 
					 | 
				
			||||||
    ${green}6.${plain}  查看面板日志
 | 
					 | 
				
			||||||
    ${green}7.${plain}  卸载管理面板
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}8.${plain}  安装监控Agent
 | 
					 | 
				
			||||||
    ${green}9.${plain}  修改Agent配置
 | 
					 | 
				
			||||||
    ${green}10.${plain} 查看Agent日志
 | 
					 | 
				
			||||||
    ${green}11.${plain} 卸载Agent
 | 
					 | 
				
			||||||
    ${green}12.${plain} 重启Agent
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}13.${plain} 更新脚本
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}0.${plain}  退出脚本
 | 
					 | 
				
			||||||
    "
 | 
					 | 
				
			||||||
    echo && printf "请输入选择 [0-13]: " && read -r num
 | 
					 | 
				
			||||||
    case "${num}" in
 | 
					 | 
				
			||||||
        0)
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        1)
 | 
					 | 
				
			||||||
            install_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        2)
 | 
					 | 
				
			||||||
            modify_dashboard_config
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        3)
 | 
					 | 
				
			||||||
            start_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        4)
 | 
					 | 
				
			||||||
            stop_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        5)
 | 
					 | 
				
			||||||
            restart_and_update
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        6)
 | 
					 | 
				
			||||||
            show_dashboard_log
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        7)
 | 
					 | 
				
			||||||
            uninstall_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        8)
 | 
					 | 
				
			||||||
            install_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        9)
 | 
					 | 
				
			||||||
            modify_agent_config
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        10)
 | 
					 | 
				
			||||||
            show_agent_log
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        11)
 | 
					 | 
				
			||||||
            uninstall_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        12)
 | 
					 | 
				
			||||||
            restart_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        13)
 | 
					 | 
				
			||||||
            update_script
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            err "请输入正确的数字 [0-13]"
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check
 | 
					 | 
				
			||||||
installation_check
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ $# -gt 0 ]; then
 | 
					 | 
				
			||||||
    case $1 in
 | 
					 | 
				
			||||||
        "install_dashboard")
 | 
					 | 
				
			||||||
            install_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "modify_dashboard_config")
 | 
					 | 
				
			||||||
            modify_dashboard_config 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "start_dashboard")
 | 
					 | 
				
			||||||
            start_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "stop_dashboard")
 | 
					 | 
				
			||||||
            stop_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "restart_and_update")
 | 
					 | 
				
			||||||
            restart_and_update 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "show_dashboard_log")
 | 
					 | 
				
			||||||
            show_dashboard_log 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "uninstall_dashboard")
 | 
					 | 
				
			||||||
            uninstall_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "install_agent")
 | 
					 | 
				
			||||||
            shift
 | 
					 | 
				
			||||||
            if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
                install_agent "$@"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                install_agent 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "modify_agent_config")
 | 
					 | 
				
			||||||
            modify_agent_config 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "show_agent_log")
 | 
					 | 
				
			||||||
            show_agent_log 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "uninstall_agent")
 | 
					 | 
				
			||||||
            uninstall_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "restart_agent")
 | 
					 | 
				
			||||||
            restart_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "update_script")
 | 
					 | 
				
			||||||
            update_script 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *) show_usage ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    select_version
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
@ -1,954 +0,0 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
#   System Required: CentOS 7+ / Debian 8+ / Ubuntu 16+ / Alpine 3+ /
 | 
					 | 
				
			||||||
#   Arch has only been tested once, if there is any problem, please report with screenshots Dysf888@pm.me
 | 
					 | 
				
			||||||
#   Description: Nezha Monitoring Install Script
 | 
					 | 
				
			||||||
#   Github: https://github.com/naiba/nezha
 | 
					 | 
				
			||||||
#========================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NZ_BASE_PATH="/opt/nezha"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_PATH="${NZ_BASE_PATH}/dashboard"
 | 
					 | 
				
			||||||
NZ_AGENT_PATH="${NZ_BASE_PATH}/agent"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_SERVICE="/etc/systemd/system/nezha-dashboard.service"
 | 
					 | 
				
			||||||
NZ_DASHBOARD_SERVICERC="/etc/init.d/nezha-dashboard"
 | 
					 | 
				
			||||||
NZ_VERSION="v0.20.2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
red='\033[0;31m'
 | 
					 | 
				
			||||||
green='\033[0;32m'
 | 
					 | 
				
			||||||
yellow='\033[0;33m'
 | 
					 | 
				
			||||||
plain='\033[0m'
 | 
					 | 
				
			||||||
export PATH="$PATH:/usr/local/bin"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
os_arch=""
 | 
					 | 
				
			||||||
[ -e /etc/os-release ] && grep -i "PRETTY_NAME" /etc/os-release | grep -qi "alpine" && os_alpine='1'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sudo() {
 | 
					 | 
				
			||||||
    myEUID=$(id -ru)
 | 
					 | 
				
			||||||
    if [ "$myEUID" -ne 0 ]; then
 | 
					 | 
				
			||||||
        if command -v sudo > /dev/null 2>&1; then
 | 
					 | 
				
			||||||
            command sudo "$@"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            err "ERROR: sudo is not installed on the system, the action cannot be proceeded."
 | 
					 | 
				
			||||||
            exit 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        "$@"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check_systemd() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ] && ! command -v systemctl >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        echo "System not supported: systemctl not found"
 | 
					 | 
				
			||||||
        exit 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
err() {
 | 
					 | 
				
			||||||
    printf "${red}%s${plain}\n" "$*" >&2
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
success() {
 | 
					 | 
				
			||||||
    printf "${green}%s${plain}\n" "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
info() {
 | 
					 | 
				
			||||||
    printf "${yellow}%s${plain}\n" "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
geo_check() {
 | 
					 | 
				
			||||||
    api_list="https://blog.cloudflare.com/cdn-cgi/trace https://dash.cloudflare.com/cdn-cgi/trace https://developers.cloudflare.com/cdn-cgi/trace"
 | 
					 | 
				
			||||||
    ua="Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0"
 | 
					 | 
				
			||||||
    set -- "$api_list"
 | 
					 | 
				
			||||||
    for url in $api_list; do
 | 
					 | 
				
			||||||
        text="$(curl -A "$ua" -m 10 -s "$url")"
 | 
					 | 
				
			||||||
        endpoint="$(echo "$text" | sed -n 's/.*h=\([^ ]*\).*/\1/p')"
 | 
					 | 
				
			||||||
        if echo "$text" | grep -qw 'CN'; then
 | 
					 | 
				
			||||||
            isCN=true
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        elif echo "$url" | grep -q "$endpoint"; then
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check() {
 | 
					 | 
				
			||||||
    umask 077
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## os_arch
 | 
					 | 
				
			||||||
    if uname -m | grep -q 'x86_64'; then
 | 
					 | 
				
			||||||
        os_arch="amd64"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'i386\|i686'; then
 | 
					 | 
				
			||||||
        os_arch="386"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'aarch64\|armv8b\|armv8l'; then
 | 
					 | 
				
			||||||
        os_arch="arm64"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'arm'; then
 | 
					 | 
				
			||||||
        os_arch="arm"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 's390x'; then
 | 
					 | 
				
			||||||
        os_arch="s390x"
 | 
					 | 
				
			||||||
    elif uname -m | grep -q 'riscv64'; then
 | 
					 | 
				
			||||||
        os_arch="riscv64"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ## China_IP
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        geo_check
 | 
					 | 
				
			||||||
        if [ -n "$isCN" ]; then
 | 
					 | 
				
			||||||
            echo "According to the information provided by various geoip api, the current IP may be in China"
 | 
					 | 
				
			||||||
            printf "Will the installation be done with a Chinese Mirror? [Y/n] (Custom Mirror Input 3): "
 | 
					 | 
				
			||||||
            read -r input
 | 
					 | 
				
			||||||
            case $input in
 | 
					 | 
				
			||||||
            [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
                echo "Use Chinese Mirror"
 | 
					 | 
				
			||||||
                CN=true
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [nN][oO] | [nN])
 | 
					 | 
				
			||||||
                echo "Do Not Use Chinese Mirror"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            [3])
 | 
					 | 
				
			||||||
                echo "Use Custom Mirror"
 | 
					 | 
				
			||||||
                printf "Please enter a custom image (e.g. :dn-dao-github-mirror.daocloud.io). If left blank, it won't be used: "
 | 
					 | 
				
			||||||
                read -r input
 | 
					 | 
				
			||||||
                case $input in
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    CUSTOM_MIRROR=$input
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            *)
 | 
					 | 
				
			||||||
                echo "Do Not Use Chinese Mirror"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -n "$CUSTOM_MIRROR" ]; then
 | 
					 | 
				
			||||||
        GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
        GITHUB_URL=$CUSTOM_MIRROR
 | 
					 | 
				
			||||||
        Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
        Get_Docker_Argu=" -s docker --mirror Aliyun"
 | 
					 | 
				
			||||||
        Docker_IMG="registry.cn-shanghai.aliyuncs.com\/naibahq\/nezha-dashboard"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="raw.githubusercontent.com/naiba/nezha/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="github.com"
 | 
					 | 
				
			||||||
            Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
            Get_Docker_Argu=" "
 | 
					 | 
				
			||||||
            Docker_IMG="ghcr.io\/naiba\/nezha-dashboard"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            GITHUB_RAW_URL="gitee.com/naibahq/nezha/raw/master"
 | 
					 | 
				
			||||||
            GITHUB_URL="gitee.com"
 | 
					 | 
				
			||||||
            Get_Docker_URL="get.docker.com"
 | 
					 | 
				
			||||||
            Get_Docker_Argu=" -s docker --mirror Aliyun"
 | 
					 | 
				
			||||||
            Docker_IMG="registry.cn-shanghai.aliyuncs.com\/naibahq\/nezha-dashboard"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
installation_check() {
 | 
					 | 
				
			||||||
    if docker compose version >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        DOCKER_COMPOSE_COMMAND="docker compose"
 | 
					 | 
				
			||||||
        if sudo $DOCKER_COMPOSE_COMMAND ls | grep -qw "$NZ_DASHBOARD_PATH/docker-compose.yaml" >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            NEZHA_IMAGES=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep -w "nezha-dashboard")
 | 
					 | 
				
			||||||
            if [ -n "$NEZHA_IMAGES" ]; then
 | 
					 | 
				
			||||||
                echo "Docker image with nezha-dashboard repository exists:"
 | 
					 | 
				
			||||||
                echo "$NEZHA_IMAGES"
 | 
					 | 
				
			||||||
                IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                FRESH_INSTALL=0
 | 
					 | 
				
			||||||
                return
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                echo "No Docker images with the nezha-dashboard repository were found."
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    elif command -v docker-compose >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        DOCKER_COMPOSE_COMMAND="docker-compose"
 | 
					 | 
				
			||||||
        if sudo $DOCKER_COMPOSE_COMMAND -f "$NZ_DASHBOARD_PATH/docker-compose.yaml" config >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            NEZHA_IMAGES=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep -w "nezha-dashboard")
 | 
					 | 
				
			||||||
            if [ -n "$NEZHA_IMAGES" ]; then
 | 
					 | 
				
			||||||
                echo "Docker image with nezha-dashboard repository exists:"
 | 
					 | 
				
			||||||
                echo "$NEZHA_IMAGES"
 | 
					 | 
				
			||||||
                IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                FRESH_INSTALL=0
 | 
					 | 
				
			||||||
                return
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                echo "No Docker images with the nezha-dashboard repository were found."
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -f "$NZ_DASHBOARD_PATH/app" ]; then
 | 
					 | 
				
			||||||
        IS_DOCKER_NEZHA=0
 | 
					 | 
				
			||||||
        FRESH_INSTALL=0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
select_version() {
 | 
					 | 
				
			||||||
    if [ -z "$IS_DOCKER_NEZHA" ]; then
 | 
					 | 
				
			||||||
        info "Select your installation method(Input anything is ok if you are installing agent):"
 | 
					 | 
				
			||||||
        info "1. Docker"
 | 
					 | 
				
			||||||
        info "2. Standalone"
 | 
					 | 
				
			||||||
        while true; do
 | 
					 | 
				
			||||||
            printf "Please enter [1-2]: "
 | 
					 | 
				
			||||||
            read -r option
 | 
					 | 
				
			||||||
            case "${option}" in
 | 
					 | 
				
			||||||
                1)
 | 
					 | 
				
			||||||
                    IS_DOCKER_NEZHA=1
 | 
					 | 
				
			||||||
                    break
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                2)
 | 
					 | 
				
			||||||
                    IS_DOCKER_NEZHA=0
 | 
					 | 
				
			||||||
                    break
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                    err "Please enter the correct number [1-2]"
 | 
					 | 
				
			||||||
                    ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
update_script() {
 | 
					 | 
				
			||||||
    echo "> Update Script"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    curl -sL https://${GITHUB_RAW_URL}/script/install_en.sh -o /tmp/nezha.sh
 | 
					 | 
				
			||||||
    new_version=$(grep "NZ_VERSION" /tmp/nezha.sh | head -n 1 | awk -F "=" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$new_version" ]; then
 | 
					 | 
				
			||||||
        echo "Script failed to get, please check if the network can link https://${GITHUB_RAW_URL}/script/install.sh"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    echo "The current latest version is: ${new_version}"
 | 
					 | 
				
			||||||
    mv -f /tmp/nezha.sh ./nezha.sh && chmod a+x ./nezha.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "Execute new script after 3s"
 | 
					 | 
				
			||||||
    sleep 3s
 | 
					 | 
				
			||||||
    clear
 | 
					 | 
				
			||||||
    exec ./nezha.sh
 | 
					 | 
				
			||||||
    exit 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
before_show_menu() {
 | 
					 | 
				
			||||||
    echo && info "* Press Enter to return to the main menu *" && read temp
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_base() {
 | 
					 | 
				
			||||||
    (command -v curl >/dev/null 2>&1 && command -v wget >/dev/null 2>&1 && command -v unzip >/dev/null 2>&1 && command -v getenforce >/dev/null 2>&1) ||
 | 
					 | 
				
			||||||
        (install_soft curl wget unzip)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_arch() {
 | 
					 | 
				
			||||||
    info "Archlinux needs to add nezha-agent user to install libselinux. It will be deleted automatically after installation. It is recommended to check manually"
 | 
					 | 
				
			||||||
    read -r -p "Do you need to install libselinux? [Y/n] " input
 | 
					 | 
				
			||||||
    case $input in
 | 
					 | 
				
			||||||
    [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
        useradd -m nezha-agent
 | 
					 | 
				
			||||||
        sed -i "$ a\nezha-agent ALL=(ALL ) NOPASSWD:ALL" /etc/sudoers
 | 
					 | 
				
			||||||
        sudo -iu nezha-agent bash -c 'gpg --keyserver keys.gnupg.net --recv-keys 4695881C254508D1;
 | 
					 | 
				
			||||||
                                        cd /tmp; git clone https://aur.archlinux.org/libsepol.git; cd libsepol; makepkg -si --noconfirm --asdeps; cd ..;
 | 
					 | 
				
			||||||
                                        git clone https://aur.archlinux.org/libselinux.git; cd libselinux; makepkg -si --noconfirm; cd ..;
 | 
					 | 
				
			||||||
                                        rm -rf libsepol libselinux'
 | 
					 | 
				
			||||||
        sed -i '/nezha-agent/d' /etc/sudoers && sleep 30s && killall -u nezha-agent && userdel -r nezha-agent
 | 
					 | 
				
			||||||
        echo -e "${red}Info: ${plain}user nezha-agent has been deleted, Be sure to check it manually!\n"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    [nN][oO] | [nN])
 | 
					 | 
				
			||||||
        echo "Libselinux will not be installed"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    *)
 | 
					 | 
				
			||||||
        echo "Libselinux will not be installed"
 | 
					 | 
				
			||||||
        exit 0
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_soft() {
 | 
					 | 
				
			||||||
    (command -v yum >/dev/null 2>&1 && sudo yum makecache && sudo yum install "$@" selinux-policy -y) ||
 | 
					 | 
				
			||||||
        (command -v apt >/dev/null 2>&1 && sudo apt update && sudo apt install "$@" selinux-utils -y) ||
 | 
					 | 
				
			||||||
        (command -v pacman >/dev/null 2>&1 && sudo pacman -Syu "$@" base-devel --noconfirm && install_arch) ||
 | 
					 | 
				
			||||||
        (command -v apt-get >/dev/null 2>&1 && sudo apt-get update && sudo apt-get install "$@" selinux-utils -y) ||
 | 
					 | 
				
			||||||
        (command -v apk >/dev/null 2>&1 && sudo apk update && sudo apk add "$@" -f)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard() {
 | 
					 | 
				
			||||||
    check_systemd
 | 
					 | 
				
			||||||
    install_base
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "> Install Dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Nezha Monitoring Folder
 | 
					 | 
				
			||||||
    if [ ! "$FRESH_INSTALL" = 0 ]; then
 | 
					 | 
				
			||||||
        sudo mkdir -p $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "You may have already installed the dashboard, repeated installation will overwrite the data, please pay attention to backup."
 | 
					 | 
				
			||||||
        printf "Exit the installation? [Y/n] "
 | 
					 | 
				
			||||||
        read -r input
 | 
					 | 
				
			||||||
        case $input in
 | 
					 | 
				
			||||||
        [yY][eE][sS] | [yY])
 | 
					 | 
				
			||||||
            echo "Exit the installation."
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        [nN][oO] | [nN])
 | 
					 | 
				
			||||||
            echo "Continue."
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            echo "Exit the installation."
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        install_dashboard_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        install_dashboard_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    modify_dashboard_config 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard_docker() {
 | 
					 | 
				
			||||||
    if [ ! "$FRESH_INSTALL" = 0 ]; then
 | 
					 | 
				
			||||||
        if ! command -v docker >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
            echo "Installing Docker"
 | 
					 | 
				
			||||||
            if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
                if ! curl -sL https://${Get_Docker_URL} | sudo bash -s "${Get_Docker_Argu}"; then
 | 
					 | 
				
			||||||
                    err "Script failed to get, please check if the network can link ${Get_Docker_URL}"
 | 
					 | 
				
			||||||
                    return 0
 | 
					 | 
				
			||||||
                fi
 | 
					 | 
				
			||||||
                sudo systemctl enable docker.service
 | 
					 | 
				
			||||||
                sudo systemctl start docker.service
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                sudo apk add docker docker-compose
 | 
					 | 
				
			||||||
                sudo rc-update add docker
 | 
					 | 
				
			||||||
                sudo rc-service docker start
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            success "Docker installed successfully"
 | 
					 | 
				
			||||||
            installation_check
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ ! -d "${NZ_DASHBOARD_PATH}/resource/template/theme-custom" ] || [ ! -d "${NZ_DASHBOARD_PATH}/resource/static/custom" ]; then
 | 
					 | 
				
			||||||
        sudo mkdir -p "${NZ_DASHBOARD_PATH}/resource/template/theme-custom" "${NZ_DASHBOARD_PATH}/resource/static/custom" >/dev/null 2>&1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
selinux() {
 | 
					 | 
				
			||||||
    #Check SELinux
 | 
					 | 
				
			||||||
    if command -v getenforce >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
        if getenforce | grep '[Ee]nfor'; then
 | 
					 | 
				
			||||||
            echo "SELinux running, closing now!"
 | 
					 | 
				
			||||||
            sudo setenforce 0 >/dev/null 2>&1
 | 
					 | 
				
			||||||
            find_key="SELINUX="
 | 
					 | 
				
			||||||
            sudo sed -ri "/^$find_key/c${find_key}disabled" /etc/selinux/config
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install_agent() {
 | 
					 | 
				
			||||||
    install_base
 | 
					 | 
				
			||||||
    selinux
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "> Install Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "Obtaining Agent version number"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _version=$(curl -m 10 -sL "https://api.github.com/repos/nezhahq/agent/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gitee.com/api/v5/repos/naibahq/agent/releases/latest" | awk -F '"' '{for(i=1;i<=NF;i++){if($i=="tag_name"){print $(i+2)}}}')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://fastly.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gcore.jsdelivr.net/gh/nezhahq/agent/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/nezhahq\/agent@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        err "Fail to obtain agent version, please check if the network can link https://api.github.com/repos/nezhahq/agent/releases/latest"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "The current latest version is: ${_version}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Nezha Monitoring Folder
 | 
					 | 
				
			||||||
    sudo mkdir -p $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "Downloading Agent"
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/nezhahq/agent/releases/download/${_version}/nezha-agent_linux_${os_arch}.zip"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        NZ_AGENT_URL="https://${GITHUB_URL}/naibahq/agent/releases/download/${_version}/nezha-agent_linux_${os_arch}.zip"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="wget -t 2 -T 60 -O nezha-agent_linux_${os_arch}.zip $NZ_AGENT_URL >/dev/null 2>&1"
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        err "Fail to download agent, please check if the network can link ${GITHUB_URL}"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo unzip -qo nezha-agent_linux_${os_arch}.zip &&
 | 
					 | 
				
			||||||
        sudo mv nezha-agent $NZ_AGENT_PATH &&
 | 
					 | 
				
			||||||
        sudo rm -rf nezha-agent_linux_${os_arch}.zip README.md
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
        modify_agent_config "$@"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        modify_agent_config 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
modify_agent_config() {
 | 
					 | 
				
			||||||
    echo "> Modify Agent Configuration"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# -lt 3 ]; then
 | 
					 | 
				
			||||||
        echo "Please add Agent in the Dashboard first, record the secret"
 | 
					 | 
				
			||||||
            printf "Please enter a domain that resolves to the IP where Dashboard is located (no CDN): "
 | 
					 | 
				
			||||||
            read -r nz_grpc_host
 | 
					 | 
				
			||||||
            printf "Please enter Dashboard RPC port (default 5555): "
 | 
					 | 
				
			||||||
            read -r nz_grpc_port
 | 
					 | 
				
			||||||
            printf "Please enter the Agent secret: "
 | 
					 | 
				
			||||||
            read -r nz_client_secret
 | 
					 | 
				
			||||||
            printf "Do you want to enable SSL/TLS encryption for the gRPC port (--tls)? Press [y] if yes, the default is not required, and users can press Enter to skip if you don't understand: "
 | 
					 | 
				
			||||||
            read -r nz_grpc_proxy
 | 
					 | 
				
			||||||
        echo "${nz_grpc_proxy}" | grep -qiw 'Y' && args='--tls'
 | 
					 | 
				
			||||||
        if [ -z "$nz_grpc_host" ] || [ -z "$nz_client_secret" ]; then
 | 
					 | 
				
			||||||
            err "All options cannot be empty"
 | 
					 | 
				
			||||||
            before_show_menu
 | 
					 | 
				
			||||||
            return 1
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        if [ -z "$nz_grpc_port" ]; then
 | 
					 | 
				
			||||||
            nz_grpc_port=5555
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        nz_grpc_host=$1
 | 
					 | 
				
			||||||
        nz_grpc_port=$2
 | 
					 | 
				
			||||||
        nz_client_secret=$3
 | 
					 | 
				
			||||||
        shift 3
 | 
					 | 
				
			||||||
        if [ $# -gt 0 ]; then
 | 
					 | 
				
			||||||
            args="$*"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="sudo ${NZ_AGENT_PATH}/nezha-agent service install -s $nz_grpc_host:$nz_grpc_port -p $nz_client_secret $args >/dev/null 2>&1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        sudo "${NZ_AGENT_PATH}"/nezha-agent service uninstall >/dev/null 2>&1
 | 
					 | 
				
			||||||
        sudo "${NZ_AGENT_PATH}"/nezha-agent service install -s "$nz_grpc_host:$nz_grpc_port" -p "$nz_client_secret" "$args" >/dev/null 2>&1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    success "Agent configuration modified successfully, please wait for agent self-restart to take effect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #if [[ $# == 0 ]]; then
 | 
					 | 
				
			||||||
    #    before_show_menu
 | 
					 | 
				
			||||||
    #fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
modify_dashboard_config() {
 | 
					 | 
				
			||||||
    echo "> Modify Dashboard Configuration"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        if [ -n "$DOCKER_COMPOSE_COMMAND" ]; then
 | 
					 | 
				
			||||||
            echo "Download Docker Script"
 | 
					 | 
				
			||||||
            _cmd="wget -t 2 -T 60 -O /tmp/nezha-docker-compose.yaml https://${GITHUB_RAW_URL}/script/docker-compose.yaml >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
                err "Script failed to get, please check if the network can link ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            err "Please install docker-compose manually. https://docs.docker.com/compose/install/linux/"
 | 
					 | 
				
			||||||
            before_show_menu
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _cmd="wget -t 2 -T 60 -O /tmp/nezha-config.yaml https://${GITHUB_RAW_URL}/script/config.yaml >/dev/null 2>&1"
 | 
					 | 
				
			||||||
    if ! eval "$_cmd"; then
 | 
					 | 
				
			||||||
        err "Script failed to get, please check if the network can link ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
        return 0
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    echo "About the GitHub Oauth2 application: create it at https://github.com/settings/developers, no review required, and fill in the http(s)://domain_or_IP/oauth2/callback"
 | 
					 | 
				
			||||||
        echo "(Not recommended) About the Gitee Oauth2 application: create it at https://gitee.com/oauth/applications, no auditing required, and fill in the http(s)://domain_or_IP/oauth2/callback"
 | 
					 | 
				
			||||||
        printf "Please enter the OAuth2 provider (github/gitlab/jihulab/gitee, default github): "
 | 
					 | 
				
			||||||
        read -r nz_oauth2_type
 | 
					 | 
				
			||||||
        printf "Please enter the Client ID of the Oauth2 application: "
 | 
					 | 
				
			||||||
        read -r nz_github_oauth_client_id
 | 
					 | 
				
			||||||
        printf "Please enter the Client Secret of the Oauth2 application: "
 | 
					 | 
				
			||||||
        read -r nz_github_oauth_client_secret
 | 
					 | 
				
			||||||
        printf "Please enter your GitHub/Gitee login name as the administrator, separated by commas: "
 | 
					 | 
				
			||||||
        read -r nz_admin_logins
 | 
					 | 
				
			||||||
        printf "Please enter the site title: "
 | 
					 | 
				
			||||||
        read -r nz_site_title
 | 
					 | 
				
			||||||
        printf "Please enter the site access port: (default 8008)"
 | 
					 | 
				
			||||||
        read -r nz_site_port
 | 
					 | 
				
			||||||
        printf "Please enter the RPC port to be used for Agent access: (default 5555)"
 | 
					 | 
				
			||||||
        read -r nz_grpc_port
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$nz_admin_logins" ] || [ -z "$nz_github_oauth_client_id" ] || [ -z "$nz_github_oauth_client_secret" ] || [ -z "$nz_site_title" ]; then
 | 
					 | 
				
			||||||
        err "All options cannot be empty"
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$nz_site_port" ]; then
 | 
					 | 
				
			||||||
        nz_site_port=8008
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$nz_grpc_port" ]; then
 | 
					 | 
				
			||||||
        nz_grpc_port=5555
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$nz_oauth2_type" ]; then
 | 
					 | 
				
			||||||
        nz_oauth2_type=github
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sed -i "s/nz_oauth2_type/${nz_oauth2_type}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_admin_logins/${nz_admin_logins}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_grpc_port/${nz_grpc_port}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_github_oauth_client_id/${nz_github_oauth_client_id}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_github_oauth_client_secret/${nz_github_oauth_client_secret}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_language/zh-CN/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    sed -i "s/nz_site_title/${nz_site_title}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        sed -i "s/nz_site_port/${nz_site_port}/" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
        sed -i "s/nz_grpc_port/${nz_grpc_port}/g" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
        sed -i "s/nz_image_url/${Docker_IMG}/" /tmp/nezha-docker-compose.yaml
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        sed -i "s/80/${nz_site_port}/" /tmp/nezha-config.yaml
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo mkdir -p $NZ_DASHBOARD_PATH/data
 | 
					 | 
				
			||||||
    sudo mv -f /tmp/nezha-config.yaml ${NZ_DASHBOARD_PATH}/data/config.yaml
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        sudo mv -f /tmp/nezha-docker-compose.yaml ${NZ_DASHBOARD_PATH}/docker-compose.yaml
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        echo "Downloading service file"
 | 
					 | 
				
			||||||
        if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
            _download="sudo wget -t 2 -T 60 -O $NZ_DASHBOARD_SERVICE https://${GITHUB_RAW_URL}/script/nezha-dashboard.service >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_download"; then
 | 
					 | 
				
			||||||
                err "File failed to get, please check if the network can link ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            _download="sudo wget -t 2 -T 60 -O $NZ_DASHBOARD_SERVICERC https://${GITHUB_RAW_URL}/script/nezha-dashboard >/dev/null 2>&1"
 | 
					 | 
				
			||||||
            if ! eval "$_download"; then
 | 
					 | 
				
			||||||
                err "File failed to get, please check if the network can link ${GITHUB_RAW_URL}"
 | 
					 | 
				
			||||||
                return 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            sudo chmod +x $NZ_DASHBOARD_SERVICERC
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    success "Dashboard configuration modified successfully, please wait for Dashboard self-restart to take effect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    restart_and_update
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update() {
 | 
					 | 
				
			||||||
    echo "> Restart and Update Dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="restart_and_update_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="restart_and_update_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "Nezha Monitoring Restart Successful"
 | 
					 | 
				
			||||||
        info "Default Dashboard address: domain:site_access_port"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "The restart failed, probably because the boot time exceeded two seconds, please check the log information later"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml pull
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml up -d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_and_update_standalone() {
 | 
					 | 
				
			||||||
    _version=$(curl -m 10 -sL "https://api.github.com/repos/naiba/nezha/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gitee.com/api/v5/repos/naibahq/nezha/releases/latest" | awk -F '"' '{for(i=1;i<=NF;i++){if($i=="tag_name"){print $(i+2)}}}')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://fastly.jsdelivr.net/gh/naiba/nezha/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/naiba\/nezha@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        _version=$(curl -m 10 -sL "https://gcore.jsdelivr.net/gh/naiba/nezha/" | grep "option\.value" | awk -F "'" '{print $2}' | sed 's/naiba\/nezha@/v/g')
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$_version" ]; then
 | 
					 | 
				
			||||||
        err "Fail to obtain agent version, please check if the network can link https://api.github.com/repos/nezhahq/agent/releases/latest"
 | 
					 | 
				
			||||||
        return 1
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo "The current latest version is: ${_version}"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl daemon-reload
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ -z "$CN" ]; then
 | 
					 | 
				
			||||||
        NZ_DASHBOARD_URL="https://${GITHUB_URL}/naiba/nezha/releases/download/${_version}/dashboard-linux-${os_arch}.zip"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        NZ_DASHBOARD_URL="https://${GITHUB_URL}/naibahq/nezha/releases/download/${_version}/dashboard-linux-${os_arch}.zip"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo wget -qO $NZ_DASHBOARD_PATH/app.zip "$NZ_DASHBOARD_URL" >/dev/null 2>&1 && sudo unzip -qq -o $NZ_DASHBOARD_PATH/app.zip -d $NZ_DASHBOARD_PATH && sudo mv $NZ_DASHBOARD_PATH/dashboard-linux-$os_arch $NZ_DASHBOARD_PATH/app && sudo rm $NZ_DASHBOARD_PATH/app.zip
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl enable nezha-dashboard
 | 
					 | 
				
			||||||
        sudo systemctl restart nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-update add nezha-dashboard
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard restart
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard() {
 | 
					 | 
				
			||||||
    echo "> Start Dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="start_dashboard_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="start_dashboard_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "Nezha Monitoring Start Successful"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "Failed to start, please check the log message later"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml up -d
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl start nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard start
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard() {
 | 
					 | 
				
			||||||
    echo "> Stop Dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        _cmd="stop_dashboard_docker"
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        _cmd="stop_dashboard_standalone"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if eval "$_cmd"; then
 | 
					 | 
				
			||||||
        success "Nezha Monitoring Stop Successful"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        err "Failed to stop, please check the log message later"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
stop_dashboard_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log() {
 | 
					 | 
				
			||||||
    echo "> View Dashboard Log"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        show_dashboard_log_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        show_dashboard_log_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml logs -f
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_dashboard_log_standalone() {
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo journalctl -xf -u nezha-dashboard.service
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo tail -n 10 /var/log/nezha-dashboard.err
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard() {
 | 
					 | 
				
			||||||
    echo "> Uninstall Dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$IS_DOCKER_NEZHA" = 1 ]; then
 | 
					 | 
				
			||||||
        uninstall_dashboard_docker
 | 
					 | 
				
			||||||
    elif [ "$IS_DOCKER_NEZHA" = 0 ]; then
 | 
					 | 
				
			||||||
        uninstall_dashboard_standalone
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    clean_all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard_docker() {
 | 
					 | 
				
			||||||
    sudo $DOCKER_COMPOSE_COMMAND -f ${NZ_DASHBOARD_PATH}/docker-compose.yaml down
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
    sudo docker rmi -f ghcr.io/naiba/nezha-dashboard >/dev/null 2>&1
 | 
					 | 
				
			||||||
    sudo docker rmi -f registry.cn-shanghai.aliyuncs.com/naibahq/nezha-dashboard >/dev/null 2>&1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_dashboard_standalone() {
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_DASHBOARD_PATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo systemctl disable nezha-dashboard
 | 
					 | 
				
			||||||
        sudo systemctl stop nezha-dashboard
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rc-update del nezha-dashboard
 | 
					 | 
				
			||||||
        sudo rc-service nezha-dashboard stop
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo rm $NZ_DASHBOARD_SERVICE
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo rm $NZ_DASHBOARD_SERVICERC
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_agent_log() {
 | 
					 | 
				
			||||||
    echo "> View Agent Log"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ "$os_alpine" != 1 ]; then
 | 
					 | 
				
			||||||
        sudo journalctl -xf -u nezha-agent.service
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sudo tail -n 10 /var/log/nezha-agent.err
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall_agent() {
 | 
					 | 
				
			||||||
    echo "> Uninstall Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo ${NZ_AGENT_PATH}/nezha-agent service uninstall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo rm -rf $NZ_AGENT_PATH
 | 
					 | 
				
			||||||
    clean_all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
restart_agent() {
 | 
					 | 
				
			||||||
    echo "> Restart Agent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sudo ${NZ_AGENT_PATH}/nezha-agent service restart
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [ $# = 0 ]; then
 | 
					 | 
				
			||||||
        before_show_menu
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_all() {
 | 
					 | 
				
			||||||
    if [ -z "$(ls -A ${NZ_BASE_PATH})" ]; then
 | 
					 | 
				
			||||||
        sudo rm -rf ${NZ_BASE_PATH}
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_usage() {
 | 
					 | 
				
			||||||
    echo "Nezha Monitor Management Script Usage: "
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
    echo "./nezha.sh                            - Show Menu"
 | 
					 | 
				
			||||||
    echo "./nezha.sh install_dashboard          - Install Dashboard"
 | 
					 | 
				
			||||||
    echo "./nezha.sh modify_dashboard_config    - Modify Dashboard Configuration"
 | 
					 | 
				
			||||||
    echo "./nezha.sh start_dashboard            - Start Dashboard"
 | 
					 | 
				
			||||||
    echo "./nezha.sh stop_dashboard             - Stop Dashboard"
 | 
					 | 
				
			||||||
    echo "./nezha.sh restart_and_update         - Restart and Update the Dashboard"
 | 
					 | 
				
			||||||
    echo "./nezha.sh show_dashboard_log         - View Dashboard Log"
 | 
					 | 
				
			||||||
    echo "./nezha.sh uninstall_dashboard        - Uninstall Dashboard"
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
    echo "./nezha.sh install_agent              - Install Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh modify_agent_config        - Modify Agent Configuration"
 | 
					 | 
				
			||||||
    echo "./nezha.sh show_agent_log             - View Agent Log"
 | 
					 | 
				
			||||||
    echo "./nezha.sh uninstall_agent            - Uninstall Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh restart_agent              - Restart Agent"
 | 
					 | 
				
			||||||
    echo "./nezha.sh update_script              - Update Script"
 | 
					 | 
				
			||||||
    echo "--------------------------------------------------------"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
show_menu() {
 | 
					 | 
				
			||||||
    printf "
 | 
					 | 
				
			||||||
    ${green}Nezha Monitor Management Script${plain} ${red}${NZ_VERSION}${plain}
 | 
					 | 
				
			||||||
    --- https://github.com/naiba/nezha ---
 | 
					 | 
				
			||||||
    ${green}1.${plain}  Install Dashboard
 | 
					 | 
				
			||||||
    ${green}2.${plain}  Modify Dashbaord Configuration
 | 
					 | 
				
			||||||
    ${green}3.${plain}  Start Dashboard
 | 
					 | 
				
			||||||
    ${green}4.${plain}  Stop Dashboard
 | 
					 | 
				
			||||||
    ${green}5.${plain}  Restart and Update Dashboard
 | 
					 | 
				
			||||||
    ${green}6.${plain}  View Dashboard Log
 | 
					 | 
				
			||||||
    ${green}7.${plain}  Uninstall Dashboard
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}8.${plain}  Install Agent
 | 
					 | 
				
			||||||
    ${green}9.${plain}  Modify Agent Configuration
 | 
					 | 
				
			||||||
    ${green}10.${plain} View Agent Log
 | 
					 | 
				
			||||||
    ${green}11.${plain} Uninstall Agent
 | 
					 | 
				
			||||||
    ${green}12.${plain} Restart Agent
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}13.${plain} Update Script
 | 
					 | 
				
			||||||
    ————————————————-
 | 
					 | 
				
			||||||
    ${green}0.${plain}  Exit Script
 | 
					 | 
				
			||||||
    "
 | 
					 | 
				
			||||||
    echo && printf "Please enter [0-13]: " && read -r num
 | 
					 | 
				
			||||||
    case "${num}" in
 | 
					 | 
				
			||||||
        0)
 | 
					 | 
				
			||||||
            exit 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        1)
 | 
					 | 
				
			||||||
            install_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        2)
 | 
					 | 
				
			||||||
            modify_dashboard_config
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        3)
 | 
					 | 
				
			||||||
            start_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        4)
 | 
					 | 
				
			||||||
            stop_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        5)
 | 
					 | 
				
			||||||
            restart_and_update
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        6)
 | 
					 | 
				
			||||||
            show_dashboard_log
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        7)
 | 
					 | 
				
			||||||
            uninstall_dashboard
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        8)
 | 
					 | 
				
			||||||
            install_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        9)
 | 
					 | 
				
			||||||
            modify_agent_config
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        10)
 | 
					 | 
				
			||||||
            show_agent_log
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        11)
 | 
					 | 
				
			||||||
            uninstall_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        12)
 | 
					 | 
				
			||||||
            restart_agent
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        13)
 | 
					 | 
				
			||||||
            update_script
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *)
 | 
					 | 
				
			||||||
            err "Please enter the correct number [0-13]"
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pre_check
 | 
					 | 
				
			||||||
installation_check
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ $# -gt 0 ]; then
 | 
					 | 
				
			||||||
    case $1 in
 | 
					 | 
				
			||||||
        "install_dashboard")
 | 
					 | 
				
			||||||
            install_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "modify_dashboard_config")
 | 
					 | 
				
			||||||
            modify_dashboard_config 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "start_dashboard")
 | 
					 | 
				
			||||||
            start_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "stop_dashboard")
 | 
					 | 
				
			||||||
            stop_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "restart_and_update")
 | 
					 | 
				
			||||||
            restart_and_update 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "show_dashboard_log")
 | 
					 | 
				
			||||||
            show_dashboard_log 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "uninstall_dashboard")
 | 
					 | 
				
			||||||
            uninstall_dashboard 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "install_agent")
 | 
					 | 
				
			||||||
            shift
 | 
					 | 
				
			||||||
            if [ $# -ge 3 ]; then
 | 
					 | 
				
			||||||
                install_agent "$@"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                install_agent 0
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "modify_agent_config")
 | 
					 | 
				
			||||||
            modify_agent_config 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "show_agent_log")
 | 
					 | 
				
			||||||
            show_agent_log 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "uninstall_agent")
 | 
					 | 
				
			||||||
            uninstall_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "restart_agent")
 | 
					 | 
				
			||||||
            restart_agent 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        "update_script")
 | 
					 | 
				
			||||||
            update_script 0
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        *) show_usage ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    select_version
 | 
					 | 
				
			||||||
    show_menu
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
@ -1,18 +0,0 @@
 | 
				
			|||||||
#!/sbin/openrc-run
 | 
					 | 
				
			||||||
supervisor=supervise-daemon
 | 
					 | 
				
			||||||
name=nezha-dashboard
 | 
					 | 
				
			||||||
output_log=/var/log/${name}.log
 | 
					 | 
				
			||||||
error_log=/var/log/${name}.err
 | 
					 | 
				
			||||||
pidfile="/run/${RC_SVCNAME}.pid"
 | 
					 | 
				
			||||||
command="/opt/nezha/dashboard/app"
 | 
					 | 
				
			||||||
command_args=""
 | 
					 | 
				
			||||||
command_background=true
 | 
					 | 
				
			||||||
directory="/opt/nezha/dashboard"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
depend() {
 | 
					 | 
				
			||||||
	  need net
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
start_pre() {
 | 
					 | 
				
			||||||
    checkpath -f -m 0644 -o root:root "/var/log/${name}.log"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,30 +0,0 @@
 | 
				
			|||||||
[Unit]
 | 
					 | 
				
			||||||
Description=Nezha Dashboard
 | 
					 | 
				
			||||||
After=syslog.target
 | 
					 | 
				
			||||||
After=network.target
 | 
					 | 
				
			||||||
After=mariadb.service mysqld.service postgresql.service memcached.service redis.service
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Service]
 | 
					 | 
				
			||||||
# Modify these two values and uncomment them if you have
 | 
					 | 
				
			||||||
# repos with lots of files and get an HTTP error 500 because
 | 
					 | 
				
			||||||
# of that
 | 
					 | 
				
			||||||
###
 | 
					 | 
				
			||||||
#LimitMEMLOCK=infinity
 | 
					 | 
				
			||||||
#LimitNOFILE=65535
 | 
					 | 
				
			||||||
Type=simple
 | 
					 | 
				
			||||||
#User=root
 | 
					 | 
				
			||||||
#Group=root
 | 
					 | 
				
			||||||
WorkingDirectory=/opt/nezha/dashboard/
 | 
					 | 
				
			||||||
ExecStart=/opt/nezha/dashboard/app
 | 
					 | 
				
			||||||
Restart=always
 | 
					 | 
				
			||||||
#Environment=DEBUG=true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Some distributions may not support these hardening directives. If you cannot start the service due
 | 
					 | 
				
			||||||
# to an unknown option, comment out the ones not supported by your version of systemd.
 | 
					 | 
				
			||||||
ProtectSystem=full
 | 
					 | 
				
			||||||
PrivateDevices=yes
 | 
					 | 
				
			||||||
PrivateTmp=yes
 | 
					 | 
				
			||||||
NoNewPrivileges=true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Install]
 | 
					 | 
				
			||||||
WantedBy=multi-user.target
 | 
					 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user