From 762fe0ee8cffc3f93622e851d831a8b632f9a432 Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 25 Oct 2024 23:52:23 +0800 Subject: [PATCH] support gateway --- README.md | 20 ++++++++++++---- cmd.go | 7 ++++++ go.mod | 28 ++++++++++++++++++++-- go.sum | 68 +++++++++++++++++++++++++++++++++++++++++++++++++---- main.go | 49 ++++++++++++++++++++++++++++---------- planet.jpg | Bin 63358 -> 0 bytes 6 files changed, 150 insertions(+), 22 deletions(-) create mode 100644 cmd.go delete mode 100644 planet.jpg diff --git a/README.md b/README.md index c302eaf..aa15200 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,14 @@ Ela is a tool to migrator data between different elasticsearch with different ve ## Usage ++ run tasks ```bash -./ela ./config.yml +./ela --config ./config.yml --tasks +``` + ++ run gateway +```bash +./ela --config ./config.yml --gateway ``` ## Config @@ -130,9 +136,15 @@ tasks: # tasks which is executed orderly. name: "template_sample_hello" pattern: ["sample_*", "index_*"] # index pattern which is used to filter index to create template. order: 0 -``` -You can communicate more directly with author through the Knowledge Planet. +gateway: # gateway for dual write both source es and target es. + gateway_address: "0.0.0.0:8080" # gateway listen address + gateway_user: "user" # gateway auth username + gateway_password: "12342" # gateway auth password + source_es: es5 # gateway source es + target_es: es8 # gateway target es + master: es8 # gateway master es, select between source es and target es. + +``` -Knowledge Planet diff --git a/cmd.go b/cmd.go new file mode 100644 index 0000000..59e902f --- /dev/null +++ b/cmd.go @@ -0,0 +1,7 @@ +package main + +type Cmd struct { + Tasks bool `long:"tasks" description:"run all tasks"` + Gateway bool `long:"gateway" description:"run gateway server"` + ConfigFile string `long:"config" description:"load config file"` +} diff --git a/go.mod b/go.mod index 1f5d049..3a7f464 100644 --- a/go.mod +++ b/go.mod @@ -3,27 +3,45 @@ module github.com/CharellKing/ela go 1.23.0 require ( - github.com/CharellKing/ela-lib v1.0.34 + github.com/CharellKing/ela-lib v1.1.0 + github.com/jessevdk/go-flags v1.6.1 github.com/spf13/viper v1.19.0 ) require ( github.com/alitto/pond v1.9.1 // indirect github.com/bytedance/gopkg v0.1.1 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect github.com/elastic/go-elasticsearch/v5 v5.6.1 // indirect github.com/elastic/go-elasticsearch/v6 v6.8.10 // indirect github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect github.com/elastic/go-elasticsearch/v8 v8.14.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/copier v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -36,14 +54,20 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 07c3939..813ed93 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,19 @@ -github.com/CharellKing/ela-lib v1.0.34 h1:yF+/8qnQuvebp/q6W1sWOu55qHtWr1g2yL7pp93uJRI= -github.com/CharellKing/ela-lib v1.0.34/go.mod h1:6AbIwbjxtUHawusGSbKEYJCTUQQ4vJlHDBEWThH98qs= +github.com/CharellKing/ela-lib v1.1.0 h1:S4tAK+ix5/u25z/UBD4Mb0IeSoKA44QfmW3csbQTmFU= +github.com/CharellKing/ela-lib v1.1.0/go.mod h1:SD3MEJvcbAv3GLuGMI612A9x0zzmH7Q4ZDy/er3BqX8= github.com/alitto/pond v1.9.1 h1:OfCpIrMyrWJpn34f647DcFmUxjK8+7Nu3eoVN/WTP+o= github.com/alitto/pond v1.9.1/go.mod h1:xQn3P/sHTYcU/1BR3i86IGIrilcrGC2LiS+E2+CJWsI= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE= github.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -24,29 +32,63 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= +github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +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/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -84,11 +126,16 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= @@ -101,13 +148,24 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -116,3 +174,5 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go index 766b280..0cd2173 100644 --- a/main.go +++ b/main.go @@ -4,21 +4,32 @@ import ( "context" "fmt" "github.com/CharellKing/ela-lib/config" - "github.com/CharellKing/ela-lib/service" + "github.com/CharellKing/ela-lib/service/gateway" + "github.com/CharellKing/ela-lib/service/task" "github.com/CharellKing/ela-lib/utils" + goflags "github.com/jessevdk/go-flags" + "log" "github.com/spf13/viper" - "os" ) func main() { - if len(os.Args) < 2 { - fmt.Println("Usage: go run main.go ") + var err error + cmd := &Cmd{} + + // parse args + _, err = goflags.Parse(cmd) + if err != nil { + log.Fatal(err) + return + } + + if cmd.ConfigFile == "" { + fmt.Println("Usage: go run main.go --config [--gateway ] [--tasks ]") return } - configPath := os.Args[1] - viper.SetConfigFile(configPath) + viper.SetConfigFile(cmd.ConfigFile) viper.SetConfigType("yaml") if err := viper.ReadInConfig(); err != nil { @@ -35,14 +46,28 @@ func main() { utils.InitLogger(&cfg) ctx := context.Background() - taskMgr, err := service.NewTaskMgr(&cfg) - if err != nil { - utils.GetLogger(ctx).WithError(err).Error("create task manager") + + if cmd.Tasks { + taskMgr, err := task.NewTaskMgr(&cfg) + if err != nil { + utils.GetLogger(ctx).WithError(err).Error("create task manager") + return + } + + if err := taskMgr.Run(ctx); err != nil { + utils.GetLogger(ctx).WithError(err).Error("run task manager") + return + } return } - if err := taskMgr.Run(ctx); err != nil { - utils.GetLogger(ctx).WithError(err).Error("run task manager") - return + + if cmd.Gateway { + esProxy, err := gateway.NewESGateway(&cfg) + if err != nil { + utils.GetLogger(ctx).Errorf("create task manager %+v", err) + return + } + esProxy.Run() } return diff --git a/planet.jpg b/planet.jpg deleted file mode 100644 index 3fce7784b773c02565a38258a99489b8b9a9ad0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63358 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