✨ Uses v2 configration schema
This commit is contained in:
		| @@ -3,9 +3,8 @@ | |||||||
|         { |         { | ||||||
|             "type": "go", |             "type": "go", | ||||||
|             "name": "Run RoadSign", |             "name": "Run RoadSign", | ||||||
|             "goExecPath": "C:\\Tools\\Scoop\\shims\\go.exe", |             "goExecPath": "/opt/homebrew/bin/go", | ||||||
|             "buildParams": ["code.smartsheep.studio/goatworks/roadsign/pkg/cmd"], |             "buildParams": ["code.smartsheep.studio/goatworks/roadsign/pkg/cmd/server"], | ||||||
|         }, |         }, | ||||||
|          |  | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
							
								
								
									
										5
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								go.mod
									
									
									
									
									
								
							| @@ -5,6 +5,7 @@ go 1.21.4 | |||||||
| require ( | require ( | ||||||
| 	github.com/gofiber/fiber/v2 v2.51.0 | 	github.com/gofiber/fiber/v2 v2.51.0 | ||||||
| 	github.com/google/uuid v1.4.0 | 	github.com/google/uuid v1.4.0 | ||||||
|  | 	github.com/json-iterator/go v1.1.12 | ||||||
| 	github.com/rs/zerolog v1.31.0 | 	github.com/rs/zerolog v1.31.0 | ||||||
| 	github.com/samber/lo v1.38.1 | 	github.com/samber/lo v1.38.1 | ||||||
| 	github.com/saracen/fastzip v0.1.11 | 	github.com/saracen/fastzip v0.1.11 | ||||||
| @@ -15,7 +16,6 @@ require ( | |||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect | 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect | ||||||
| 	github.com/json-iterator/go v1.1.12 // 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/russross/blackfriday/v2 v2.1.0 // indirect | 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||||
| @@ -34,7 +34,7 @@ require ( | |||||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||||
| 	github.com/mattn/go-runewidth v0.0.15 // indirect | 	github.com/mattn/go-runewidth v0.0.15 // indirect | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 // indirect | 	github.com/mitchellh/mapstructure v1.5.0 // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.1.0 // indirect | 	github.com/pelletier/go-toml/v2 v2.1.1 | ||||||
| 	github.com/philhofer/fwd v1.1.2 // indirect | 	github.com/philhofer/fwd v1.1.2 // indirect | ||||||
| 	github.com/rivo/uniseg v0.2.0 // indirect | 	github.com/rivo/uniseg v0.2.0 // indirect | ||||||
| 	github.com/sagikazarmark/locafero v0.3.0 // indirect | 	github.com/sagikazarmark/locafero v0.3.0 // indirect | ||||||
| @@ -53,6 +53,5 @@ require ( | |||||||
| 	golang.org/x/sys v0.15.0 // indirect | 	golang.org/x/sys v0.15.0 // indirect | ||||||
| 	golang.org/x/text v0.13.0 // indirect | 	golang.org/x/text v0.13.0 // indirect | ||||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 |  | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								go.sum
									
									
									
									
									
								
							| @@ -17,14 +17,19 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb | |||||||
| cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= | cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= | ||||||
| cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= | cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= | ||||||
| cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= | cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= | ||||||
|  | cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= | ||||||
| cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | ||||||
| cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | ||||||
| cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= | ||||||
| cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= | ||||||
| cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= | ||||||
| cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= | ||||||
|  | cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= | ||||||
|  | cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= | ||||||
| cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | ||||||
| cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= | ||||||
|  | cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= | ||||||
|  | cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= | ||||||
| cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= | ||||||
| cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= | ||||||
| cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= | ||||||
| @@ -37,9 +42,11 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 | |||||||
| cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= | cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= | ||||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | ||||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||||
|  | github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= | ||||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | ||||||
| github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= | github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= | ||||||
| github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= | github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= | ||||||
|  | github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= | ||||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||||
| github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | ||||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | ||||||
| @@ -48,6 +55,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk | |||||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||||
| github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | ||||||
| github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | ||||||
|  | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||||
| github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||||
| github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= | github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= | ||||||
| github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | ||||||
| @@ -61,6 +69,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m | |||||||
| github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= | github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= | ||||||
| github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= | ||||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||||
|  | github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= | ||||||
| github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= | github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= | ||||||
| github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | ||||||
| github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= | github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= | ||||||
| @@ -71,10 +80,12 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 | |||||||
| github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||||
| github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= | github.com/gofiber/fiber/v2 v2.51.0 h1:JNACcZy5e2tGApWB2QrRpenTWn0fq0hkFm6k0C86gKQ= | ||||||
| github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= | github.com/gofiber/fiber/v2 v2.51.0/go.mod h1:xaQRZQJGqnKOQnbQw+ltvku3/h8QxvNi8o6JiJ7Ll0U= | ||||||
|  | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||||
| github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||||
| github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||||
| github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||||
|  | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||||
| github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||||
| github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= | ||||||
| @@ -96,6 +107,7 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq | |||||||
| github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | ||||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
| github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
|  | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||||
| github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||||
| @@ -124,16 +136,26 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe | |||||||
| github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||||
| github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||||
|  | github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= | ||||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= | github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= | ||||||
| github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
|  | github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= | ||||||
| github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | ||||||
| github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | ||||||
|  | github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= | ||||||
| github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= | github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= | ||||||
|  | github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= | ||||||
|  | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= | ||||||
|  | github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= | ||||||
|  | github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= | ||||||
|  | github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= | ||||||
| github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | ||||||
| github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | ||||||
|  | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||||
| github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= | 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/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | ||||||
|  | github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= | ||||||
| github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | ||||||
| github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | ||||||
| github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||||
| @@ -161,6 +183,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE | |||||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||||
| github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= | github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= | ||||||
| github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | ||||||
|  | github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= | ||||||
|  | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | ||||||
| github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= | github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= | ||||||
| github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | ||||||
| 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= | ||||||
| @@ -168,8 +192,12 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w | |||||||
| 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= | ||||||
| github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||||
| github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||||
| github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= | github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= | ||||||
| github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= | github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzDHrVBd5qM= | ||||||
|  | github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= | ||||||
|  | github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= | ||||||
|  | github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= | ||||||
| github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= | github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= | ||||||
| github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= | github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= | ||||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
| @@ -188,6 +216,7 @@ github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= | |||||||
| github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= | github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= | ||||||
| github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | ||||||
| github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||||
|  | github.com/sagikazarmark/crypt v0.15.0/go.mod h1:5rwNNax6Mlk9sZ40AcyVtiEw24Z4J04cfSioF2COKmc= | ||||||
| github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= | github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= | ||||||
| github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= | github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= | ||||||
| github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= | github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= | ||||||
| @@ -238,16 +267,22 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de | |||||||
| github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
| 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.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= | ||||||
|  | go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= | ||||||
|  | go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= | ||||||
|  | go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= | ||||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||||
| go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||||
| go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||||
| go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||||
| go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | ||||||
|  | go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= | ||||||
| go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= | 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/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 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= | ||||||
| go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= | go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= | ||||||
|  | go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= | ||||||
| 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= | ||||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
| golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
| @@ -256,6 +291,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh | |||||||
| golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||||
|  | golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= | ||||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
| golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
| golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | ||||||
| @@ -293,6 +329,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||||||
| golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||||
| golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
|  | golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| @@ -327,6 +364,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v | |||||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||||
| golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= | golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= | ||||||
|  | golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= | ||||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
| @@ -336,6 +374,7 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ | |||||||
| golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||||
| golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||||
| golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||||
|  | golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| @@ -411,6 +450,7 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | |||||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
|  | golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||||
| @@ -460,10 +500,12 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f | |||||||
| golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | ||||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||||
| golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= | golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= | ||||||
|  | golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= | ||||||
| google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= | ||||||
| google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= | ||||||
| google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | ||||||
| @@ -483,6 +525,7 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 | |||||||
| google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= | google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= | ||||||
| google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= | google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= | ||||||
| google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= | google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= | ||||||
|  | google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= | ||||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||||
| google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||||
| @@ -526,6 +569,9 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D | |||||||
| google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||||
| google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||||
| google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||||
|  | google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= | ||||||
|  | google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= | ||||||
|  | google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= | ||||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||||
| google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||||
| @@ -542,6 +588,7 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM | |||||||
| google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= | ||||||
| google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= | google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= | ||||||
| google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | ||||||
|  | google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= | ||||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||||
| @@ -552,6 +599,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 | |||||||
| google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||||
| google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= | ||||||
| google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | ||||||
|  | google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | ||||||
| @@ -560,8 +608,6 @@ 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 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= | ||||||
| gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | 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/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= |  | ||||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ type CliConnection struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (v CliConnection) CheckConnectivity() error { | func (v CliConnection) CheckConnectivity() error { | ||||||
| 	client := fiber.Get(v.Url + "/cgi/connectivity") | 	client := fiber.Get(v.Url + "/cgi/metadata") | ||||||
| 	client.BasicAuth("RoadSign CLI", v.Credential) | 	client.BasicAuth("RoadSign CLI", v.Credential) | ||||||
|  |  | ||||||
| 	if status, data, err := client.Bytes(); len(err) > 0 { | 	if status, data, err := client.Bytes(); len(err) > 0 { | ||||||
|   | |||||||
| @@ -11,9 +11,9 @@ import ( | |||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/cmd/rds/conn" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/cmd/rds/conn" | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
|  | 	"github.com/pelletier/go-toml/v2" | ||||||
| 	"github.com/rs/zerolog/log" | 	"github.com/rs/zerolog/log" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| 	"gopkg.in/yaml.v2" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var DeployCommands = []*cli.Command{ | var DeployCommands = []*cli.Command{ | ||||||
| @@ -78,7 +78,7 @@ var DeployCommands = []*cli.Command{ | |||||||
| 				return err | 				return err | ||||||
| 			} else { | 			} else { | ||||||
| 				raw, _ := io.ReadAll(file) | 				raw, _ := io.ReadAll(file) | ||||||
| 				yaml.Unmarshal(raw, &site) | 				toml.Unmarshal(raw, &site) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			url := fmt.Sprintf("/webhooks/sync/%s", ctx.Args().Get(1)) | 			url := fmt.Sprintf("/webhooks/sync/%s", ctx.Args().Get(1)) | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ func main() { | |||||||
| 	// Configure settings | 	// Configure settings | ||||||
| 	viper.AddConfigPath("$HOME") | 	viper.AddConfigPath("$HOME") | ||||||
| 	viper.SetConfigName(".roadsignrc") | 	viper.SetConfigName(".roadsignrc") | ||||||
| 	viper.SetConfigType("yaml") | 	viper.SetConfigType("toml") | ||||||
|  |  | ||||||
| 	// Load settings | 	// Load settings | ||||||
| 	if err := viper.ReadInConfig(); err != nil { | 	if err := viper.ReadInConfig(); err != nil { | ||||||
|   | |||||||
| @@ -10,7 +10,6 @@ import ( | |||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/hypertext" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/hypertext" | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/sideload" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/sideload" | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/sign" |  | ||||||
| 	"github.com/google/uuid" | 	"github.com/google/uuid" | ||||||
| 	"github.com/rs/zerolog" | 	"github.com/rs/zerolog" | ||||||
| 	"github.com/rs/zerolog/log" | 	"github.com/rs/zerolog/log" | ||||||
| @@ -27,7 +26,7 @@ func main() { | |||||||
| 	viper.AddConfigPath(".") | 	viper.AddConfigPath(".") | ||||||
| 	viper.AddConfigPath("..") | 	viper.AddConfigPath("..") | ||||||
| 	viper.SetConfigName("settings") | 	viper.SetConfigName("settings") | ||||||
| 	viper.SetConfigType("yaml") | 	viper.SetConfigType("toml") | ||||||
|  |  | ||||||
| 	// Load settings | 	// Load settings | ||||||
| 	if err := viper.ReadInConfig(); err != nil { | 	if err := viper.ReadInConfig(); err != nil { | ||||||
| @@ -44,20 +43,15 @@ func main() { | |||||||
| 		log.Warn().Msgf("RoadSign auto generated api credential is %s", credential) | 		log.Warn().Msgf("RoadSign auto generated api credential is %s", credential) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Load & init sign | 	// Load & init navi | ||||||
| 	if err := navi.ReadInConfig(viper.GetString("paths.configs")); err != nil { | 	if err := navi.ReadInConfig(viper.GetString("paths.configs")); err != nil { | ||||||
| 		log.Panic().Err(err).Msg("An error occurred when loading configurations.") | 		log.Panic().Err(err).Msg("An error occurred when loading configurations.") | ||||||
| 	} else { | 	} else { | ||||||
| 		log.Info().Int("count", len(sign.App.Sites)).Msg("All configuration has been loaded.") | 		log.Info().Int("count", len(navi.R.Regions)).Msg("All configuration has been loaded.") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Preheat processes | 	// Init warden | ||||||
| 	go func() { | 	navi.InitializeWarden(navi.R.Regions) | ||||||
| 		log.Info().Msg("Preheating processes...") |  | ||||||
| 		sign.App.PreheatProcesses(func(total int, success int) { |  | ||||||
| 			log.Info().Int("requested", total).Int("succeed", success).Msgf("Preheat processes completed!") |  | ||||||
| 		}) |  | ||||||
| 	}() |  | ||||||
|  |  | ||||||
| 	// Init hypertext server | 	// Init hypertext server | ||||||
| 	hypertext.RunServer( | 	hypertext.RunServer( | ||||||
|   | |||||||
| @@ -1,9 +1,10 @@ | |||||||
| package hypertext | package hypertext | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"math/rand" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  |  | ||||||
| 	"code.smartsheep.studio/goatworks/roadnavi/pkg/navi" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
| 	"github.com/samber/lo" | 	"github.com/samber/lo" | ||||||
| ) | ) | ||||||
| @@ -16,16 +17,16 @@ func UseProxies(app *fiber.App) { | |||||||
| 		headers := ctx.GetReqHeaders() | 		headers := ctx.GetReqHeaders() | ||||||
|  |  | ||||||
| 		// Filtering sites | 		// Filtering sites | ||||||
| 		for _, site := range navi.App.Sites { | 		for _, region := range navi.R.Regions { | ||||||
| 			// Matching rules | 			// Matching rules | ||||||
| 			for _, rule := range site.Rules { | 			for _, location := range region.Locations { | ||||||
| 				if !lo.Contains(rule.Host, host) { | 				if !lo.Contains(location.Host, host) { | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if !func() bool { | 				if !func() bool { | ||||||
| 					flag := false | 					flag := false | ||||||
| 					for _, pattern := range rule.Path { | 					for _, pattern := range location.Path { | ||||||
| 						if ok, _ := regexp.MatchString(pattern, path); ok { | 						if ok, _ := regexp.MatchString(pattern, path); ok { | ||||||
| 							flag = true | 							flag = true | ||||||
| 							break | 							break | ||||||
| @@ -38,7 +39,7 @@ func UseProxies(app *fiber.App) { | |||||||
|  |  | ||||||
| 				// Filter query strings | 				// Filter query strings | ||||||
| 				flag := true | 				flag := true | ||||||
| 				for rk, rv := range rule.Queries { | 				for rk, rv := range location.Queries { | ||||||
| 					for ik, iv := range queries { | 					for ik, iv := range queries { | ||||||
| 						if rk != ik && rv != iv { | 						if rk != ik && rv != iv { | ||||||
| 							flag = false | 							flag = false | ||||||
| @@ -54,7 +55,7 @@ func UseProxies(app *fiber.App) { | |||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				// Filter headers | 				// Filter headers | ||||||
| 				for rk, rv := range rule.Headers { | 				for rk, rv := range location.Headers { | ||||||
| 					for ik, iv := range headers { | 					for ik, iv := range headers { | ||||||
| 						if rk == ik { | 						if rk == ik { | ||||||
| 							for _, ov := range iv { | 							for _, ov := range iv { | ||||||
| @@ -76,9 +77,12 @@ func UseProxies(app *fiber.App) { | |||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | 				idx := rand.Intn(len(location.Destinations)) | ||||||
|  | 				dest := location.Destinations[idx] | ||||||
|  |  | ||||||
| 				// Passing all the rules means the site is what we are looking for. | 				// Passing all the rules means the site is what we are looking for. | ||||||
| 				// Let us respond to our client! | 				// Let us respond to our client! | ||||||
| 				return makeResponse(ctx, site) | 				return makeResponse(ctx, &dest) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -89,19 +93,19 @@ func UseProxies(app *fiber.App) { | |||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func makeResponse(ctx *fiber.Ctx, site *navi.SiteConfig) error { | func makeResponse(ctx *fiber.Ctx, dest *navi.Destination) error { | ||||||
| 	// Modify request | 	// Modify request | ||||||
| 	for _, transformer := range site.Transformers { | 	for _, transformer := range dest.Transformers { | ||||||
| 		if err := transformer.TransformRequest(ctx); err != nil { | 		if err := transformer.TransformRequest(ctx); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Forward | 	// Forward | ||||||
| 	err := navi.App.Forward(ctx, site) | 	err := navi.R.Forward(ctx, dest) | ||||||
|  |  | ||||||
| 	// Modify response | 	// Modify response | ||||||
| 	for _, transformer := range site.Transformers { | 	for _, transformer := range dest.Transformers { | ||||||
| 		if err := transformer.TransformResponse(ctx); err != nil { | 		if err := transformer.TransformResponse(ctx); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -4,34 +4,35 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strings" |  | ||||||
| 
 | 
 | ||||||
| 	"gopkg.in/yaml.v2" | 	"github.com/pelletier/go-toml/v2" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var App *RoadApp | var R *RoadApp | ||||||
| 
 | 
 | ||||||
| func ReadInConfig(root string) error { | func ReadInConfig(root string) error { | ||||||
| 	instance := &RoadApp{ | 	instance := &RoadApp{ | ||||||
| 		Sites: []*SiteConfig{}, | 		Regions: make([]*Region, 0), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := filepath.Walk(root, func(fp string, info os.FileInfo, err error) error { | 	if err := filepath.Walk(root, func(fp string, info os.FileInfo, _ error) error { | ||||||
| 		var site SiteConfig | 		var region Region | ||||||
| 		if info.IsDir() { | 		if info.IsDir() { | ||||||
| 			return nil | 			return nil | ||||||
| 		} else if file, err := os.OpenFile(fp, os.O_RDONLY, 0755); err != nil { | 		} else if file, err := os.OpenFile(fp, os.O_RDONLY, 0755); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} else if data, err := io.ReadAll(file); err != nil { | 		} else if data, err := io.ReadAll(file); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} else if err := yaml.Unmarshal(data, &site); err != nil { | 		} else if err := toml.Unmarshal(data, ®ion); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} else { | 		} else { | ||||||
| 			defer file.Close() | 			defer file.Close() | ||||||
| 
 | 
 | ||||||
| 			// Extract file name as site id | 			if region.Disabled { | ||||||
| 			site.ID = strings.SplitN(filepath.Base(fp), ".", 2)[0] | 				return nil | ||||||
| 			instance.Sites = append(instance.Sites, &site) | 			} | ||||||
|  | 			 | ||||||
|  | 			instance.Regions = append(instance.Regions, ®ion) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return nil | 		return nil | ||||||
| @@ -39,7 +40,7 @@ func ReadInConfig(root string) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	App = instance | 	R = instance | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @@ -18,16 +18,16 @@ import ( | |||||||
| 	"github.com/valyala/fasthttp" | 	"github.com/valyala/fasthttp" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func makeHypertextResponse(c *fiber.Ctx, upstream *UpstreamInstance) error { | func makeHypertextResponse(c *fiber.Ctx, dest *Destination) error { | ||||||
| 	timeout := time.Duration(viper.GetInt64("performance.network_timeout")) * time.Millisecond | 	timeout := time.Duration(viper.GetInt64("performance.network_timeout")) * time.Millisecond | ||||||
| 	return proxy.Do(c, upstream.MakeURI(c), &fasthttp.Client{ | 	return proxy.Do(c, dest.MakeUri(c), &fasthttp.Client{ | ||||||
| 		ReadTimeout:  timeout, | 		ReadTimeout:  timeout, | ||||||
| 		WriteTimeout: timeout, | 		WriteTimeout: timeout, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func makeFileResponse(c *fiber.Ctx, upstream *UpstreamInstance) error { | func makeFileResponse(c *fiber.Ctx, dest *Destination) error { | ||||||
| 	uri, queries := upstream.GetRawURI() | 	uri, queries := dest.GetRawUri() | ||||||
| 	root := http.Dir(uri) | 	root := http.Dir(uri) | ||||||
|  |  | ||||||
| 	method := c.Method() | 	method := c.Method() | ||||||
|   | |||||||
| @@ -1,49 +1,24 @@ | |||||||
| package navi | package navi | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"math/rand" |  | ||||||
|  |  | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi/transformers" | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi/transformers" | ||||||
|  |  | ||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type RoadApp struct { | type RoadApp struct { | ||||||
| 	Sites []*SiteConfig `json:"sites"` | 	Regions []*Region `json:"regions"` | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *RoadApp) Forward(ctx *fiber.Ctx, site *SiteConfig) error { | func (v *RoadApp) Forward(ctx *fiber.Ctx, dest *Destination) error { | ||||||
| 	if len(site.Upstreams) == 0 { | 	switch dest.GetType() { | ||||||
| 		return errors.New("invalid configuration") | 	case DestinationHypertext: | ||||||
| 	} | 		return makeHypertextResponse(ctx, dest) | ||||||
|  | 	case DestinationStaticFile: | ||||||
| 	// Do forward | 		return makeFileResponse(ctx, dest) | ||||||
| 	idx := rand.Intn(len(site.Upstreams)) |  | ||||||
| 	upstream := site.Upstreams[idx] |  | ||||||
|  |  | ||||||
| 	switch upstream.GetType() { |  | ||||||
| 	case UpstreamTypeHypertext: |  | ||||||
| 		return makeHypertextResponse(ctx, upstream) |  | ||||||
| 	case UpstreamTypeFile: |  | ||||||
| 		return makeFileResponse(ctx, upstream) |  | ||||||
| 	default: | 	default: | ||||||
| 		return fiber.ErrBadGateway | 		return fiber.ErrBadGateway | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| type RequestTransformerConfig = transformers.RequestTransformerConfig | type RequestTransformerConfig = transformers.TransformerConfig | ||||||
|  |  | ||||||
| type SiteConfig struct { |  | ||||||
| 	ID           string                      `json:"id"` |  | ||||||
| 	Rules        []*RouterRule               `json:"rules" yaml:"rules"` |  | ||||||
| 	Transformers []*RequestTransformerConfig `json:"transformers" yaml:"transformers"` |  | ||||||
| 	Upstreams    []*UpstreamInstance         `json:"upstreams" yaml:"upstreams"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type RouterRule struct { |  | ||||||
| 	Host    []string            `json:"host" yaml:"host"` |  | ||||||
| 	Path    []string            `json:"path" yaml:"path"` |  | ||||||
| 	Queries map[string]string   `json:"queries" yaml:"queries"` |  | ||||||
| 	Headers map[string][]string `json:"headers" yaml:"headers"` |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								pkg/navi/struct.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								pkg/navi/struct.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | package navi | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/url" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi/transformers" | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
|  | 	"github.com/gofiber/fiber/v2" | ||||||
|  | 	"github.com/samber/lo" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Region struct { | ||||||
|  | 	ID           string               `json:"id" toml:"id"` | ||||||
|  | 	Disabled     bool                 `json:"disabled" toml:"disabled"` | ||||||
|  | 	Locations    []Location           `json:"locations" toml:"locations"` | ||||||
|  | 	Applications []warden.Application `json:"applications" toml:"applications"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Location struct { | ||||||
|  | 	ID           string              `json:"id" toml:"id"` | ||||||
|  | 	Host         []string            `json:"host" toml:"host"` | ||||||
|  | 	Path         []string            `json:"path" toml:"path"` | ||||||
|  | 	Queries      map[string]string   `json:"queries" toml:"queries"` | ||||||
|  | 	Headers      map[string][]string `json:"headers" toml:"headers"` | ||||||
|  | 	Destinations []Destination       `json:"destinations" toml:"destinations"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type DestinationType = int8 | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	DestinationHypertext = DestinationType(iota) | ||||||
|  | 	DestinationStaticFile | ||||||
|  | 	DestinationUnknown | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Destination struct { | ||||||
|  | 	ID           string                           `json:"id" toml:"id"` | ||||||
|  | 	Uri          string                           `json:"uri" toml:"uri"` | ||||||
|  | 	Transformers []transformers.TransformerConfig `json:"transformers" toml:"transformers"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (v *Destination) GetType() DestinationType { | ||||||
|  | 	protocol := strings.SplitN(v.Uri, "://", 2)[0] | ||||||
|  | 	switch protocol { | ||||||
|  | 	case "http", "https": | ||||||
|  | 		return DestinationHypertext | ||||||
|  | 	case "file", "files": | ||||||
|  | 		return DestinationStaticFile | ||||||
|  | 	} | ||||||
|  | 	return DestinationUnknown | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (v *Destination) GetRawUri() (string, url.Values) { | ||||||
|  | 	uri := strings.SplitN(v.Uri, "://", 2)[1] | ||||||
|  | 	data := strings.SplitN(uri, "?", 2) | ||||||
|  | 	data = append(data, " ") // Make data array least have two element | ||||||
|  | 	qs, _ := url.ParseQuery(data[0]) | ||||||
|  |  | ||||||
|  | 	return data[0], qs | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (v *Destination) MakeUri(ctx *fiber.Ctx) string { | ||||||
|  | 	var queries []string | ||||||
|  | 	for k, v := range ctx.Queries() { | ||||||
|  | 		parsed, _ := url.QueryUnescape(v) | ||||||
|  | 		value := url.QueryEscape(parsed) | ||||||
|  | 		queries = append(queries, fmt.Sprintf("%s=%s", k, value)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	path := string(ctx.Request().URI().Path()) | ||||||
|  | 	hash := string(ctx.Request().URI().Hash()) | ||||||
|  |  | ||||||
|  | 	return v.Uri + path + | ||||||
|  | 		lo.Ternary(len(queries) > 0, "?"+strings.Join(queries, "&"), "") + | ||||||
|  | 		lo.Ternary(len(hash) > 0, "#"+hash, "") | ||||||
|  | } | ||||||
| @@ -5,13 +5,13 @@ import ( | |||||||
| 	"github.com/valyala/fasthttp" | 	"github.com/valyala/fasthttp" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var CompressResponse = RequestTransformer{ | var CompressResponse = Transformer{ | ||||||
| 	ModifyResponse: func(options any, ctx *fiber.Ctx) error { | 	ModifyResponse: func(options any, ctx *fiber.Ctx) error { | ||||||
| 		opts := DeserializeOptions[struct { | 		opts := DeserializeOptions[struct { | ||||||
| 			Level int `json:"level" yaml:"level"` | 			Level int `json:"level" toml:"level"` | ||||||
| 		}](options) | 		}](options) | ||||||
|  |  | ||||||
| 		var fctx = func(c *fasthttp.RequestCtx) {} | 		fctx := func(c *fasthttp.RequestCtx) {} | ||||||
| 		var compressor fasthttp.RequestHandler | 		var compressor fasthttp.RequestHandler | ||||||
| 		switch opts.Level { | 		switch opts.Level { | ||||||
| 		// Best Speed Mode | 		// Best Speed Mode | ||||||
|   | |||||||
| @@ -9,17 +9,17 @@ import ( | |||||||
|  |  | ||||||
| var json = jsoniter.ConfigCompatibleWithStandardLibrary | var json = jsoniter.ConfigCompatibleWithStandardLibrary | ||||||
|  |  | ||||||
| type RequestTransformer struct { | type Transformer struct { | ||||||
| 	ModifyRequest  func(options any, ctx *fiber.Ctx) error | 	ModifyRequest  func(options any, ctx *fiber.Ctx) error | ||||||
| 	ModifyResponse func(options any, ctx *fiber.Ctx) error | 	ModifyResponse func(options any, ctx *fiber.Ctx) error | ||||||
| } | } | ||||||
|  |  | ||||||
| type RequestTransformerConfig struct { | type TransformerConfig struct { | ||||||
| 	Type    string `json:"type" yaml:"type"` | 	Type    string `json:"type" toml:"type"` | ||||||
| 	Options any    `json:"options" yaml:"options"` | 	Options any    `json:"options" toml:"options"` | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *RequestTransformerConfig) TransformRequest(ctx *fiber.Ctx) error { | func (v *TransformerConfig) TransformRequest(ctx *fiber.Ctx) error { | ||||||
| 	for k, f := range Transformers { | 	for k, f := range Transformers { | ||||||
| 		if k == v.Type { | 		if k == v.Type { | ||||||
| 			if f.ModifyRequest != nil { | 			if f.ModifyRequest != nil { | ||||||
| @@ -31,7 +31,7 @@ func (v *RequestTransformerConfig) TransformRequest(ctx *fiber.Ctx) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *RequestTransformerConfig) TransformResponse(ctx *fiber.Ctx) error { | func (v *TransformerConfig) TransformResponse(ctx *fiber.Ctx) error { | ||||||
| 	for k, f := range Transformers { | 	for k, f := range Transformers { | ||||||
| 		if k == v.Type { | 		if k == v.Type { | ||||||
| 			if f.ModifyResponse != nil { | 			if f.ModifyResponse != nil { | ||||||
| @@ -55,7 +55,7 @@ func DeserializeOptions[T any](data any) T { | |||||||
| // Map of Transformers | // Map of Transformers | ||||||
| // Every transformer need to be mapped here so that they can get work. | // Every transformer need to be mapped here so that they can get work. | ||||||
|  |  | ||||||
| var Transformers = map[string]RequestTransformer{ | var Transformers = map[string]Transformer{ | ||||||
| 	"replacePath":      ReplacePath, | 	"replacePath":      ReplacePath, | ||||||
| 	"compressResponse": CompressResponse, | 	"compressResponse": CompressResponse, | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,18 +1,19 @@ | |||||||
| package transformers | package transformers | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"github.com/gofiber/fiber/v2" |  | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/gofiber/fiber/v2" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ReplacePath = RequestTransformer{ | var ReplacePath = Transformer{ | ||||||
| 	ModifyRequest: func(options any, ctx *fiber.Ctx) error { | 	ModifyRequest: func(options any, ctx *fiber.Ctx) error { | ||||||
| 		opts := DeserializeOptions[struct { | 		opts := DeserializeOptions[struct { | ||||||
| 			Pattern string `json:"pattern" yaml:"pattern"` | 			Pattern string `json:"pattern" toml:"pattern"` | ||||||
| 			Value   string `json:"value" yaml:"value"` | 			Value   string `json:"value" toml:"value"` | ||||||
| 			Repl    string `json:"repl" yaml:"repl"` // Use when complex mode(regexp) enabled | 			Repl    string `json:"repl" toml:"repl"` // Use when complex mode(regexp) enabled | ||||||
| 			Complex bool   `json:"complex" yaml:"complex"` | 			Complex bool   `json:"complex" toml:"complex"` | ||||||
| 		}](options) | 		}](options) | ||||||
| 		path := string(ctx.Request().URI().Path()) | 		path := string(ctx.Request().URI().Path()) | ||||||
| 		if !opts.Complex { | 		if !opts.Complex { | ||||||
|   | |||||||
| @@ -1,58 +0,0 @@ | |||||||
| package navi |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"net/url" |  | ||||||
| 	"strings" |  | ||||||
|  |  | ||||||
| 	"github.com/gofiber/fiber/v2" |  | ||||||
| 	"github.com/samber/lo" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	UpstreamTypeFile      = "file" |  | ||||||
| 	UpstreamTypeHypertext = "hypertext" |  | ||||||
| 	UpstreamTypeUnknown   = "unknown" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type UpstreamInstance struct { |  | ||||||
| 	ID  string `json:"id" yaml:"id"` |  | ||||||
| 	URI string `json:"uri" yaml:"uri"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (v *UpstreamInstance) GetType() string { |  | ||||||
| 	protocol := strings.SplitN(v.URI, "://", 2)[0] |  | ||||||
| 	switch protocol { |  | ||||||
| 	case "file", "files": |  | ||||||
| 		return UpstreamTypeFile |  | ||||||
| 	case "http", "https": |  | ||||||
| 		return UpstreamTypeHypertext |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return UpstreamTypeUnknown |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (v *UpstreamInstance) GetRawURI() (string, url.Values) { |  | ||||||
| 	uri := strings.SplitN(v.URI, "://", 2)[1] |  | ||||||
| 	data := strings.SplitN(uri, "?", 2) |  | ||||||
| 	data = append(data, " ") // Make data array least have two element |  | ||||||
| 	qs, _ := url.ParseQuery(data[0]) |  | ||||||
|  |  | ||||||
| 	return data[0], qs |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (v *UpstreamInstance) MakeURI(ctx *fiber.Ctx) string { |  | ||||||
| 	var queries []string |  | ||||||
| 	for k, v := range ctx.Queries() { |  | ||||||
| 		parsed, _ := url.QueryUnescape(v) |  | ||||||
| 		value := url.QueryEscape(parsed) |  | ||||||
| 		queries = append(queries, fmt.Sprintf("%s=%s", k, value)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	path := string(ctx.Request().URI().Path()) |  | ||||||
| 	hash := string(ctx.Request().URI().Hash()) |  | ||||||
|  |  | ||||||
| 	return v.URI + path + |  | ||||||
| 		lo.Ternary(len(queries) > 0, "?"+strings.Join(queries, "&"), "") + |  | ||||||
| 		lo.Ternary(len(hash) > 0, "#"+hash, "") |  | ||||||
| } |  | ||||||
							
								
								
									
										17
									
								
								pkg/navi/warden.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								pkg/navi/warden.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | package navi | ||||||
|  |  | ||||||
|  | import "code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
|  |  | ||||||
|  | func InitializeWarden(regions []*Region) { | ||||||
|  | 	for _, region := range regions { | ||||||
|  | 		for _, application := range region.Applications { | ||||||
|  | 			warden.InstancePool = append(warden.InstancePool, &warden.AppInstance{ | ||||||
|  | 				Manifest: application, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	for _, instance := range warden.InstancePool { | ||||||
|  | 		instance.Wake() | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								pkg/sideload/applications.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								pkg/sideload/applications.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | package sideload | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
|  | 	"github.com/gofiber/fiber/v2" | ||||||
|  | 	"github.com/samber/lo" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func getApplications(c *fiber.Ctx) error { | ||||||
|  | 	applications := lo.FlatMap(navi.R.Regions, func(item *navi.Region, idx int) []warden.Application { | ||||||
|  | 		return item.Applications | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	return c.JSON(applications) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func getApplicationLogs(c *fiber.Ctx) error { | ||||||
|  | 	if instance, ok := lo.Find(warden.InstancePool, func(item *warden.AppInstance) bool { | ||||||
|  | 		return item.Manifest.ID == c.Params("id") | ||||||
|  | 	}); !ok { | ||||||
|  | 		return fiber.NewError(fiber.StatusNotFound) | ||||||
|  | 	} else { | ||||||
|  | 		return c.SendString(instance.Logs()) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -5,7 +5,7 @@ import ( | |||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func responseConnectivity(c *fiber.Ctx) error { | func getMetadata(c *fiber.Ctx) error { | ||||||
| 	return c.Status(fiber.StatusOK).JSON(fiber.Map{ | 	return c.Status(fiber.StatusOK).JSON(fiber.Map{ | ||||||
| 		"server":  "RoadSign", | 		"server":  "RoadSign", | ||||||
| 		"version": roadsign.AppVersion, | 		"version": roadsign.AppVersion, | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| package sideload |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/sign" |  | ||||||
| 	"github.com/gofiber/fiber/v2" |  | ||||||
| 	"github.com/samber/lo" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func getProcesses(c *fiber.Ctx) error { |  | ||||||
| 	processes := lo.FlatMap(sign.App.Sites, func(item *sign.SiteConfig, idx int) []*sign.ProcessInstance { |  | ||||||
| 		return item.Processes |  | ||||||
| 	}) |  | ||||||
|  |  | ||||||
| 	return c.JSON(processes) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func getProcessLog(c *fiber.Ctx) error { |  | ||||||
| 	processes := lo.FlatMap(sign.App.Sites, func(item *sign.SiteConfig, idx int) []*sign.ProcessInstance { |  | ||||||
| 		return item.Processes |  | ||||||
| 	}) |  | ||||||
|  |  | ||||||
| 	if target, ok := lo.Find(processes, func(item *sign.ProcessInstance) bool { |  | ||||||
| 		return item.ID == c.Params("id") |  | ||||||
| 	}); !ok { |  | ||||||
| 		return fiber.NewError(fiber.StatusNotFound) |  | ||||||
| 	} else { |  | ||||||
| 		return c.SendString(target.GetLogs()) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -1,6 +1,7 @@ | |||||||
| package sideload | package sideload | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
| 	"context" | 	"context" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| @@ -14,23 +15,23 @@ import ( | |||||||
|  |  | ||||||
| func doPublish(c *fiber.Ctx) error { | func doPublish(c *fiber.Ctx) error { | ||||||
| 	var workdir string | 	var workdir string | ||||||
| 	var site *sign.SiteConfig | 	var destination *navi.Destination | ||||||
| 	var upstream *sign.UpstreamInstance | 	var application *warden.Application | ||||||
| 	var process *sign.ProcessInstance | 	for _, item := range navi.R.Regions { | ||||||
| 	for _, item := range navi.App.Sites { |  | ||||||
| 		if item.ID == c.Params("site") { | 		if item.ID == c.Params("site") { | ||||||
| 			site = item | 			for _, location := range item.Locations { | ||||||
| 			for _, stream := range item.Upstreams { | 				for _, dest := range location.Destinations { | ||||||
| 				if stream.ID == c.Params("slug") { | 					if dest.ID == c.Params("slug") { | ||||||
| 					upstream = stream | 						destination = &dest | ||||||
| 					workdir, _ = stream.GetRawURI() | 						workdir, _ = dest.GetRawUri() | ||||||
| 						break | 						break | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			for _, proc := range item.Processes { | 			} | ||||||
| 				if proc.ID == c.Params("slug") { | 			for _, app := range item.Applications { | ||||||
| 					process = proc | 				if app.ID == c.Params("slug") { | ||||||
| 					workdir = proc.Workdir | 					application = &app | ||||||
|  | 					workdir = app.Workdir | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @@ -38,14 +39,15 @@ func doPublish(c *fiber.Ctx) error { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if upstream == nil && process == nil { | 	var instance *warden.AppInstance | ||||||
| 		return fiber.ErrNotFound | 	if application != nil { | ||||||
| 	} else if upstream != nil && upstream.GetType() != navi.UpstreamTypeFile { | 		if instance = warden.GetFromPool(application.ID); instance != nil { | ||||||
|  | 			instance.Stop() | ||||||
|  | 		} | ||||||
|  | 	} else if destination != nil && destination.GetType() != navi.DestinationStaticFile { | ||||||
| 		return fiber.ErrUnprocessableEntity | 		return fiber.ErrUnprocessableEntity | ||||||
| 	} | 	} else { | ||||||
|  | 		return fiber.ErrNotFound | ||||||
| 	for _, process := range site.Processes { |  | ||||||
| 		process.StopProcess() |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if c.Query("overwrite", "yes") == "yes" { | 	if c.Query("overwrite", "yes") == "yes" { | ||||||
| @@ -81,5 +83,9 @@ func doPublish(c *fiber.Ctx) error { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if instance != nil { | ||||||
|  | 		instance.Wake() | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return c.SendStatus(fiber.StatusOK) | 	return c.SendStatus(fiber.StatusOK) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										67
									
								
								pkg/sideload/regions.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								pkg/sideload/regions.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | package sideload | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
|  | 	"github.com/gofiber/fiber/v2" | ||||||
|  | 	"github.com/pelletier/go-toml/v2" | ||||||
|  | 	"github.com/samber/lo" | ||||||
|  | 	"github.com/spf13/viper" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func getRegions(c *fiber.Ctx) error { | ||||||
|  | 	return c.JSON(navi.R.Regions) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func getRegionConfig(c *fiber.Ctx) error { | ||||||
|  | 	fp := filepath.Join(viper.GetString("paths.configs"), c.Params("id")) | ||||||
|  |  | ||||||
|  | 	var err error | ||||||
|  | 	var data []byte | ||||||
|  | 	if data, err = os.ReadFile(fp + ".toml"); err != nil { | ||||||
|  | 		return fiber.NewError(fiber.StatusNotFound, err.Error()) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return c.Type("toml").SendString(string(data)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func doSync(c *fiber.Ctx) error { | ||||||
|  | 	req := string(c.Body()) | ||||||
|  |  | ||||||
|  | 	id := c.Params("slug") | ||||||
|  | 	path := filepath.Join(viper.GetString("paths.configs"), fmt.Sprintf("%s.toml", id)) | ||||||
|  |  | ||||||
|  | 	if file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755); err != nil { | ||||||
|  | 		return fiber.NewError(fiber.ErrInternalServerError.Code, err.Error()) | ||||||
|  | 	} else { | ||||||
|  | 		raw, _ := toml.Marshal(req) | ||||||
|  | 		file.Write(raw) | ||||||
|  | 		defer file.Close() | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	var rebootQueue []*warden.AppInstance | ||||||
|  | 	if region, ok := lo.Find(navi.R.Regions, func(item *navi.Region) bool { | ||||||
|  | 		return item.ID == id | ||||||
|  | 	}); ok { | ||||||
|  | 		for _, application := range region.Applications { | ||||||
|  | 			if instance := warden.GetFromPool(application.ID); instance != nil { | ||||||
|  | 				instance.Stop() | ||||||
|  | 				rebootQueue = append(rebootQueue, instance) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Reload | ||||||
|  | 	navi.ReadInConfig(viper.GetString("paths.configs")) | ||||||
|  | 	 | ||||||
|  | 	// Reboot | ||||||
|  | 	for _, instance := range rebootQueue { | ||||||
|  | 		instance.Wake() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return c.SendStatus(fiber.StatusOK) | ||||||
|  | } | ||||||
| @@ -1,11 +1,12 @@ | |||||||
| package sideload | package sideload | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/sideload/view" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  |  | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/sideload/view" | ||||||
| 	"github.com/gofiber/fiber/v2/middleware/filesystem" | 	"github.com/gofiber/fiber/v2/middleware/filesystem" | ||||||
| 	jsoniter "github.com/json-iterator/go" | 	jsoniter "github.com/json-iterator/go" | ||||||
| 	"net/http" |  | ||||||
|  |  | ||||||
| 	roadsign "code.smartsheep.studio/goatworks/roadsign/pkg" | 	roadsign "code.smartsheep.studio/goatworks/roadsign/pkg" | ||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
| @@ -51,18 +52,18 @@ func InitSideload() *fiber.App { | |||||||
|  |  | ||||||
| 	cgi := app.Group("/cgi").Name("CGI") | 	cgi := app.Group("/cgi").Name("CGI") | ||||||
| 	{ | 	{ | ||||||
| 		cgi.All("/connectivity", responseConnectivity) | 		cgi.Get("/metadata", getMetadata) | ||||||
| 		cgi.Get("/statistics", getStatistics) | 		cgi.Get("/statistics", getStatistics) | ||||||
| 		cgi.Get("/sites", getSites) | 		cgi.Get("/sites", getRegions) | ||||||
| 		cgi.Get("/sites/cfg/:id", getSiteConfig) | 		cgi.Get("/sites/cfg/:id", getRegionConfig) | ||||||
| 		cgi.Get("/processes", getProcesses) | 		cgi.Get("/processes", getApplications) | ||||||
| 		cgi.Get("/processes/logs/:id", getProcessLog) | 		cgi.Get("/processes/logs/:id", getApplicationLogs) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	webhooks := app.Group("/webhooks").Name("WebHooks") | 	webhooks := app.Group("/webhooks").Name("WebHooks") | ||||||
| 	{ | 	{ | ||||||
| 		webhooks.Put("/publish/:site/:slug", doPublish) | 		webhooks.Put("/publish/:site/:slug", doPublish) | ||||||
| 		webhooks.Put("/sync/:slug", doSyncSite) | 		webhooks.Put("/sync/:slug", doSync) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return app | 	return app | ||||||
|   | |||||||
| @@ -1,64 +0,0 @@ | |||||||
| package sideload |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
|  |  | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" |  | ||||||
| 	"code.smartsheep.studio/goatworks/roadsign/pkg/sign" |  | ||||||
| 	"github.com/gofiber/fiber/v2" |  | ||||||
| 	"github.com/samber/lo" |  | ||||||
| 	"github.com/spf13/viper" |  | ||||||
| 	"gopkg.in/yaml.v2" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func getSites(c *fiber.Ctx) error { |  | ||||||
| 	return c.JSON(sign.App.Sites) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func getSiteConfig(c *fiber.Ctx) error { |  | ||||||
| 	fp := filepath.Join(viper.GetString("paths.configs"), c.Params("id")) |  | ||||||
|  |  | ||||||
| 	var err error |  | ||||||
| 	var data []byte |  | ||||||
| 	if data, err = os.ReadFile(fp + ".yml"); err != nil { |  | ||||||
| 		if data, err = os.ReadFile(fp + ".yaml"); err != nil { |  | ||||||
| 			return fiber.NewError(fiber.StatusNotFound, err.Error()) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return c.Type("yaml").SendString(string(data)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func doSyncSite(c *fiber.Ctx) error { |  | ||||||
| 	var req navi.SiteConfig |  | ||||||
|  |  | ||||||
| 	if err := c.BodyParser(&req); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	id := c.Params("slug") |  | ||||||
| 	path := filepath.Join(viper.GetString("paths.configs"), fmt.Sprintf("%s.yaml", id)) |  | ||||||
|  |  | ||||||
| 	if file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755); err != nil { |  | ||||||
| 		return fiber.NewError(fiber.ErrInternalServerError.Code, err.Error()) |  | ||||||
| 	} else { |  | ||||||
| 		raw, _ := yaml.Marshal(req) |  | ||||||
| 		file.Write(raw) |  | ||||||
| 		defer file.Close() |  | ||||||
| 	} |  | ||||||
| 	if site, ok := lo.Find(sign.App.Sites, func(item *sign.SiteConfig) bool { |  | ||||||
| 		return item.ID == id |  | ||||||
| 	}); ok { |  | ||||||
| 		for _, process := range site.Processes { |  | ||||||
| 			process.StopProcess() |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Reload |  | ||||||
| 	sign.ReadInConfig(viper.GetString("paths.configs")) |  | ||||||
| 	sign.App.PreheatProcesses() |  | ||||||
|  |  | ||||||
| 	return c.SendStatus(fiber.StatusOK) |  | ||||||
| } |  | ||||||
| @@ -1,27 +1,27 @@ | |||||||
| package sideload | package sideload | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/navi" | ||||||
|  | 	"code.smartsheep.studio/goatworks/roadsign/pkg/warden" | ||||||
| 	"github.com/gofiber/fiber/v2" | 	"github.com/gofiber/fiber/v2" | ||||||
| 	"github.com/samber/lo" | 	"github.com/samber/lo" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func getStatistics(c *fiber.Ctx) error { | func getStatistics(c *fiber.Ctx) error { | ||||||
| 	upstreams := lo.FlatMap(sign.App.Sites, func(item *sign.SiteConfig, idx int) []*sign.UpstreamInstance { | 	locations := lo.FlatMap(navi.R.Regions, func(item *navi.Region, idx int) []navi.Location { | ||||||
| 		return item.Upstreams | 		return item.Locations | ||||||
| 	}) | 	}) | ||||||
| 	processes := lo.FlatMap(sign.App.Sites, func(item *sign.SiteConfig, idx int) []*sign.ProcessInstance { | 	destinations := lo.FlatMap(locations, func(item navi.Location, idx int) []navi.Destination { | ||||||
| 		return item.Processes | 		return item.Destinations | ||||||
| 	}) |  | ||||||
| 	unhealthy := lo.FlatMap(sign.App.Sites, func(item *sign.SiteConfig, idx int) []*sign.ProcessInstance { |  | ||||||
| 		return lo.Filter(item.Processes, func(item *sign.ProcessInstance, idx int) bool { |  | ||||||
| 			return item.Status != navi.ProcessStarted |  | ||||||
| 	}) | 	}) | ||||||
|  | 	applications := lo.FlatMap(navi.R.Regions, func(item *navi.Region, idx int) []warden.Application { | ||||||
|  | 		return item.Applications | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	return c.JSON(fiber.Map{ | 	return c.JSON(fiber.Map{ | ||||||
| 		"sites":     len(sign.App.Sites), | 		"regions": len(navi.R.Regions), | ||||||
| 		"upstreams": len(upstreams), | 		"locations": len(locations), | ||||||
| 		"processes": len(processes), | 		"destinations": len(destinations), | ||||||
| 		"status":    len(unhealthy) == 0, | 		"applications": len(applications), | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,6 +11,25 @@ import ( | |||||||
| 	"github.com/samber/lo" | 	"github.com/samber/lo" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | var InstancePool []*AppInstance | ||||||
|  |  | ||||||
|  | func GetFromPool(id string) *AppInstance { | ||||||
|  | 	val, ok := lo.Find(InstancePool, func(item *AppInstance) bool { | ||||||
|  | 		return item.Manifest.ID == id | ||||||
|  | 	}) | ||||||
|  | 	return lo.Ternary(ok, val, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func StartPool() []error { | ||||||
|  | 	var errors []error | ||||||
|  | 	for _, instance := range InstancePool { | ||||||
|  | 		if err := instance.Wake(); err != nil { | ||||||
|  | 			errors = append(errors, err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return errors | ||||||
|  | } | ||||||
|  |  | ||||||
| type AppStatus = int8 | type AppStatus = int8 | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -21,8 +40,8 @@ const ( | |||||||
| 	AppFailure | 	AppFailure | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type WardenInstance struct { | type AppInstance struct { | ||||||
| 	Manifest WardenApplication `json:"manifest"` | 	Manifest Application `json:"manifest"` | ||||||
|  |  | ||||||
| 	Cmd    *exec.Cmd       `json:"-"` | 	Cmd    *exec.Cmd       `json:"-"` | ||||||
| 	Logger strings.Builder `json:"-"` | 	Logger strings.Builder `json:"-"` | ||||||
| @@ -30,7 +49,7 @@ type WardenInstance struct { | |||||||
| 	Status AppStatus `json:"status"` | 	Status AppStatus `json:"status"` | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *WardenInstance) Wake() error { | func (v *AppInstance) Wake() error { | ||||||
| 	if v.Cmd != nil { | 	if v.Cmd != nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -52,7 +71,7 @@ func (v *WardenInstance) Wake() error { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *WardenInstance) Start() error { | func (v *AppInstance) Start() error { | ||||||
| 	manifest := v.Manifest | 	manifest := v.Manifest | ||||||
|  |  | ||||||
| 	if len(manifest.Command) <= 0 { | 	if len(manifest.Command) <= 0 { | ||||||
| @@ -83,7 +102,7 @@ func (v *WardenInstance) Start() error { | |||||||
| 	return v.Cmd.Start() | 	return v.Cmd.Start() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *WardenInstance) Stop() error { | func (v *AppInstance) Stop() error { | ||||||
| 	if v.Cmd != nil && v.Cmd.Process != nil { | 	if v.Cmd != nil && v.Cmd.Process != nil { | ||||||
| 		if err := v.Cmd.Process.Signal(os.Interrupt); err != nil { | 		if err := v.Cmd.Process.Signal(os.Interrupt); err != nil { | ||||||
| 			v.Cmd.Process.Kill() | 			v.Cmd.Process.Kill() | ||||||
| @@ -96,6 +115,6 @@ func (v *WardenInstance) Stop() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (v *WardenInstance) Logs() string { | func (v *AppInstance) Logs() string { | ||||||
| 	return v.Logger.String() | 	return v.Logger.String() | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| package warden | package warden | ||||||
|  |  | ||||||
| type WardenApplication struct { | type Application struct { | ||||||
| 	ID          string   `json:"id" yaml:"id"` | 	ID          string   `json:"id" toml:"id"` | ||||||
| 	Workdir     string   `json:"workdir" yaml:"workdir"` | 	Workdir     string   `json:"workdir" toml:"workdir"` | ||||||
| 	Command     []string `json:"command" yaml:"command"` | 	Command     []string `json:"command" toml:"command"` | ||||||
| 	Environment []string `json:"environment" yaml:"environment"` | 	Environment []string `json:"environment" toml:"environment"` | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								settings.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								settings.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [debug] | ||||||
|  | print_routes = false | ||||||
|  |  | ||||||
|  | [hypertext] | ||||||
|  | sideload_ports = [":81"] | ||||||
|  | sideload_secured_ports = [] | ||||||
|  | ports = [":8000"] | ||||||
|  | secured_ports = [] | ||||||
|  |  | ||||||
|  | [hypertext.certificate] | ||||||
|  | redirect = false | ||||||
|  | sideload_key = "./cert.key" | ||||||
|  | sideload_pem = "./cert.pem" | ||||||
|  | key = "./cert.key" | ||||||
|  | pem = "./cert.pem" | ||||||
|  |  | ||||||
|  | [hypertext.limitation] | ||||||
|  | max_body_size = 549_755_813_888 # 512 GiB | ||||||
|  | max_qps = -1 | ||||||
|  |  | ||||||
|  | [paths] | ||||||
|  | configs = "./config" | ||||||
|  |  | ||||||
|  | [performance] | ||||||
|  | request_logging = true | ||||||
|  | network_timeout = 3_000 | ||||||
|  | prefork = false | ||||||
|  |  | ||||||
|  | [security] | ||||||
|  | sideload_trusted_proxies = ["localhost"] | ||||||
|  | credential = "e81f43f32d934271af6322e5376f5f59" | ||||||
							
								
								
									
										28
									
								
								settings.yml
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								settings.yml
									
									
									
									
									
								
							| @@ -1,28 +0,0 @@ | |||||||
| debug: |  | ||||||
|   print_routes: true |  | ||||||
| hypertext: |  | ||||||
|   sideload_ports: |  | ||||||
|     - :81 |  | ||||||
|   sideload_secured_ports: [ ] |  | ||||||
|   certificate: |  | ||||||
|     redirect: false |  | ||||||
|     sideload_key: ./cert.key |  | ||||||
|     sideload_pem: ./cert.pem |  | ||||||
|     key: ./cert.key |  | ||||||
|     pem: ./cert.pem |  | ||||||
|   limitation: |  | ||||||
|     max_body_size: 536870912 |  | ||||||
|     max_qps: -1 |  | ||||||
|   ports: |  | ||||||
|     - :8000 |  | ||||||
|   secured_ports: [ ] |  | ||||||
| paths: |  | ||||||
|   configs: ./config |  | ||||||
| performance: |  | ||||||
|   request_logging: true |  | ||||||
|   network_timeout: 3000 |  | ||||||
|   prefork: false |  | ||||||
| security: |  | ||||||
|   sideload_trusted_proxies: |  | ||||||
|     - localhost |  | ||||||
|   credential: e81f43f32d934271af6322e5376f5f59 |  | ||||||
							
								
								
									
										31
									
								
								test/roadsign-spa/settings.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/roadsign-spa/settings.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [debug] | ||||||
|  | print_routes = true | ||||||
|  |  | ||||||
|  | [hypertext] | ||||||
|  | sideload_ports = [":81"] | ||||||
|  | sideload_secured_ports = [] | ||||||
|  | ports = [":8000"] | ||||||
|  | secured_ports = [] | ||||||
|  |  | ||||||
|  | [hypertext.certificate] | ||||||
|  | redirect = false | ||||||
|  | sideload_key = "./cert.key" | ||||||
|  | sideload_pem = "./cert.pem" | ||||||
|  | key = "./cert.key" | ||||||
|  | pem = "./cert.pem" | ||||||
|  |  | ||||||
|  | [hypertext.limitation] | ||||||
|  | max_body_size = 549_755_813_888 # 512 GiB | ||||||
|  | max_qps = -1 | ||||||
|  |  | ||||||
|  | [paths] | ||||||
|  | configs = "./config" | ||||||
|  |  | ||||||
|  | [performance] | ||||||
|  | request_logging = true | ||||||
|  | network_timeout = 3_000 | ||||||
|  | prefork = false | ||||||
|  |  | ||||||
|  | [security] | ||||||
|  | sideload_trusted_proxies = ["localhost"] | ||||||
|  | credential = "e81f43f32d934271af6322e5376f5f59" | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| debug: |  | ||||||
|     print_routes: false |  | ||||||
| hypertext: |  | ||||||
|     sideload_ports: [":81"] |  | ||||||
|     sideload_secured_ports: [] |  | ||||||
|     certificate: |  | ||||||
|         sideload_key: ./cert.key |  | ||||||
|         sideload_pem: ./cert.pem |  | ||||||
|         key: ./cert.key |  | ||||||
|         pem: ./cert.pem |  | ||||||
|     limitation: |  | ||||||
|         max_body_size: 536870912 |  | ||||||
|         max_qps: -1 |  | ||||||
|     ports: |  | ||||||
|         - :8000 |  | ||||||
|     secured_ports: [] |  | ||||||
| paths: |  | ||||||
|     configs: ./config |  | ||||||
| performance: |  | ||||||
|     request_logging: false |  | ||||||
|     network_timeout: 3000 |  | ||||||
|     prefork: false |  | ||||||
| security: |  | ||||||
|     sideload_trusted_proxies: |  | ||||||
|         - localhost |  | ||||||
|     credential: e81f43f32d934271af6322e5376f5f59 |  | ||||||
							
								
								
									
										31
									
								
								test/roadsign-ssr/settings.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/roadsign-ssr/settings.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [debug] | ||||||
|  | print_routes = true | ||||||
|  |  | ||||||
|  | [hypertext] | ||||||
|  | sideload_ports = [":81"] | ||||||
|  | sideload_secured_ports = [] | ||||||
|  | ports = [":8000"] | ||||||
|  | secured_ports = [] | ||||||
|  |  | ||||||
|  | [hypertext.certificate] | ||||||
|  | redirect = false | ||||||
|  | sideload_key = "./cert.key" | ||||||
|  | sideload_pem = "./cert.pem" | ||||||
|  | key = "./cert.key" | ||||||
|  | pem = "./cert.pem" | ||||||
|  |  | ||||||
|  | [hypertext.limitation] | ||||||
|  | max_body_size = 549_755_813_888 # 512 GiB | ||||||
|  | max_qps = -1 | ||||||
|  |  | ||||||
|  | [paths] | ||||||
|  | configs = "./config" | ||||||
|  |  | ||||||
|  | [performance] | ||||||
|  | request_logging = true | ||||||
|  | network_timeout = 3_000 | ||||||
|  | prefork = false | ||||||
|  |  | ||||||
|  | [security] | ||||||
|  | sideload_trusted_proxies = ["localhost"] | ||||||
|  | credential = "e81f43f32d934271af6322e5376f5f59" | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| debug: |  | ||||||
|     print_routes: false |  | ||||||
| hypertext: |  | ||||||
|     sideload_ports: [":81"] |  | ||||||
|     sideload_secured_ports: [] |  | ||||||
|     certificate: |  | ||||||
|         sideload_key: ./cert.key |  | ||||||
|         sideload_pem: ./cert.pem |  | ||||||
|         key: ./cert.key |  | ||||||
|         pem: ./cert.pem |  | ||||||
|     limitation: |  | ||||||
|         max_body_size: 536870912 |  | ||||||
|         max_qps: -1 |  | ||||||
|     ports: |  | ||||||
|         - :8000 |  | ||||||
|     secured_ports: [] |  | ||||||
| paths: |  | ||||||
|     configs: ./config |  | ||||||
| performance: |  | ||||||
|     request_logging: false |  | ||||||
|     network_timeout: 3000 |  | ||||||
|     prefork: false |  | ||||||
| security: |  | ||||||
|     sideload_trusted_proxies: |  | ||||||
|         - localhost |  | ||||||
|     credential: e81f43f32d934271af6322e5376f5f59 |  | ||||||
							
								
								
									
										31
									
								
								test/roadsign-with-prefork/settings.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/roadsign-with-prefork/settings.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [debug] | ||||||
|  | print_routes = true | ||||||
|  |  | ||||||
|  | [hypertext] | ||||||
|  | sideload_ports = [":81"] | ||||||
|  | sideload_secured_ports = [] | ||||||
|  | ports = [":8000"] | ||||||
|  | secured_ports = [] | ||||||
|  |  | ||||||
|  | [hypertext.certificate] | ||||||
|  | redirect = false | ||||||
|  | sideload_key = "./cert.key" | ||||||
|  | sideload_pem = "./cert.pem" | ||||||
|  | key = "./cert.key" | ||||||
|  | pem = "./cert.pem" | ||||||
|  |  | ||||||
|  | [hypertext.limitation] | ||||||
|  | max_body_size = 549_755_813_888 # 512 GiB | ||||||
|  | max_qps = -1 | ||||||
|  |  | ||||||
|  | [paths] | ||||||
|  | configs = "./config" | ||||||
|  |  | ||||||
|  | [performance] | ||||||
|  | request_logging = true | ||||||
|  | network_timeout = 3_000 | ||||||
|  | prefork = true | ||||||
|  |  | ||||||
|  | [security] | ||||||
|  | sideload_trusted_proxies = ["localhost"] | ||||||
|  | credential = "e81f43f32d934271af6322e5376f5f59" | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| debug: |  | ||||||
|     print_routes: false |  | ||||||
| hypertext: |  | ||||||
|     sideload_ports: [":81"] |  | ||||||
|     sideload_secured_ports: [] |  | ||||||
|     certificate: |  | ||||||
|         sideload_key: ./cert.key |  | ||||||
|         sideload_pem: ./cert.pem |  | ||||||
|         key: ./cert.key |  | ||||||
|         pem: ./cert.pem |  | ||||||
|     limitation: |  | ||||||
|         max_body_size: 536870912 |  | ||||||
|         max_qps: -1 |  | ||||||
|     ports: |  | ||||||
|         - :8000 |  | ||||||
|     secured_ports: [] |  | ||||||
| paths: |  | ||||||
|     configs: ./config |  | ||||||
| performance: |  | ||||||
|     request_logging: false |  | ||||||
|     network_timeout: 3000 |  | ||||||
|     prefork: true |  | ||||||
| security: |  | ||||||
|     sideload_trusted_proxies: |  | ||||||
|         - localhost |  | ||||||
|     credential: e81f43f32d934271af6322e5376f5f59 |  | ||||||
							
								
								
									
										31
									
								
								test/roadsign/settings.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/roadsign/settings.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [debug] | ||||||
|  | print_routes = true | ||||||
|  |  | ||||||
|  | [hypertext] | ||||||
|  | sideload_ports = [":81"] | ||||||
|  | sideload_secured_ports = [] | ||||||
|  | ports = [":8000"] | ||||||
|  | secured_ports = [] | ||||||
|  |  | ||||||
|  | [hypertext.certificate] | ||||||
|  | redirect = false | ||||||
|  | sideload_key = "./cert.key" | ||||||
|  | sideload_pem = "./cert.pem" | ||||||
|  | key = "./cert.key" | ||||||
|  | pem = "./cert.pem" | ||||||
|  |  | ||||||
|  | [hypertext.limitation] | ||||||
|  | max_body_size = 549_755_813_888 # 512 GiB | ||||||
|  | max_qps = -1 | ||||||
|  |  | ||||||
|  | [paths] | ||||||
|  | configs = "./config" | ||||||
|  |  | ||||||
|  | [performance] | ||||||
|  | request_logging = true | ||||||
|  | network_timeout = 3_000 | ||||||
|  | prefork = false | ||||||
|  |  | ||||||
|  | [security] | ||||||
|  | sideload_trusted_proxies = ["localhost"] | ||||||
|  | credential = "e81f43f32d934271af6322e5376f5f59" | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| debug: |  | ||||||
|     print_routes: false |  | ||||||
| hypertext: |  | ||||||
|     sideload_ports: [":81"] |  | ||||||
|     sideload_secured_ports: [] |  | ||||||
|     certificate: |  | ||||||
|         sideload_key: ./cert.key |  | ||||||
|         sideload_pem: ./cert.pem |  | ||||||
|         key: ./cert.key |  | ||||||
|         pem: ./cert.pem |  | ||||||
|     limitation: |  | ||||||
|         max_body_size: 536870912 |  | ||||||
|         max_qps: -1 |  | ||||||
|     ports: |  | ||||||
|         - :8000 |  | ||||||
|     secured_ports: [] |  | ||||||
| paths: |  | ||||||
|     configs: ./config |  | ||||||
| performance: |  | ||||||
|     request_logging: false |  | ||||||
|     network_timeout: 3000 |  | ||||||
|     prefork: false |  | ||||||
| security: |  | ||||||
|     sideload_trusted_proxies: |  | ||||||
|         - localhost |  | ||||||
|     credential: e81f43f32d934271af6322e5376f5f59 |  | ||||||
		Reference in New Issue
	
	Block a user