From ecbbfc1120df31aae5a6c49129f2cb3296700906 Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong(cubxxw)" <3293172751nss@gmail.com> Date: Wed, 27 Sep 2023 09:09:57 +0800 Subject: [PATCH] feat: add tools imctl --- .gitignore | 1 - tools/imctl/.gitignore | 64 ++++++++++++++++++++++++++++++ tools/imctl/README.md | 89 ++++++++++++++++++++++++++++++++++++++++++ tools/imctl/go.mod | 18 +++++++++ tools/imctl/go.sum | 24 ++++++++++++ 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 tools/imctl/.gitignore create mode 100644 tools/imctl/README.md create mode 100644 tools/imctl/go.mod create mode 100644 tools/imctl/go.sum diff --git a/.gitignore b/.gitignore index 2d8f1e002..92408fa56 100644 --- a/.gitignore +++ b/.gitignore @@ -160,7 +160,6 @@ flycheck_*.el # Dependency directories (remove the comment below to include it) vendor/ -tools/imctl # Go workspace file # go.work diff --git a/tools/imctl/.gitignore b/tools/imctl/.gitignore new file mode 100644 index 000000000..a2e773394 --- /dev/null +++ b/tools/imctl/.gitignore @@ -0,0 +1,64 @@ +# Copyright © 2023 OpenIMSDK. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ============================================================================== +# For the entire design of.gitignore, ignore git commits and ignore files +#=============================================================================== +# + +### OpenIM developer supplement ### +logs +.devcontainer +components +out-test +Dockerfile.cross + +### Makefile ### +tmp/ +bin/ +output/ +_output/ + +### OpenIM Config ### +config/config.yaml +./config/config.yaml +.env +./.env + +### OpenIM deploy ### +deploy/openim_demo +deploy/openim-api +deploy/openim-rpc-msg_gateway +deploy/openim-msgtransfer +deploy/openim-push +deploy/openim_timer_task +deploy/openim-rpc-user +deploy/openim-rpc-friend +deploy/openim-rpc-group +deploy/openim-rpc-msg +deploy/openim-rpc-auth +deploy/Open-IM-SDK-Core + +# files used by the developer +.idea.md +.todo.md +.note.md + +# ============================================================================== +# Created by https://www.toptal.com/developers/gitignore/api/go,git,vim,tags,test,emacs,backup,jetbrains +# Edit at https://www.toptal.com/developers/gitignore?templates=go,git,vim,tags,test,emacs,backup,jetbrains + +cmd/ +internal/ +pkg/ diff --git a/tools/imctl/README.md b/tools/imctl/README.md new file mode 100644 index 000000000..28df87e26 --- /dev/null +++ b/tools/imctl/README.md @@ -0,0 +1,89 @@ +# [RFC #0005] OpenIM CTL Module Proposal + +## Meta + +- Name: OpenIM CTL Module Enhancement +- Start Date: 2023-08-23 +- Author(s): @cubxxw +- Status: Draft +- RFC Pull Request: (leave blank) +- OpenIMSDK Pull Request: (leave blank) +- OpenIMSDK Issue: https://github.com/openimsdk/open-im-server/issues/924 +- Supersedes: N/A + +## 📇Topics + +- RFC #0000 OpenIMSDK CTL Module Proposal + - [Meta](#meta) + - [Summary](#summary) + - [Definitions](#definitions) + - [Motivation](#motivation) + - [What it is](#what-it-is) + - [How it Works](#how-it-works) + - [Migration](#migration) + - [Drawbacks](#drawbacks) + - [Alternatives](#alternatives) + - [Prior Art](#prior-art) + - [Unresolved Questions](#unresolved-questions) + - [Spec. Changes (OPTIONAL)](#spec-changes-optional) + - [History](#history) + +## Summary + +The OpenIM CTL module proposal aims to provide an integrated tool for the OpenIM system, offering utilities for user management, system monitoring, debugging, configuration, and more. This tool will enhance the extensibility of the OpenIM system and reduce dependencies on individual modules. + +## Definitions + +- **OpenIM**: An Instant Messaging system. +- **`imctl`**: The control command-line tool for OpenIM. +- **E2E Testing**: End-to-End Testing. +- **API**: Application Programming Interface. + +## Motivation + +- Improve the OpenIM system's extensibility and reduce dependencies on individual modules. +- Simplify the process for testers to perform automated tests. +- Enhance interaction with scripts and reduce the system's coupling. +- Implement a consistent tool similar to kubectl for a streamlined user experience. + +## What it is + +`imctl` is a command-line utility designed for OpenIM to provide functionalities including: + +- User Management: Add, delete, or disable user accounts. +- System Monitoring: View metrics like online users, message transfer rate. +- Debugging: View logs, adjust log levels, check system states. +- Configuration Management: Update system settings, manage plugins/modules. +- Data Management: Backup, restore, import, or export data. +- System Maintenance: Update, restart services, or maintenance mode. + +## How it Works + +`imctl`, inspired by kubectl, will have sub-commands and options for the functionalities mentioned. Developers, operations, and testers can invoke these commands to manage and monitor the OpenIM system. + +## Migration + +Currently, the `imctl` will be housed in `tools/imctl`, and later on, the plan is to move it to `cmd/imctl`. Migration guidelines will be provided to ensure smooth transitions. + +## Drawbacks + +- Overhead in learning and adapting to a new tool for existing users. +- Potential complexities in implementing some of the advanced functionalities. + +## Alternatives + +- Continue using individual modules for OpenIM management. +- Utilize third-party tools or platforms with similar functionalities, customizing them for OpenIM. + +## Prior Art + +Kubectl from Kubernetes is a significant inspiration for `imctl`, offering a comprehensive command-line tool for managing clusters. + +## Unresolved Questions + +- What other functionalities might be required in future versions of `imctl`? +- What's the expected timeline for transitioning from `tools/imctl` to `cmd/imctl`? + +## Spec. Changes (OPTIONAL) + +As of now, there are no proposed changes to the core specifications or extensions. Future changes based on community feedback might necessitate spec changes, which will be documented accordingly. \ No newline at end of file diff --git a/tools/imctl/go.mod b/tools/imctl/go.mod new file mode 100644 index 000000000..60b06b45b --- /dev/null +++ b/tools/imctl/go.mod @@ -0,0 +1,18 @@ +module github.com/openimsdk/open-im-server/v3/tools/imctl + +go 1.18 + +require ( + github.com/MakeNowJust/heredoc/v2 v2.0.1 + github.com/mitchellh/go-wordwrap v1.0.1 + github.com/moby/term v0.5.0 + github.com/russross/blackfriday v1.6.0 + github.com/spf13/cobra v1.7.0 + github.com/spf13/pflag v1.0.5 +) + +require ( + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + golang.org/x/sys v0.1.0 // indirect +) diff --git a/tools/imctl/go.sum b/tools/imctl/go.sum new file mode 100644 index 000000000..3d4c61343 --- /dev/null +++ b/tools/imctl/go.sum @@ -0,0 +1,24 @@ +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A= +github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=