feat: set openim lint

Signed-off-by: Xinwei Xiong(cubxxw) <3293172751nss@gmail.com>
pull/1820/head
Xinwei Xiong(cubxxw) 10 months ago
parent a2da40ceab
commit 2efa041664

@ -33,7 +33,7 @@ env:
OPEN_IM_SERVER_CLA_DOCUMENT: https://github.com/openim-sigs/cla/blob/main/README.md OPEN_IM_SERVER_CLA_DOCUMENT: https://github.com/openim-sigs/cla/blob/main/README.md
OPEN_IM_SERVER_SIGNATURES_PATH: signatures/${{ github.event.repository.name }}/cla.json OPEN_IM_SERVER_SIGNATURES_PATH: signatures/${{ github.event.repository.name }}/cla.json
OPEN_IM_SERVER_ALLOWLIST: kubbot,bot*,bot-*,bot/*,bot-/*,bot,*[bot] OPEN_IM_SERVER_ALLOWLIST: kubbot,openimbot,bot*,dependabot,sweep-ai,*bot,bot-*,bot/*,bot-/*,bot,*[bot]
jobs: jobs:
CLAAssistant: CLAAssistant:

@ -106,6 +106,16 @@ jobs:
ghcr.io/openimsdk/openim-api ghcr.io/openimsdk/openim-api
openim/openim-api openim/openim-api
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-api registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-api
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-api - name: Build and push Docker image for openim-api
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -127,6 +137,16 @@ jobs:
ghcr.io/openimsdk/openim-cmdutils ghcr.io/openimsdk/openim-cmdutils
openim/openim-cmdutils openim/openim-cmdutils
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-cmdutils registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-cmdutils
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-cmdutils - name: Build and push Docker image for openim-cmdutils
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -148,6 +168,16 @@ jobs:
ghcr.io/openimsdk/openim-crontask ghcr.io/openimsdk/openim-crontask
openim/openim-crontask openim/openim-crontask
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-crontask registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-crontask
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-crontask - name: Build and push Docker image for openim-crontask
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -169,6 +199,16 @@ jobs:
ghcr.io/openimsdk/openim-msggateway ghcr.io/openimsdk/openim-msggateway
openim/openim-msggateway openim/openim-msggateway
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-msggateway registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-msggateway
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-msggateway - name: Build and push Docker image for openim-msggateway
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -190,6 +230,16 @@ jobs:
ghcr.io/openimsdk/openim-msgtransfer ghcr.io/openimsdk/openim-msgtransfer
openim/openim-msgtransfer openim/openim-msgtransfer
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-msgtransfer registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-msgtransfer
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-msgtransfer - name: Build and push Docker image for openim-msgtransfer
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -211,6 +261,16 @@ jobs:
ghcr.io/openimsdk/openim-push ghcr.io/openimsdk/openim-push
openim/openim-push openim/openim-push
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-push registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-push
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-push - name: Build and push Docker image for openim-push
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -232,6 +292,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-auth ghcr.io/openimsdk/openim-rpc-auth
openim/openim-rpc-auth openim/openim-rpc-auth
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-auth registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-auth
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-auth - name: Build and push Docker image for openim-rpc-auth
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -253,6 +323,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-conversation ghcr.io/openimsdk/openim-rpc-conversation
openim/openim-rpc-conversation openim/openim-rpc-conversation
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-conversation registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-conversation
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-conversation - name: Build and push Docker image for openim-rpc-conversation
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -274,6 +354,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-friend ghcr.io/openimsdk/openim-rpc-friend
openim/openim-rpc-friend openim/openim-rpc-friend
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-friend registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-friend
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-friend - name: Build and push Docker image for openim-rpc-friend
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -295,6 +385,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-group ghcr.io/openimsdk/openim-rpc-group
openim/openim-rpc-group openim/openim-rpc-group
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-group registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-group
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-group - name: Build and push Docker image for openim-rpc-group
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -316,6 +416,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-msg ghcr.io/openimsdk/openim-rpc-msg
openim/openim-rpc-msg openim/openim-rpc-msg
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-msg registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-msg
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-msg - name: Build and push Docker image for openim-rpc-msg
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -337,6 +447,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-third ghcr.io/openimsdk/openim-rpc-third
openim/openim-rpc-third openim/openim-rpc-third
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-third registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-third
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-third - name: Build and push Docker image for openim-rpc-third
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5
@ -358,6 +478,16 @@ jobs:
ghcr.io/openimsdk/openim-rpc-user ghcr.io/openimsdk/openim-rpc-user
openim/openim-rpc-user openim/openim-rpc-user
registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-user registry.cn-hangzhou.aliyuncs.com/openimsdk/openim-rpc-user
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha
- name: Build and push Docker image for openim-rpc-user - name: Build and push Docker image for openim-rpc-user
uses: docker/build-push-action@v5 uses: docker/build-push-action@v5

@ -92,11 +92,41 @@ jobs:
- name: Exec OpenIM API test - name: Exec OpenIM API test
run: | run: |
sudo make test-api mkdir -p ./tmp
touch ./tmp/test.md
- name: Exec OpenIM E2E test echo "# OpenIM Test" >> ./tmp/test.md
echo "## OpenIM API Test" >> ./tmp/test.md
echo "<details><summary>Command Output for OpenIM API Test</summary>" >> ./tmp/test.md
echo "<pre><code>" >> ./tmp/test.md
sudo make test-api | tee -a ./tmp/test.md
echo "</code></pre>" >> ./tmp/test.md
echo "</details>" >> ./tmp/test.md
- name: Exec OpenIM E2E Test
run: | run: |
sudo make test-e2e echo "" >> ./tmp/test.md
echo "## OpenIM E2E Test" >> ./tmp/test.md
echo "<details><summary>Command Output for OpenIM E2E Test</summary>" >> ./tmp/test.md
echo "<pre><code>" >> ./tmp/test.md
sudo make test-e2e | tee -a ./tmp/test.md
echo "</code></pre>" >> ./tmp/test.md
echo "</details>" >> ./tmp/test.md
- name: Comment PR with file
uses: thollander/actions-comment-pull-request@v2
with:
filePath: ./tmp/test.md
comment_tag: nrt_file
reactions: eyes, rocket
mode: recreate
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
continue-on-error: true
- name: Check outputs
run: |
echo "id : ${{ steps.nrt_message.outputs.id }}"
echo "body : ${{ steps.nrt_message.outputs.body }}"
echo "html_url : ${{ steps.nrt_message.outputs.html_url }}"
- name: Exec OpenIM System uninstall - name: Exec OpenIM System uninstall
run: | run: |

@ -17,6 +17,7 @@ on:
issues: issues:
types: types:
- labeled - labeled
jobs: jobs:
add-comment: add-comment:
if: github.event.label.name == 'help wanted' || github.event.label.name == 'good first issue' if: github.event.label.name == 'help wanted' || github.event.label.name == 'good first issue'

@ -18,39 +18,42 @@ on:
push: push:
branches: branches:
- main - main
- release-*
paths-ignore: paths-ignore:
- "docs/**" - "docs/**"
- "README.md" - "README.md"
- "README_zh-CN.md" - "README_zh-CN.md"
- "**.md"
- "docs/**"
- "CONTRIBUTING.md" - "CONTRIBUTING.md"
pull_request: pull_request:
branches: branches:
- main - main
- release-*
paths-ignore: paths-ignore:
- "README.md" - "README.md"
- "README_zh-CN.md" - "README_zh-CN.md"
- "CONTRIBUTING.md" - "CONTRIBUTING/**"
- "**.md"
- "docs/**" - "docs/**"
env: env:
GO_VERSION: "1.19" GO_VERSION: "1.19"
GOLANGCI_VERSION: "v1.50.1" GOLANGCI_VERSION: "v1.50.1"
jobs: jobs:
openim: openim:
name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }} name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
permissions: permissions:
contents: write contents: write
pull-requests: write
environment: environment:
name: openim name: openim
strategy: strategy:
matrix: matrix:
go_version: ["1.19","1.20","1.21"] go_version: ["1.19","1.20","1.21"]
os: [ubuntu-latest] os: [ubuntu-latest]
steps: steps:
- name: Setup - name: Setup
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -67,6 +70,9 @@ jobs:
version: '3.x' # If available, use the latest major version that's compatible version: '3.x' # If available, use the latest major version that's compatible
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: OpenIM Scripts Verification(make verify)
run: sudo make verify
- name: Module Operations - name: Module Operations
run: | run: |
sudo make tidy sudo make tidy
@ -83,16 +89,14 @@ jobs:
- name: Build Source - name: Build Source
run: sudo make build run: sudo make build
- name: Build multiarch PLATFORMS
if: startsWith(github.ref, 'refs/heads/release-')
run: |
sudo make multiarch
- name: Cleanup Build - name: Cleanup Build
run: sudo make clean run: sudo make clean
- name: Push Changes to Main
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "cicd: robot automated Change"
branch: main
continue-on-error: true
- name: Set Current Directory - name: Set Current Directory
id: set_directory id: set_directory
run: echo "::set-output name=directory::$(pwd)" run: echo "::set-output name=directory::$(pwd)"
@ -109,8 +113,11 @@ jobs:
continue-on-error: true continue-on-error: true
openim-start: openim-start:
name: Test OpenIM install/start on ${{ matrix.os }} name: Test OpenIM install/start on ${{ matrix.os }}-${{ matrix.arch }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
permissions:
contents: write
pull-requests: write
environment: environment:
name: openim name: openim
strategy: strategy:
@ -129,15 +136,59 @@ jobs:
run: | run: |
sudo make install sudo make install
# - name: Check the OpenIM environment and status
# run: |
# sudo docker images
# sudo docker ps
- name: Check the OpenIM environment and status
if: runner.os == 'Linux' && matrix.arch == 'amd64'
id: docker_info
run: |
sleep 30
echo "images<<EOF" >> $GITHUB_ENV
sudo docker images >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "containers<<EOF" >> $GITHUB_ENV
sudo docker ps >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Comment PR
uses: thollander/actions-comment-pull-request@v2
if: runner.os == 'Linux' && matrix.arch == 'amd64'
with:
message: |
> [!TIP]
> Run make install to check the status
### Docker Images:
<details><summary>Click to expand docker images</summary>
```bash
${{ env.images }}
```
</details>
### Docker Processes:
<details><summary>Click to expand docker ps</summary>
```bash
${{ env.containers }}
```
</details>
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
execute-scripts: execute-scripts:
name: Execute OpenIM Script On ${{ matrix.os }} name: Execute OpenIM Script On ${{ matrix.os }}-${{ matrix.arch }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
permissions:
contents: write
pull-requests: write
environment: environment:
name: openim name: openim
strategy: strategy:
matrix: matrix:
go_version: ["1.20"] go_version: ["1.21"]
os: ["ubuntu-latest", "macos-latest"] os: ["ubuntu-latest", "macos-latest"]
arch: [arm64, armv7, amd64]
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -155,7 +206,7 @@ jobs:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
# - name: Install latest Bash (macOS only) # - name: Install latest Bash (macOS only)
# if: runner.os == 'macOS' # if: runner.os == 'macOS' && matrix.arch == 'arm64'
# run: | # run: |
# /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# brew update # brew update
@ -175,7 +226,7 @@ jobs:
sudo sleep 20 sudo sleep 20
# - name: Set up Docker for macOS # - name: Set up Docker for macOS
# if: runner.os == 'macOS' # if: runner.os == 'macOS' && matrix.arch == 'arm64'
# run: | # run: |
# brew install --cask docker # brew install --cask docker
# open /Applications/Docker.app # open /Applications/Docker.app
@ -201,29 +252,27 @@ jobs:
- name: Build, Start, Check Services and Print Logs for Ubuntu - name: Build, Start, Check Services and Print Logs for Ubuntu
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: | run: |
sudo make build && \ sudo make build
sudo make start && \ sudo make start
sudo make check || \ sudo make check
(echo "An error occurred, printing logs:" && sudo cat ./_output/logs/* 2>/dev/null)
- name: Restart Services and Print Logs for Ubuntu - name: Restart Services and Print Logs for Ubuntu
if: runner.os == 'Linux' if: runner.os == 'Linux' && matrix.arch == 'amd64'
run: | run: |
sudo make restart sudo make restart
sudo make check sudo make check
# - name: Build, Start, Check Services and Print Logs for macOS - name: Build, Start, Check Services and Print Logs for macOS
# if: runner.os == 'macOS' if: runner.os == 'macOS' && matrix.arch == 'arm64'
# run: | run: |
# make init && \ make build
# make build && \
# make start && \
# make check || \
# (echo "An error occurred, printing logs:" && sudo cat ./_output/logs/* 2>/dev/null)
openim-test-build-image: openim-test-build-image:
name: Build OpenIM Docker Image name: Build OpenIM Docker Image
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
environment: environment:
name: openim name: openim
steps: steps:
@ -245,3 +294,9 @@ jobs:
run: | run: |
sudo make init sudo make init
sudo make image sudo make image
- name: Get OpenIM Docker Images Status
id: docker_processes
run: |
sudo docker images
sudo docker ps

@ -0,0 +1,45 @@
# Copyright © 2023 OpenIM. All rights reserved.
#
# 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.
# OpenIM base image: https://github.com/openim-sigs/openim-base-image
# Set go mod installation source and proxy
FROM golang:1.20 AS builder
ARG GO111MODULE=on
ARG GOPROXY=https://goproxy.cn,direct
WORKDIR /openim/openim-server
ENV GO111MODULE=$GO111MODULE
ENV GOPROXY=$GOPROXY
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN make build BINS=openim-rpc-encryption
RUN cp /openim/openim-server/_output/bin/platforms/$(go env GOOS)/$(go env GOARCH)/openim-rpc-encryption /usr/bin/openim-rpc-encryption
# FROM ghcr.io/openim-sigs/openim-bash-image:latest
FROM ghcr.io/openim-sigs/openim-bash-image:latest
WORKDIR /openim/openim-server
COPY --from=builder /usr/bin/openim-rpc-encryption ./bin/openim-rpc-encryption
ENTRYPOINT ["./bin/openim-rpc-encryption"]

@ -0,0 +1,45 @@
# Copyright © 2023 OpenIM. All rights reserved.
#
# 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.
# OpenIM base image: https://github.com/openim-sigs/openim-base-image
# Set go mod installation source and proxy
FROM golang:1.20 AS builder
ARG GO111MODULE=on
ARG GOPROXY=https://goproxy.cn,direct
WORKDIR /openim/openim-server
ENV GO111MODULE=$GO111MODULE
ENV GOPROXY=$GOPROXY
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN make build BINS=openim-rpc-extend-msg
RUN cp /openim/openim-server/_output/bin/platforms/$(go env GOOS)/$(go env GOARCH)/openim-rpc-extend-msg /usr/bin/openim-rpc-extend-msg
# FROM ghcr.io/openim-sigs/openim-bash-image:latest
FROM ghcr.io/openim-sigs/openim-bash-image:latest
WORKDIR /openim/openim-server
COPY --from=builder /usr/bin/openim-rpc-extend-msg ./bin/openim-rpc-extend-msg
ENTRYPOINT ["./bin/openim-rpc-extend-msg"]

@ -31,7 +31,7 @@ docs/guide/en-US/cmd/openim/openim-rpc-user_list.md
docs/guide/en-US/cmd/openim/openim-rpc-user_update.md docs/guide/en-US/cmd/openim/openim-rpc-user_update.md
docs/guide/en-US/cmd/openim/openim_validate.md docs/guide/en-US/cmd/openim/openim_validate.md
docs/guide/en-US/cmd/openim/openim_version.md docs/guide/en-US/cmd/openim/openim_version.md
docs/guide/en-US/yaml/openim/openim.yaml docs/guide/en-US/yaml/openim/config.yaml
docs/guide/en-US/yaml/openim/openim_color.yaml docs/guide/en-US/yaml/openim/openim_color.yaml
docs/guide/en-US/yaml/openim/openim_completion.yaml docs/guide/en-US/yaml/openim/openim_completion.yaml
docs/guide/en-US/yaml/openim/openim_info.yaml docs/guide/en-US/yaml/openim/openim_info.yaml

@ -89,7 +89,7 @@ While the first two methods will be our main focus, it's worth noting that the t
### 1.2. <a name='SourceCodeDeployment'></a>Source Code Deployment ### 1.2. <a name='SourceCodeDeployment'></a>Source Code Deployment
In the source code deployment method, the configuration generation process involves executing `make init`, which fundamentally runs the script `./scripts/init-config.sh`. This script utilizes variables defined in the [`environment.sh`](https://github.com/openimsdk/open-im-server/blob/main/scripts/install/environment.sh) script to render the [`openim.yaml`](https://github.com/openimsdk/open-im-server/blob/main/deployments/templates/openim.yaml) template file, subsequently generating the [`config.yaml`](https://github.com/openimsdk/open-im-server/blob/main/config/config.yaml) configuration file. In the source code deployment method, the configuration generation process involves executing `make init`, which fundamentally runs the script `./scripts/init-config.sh`. This script utilizes variables defined in the [`environment.sh`](https://github.com/openimsdk/open-im-server/blob/main/scripts/install/environment.sh) script to render the [`config.yaml`](https://github.com/openimsdk/open-im-server/blob/main/deployments/templates/config.yaml) template file, subsequently generating the [`config.yaml`](https://github.com/openimsdk/open-im-server/blob/main/config/config.yaml) configuration file.
### 1.3. <a name='DockerComposeDeployment'></a>Docker Compose Deployment ### 1.3. <a name='DockerComposeDeployment'></a>Docker Compose Deployment
@ -104,16 +104,19 @@ Docker deployment offers a slightly more intricate template. Within the [openim-
Configuration file modifications can be made by specifying corresponding environment variables, for instance: Configuration file modifications can be made by specifying corresponding environment variables, for instance:
```bash ```bash
export CHAT_IMAGE_VERSION="main" export CHAT_IMAGE_VERSION="main"
export SERVER_IMAGE_VERSION="main" export SERVER_IMAGE_VERSION="main"
``` ```
These variables are stored within the [`environment.sh`](https://github.com/OpenIMSDK/openim-docker/blob/main/scripts/install/environment.sh) configuration: These variables are stored within the [`environment.sh`](https://github.com/OpenIMSDK/open-im-server/blob/main/scripts/install/environment.sh) configuration:
```bash ```bash
readonly CHAT_IMAGE_VERSION=${CHAT_IMAGE_VERSION:-'main'} readonly CHAT_IMAGE_VERSION=${CHAT_IMAGE_VERSION:-'main'}
readonly SERVER_IMAGE_VERSION=${SERVER_IMAGE_VERSION:-'main'} readonly SERVER_IMAGE_VERSION=${SERVER_IMAGE_VERSION:-'main'}
``` ```
> [!IMPORTANT]
> Can learn to read our mirror version strategy: https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md
Setting a variable, e.g., `export CHAT_IMAGE_VERSION="release-v1.3"`, will prioritize `CHAT_IMAGE_VERSION="release-v1.3"` as the variable value. Ultimately, the chosen image version is determined, and rendering is achieved through `make init` (or `./scripts/init-config.sh`). Setting a variable, e.g., `export CHAT_IMAGE_VERSION="release-v1.3"`, will prioritize `CHAT_IMAGE_VERSION="release-v1.3"` as the variable value. Ultimately, the chosen image version is determined, and rendering is achieved through `make init` (or `./scripts/init-config.sh`).
@ -127,7 +130,7 @@ For convenience, configuration through modifying environment variables is recomm
+ PASSWORD + PASSWORD
+ **Description**: Password for mysql, mongodb, redis, and minio. + **Description**: Password for mongodb, redis, and minio.
+ **Default**: `openIM123` + **Default**: `openIM123`
+ Notes: + Notes:
+ Minimum password length: 8 characters. + Minimum password length: 8 characters.
@ -139,20 +142,22 @@ For convenience, configuration through modifying environment variables is recomm
+ OPENIM_USER + OPENIM_USER
+ **Description**: Username for mysql, mongodb, redis, and minio. + **Description**: Username for redis, and minio.
+ **Default**: `root` + **Default**: `root`
```bash ```bash
export OPENIM_USER="root" export OPENIM_USER="root"
``` ```
+ API_URL > mongo is `openIM`, use `export MONGO_OPENIM_USERNAME="openIM"` to modify
+ OPENIM_IP
+ **Description**: API address. + **Description**: API address.
+ **Note**: If the server has an external IP, it will be automatically obtained. For internal networks, set this variable to the IP serving internally. + **Note**: If the server has an external IP, it will be automatically obtained. For internal networks, set this variable to the IP serving internally.
```bash ```bash
export API_URL="http://ip:10002" export OPENIM_IP="ip"
``` ```
+ DATA_DIR + DATA_DIR
@ -443,7 +448,7 @@ This section involves configuring the log settings, including storage location,
| Parameter | Example Value | Description | | Parameter | Example Value | Description |
| ------------------------- | ------------------------ | --------------------------------- | | ------------------------- | ------------------------ | --------------------------------- |
| LOG_STORAGE_LOCATION | ""${OPENIM_ROOT}"/logs/" | Location for storing logs | | LOG_STORAGE_LOCATION | "${OPENIM_ROOT}/logs/" | Location for storing logs |
| LOG_ROTATION_TIME | "24" | Log rotation time (in hours) | | LOG_ROTATION_TIME | "24" | Log rotation time (in hours) |
| LOG_REMAIN_ROTATION_COUNT | "2" | Number of log rotations to retain | | LOG_REMAIN_ROTATION_COUNT | "2" | Number of log rotations to retain |
| LOG_REMAIN_LOG_LEVEL | "6" | Log level to retain | | LOG_REMAIN_LOG_LEVEL | "6" | Log level to retain |

@ -75,7 +75,7 @@ It is critical that our full community is actively engaged on enhancements in th
- Be aware the cherry pick script assumes you have a git remote called `upstream` that points at the openim-server github org. - Be aware the cherry pick script assumes you have a git remote called `upstream` that points at the openim-server github org.
Please see our [recommended Git workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contributors/github-workflow.md#workflow). Please see our [recommended Git workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/github-workflow.md#workflow).
- You will need to run the cherry pick script separately for each patch release you want to cherry pick to. Cherry picks should be applied to all [active](https://github.com/openimsdk/open-im-server/releases) release branches where the fix is applicable. - You will need to run the cherry pick script separately for each patch release you want to cherry pick to. Cherry picks should be applied to all [active](https://github.com/openimsdk/open-im-server/releases) release branches where the fix is applicable.

@ -8,7 +8,6 @@ description: |
commit hygiene. commit hygiene.
--- ---
![Git workflow](git_workflow.png)
## 1. Fork in the cloud ## 1. Fork in the cloud
@ -28,10 +27,10 @@ neither `$GOPATH/src/github.com/${your github profile name}/`
nor any other pattern will work. nor any other pattern will work.
```sh ```sh
export working_dir="$(go env GOPATH)/src/k8s.io" export working_dir="$(go env GOPATH)/src/github.com/openimsdk"
``` ```
If you already do Go development on github, the `k8s.io` directory If you already do Go development on github, the `github.com/openimsdk` directory
will be a sibling to your existing `github.com` directory. will be a sibling to your existing `github.com` directory.
Set `user` to match your github profile name: Set `user` to match your github profile name:

@ -26,6 +26,7 @@ We provide multiple versions of our images to meet different project requirement
1. `main`: This image corresponds to the latest version of the main branch in OpenIM. It is updated frequently, making it perfect for users who want to stay at the cutting edge of our features. 1. `main`: This image corresponds to the latest version of the main branch in OpenIM. It is updated frequently, making it perfect for users who want to stay at the cutting edge of our features.
2. `release-v3.*`: This is the image that corresponds to the latest version of OpenIM's stable release branch. It's ideal for users who prefer a balance between new features and stability. 2. `release-v3.*`: This is the image that corresponds to the latest version of OpenIM's stable release branch. It's ideal for users who prefer a balance between new features and stability.
3. `v3.*.*`: These images are specific to each tag in OpenIM. They are preserved in their original state and are never overwritten. These are the go-to images for users who need a specific, unchanging version of OpenIM. 3. `v3.*.*`: These images are specific to each tag in OpenIM. They are preserved in their original state and are never overwritten. These are the go-to images for users who need a specific, unchanging version of OpenIM.
4. The image versions adhere to Semantic Versioning 2.0.0 strategy. Taking the `openim-server` image as an example, available at [openim-server container package](https://github.com/openimsdk/open-im-server/pkgs/container/openim-server): upon tagging with v3.5.0, the CI automatically releases the following tags - `openim-server:3`, `openim-server:3.5`, `openim-server:3.5.0`, `openim-server:v3.5.0`, `openim-server:latest`, and `sha-e0244d9`. It's important to note that only `sha-e0244d9` is absolutely unique, whereas `openim-server:v3.5.0` and `openim-server:3.5.0` maintain a degree of uniqueness.
### Multi-Architecture Images ### Multi-Architecture Images

@ -23,8 +23,8 @@ In the `scripts/init_config.sh` file, we defined some template files. These temp
``` ```
# Defines an associative array where the keys are the template files and the values are the corresponding output files. # Defines an associative array where the keys are the template files and the values are the corresponding output files.
declare -A TEMPLATES=( declare -A TEMPLATES=(
[""${OPENIM_ROOT}"/scripts/template/config-tmpl/env.template"]="${OPENIM_OUTPUT_SUBPATH}/bin/.env" ["${OPENIM_ROOT}/scripts/template/config-tmpl/env.template"]="${OPENIM_OUTPUT_SUBPATH}/bin/.env"
[""${OPENIM_ROOT}"/scripts/template/config-tmpl/config.yaml"]="${OPENIM_OUTPUT_SUBPATH}/bin/config.yaml" ["${OPENIM_ROOT}/scripts/template/config-tmpl/config.yaml"]="${OPENIM_OUTPUT_SUBPATH}/bin/config.yaml"
) )
``` ```

@ -0,0 +1,258 @@
# Mac Developer Deployment Guide for OpenIM
## Introduction
This guide aims to assist Mac-based developers in contributing effectively to OpenIM. It covers the setup of a development environment tailored for Mac, including the use of GitHub for development workflow and `devcontainer` for a consistent development experience.
Before contributing to OpenIM through issues and pull requests, make sure you are familiar with GitHub and the [pull request workflow](https://docs.github.com/en/get-started/quickstart/github-flow).
## Prerequisites
### System Requirements
- macOS (latest stable version recommended)
- Internet connection
- Administrator access
### Knowledge Requirements
- Basic understanding of Git and GitHub
- Familiarity with Docker and containerization
- Experience with Go programming language
## Setting up the Development Environment
### Installing Homebrew
Homebrew is an essential package manager for macOS. Install it using:
```sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
### Installing and Configuring Git
1. Install Git:
```sh
brew install git
```
2. Configure Git with your user details:
```sh
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
```
### Setting Up the Devcontainer
`Devcontainers` provide a Docker-based isolated development environment.
Read [README.md](https://github.com/openimsdk/open-im-server/tree/main/.devcontainer) in the `.devcontainer` directory of the project to learn more about the devcontainer.
To set it up:
1. Install Docker Desktop for Mac from [Docker Hub](https://docs.docker.com/desktop/install/mac-install/).
2. Install Visual Studio Code and the Remote - Containers extension.
3. Open the cloned OpenIM repository in VS Code.
4. VS Code will prompt to reopen the project in a container. Accept this to set up the environment automatically.
### Installing Go and Dependencies
Use Homebrew to install Go:
```sh
brew install go
```
Ensure the version of Go is compatible with the version required by OpenIM (refer to the main documentation for version requirements).
### Additional Tools
Install other required tools like Docker, Vagrant, and necessary GNU utils as described in the main documentation.
## Mac Deployment openim-chat and openim-server
To integrate the Chinese document into an English document for Linux deployment, we will first translate the content and then adapt it to suit the Linux environment. Here's how the translated and adapted content might look:
### Ensure a Clean Environment
- It's recommended to execute in a new directory.
- Run `ps -ef | grep openim` to ensure no OpenIM processes are running.
- Run `ps -ef | grep chat` to check for absence of chat-related processes.
- Execute `docker ps` to verify there are no related containers running.
### Source Code Deployment
#### Deploying openim-server
Source code deployment is slightly more complex because Docker's networking on Linux differs from Mac.
```bash
git clone https://github.com/openimsdk/open-im-server
cd open-im-server
export OPENIM_IP="Your IP" # If it's a cloud server, setting might not be needed
make init # Generates configuration files
```
Before deploying openim-server, modify the Kafka logic in the docker-compose.yml file. Replace:
```yaml
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://${DOCKER_BRIDGE_GATEWAY:-172.28.0.1}:${KAFKA_PORT:-19094}
```
With:
```yaml
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://127.0.0.1:${KAFKA_PORT:-19094}
```
Then start the service:
```bash
docker compose up -d
```
Before starting the openim-server source, set `config/config.yaml` by replacing all instances of `172.28.0.1` with `127.0.0.1`:
```bash
vim config/config.yaml -c "%s/172\.28\.0\.1/127.0.0.1/g" -c "wq"
```
Then start openim-server:
```bash
make start
```
To check the startup:
```bash
make check
```
<aside>
🚧 To avoid mishaps, it's best to wait five minutes before running `make check` again.
</aside>
#### Deploying openim-chat
There are several ways to deploy openim-chat, either by source code or using Docker.
Navigate back to the parent directory:
```bash
cd ..
```
First, let's look at deploying chat from source:
```bash
git clone https://github.com/openimsdk/chat
cd chat
make init # Generates configuration files
```
If openim-chat has not deployed MySQL, you will need to deploy it. Note that the official Docker Hub for MySQL does not support architectures like ARM, so you can use the newer version of the open-source edition:
```bash
docker run -d \
--name mysql \
-p 13306:3306 \
-p 3306:33060 \
-v "$(pwd)/components/mysql/data:/var/lib/mysql" \
-v "/etc/localtime:/etc/localtime" \
-e MYSQL_ROOT_PASSWORD="openIM123" \
--restart always \
mariadb:10.6
```
Before starting the source code of openim-chat, set `config/config.yaml` by replacing all instances of `172.28.0.1` with `127.0.0.1`:
```bash
vim config/config.yaml -c "%s/172\.28\.0\.1/127.0.0.1/g" -c "wq"
```
Then start openim-chat from source:
```bash
make start
```
To check, ensure the following four processes start successfully:
```bash
make check
```
### Docker Deployment
Refer to https://github.com/openimsdk/openim-docker for Docker deployment instructions, which can be followed similarly on Linux.
```bash
git clone https://github.com/openimsdk/openim-docker
cd openim-docker
export OPENIM_IP="Your IP"
make init
docker compose up -d
docker compose logs -f openim-server
docker compose logs -f openim-chat
```
## GitHub Development Workflow
### Creating a New Branch
For new features or fixes, create a new branch:
```sh
git checkout -b feat/your-feature-name
```
### Making Changes and Committing
1. Make your changes in the code.
2. Stage your changes:
```sh
git add .
```
3. Commit with a meaningful message:
```sh
git commit -m "Add a brief description of your changes"
```
### Pushing Changes and Creating Pull Requests
1. Push your branch to GitHub:
```sh
git push origin feat/your-feature-name
```
2. Go to your fork on GitHub and create a pull request to the main OpenIM repository.
### Keeping Your Fork Updated
Regularly sync your fork with the main repository:
```sh
git fetch upstream
git checkout main
git rebase upstream/main
```
More read: [https://github.com/openimsdk/open-im-server/blob/main/CONTRIBUTING.md](https://github.com/openimsdk/open-im-server/blob/main/CONTRIBUTING.md)
## Testing and Quality Assurance
Run tests as described in the OpenIM documentation to ensure your changes do not break existing functionality.
## Conclusion
This guide provides a comprehensive overview for Mac developers to set up and contribute to OpenIM. By following these steps, you can ensure a smooth and efficient development experience. Happy coding!

@ -6,25 +6,57 @@
Below are the base images and their versions you'll need: Below are the base images and their versions you'll need:
- wurstmeister/kafka - [ ] bitnami/kafka:3.5.1
- redis:7.0.0 - [ ] redis:7.0.0
- mongo:6.0.2 - [ ] mongo:6.0.2
- mysql:5.7 - [ ] bitnami/zookeeper:3.8
- wurstmeister/zookeeper - [ ] minio/minio:latest
- minio/minio
> [!IMPORTANT]
> It is important to note that OpenIM removed mysql components from versions v3.5.0 (release-v3.5) and above, so mysql can be deployed without this requirement or above
**If you need to install more IM components or monitoring products**
OpenIM:
> [!TIP]
> If you need to install more IM components or monitoring products [images.md](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md)
- [ ] ghcr.io/openimsdk/openim-web:latest
- [ ] ghcr.io/openimsdk/openim-admin:latest
- [ ] ghcr.io/openimsdk/openim-chat:latest
- [ ] ghcr.io/openimsdk/openim-server:latest
Monitoring:
- [ ] prom/prometheusv2.48.1
- [ ] prom/alertmanagerv0.23.0
- [ ] grafana/grafana10.2.2
- [ ] bitnami/node-exporter1.7.0
Use the following commands to pull these base images: Use the following commands to pull these base images:
``` ```bash
docker pull wurstmeister/kafka docker pull bitnami/kafka:3.5.1
docker pull redis:7.0.0 docker pull redis:7.0.0
docker pull mongo:6.0.2 docker pull mongo:6.0.2
docker pull mysql:5.7 docker pull mysql:5.7
docker pull wurstmeister/zookeeper docker pull bitnami/zookeeper:3.8
docker pull minio/minio docker pull minio/minio:latest
``` ```
## 2. OpenIM & Chat Images If you need to install more IM components or monitoring products:
```bash
docker pull prom/prometheus:v2.48.1
docker pull prom/alertmanager:v0.23.0
docker pull grafana/grafana:10.2.2
docker pull bitnami/node-exporter:1.7.0
```
## 2. OpenIM Images
**For detailed understanding of version management and storage of OpenIM and Chat**: [version.md](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) **For detailed understanding of version management and storage of OpenIM and Chat**: [version.md](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md)
@ -42,9 +74,26 @@ docker pull ghcr.io/openimsdk/openim-server:<version-name>
- Execute the following command to pull the image: - Execute the following command to pull the image:
```bash ```bash
docker pull ghcr.io/openimsdk/openim-server:<version-name> docker pull ghcr.io/openimsdk/openim-chat:<version-name>
```
### Web Image
- Execute the following command to pull the image:
```bash
docker pull ghcr.io/openimsdk/openim-web:<version-name>
``` ```
### Admin Image
- Execute the following command to pull the image:
```bash
docker pull ghcr.io/openimsdk/openim-admin:<version-name>
```
## 3. Image Storage Selection ## 3. Image Storage Selection
**Repositories**: **Repositories**:
@ -71,46 +120,61 @@ You can select from the following versions:
1. **Pull images**: Execute the above `docker pull` commands to pull all required images locally. 1. **Pull images**: Execute the above `docker pull` commands to pull all required images locally.
2. **Save images**: 2. **Save images**:
``` ```bash
docker save -o <tar-file-name>.tar <image-name> docker save -o <tar-file-name>.tar <image-name>
``` ```
1. **Fetch code**: Clone the repository: If you want to save all the images, use the following command:
```bash
docker save -o <tar-file-name>.tar $(docker images -q)
``` ```
git clone https://github.com/OpenIMSDK/openim-docker.git
3. **Fetch code**: Clone the repository:
```bash
git clone https://github.com/openimsdk/openim-docker.git
``` ```
Or download the code from [Releases](https://github.com/OpenIMSDK/openim-docker/releases/). Or download the code from [Releases](https://github.com/openimsdk/openim-docker/releases/).
1. **Transfer files**: Use `scp` to transfer all images and code to the intranet server. > Because of the difference between win and linux newlines, please do not clone the repository with win and then synchronize scp to linux.
``` 4. **Transfer files**: Use `scp` to transfer all images and code to the intranet server.
```bash
scp <tar-file-name>.tar user@remote-ip:/path/on/remote/server scp <tar-file-name>.tar user@remote-ip:/path/on/remote/server
``` ```
Or choose other transfer methods such as a hard drive. Or choose other transfer methods such as a hard drive.
1. **Import images**: On the intranet server: 5. **Import images**: On the intranet server:
``` ```bash
docker load -i <tar-file-name>.tar docker load -i <tar-file-name>.tar
``` ```
1. **Deploy**: Navigate to the `openim-docker` repository directory and follow the README guide for deployment. Import directly with shortcut commands:
2. **Deploy using Docker-compose**:
```bash
for i in `ls ./`;do docker load -i $i;done
``` ```
docker-compose up -d
# Verify 6. **Deploy**: Navigate to the `openim-docker` repository directory and follow the [README guide](https://github.com/openimsdk/openim-docker) for deployment.
docker-compose ps
7. **Deploy using docker compose**:
```bash
export OPENIM_IP="your ip" # Set Ip
make init # Init config
docker compose up -d # Deployment
docker compose ps # Verify
``` ```
> **Note**: If you're using a version of Docker prior to 20, make sure you've installed `docker-compose`. > **Note**: If you're using a version of Docker prior to 20, make sure you've installed `docker-compose`.
## 6. Reference Links ## 6. Reference Links
- [OpenIMSDK Issue #432](https://github.com/openimsdk/open-im-server/issues/432) - [openimsdk Issue #432](https://github.com/openimsdk/open-im-server/issues/432)
- [Notion Link](https://nsddd.notion.site/435ee747c0bc44048da9300a2d745ad3?pvs=25) - [Notion Link](https://nsddd.notion.site/435ee747c0bc44048da9300a2d745ad3?pvs=25)
- [OpenIMSDK Issue #474](https://github.com/openimsdk/open-im-server/issues/474) - [openimsdk Issue #474](https://github.com/openimsdk/open-im-server/issues/474)

@ -111,32 +111,35 @@ Importing Grafana Dashboards is a straightforward process and is applicable to O
To monitor OpenIM in Grafana, you need to focus on three categories of key metrics, each with its specific deployment and configuration steps: To monitor OpenIM in Grafana, you need to focus on three categories of key metrics, each with its specific deployment and configuration steps:
1. **OpenIM Metrics (`prometheus-dashboard.yaml`)**: **OpenIM Metrics (`prometheus-dashboard.yaml`)**:
+ **Configuration File Path**: Located at `config/prometheus-dashboard.yaml`.
+ **Enabling Monitoring**: Set the environment variable `export PROMETHEUS_ENABLE=true` to enable Prometheus monitoring. - **Configuration File Path**: Find this at `config/prometheus-dashboard.yaml`.
+ **More Information**: Refer to the [OpenIM Configuration Guide](https://docs.openim.io/configurations/prometheus-integration). - **Enabling Monitoring**: Activate Prometheus monitoring by setting the environment variable: `export PROMETHEUS_ENABLE=true`.
2. **Node Exporter**: - **More Information**: For detailed instructions, see the [OpenIM Configuration Guide](https://docs.openim.io/configurations/prometheus-integration).
+ **Container Deployment**: Deploy the `quay.io/prometheus/node-exporter` container for node monitoring.
+ **Get Dashboard**: Access the [Node Exporter Full Feature Dashboard](https://grafana.com/grafana/dashboards/1860-node-exporter-full/) and import it using YAML file download or ID import. **Node Exporter**:
+ **Deployment Guide**: Refer to the [Node Exporter Deployment Documentation](https://prometheus.io/docs/guides/node-exporter/).
3. **Middleware Metrics**: Each middleware requires specific steps and configurations to enable monitoring. Here is a list of common middleware and links to their respective setup guides: - **Container Deployment**: Use the container `quay.io/prometheus/node-exporter` for effective node monitoring.
+ MySQL: - **Access Dashboard**: Visit the [Node Exporter Full Feature Dashboard](https://grafana.com/grafana/dashboards/1860-node-exporter-full/) for dashboard integration either through YAML file download or ID.
+ **Configuration**: Ensure MySQL has performance monitoring enabled. - **Deployment Guide**: For deployment steps, consult the [Node Exporter Deployment Documentation](https://prometheus.io/docs/guides/node-exporter/).
+ **Link**: Refer to the [MySQL Monitoring Configuration Guide](https://grafana.com/docs/grafana/latest/datasources/mysql/).
+ Redis: **Middleware Metrics**: Different middlewares require unique steps and configurations for monitoring:
+ **Configuration**: Configure Redis to allow monitoring data export.
+ **Link**: Refer to the [Redis Monitoring Guide](https://grafana.com/docs/grafana/latest/datasources/redis/). - MySQL:
+ MongoDB: - **Configuration**: Make sure MySQL is set up for performance monitoring.
+ **Configuration**: Set up monitoring metrics for MongoDB. - **Guide**: See the [MySQL Monitoring Configuration Guide](https://grafana.com/docs/grafana/latest/datasources/mysql/).
+ **Link**: Refer to the [MongoDB Monitoring Guide](https://grafana.com/grafana/plugins/grafana-mongodb-datasource/). - Redis:
+ Kafka: - **Configuration**: Adjust Redis settings to enable monitoring data export.
+ **Configuration**: Integrate Kafka with Prometheus monitoring. - **Guide**: Consult the [Redis Monitoring Guide](https://grafana.com/docs/grafana/latest/datasources/redis/).
+ **Link**: Refer to the [Kafka Monitoring Guide](https://grafana.com/grafana/plugins/grafana-kafka-datasource/). - MongoDB:
+ Zookeeper: - **Configuration**: Configure MongoDB for monitoring metrics.
+ **Configuration**: Ensure Zookeeper can be monitored by Prometheus. - **Guide**: Visit the [MongoDB Monitoring Guide](https://grafana.com/grafana/plugins/grafana-mongodb-datasource/).
+ **Link**: Refer to the [Zookeeper Monitoring Configuration](https://grafana.com/docs/grafana/latest/datasources/zookeeper/). - Kafka:
- **Configuration**: Set up Kafka for Prometheus monitoring integration.
- **Guide**: Refer to the [Kafka Monitoring Guide](https://grafana.com/grafana/plugins/grafana-kafka-datasource/).
- Zookeeper:
- **Configuration**: Ensure Prometheus can monitor Zookeeper.
- **Guide**: Check out the [Zookeeper Monitoring Configuration](https://grafana.com/docs/grafana/latest/datasources/zookeeper/).
**Importing Steps**: **Importing Steps**:

@ -0,0 +1,251 @@
# OpenIM Release Automation Design Document
This document outlines the automation process for releasing OpenIM. You can use the `make release` command for automated publishing. We will discuss how to use the `make release` command and Github Actions CICD separately, while also providing insight into the design principles involved.
## Github Actions Automation
In our CICD pipeline, we have implemented logic for automating the release process using the goreleaser tool. To achieve this, follow these steps on your local machine or server:
```bash
git clone https://github.com/openimsdk/open-im-server
cd open-im-server
git tag -a v3.6.0 -s -m "release: xxx"
# For pre-release versions: git tag -a v3.6.0-rc.0 -s -m "pre-release: xxx"
git push origin v3.6.0
```
The remaining tasks are handled by automated processes:
+ Automatically complete the release publication on Github
+ Automatically build the `v3.6.0` version image and push it to aliyun, dockerhub, and github
Through these automated steps, we achieve rapid and efficient OpenIM version releases, simplifying the release process and enhancing productivity.
Certainly, here is the continuation of the document in English:
## Local Make Release Design
There are two primary scenarios for local usage:
+ Advanced compilation and release, manually executed locally
+ Quick compilation verification and version release, manually executed locally
**These two scenarios can also be combined, for example, by tagging locally and then releasing:**
```bash
git add .
git commit -a -s -m "release(v3.6.0): ......"
git tag v3.6.0
git release
git push origin main
```
In a local environment, you can use the `make release` command to complete the release process. The main implementation logic can be found in the `/data/workspaces/open-im-server/scripts/lib/release.sh` file. First, let's explore its usage through the help information.
### Help Information
To view the help information, execute the following command:
```bash
$ ./scripts/release.sh --help
Usage: release.sh [options]
Options:
-h, --help Display this help message
-se, --setup-env Execute environment setup
-vp, --verify-prereqs Execute prerequisite verification
-bc, --build-command Execute build command
-bi, --build-image Execute build image (default is not executed)
-pt, --package-tarballs Execute tarball packaging
-ut, --upload-tarballs Execute tarball upload
-gr, --github-release Execute GitHub release
-gc, --generate-changelog Execute changelog generation
```
### Default Behavior
If no options are provided, all operations are executed by default:
```bash
# If no options are provided, enable all operations by default
if [ "$#" -eq 0 ]; then
perform_setup_env=true
perform_verify_prereqs=true
perform_build_command=true
perform_package_tarballs=true
perform_upload_tarballs=true
perform_github_release=true
perform_generate_changelog=true
# TODO: Defaultly not enable build_image
# perform_build_image=true
fi
```
### Environment Variable Setup
Before starting, you need to set environment variables:
```bash
export TENCENT_SECRET_KEY=OZZ****************************
export TENCENT_SECRET_ID=AKI****************************
```
### Modifying COS Account and Password
If you need to change the COS account, password, and bucket information, please modify the following section in the `/data/workspaces/open-im-server/scripts/lib/release.sh` file:
```bash
readonly BUCKET="openim-1306374445"
readonly REGION="ap-guangzhou"
readonly COS_RELEASE_DIR="openim-release"
```
### GitHub Release Configuration
If you intend to use the GitHub Release feature, you also need to set the environment variable:
```bash
export GITHUB_TOKEN="your_github_token"
```
### Modifying GitHub Release Basic Information
If you need to modify the basic information of GitHub Release, please edit the following section in the `/data/workspaces/open-im-server/scripts/lib/release.sh` file:
```bash
# OpenIM GitHub account information
readonly OPENIM_GITHUB_ORG=openimsdk
readonly OPENIM_GITHUB_REPO=open-im-server
```
This setup allows you to configure and execute the local release process according to your specific needs.
### GitHub Release Versioning Rules
Firstly, it's important to note that GitHub Releases should primarily be for pre-release versions. However, goreleaser might provide a `prerelease: auto` option, which automatically marks versions with pre-release indicators like `-rc1`, `-beta`, etc., as pre-releases.
So, if your most recent tag does not have pre-release indicators such as `-rc1` or `-beta`, even if you use `make release` for pre-release versions, goreleaser might still consider them as formal releases.
To avoid this issue, I have added the `--draft` flag to github-release. This way, all releases are created as drafts.
## CICD Release Documentation Design
The release records still require manual composition for GitHub Release. This is different from github-release.
This approach ensures that all releases are initially created as drafts, allowing you to manually review and edit the release documentation on GitHub. This manual step provides more control and allows you to curate release notes and other information before making them public.
## Makefile Section
This document aims to elaborate and explain key sections of the OpenIM Release automation design, including the Makefile section and functions within the code. Below, we will provide a detailed explanation of the logic and functions of each section.
In the project's root directory, the Makefile imports a subdirectory:
```makefile
include scripts/make-rules/release.mk
```
And defines the `release` target as follows:
```makefile
## release: release the project ✨
.PHONY: release release: release.verify release.ensure-tag
@scripts/release.sh
```
### Importing Subdirectory
At the beginning of the Makefile, the `include scripts/make-rules/release.mk` statement imports the `release.mk` file from the subdirectory. This file contains rules and configurations related to releases to be used in subsequent operations.
### The `release` Target
The Makefile defines a target named `release`, which is used to execute the project's release operation. This target is marked as a phony target (`.PHONY`), meaning it doesn't represent an actual file or directory but serves as an identifier for executing a series of actions.
In the `release` target, two dependency targets are executed first: `release.verify` and `release.ensure-tag`. Afterward, the `scripts/release.sh` script is called to perform the actual release operation.
## Logic of `release.verify` and `release.ensure-tag`
```makefile
## release.verify: Check if a tool is installed and install it
.PHONY: release.verify
release.verify: tools.verify.git-chglog tools.verify.github-release tools.verify.coscmd tools.verify.coscli
## release.ensure-tag: ensure tag
.PHONY: release.ensure-tag
release.ensure-tag: tools.verify.gsemver
@scripts/ensure-tag.sh
```
### `release.verify` Target
The `release.verify` target is used to check and install tools. It depends on four sub-targets: `tools.verify.git-chglog`, `tools.verify.github-release`, `tools.verify.coscmd`, and `tools.verify.coscli`. These sub-targets aim to check if specific tools are installed and attempt to install them if they are not.
The purpose of this target is to ensure that the necessary tools required for the release process are available so that subsequent operations can be executed smoothly.
### `release.ensure-tag` Target
The `release.ensure-tag` target is used to ensure that the project has a version tag. It depends on the sub-target `tools.verify.gsemver`, indicating that it should check if the `gsemver` tool is installed before executing.
When the `release.ensure-tag` target is executed, it calls the `scripts/ensure-tag.sh` script to ensure that the project has a version tag. Version tags are typically used to identify specific versions of the project for management and release in version control systems.
## Logic of `release.sh` Script
```bash
openim::golang::setup_env
openim::build::verify_prereqs
openim::release::verify_prereqs
#openim::build::build_image
openim::build::build_command
openim::release::package_tarballs
openim::release::upload_tarballs
git push origin ${VERSION}
#openim::release::github_release
#openim::release::generate_changelog
```
The `release.sh` script is responsible for executing the actual release operations. Below is the logic of this script:
1. `openim::golang::setup_env`: This function sets up some configurations for the Golang development environment.
2. `openim::build::verify_prereqs`: This function is used to verify whether the prerequisites for building are met. This includes checking dependencies, environment variables, and more.
3. `openim::release::verify_prereqs`: Similar to the previous function, this one is used to verify whether the prerequisites for the release are met. It focuses on conditions relevant to the release.
4. `openim::build::build_command`: This function is responsible for building the project's command, which typically involves compiling the project or performing other build operations.
5. `openim::release::package_tarballs`: This function is used to package tarball files required for the release. These tarballs are usually used for distribution packages during the release.
6. `openim::release::upload_tarballs`: This function is used to upload the packaged tarball files, typically to a distribution platform or repository.
7. `git push origin ${VERSION}`: This line of command pushes the version tag to the remote Git repository's `origin` branch, marking this release in the version control system.
In the comments, you can see that there are some operations that are commented out, such as `openim::build::build_image`, `openim::release::github_release`, and `openim::release::generate_changelog`. These operations are related to building images, releasing to GitHub, and generating changelogs, and they can be enabled in the release process as needed.
Let's take a closer look at the function responsible for packaging the tarball files:
```bash
function openim::release::package_tarballs() {
# Clean out any old releases
rm -rf "${RELEASE_STAGE}" "${RELEASE_TARS}" "${RELEASE_IMAGES}"
mkdir -p "${RELEASE_TARS}"
openim::release::package_src_tarball &
openim::release::package_client_tarballs &
openim::release::package_openim_manifests_tarball &
openim::release::package_server_tarballs &
openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
openim::release::package_final_tarball & # _final depends on some of the previous phases
openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
}
```
The `openim::release::package_tarballs()` function is responsible for packaging the tarball files required for the release. Here is the specific logic of this function:
1. `rm -rf "${RELEASE_STAGE}" "${RELEASE_TARS}" "${RELEASE_IMAGES}"`: First, the function removes any old release directories and files to ensure a clean starting state.
2. `mkdir -p "${RELEASE_TARS}"`: Next, it creates a directory `${RELEASE_TARS}` to store the packaged tarball files. If the directory doesn't exist, it will be created.
3. `openim::release::package_final_tarball &`: This is an asynchronous operation that depends on some of the previous phases. It is likely used to package the final tarball file, which includes the contents of all previous asynchronous operations.
4. `openim::util::wait-for-jobs`: It waits for all asynchronous operations to complete. If any of the previous asynchronous operations fail, an error will be returned.

@ -1,6 +1,7 @@
# OpenIM Branch Management and Versioning: A Blueprint for High-Grade Software Development # OpenIM Branch Management and Versioning: A Blueprint for High-Grade Software Development
[📚 **OpenIM TOC**](#openim-branch-management-and-versioning-a-blueprint-for-high-grade-software-development) [📚 **OpenIM TOC**](#openim-branch-management-and-versioning-a-blueprint-for-high-grade-software-development)
- [OpenIM Branch Management and Versioning: A Blueprint for High-Grade Software Development](#openim-branch-management-and-versioning-a-blueprint-for-high-grade-software-development)
- [Unfolding the Mechanism of OpenIM Version Maintenance](#unfolding-the-mechanism-of-openim-version-maintenance) - [Unfolding the Mechanism of OpenIM Version Maintenance](#unfolding-the-mechanism-of-openim-version-maintenance)
- [Main Branch: The Heart of OpenIM Development](#main-branch-the-heart-of-openim-development) - [Main Branch: The Heart of OpenIM Development](#main-branch-the-heart-of-openim-development)
- [Release Branch: The Beacon of Stability](#release-branch-the-beacon-of-stability) - [Release Branch: The Beacon of Stability](#release-branch-the-beacon-of-stability)
@ -8,8 +9,21 @@
- [Release Management: A Guided Tour](#release-management-a-guided-tour) - [Release Management: A Guided Tour](#release-management-a-guided-tour)
- [Milestones, Branching, and Addressing Major Bugs](#milestones-branching-and-addressing-major-bugs) - [Milestones, Branching, and Addressing Major Bugs](#milestones-branching-and-addressing-major-bugs)
- [Version Skew Policy](#version-skew-policy) - [Version Skew Policy](#version-skew-policy)
- [Supported version skew](#supported-version-skew)
- [OpenIM Versioning, Branching, and Tag Strategy](#openim-versioning-branching-and-tag-strategy)
- [Supported Version Skew](#supported-version-skew-1)
- [openim-api](#openim-api)
- [openim-rpc-\* Components](#openim-rpc--components)
- [Other OpenIM Services](#other-openim-services)
- [Supported Component Upgrade Order](#supported-component-upgrade-order)
- [openim-api](#openim-api-1)
- [openim-rpc-\* Components](#openim-rpc--components-1)
- [Other OpenIM Services](#other-openim-services-1)
- [Conclusion](#conclusion)
- [Applying Principles: A Git Workflow Example](#applying-principles-a-git-workflow-example) - [Applying Principles: A Git Workflow Example](#applying-principles-a-git-workflow-example)
- [Release Process](#release-process)
- [Docker Images Version Management](#docker-images-version-management) - [Docker Images Version Management](#docker-images-version-management)
- [More](#more)
At OpenIM, we acknowledge the profound impact of implementing a robust and efficient version management system, hence we abide by the established standards of [Semantic Versioning 2.0.0](https://semver.org/lang/zh-CN/). At OpenIM, we acknowledge the profound impact of implementing a robust and efficient version management system, hence we abide by the established standards of [Semantic Versioning 2.0.0](https://semver.org/lang/zh-CN/).
@ -213,3 +227,10 @@ Throughout this process, active communication within the team is pivotal to main
## Docker Images Version Management ## Docker Images Version Management
For more details on managing Docker image versions, visit [OpenIM Docker Images Administration](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md). For more details on managing Docker image versions, visit [OpenIM Docker Images Administration](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md).
## More
More on multi-branch version management design and version management design at helm charts
+ https://github.com/openimsdk/open-im-server/issues/1695
+ https://github.com/openimsdk/open-im-server/issues/1662

@ -3,4 +3,6 @@ go.mod
go.sum go.sum
third_party/ third_party/
translations/ translations/
log logs
.git
.golangci.yml

@ -23,7 +23,7 @@ trap 'openim::util::onCtrlC' INT
print_with_delay() { print_with_delay() {
text="$1" text="$1"
delay="$2" delay="$2"
for i in $(seq 0 $((${#text}-1))); do for i in $(seq 0 $((${#text}-1))); do
printf "${text:$i:1}" printf "${text:$i:1}"
sleep $delay sleep $delay
@ -34,7 +34,7 @@ print_with_delay() {
print_progress() { print_progress() {
total="$1" total="$1"
delay="$2" delay="$2"
printf "[" printf "["
for i in $(seq 1 $total); do for i in $(seq 1 $total); do
printf "#" printf "#"
@ -44,14 +44,14 @@ print_progress() {
} }
function openim_logo() { function openim_logo() {
# Set text color to cyan for header and URL # Set text color to cyan for header and URL
echo -e "\033[0;36m" echo -e "\033[0;36m"
# Display fancy ASCII Art logo
# look http://patorjk.com/software/taag/#p=display&h=1&v=1&f=Doh&t=OpenIM
print_with_delay '
# Display fancy ASCII Art logo
# look http://patorjk.com/software/taag/#p=display&h=1&v=1&f=Doh&t=OpenIM
print_with_delay '
OOOOOOOOO IIIIIIIIIIMMMMMMMM MMMMMMMM OOOOOOOOO IIIIIIIIIIMMMMMMMM MMMMMMMM
OO:::::::::OO I::::::::IM:::::::M M:::::::M OO:::::::::OO I::::::::IM:::::::M M:::::::M
OO:::::::::::::OO I::::::::IM::::::::M M::::::::M OO:::::::::::::OO I::::::::IM::::::::M M::::::::M
@ -68,45 +68,45 @@ O:::::::OOO:::::::O p:::::ppppp:::::::pe::::::::e n::::n n::::nII:
OO:::::::::::::OO p::::::::::::::::p e::::::::eeeeeeee n::::n n::::nI::::::::IM::::::M M::::::M OO:::::::::::::OO p::::::::::::::::p e::::::::eeeeeeee n::::n n::::nI::::::::IM::::::M M::::::M
OO:::::::::OO p::::::::::::::pp ee:::::::::::::e n::::n n::::nI::::::::IM::::::M M::::::M OO:::::::::OO p::::::::::::::pp ee:::::::::::::e n::::n n::::nI::::::::IM::::::M M::::::M
OOOOOOOOO p::::::pppppppp eeeeeeeeeeeeee nnnnnn nnnnnnIIIIIIIIIIMMMMMMMM MMMMMMMM OOOOOOOOO p::::::pppppppp eeeeeeeeeeeeee nnnnnn nnnnnnIIIIIIIIIIMMMMMMMM MMMMMMMM
p:::::p p:::::p
p:::::p p:::::p
p:::::::p p:::::::p
p:::::::p p:::::::p
p:::::::p p:::::::p
ppppppppp ppppppppp
' 0.0001 ' 0.0001
# Display product URL # Display product URL
print_with_delay "Discover more and contribute at: https://github.com/openimsdk/open-im-server" 0.01 print_with_delay "Discover more and contribute at: https://github.com/openimsdk/open-im-server" 0.01
# Reset text color back to normal # Reset text color back to normal
echo -e "\033[0m" echo -e "\033[0m"
# Set text color to green for product description # Set text color to green for product description
echo -e "\033[1;32m" echo -e "\033[1;32m"
print_with_delay "Open-IM-Server: Reinventing Instant Messaging" 0.01 print_with_delay "Open-IM-Server: Reinventing Instant Messaging" 0.01
print_progress 50 0.02 print_progress 50 0.02
print_with_delay "Open-IM-Server is not just a product; it's a revolution. It's about bringing the power of seamless," 0.01 print_with_delay "Open-IM-Server is not just a product; it's a revolution. It's about bringing the power of seamless," 0.01
print_with_delay "real-time messaging to your fingertips. And it's about joining a global community of developers, dedicated to pushing the boundaries of what's possible." 0.01 print_with_delay "real-time messaging to your fingertips. And it's about joining a global community of developers, dedicated to pushing the boundaries of what's possible." 0.01
print_progress 50 0.02 print_progress 50 0.02
# Reset text color back to normal # Reset text color back to normal
echo -e "\033[0m" echo -e "\033[0m"
# Set text color to yellow for the Slack link # Set text color to yellow for the Slack link
echo -e "\033[1;33m" echo -e "\033[1;33m"
print_with_delay "Join our developer community on Slack: https://join.slack.com/t/openimsdk/shared_invite/zt-22720d66b-o_FvKxMTGXtcnnnHiMqe9Q" 0.01 print_with_delay "Join our developer community on Slack: https://join.slack.com/t/openimsdk/shared_invite/zt-22720d66b-o_FvKxMTGXtcnnnHiMqe9Q" 0.01
# Reset text color back to normal # Reset text color back to normal
echo -e "\033[0m" echo -e "\033[0m"
} }
function main() { function main() {
openim_logo openim_logo
} }
main "$@" main "$@"

@ -0,0 +1,173 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#**************************************************************************
# Copyright (C) 2011, Paul Lutus *
# *
# This program is free software; you can redistribute it and/or modify *
# it under the terms of the GNU General Public License as published by *
# the Free Software Foundation; either version 2 of the License, or *
# (at your option) any later version. *
# *
# This program is distributed in the hope that it will be useful, *
# but WITHOUT ANY WARRANTY; without even the implied warranty of *
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# GNU General Public License for more details. *
# *
# You should have received a copy of the GNU General Public License *
# along with this program; if not, write to the *
# Free Software Foundation, Inc., *
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
#**************************************************************************
import re
import sys
PVERSION = '1.0'
class BeautifyBash:
def __init__(self):
self.tab_str = ' '
self.tab_size = 2
def read_file(self, fp):
with open(fp) as f:
return f.read()
def write_file(self, fp, data):
with open(fp, 'w') as f:
f.write(data)
def beautify_string(self, data, path=''):
tab = 0
case_stack = []
in_here_doc = False
defer_ext_quote = False
in_ext_quote = False
ext_quote_string = ''
here_string = ''
output = []
line = 1
for record in re.split('\n', data):
record = record.rstrip()
stripped_record = record.strip()
# collapse multiple quotes between ' ... '
test_record = re.sub(r'\'.*?\'', '', stripped_record)
# collapse multiple quotes between " ... "
test_record = re.sub(r'".*?"', '', test_record)
# collapse multiple quotes between ` ... `
test_record = re.sub(r'`.*?`', '', test_record)
# collapse multiple quotes between \` ... ' (weird case)
test_record = re.sub(r'\\`.*?\'', '', test_record)
# strip out any escaped single characters
test_record = re.sub(r'\\.', '', test_record)
# remove '#' comments
test_record = re.sub(r'(\A|\s)(#.*)', '', test_record, 1)
if(not in_here_doc):
if(re.search('<<-?', test_record)):
here_string = re.sub(
'.*<<-?\s*[\'|"]?([_|\w]+)[\'|"]?.*', '\\1', stripped_record, 1)
in_here_doc = (len(here_string) > 0)
if(in_here_doc): # pass on with no changes
output.append(record)
# now test for here-doc termination string
if(re.search(here_string, test_record) and not re.search('<<', test_record)):
in_here_doc = False
else: # not in here doc
if(in_ext_quote):
if(re.search(ext_quote_string, test_record)):
# provide line after quotes
test_record = re.sub(
'.*%s(.*)' % ext_quote_string, '\\1', test_record, 1)
in_ext_quote = False
else: # not in ext quote
if(re.search(r'(\A|\s)(\'|")', test_record)):
# apply only after this line has been processed
defer_ext_quote = True
ext_quote_string = re.sub(
'.*([\'"]).*', '\\1', test_record, 1)
# provide line before quote
test_record = re.sub(
'(.*)%s.*' % ext_quote_string, '\\1', test_record, 1)
if(in_ext_quote):
# pass on unchanged
output.append(record)
else: # not in ext quote
inc = len(re.findall(
'(\s|\A|;)(case|then|do)(;|\Z|\s)', test_record))
inc += len(re.findall('(\{|\(|\[)', test_record))
outc = len(re.findall(
'(\s|\A|;)(esac|fi|done|elif)(;|\)|\||\Z|\s)', test_record))
outc += len(re.findall('(\}|\)|\])', test_record))
if(re.search(r'\besac\b', test_record)):
if(len(case_stack) == 0):
sys.stderr.write(
'File %s: error: "esac" before "case" in line %d.\n' % (
path, line)
)
else:
outc += case_stack.pop()
# sepcial handling for bad syntax within case ... esac
if(len(case_stack) > 0):
if(re.search('\A[^(]*\)', test_record)):
# avoid overcount
outc -= 2
case_stack[-1] += 1
if(re.search(';;', test_record)):
outc += 1
case_stack[-1] -= 1
# an ad-hoc solution for the "else" keyword
else_case = (
0, -1)[re.search('^(else)', test_record) != None]
net = inc - outc
tab += min(net, 0)
extab = tab + else_case
extab = max(0, extab)
output.append(
(self.tab_str * self.tab_size * extab) + stripped_record)
tab += max(net, 0)
if(defer_ext_quote):
in_ext_quote = True
defer_ext_quote = False
if(re.search(r'\bcase\b', test_record)):
case_stack.append(0)
line += 1
error = (tab != 0)
if(error):
sys.stderr.write(
'File %s: error: indent/outdent mismatch: %d.\n' % (path, tab))
return '\n'.join(output), error
def beautify_file(self, path):
error = False
if(path == '-'):
data = sys.stdin.read()
result, error = self.beautify_string(data, '(stdin)')
sys.stdout.write(result)
else: # named file
data = self.read_file(path)
result, error = self.beautify_string(data, path)
if(data != result):
# make a backup copy
self.write_file(path + '~', data)
self.write_file(path, result)
return error
def main(self):
error = False
sys.argv.pop(0)
if(len(sys.argv) < 1):
sys.stderr.write(
'usage: shell script filenames or \"-\" for stdin.\n')
else:
for path in sys.argv:
error |= self.beautify_file(path)
sys.exit((0, 1)[error])
# if not called as a module
if(__name__ == '__main__'):
BeautifyBash().main()

@ -30,8 +30,8 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${OPENIM_ROOT}/scripts/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
# CPU core number # CPU core number
pushd ""${OPENIM_ROOT}"/tools/ncpu" >/dev/null pushd "${OPENIM_ROOT}/tools/ncpu" >/dev/null
cpu_count=$(go run .) cpu_count=$(go run .)
popd >/dev/null popd >/dev/null
openim::color::echo ${GREEN_PREFIX} "======> cpu_count=$cpu_count" openim::color::echo ${GREEN_PREFIX} "======> cpu_count=$cpu_count"
@ -42,7 +42,7 @@ compile_count=$((cpu_count / 2))
# For help output # For help output
ARGHELP="" ARGHELP=""
if [[ "$#" -gt 0 ]]; then if [[ "$#" -gt 0 ]]; then
ARGHELP="'$*'" ARGHELP="'$*'"
fi fi
openim::color::echo $COLOR_CYAN "NOTE: $0 has been replaced by 'make multiarch' or 'make build'" openim::color::echo $COLOR_CYAN "NOTE: $0 has been replaced by 'make multiarch' or 'make build'"
@ -61,15 +61,15 @@ echo " ./scripts/build-all-service.sh BINS=openim-api V=1 DEBUG=1"
echo echo
if [ -z "$*" ]; then if [ -z "$*" ]; then
openim::log::info "no args, build all service" openim::log::info "no args, build all service"
make --no-print-directory -C "${OPENIM_ROOT}" -j$compile_count build make --no-print-directory -C "${OPENIM_ROOT}" -j$compile_count build
else else
openim::log::info "build service: $*" openim::log::info "build service: $*"
make --no-print-directory -C "${OPENIM_ROOT}" -j$compile_count build "$*" make --no-print-directory -C "${OPENIM_ROOT}" -j$compile_count build "$*"
fi fi
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
openim::log::success "all service build success, run 'make start' or './scripts/start-all.sh'" openim::log::success "all service build success, run 'make start' or './scripts/start-all.sh'"
else else
openim::log::error "make build Error, script exits" openim::log::error "make build Error, script exits"
fi fi

@ -14,10 +14,10 @@
# limitations under the License. # limitations under the License.
# This script is check openim service is running normally # This script is check openim service is running normally
# #
# Usage: `scripts/check-all.sh`. # Usage: `scripts/check-all.sh`.
# Encapsulated as: `make check`. # Encapsulated as: `make check`.
# READ: https://github.com/openimsdk/open-im-server/tree/main/scripts/install/environment.sh # READ: https://github.com/openimsdk/open-im-server/tree/main/scripts/install/environment.sh
set -o errexit set -o errexit
set -o nounset set -o nounset
@ -34,19 +34,19 @@ openim::log::status "Check all dependent service ports"
# Elegant printing function # Elegant printing function
# Elegant printing function # Elegant printing function
print_services_and_ports() { print_services_and_ports() {
local service_names=("$@") local service_names=("$@")
local half_length=$((${#service_names[@]} / 2)) local half_length=$((${#service_names[@]} / 2))
local service_ports=("${service_names[@]:half_length}") local service_ports=("${service_names[@]:half_length}")
echo "+-------------------------+----------+" echo "+-------------------------+----------+"
echo "| Service Name | Port |" echo "| Service Name | Port |"
echo "+-------------------------+----------+" echo "+-------------------------+----------+"
for ((index=0; index < half_length; index++)); do for ((index=0; index < half_length; index++)); do
printf "| %-23s | %-8s |\n" "${service_names[$index]}" "${service_ports[$index]}" printf "| %-23s | %-8s |\n" "${service_names[$index]}" "${service_ports[$index]}"
done done
echo "+-------------------------+----------+" echo "+-------------------------+----------+"
} }
# Assuming OPENIM_SERVER_NAME_TARGETS and OPENIM_SERVER_PORT_TARGETS are defined # Assuming OPENIM_SERVER_NAME_TARGETS and OPENIM_SERVER_PORT_TARGETS are defined
@ -67,10 +67,10 @@ set +e
# Later, after discarding Docker, the Docker keyword is unreliable, and Kubepods is used # Later, after discarding Docker, the Docker keyword is unreliable, and Kubepods is used
if grep -qE 'docker|kubepods' /proc/1/cgroup || [ -f /.dockerenv ]; then if grep -qE 'docker|kubepods' /proc/1/cgroup || [ -f /.dockerenv ]; then
openim::color::echo ${COLOR_CYAN} "Environment in the interior of the container" openim::color::echo ${COLOR_CYAN} "Environment in the interior of the container"
else else
openim::color::echo ${COLOR_CYAN} "The environment is outside the container" openim::color::echo ${COLOR_CYAN} "The environment is outside the container"
openim::util::check_ports ${OPENIM_DEPENDENCY_PORT_LISTARIES[@]} || return 0 openim::util::check_ports ${OPENIM_DEPENDENCY_PORT_LISTARIES[@]} || return 0
fi fi
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then

@ -118,7 +118,7 @@ function return_to_kansas {
openim::log::status "Aborting in-progress git am." openim::log::status "Aborting in-progress git am."
git am --abort >/dev/null 2>&1 || true git am --abort >/dev/null 2>&1 || true
fi fi
# return to the starting branch and delete the PR text file # return to the starting branch and delete the PR text file
if [[ -z "${DRY_RUN}" ]]; then if [[ -z "${DRY_RUN}" ]]; then
echo echo
@ -137,7 +137,7 @@ function make-a-pr() {
rel="$(basename "${BRANCH}")" rel="$(basename "${BRANCH}")"
echo echo
openim::log::status "Creating a pull request on GitHub at ${GITHUB_USER}:${NEWBRANCH}" openim::log::status "Creating a pull request on GitHub at ${GITHUB_USER}:${NEWBRANCH}"
local numandtitle local numandtitle
numandtitle=$(printf '%s\n' "${SUBJECTS[@]}") numandtitle=$(printf '%s\n' "${SUBJECTS[@]}")
prtext=$(cat <<EOF prtext=$(cat <<EOF
@ -153,7 +153,7 @@ For details on the cherry pick process, see the [cherry pick requests](https://g
EOF EOF
) )
gh pr create --title="Automated cherry pick of ${numandtitle}" --body="${prtext}" --head "${GITHUB_USER}:${NEWBRANCH}" --base "${rel}" --repo="${MAIN_REPO_ORG}/${MAIN_REPO_NAME}" gh pr create --title="Automated cherry pick of ${numandtitle}" --body="${prtext}" --head "${GITHUB_USER}:${NEWBRANCH}" --base "${rel}" --repo="${MAIN_REPO_ORG}/${MAIN_REPO_NAME}"
} }
git checkout -b "${NEWBRANCHUNIQ}" "${BRANCH}" git checkout -b "${NEWBRANCHUNIQ}" "${BRANCH}"
@ -161,84 +161,84 @@ cleanbranch="${NEWBRANCHUNIQ}"
gitamcleanup=true gitamcleanup=true
for pull in "${PULLS[@]}"; do for pull in "${PULLS[@]}"; do
openim::log::status "Downloading patch to /tmp/${pull}.patch (in case you need to do this again)" openim::log::status "Downloading patch to /tmp/${pull}.patch (in case you need to do this again)"
curl -o "/tmp/${pull}.patch" -sSL "https://github.com/${MAIN_REPO_ORG}/${MAIN_REPO_NAME}/pull/${pull}.patch" curl -o "/tmp/${pull}.patch" -sSL "https://github.com/${MAIN_REPO_ORG}/${MAIN_REPO_NAME}/pull/${pull}.patch"
echo echo
openim::log::status "About to attempt cherry pick of PR. To reattempt:" openim::log::status "About to attempt cherry pick of PR. To reattempt:"
echo " $ git am -3 /tmp/${pull}.patch" echo " $ git am -3 /tmp/${pull}.patch"
echo echo
git am -3 "/tmp/${pull}.patch" || { git am -3 "/tmp/${pull}.patch" || {
conflicts=false conflicts=false
while unmerged=$(git status --porcelain | grep ^U) && [[ -n ${unmerged} ]] \ while unmerged=$(git status --porcelain | grep ^U) && [[ -n ${unmerged} ]] \
|| [[ -e "${REBASEMAGIC}" ]]; do || [[ -e "${REBASEMAGIC}" ]]; do
conflicts=true # <-- We should have detected conflicts once conflicts=true # <-- We should have detected conflicts once
echo echo
openim::log::status "Conflicts detected:" openim::log::status "Conflicts detected:"
echo echo
(git status --porcelain | grep ^U) || echo "!!! None. Did you git am --continue?" (git status --porcelain | grep ^U) || echo "!!! None. Did you git am --continue?"
echo echo
openim::log::status "Please resolve the conflicts in another window (and remember to 'git add / git am --continue')" openim::log::status "Please resolve the conflicts in another window (and remember to 'git add / git am --continue')"
read -p "+++ Proceed (anything other than 'y' aborts the cherry-pick)? [y/n] " -r read -p "+++ Proceed (anything other than 'y' aborts the cherry-pick)? [y/n] " -r
echo echo
if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then
echo "Aborting." >&2 echo "Aborting." >&2
exit 1
fi
done
if [[ "${conflicts}" != "true" ]]; then
echo "!!! git am failed, likely because of an in-progress 'git am' or 'git rebase'"
exit 1 exit 1
fi fi
} done
if [[ "${conflicts}" != "true" ]]; then
echo "!!! git am failed, likely because of an in-progress 'git am' or 'git rebase'"
exit 1
fi
}
# set the subject # set the subject
subject=$(grep -m 1 "^Subject" "/tmp/${pull}.patch" | sed -e 's/Subject: \[PATCH//g' | sed 's/.*] //') subject=$(grep -m 1 "^Subject" "/tmp/${pull}.patch" | sed -e 's/Subject: \[PATCH//g' | sed 's/.*] //')
SUBJECTS+=("#${pull}: ${subject}") SUBJECTS+=("#${pull}: ${subject}")
# remove the patch file from /tmp # remove the patch file from /tmp
rm -f "/tmp/${pull}.patch" rm -f "/tmp/${pull}.patch"
done done
gitamcleanup=false gitamcleanup=false
# Re-generate docs (if needed) # Re-generate docs (if needed)
if [[ -n "${REGENERATE_DOCS}" ]]; then if [[ -n "${REGENERATE_DOCS}" ]]; then
echo
echo "Regenerating docs..."
if ! scripts/generate-docs.sh; then
echo echo
echo "Regenerating docs..." echo "scripts/gendoc.sh FAILED to complete."
if ! scripts/generate-docs.sh; then exit 1
echo fi
echo "scripts/gendoc.sh FAILED to complete."
exit 1
fi
fi fi
if [[ -n "${DRY_RUN}" ]]; then if [[ -n "${DRY_RUN}" ]]; then
openim::log::error "!!! Skipping git push and PR creation because you set DRY_RUN." openim::log::error "!!! Skipping git push and PR creation because you set DRY_RUN."
echo "To return to the branch you were in when you invoked this script:" echo "To return to the branch you were in when you invoked this script:"
echo echo
echo " git checkout ${STARTINGBRANCH}" echo " git checkout ${STARTINGBRANCH}"
echo echo
echo "To delete this branch:" echo "To delete this branch:"
echo echo
echo " git branch -D ${NEWBRANCHUNIQ}" echo " git branch -D ${NEWBRANCHUNIQ}"
exit 0 exit 0
fi fi
if git remote -v | grep ^"${FORK_REMOTE}" | grep "${MAIN_REPO_ORG}/${MAIN_REPO_NAME}.git"; then if git remote -v | grep ^"${FORK_REMOTE}" | grep "${MAIN_REPO_ORG}/${MAIN_REPO_NAME}.git"; then
echo "!!! You have ${FORK_REMOTE} configured as your ${MAIN_REPO_ORG}/${MAIN_REPO_NAME}.git" echo "!!! You have ${FORK_REMOTE} configured as your ${MAIN_REPO_ORG}/${MAIN_REPO_NAME}.git"
echo "This isn't normal. Leaving you with push instructions:" echo "This isn't normal. Leaving you with push instructions:"
echo echo
openim::log::status "First manually push the branch this script created:" openim::log::status "First manually push the branch this script created:"
echo echo
echo " git push REMOTE ${NEWBRANCHUNIQ}:${NEWBRANCH}" echo " git push REMOTE ${NEWBRANCHUNIQ}:${NEWBRANCH}"
echo echo
echo "where REMOTE is your personal fork (maybe ${UPSTREAM_REMOTE}? Consider swapping those.)." echo "where REMOTE is your personal fork (maybe ${UPSTREAM_REMOTE}? Consider swapping those.)."
echo "OR consider setting UPSTREAM_REMOTE and FORK_REMOTE to different values." echo "OR consider setting UPSTREAM_REMOTE and FORK_REMOTE to different values."
echo echo
make-a-pr make-a-pr
cleanbranch="" cleanbranch=""
exit 0 exit 0
fi fi
echo echo
@ -248,8 +248,8 @@ echo " git push ${FORK_REMOTE} ${NEWBRANCHUNIQ}:${NEWBRANCH}"
echo echo
read -p "+++ Proceed (anything other than 'y' aborts the cherry-pick)? [y/n] " -r read -p "+++ Proceed (anything other than 'y' aborts the cherry-pick)? [y/n] " -r
if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then
echo "Aborting." >&2 echo "Aborting." >&2
exit 1 exit 1
fi fi
git push "${FORK_REMOTE}" -f "${NEWBRANCHUNIQ}:${NEWBRANCH}" git push "${FORK_REMOTE}" -f "${NEWBRANCHUNIQ}:${NEWBRANCH}"

@ -42,7 +42,7 @@ OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd -P)
# Constants # Constants
readonly OPENIM_BUILD_IMAGE_REPO=openim-build readonly OPENIM_BUILD_IMAGE_REPO=openim-build
#readonly OPENIM_BUILD_IMAGE_CROSS_TAG="$(cat ""${OPENIM_ROOT}"/build/build-image/cross/VERSION")" #readonly OPENIM_BUILD_IMAGE_CROSS_TAG="$(cat "${OPENIM_ROOT}/build/build-image/cross/VERSION")"
readonly OPENIM_DOCKER_REGISTRY="${OPENIM_DOCKER_REGISTRY:-k8s.gcr.io}" readonly OPENIM_DOCKER_REGISTRY="${OPENIM_DOCKER_REGISTRY:-k8s.gcr.io}"
readonly OPENIM_BASE_IMAGE_REGISTRY="${OPENIM_BASE_IMAGE_REGISTRY:-us.gcr.io/k8s-artifacts-prod/build-image}" readonly OPENIM_BASE_IMAGE_REGISTRY="${OPENIM_BASE_IMAGE_REGISTRY:-us.gcr.io/k8s-artifacts-prod/build-image}"
@ -53,7 +53,7 @@ readonly OPENIM_BASE_IMAGE_REGISTRY="${OPENIM_BASE_IMAGE_REGISTRY:-us.gcr.io/k8s
# #
# Increment/change this number if you change the build image (anything under # Increment/change this number if you change the build image (anything under
# build/build-image) or change the set of volumes in the data container. # build/build-image) or change the set of volumes in the data container.
#readonly OPENIM_BUILD_IMAGE_VERSION_BASE="$(cat ""${OPENIM_ROOT}"/build/build-image/VERSION")" #readonly OPENIM_BUILD_IMAGE_VERSION_BASE="$(cat "${OPENIM_ROOT}/build/build-image/VERSION")"
#readonly OPENIM_BUILD_IMAGE_VERSION="${OPENIM_BUILD_IMAGE_VERSION_BASE}-${OPENIM_BUILD_IMAGE_CROSS_TAG}" #readonly OPENIM_BUILD_IMAGE_VERSION="${OPENIM_BUILD_IMAGE_VERSION_BASE}-${OPENIM_BUILD_IMAGE_CROSS_TAG}"
# Here we map the output directories across both the local and remote _output # Here we map the output directories across both the local and remote _output
@ -66,9 +66,10 @@ readonly OPENIM_BASE_IMAGE_REGISTRY="${OPENIM_BASE_IMAGE_REGISTRY:-us.gcr.io/k8s
# is really remote, this is the stuff that has to be copied # is really remote, this is the stuff that has to be copied
# back. # back.
# OUT_DIR can come in from the Makefile, so honor it. # OUT_DIR can come in from the Makefile, so honor it.
readonly LOCAL_OUTPUT_ROOT=""${OPENIM_ROOT}"/${OUT_DIR:-_output}" readonly LOCAL_OUTPUT_ROOT="${OPENIM_ROOT}/${OUT_DIR:-_output}"
readonly LOCAL_OUTPUT_SUBPATH="${LOCAL_OUTPUT_ROOT}/platforms" readonly LOCAL_OUTPUT_SUBPATH="${LOCAL_OUTPUT_ROOT}/bin"
readonly LOCAL_OUTPUT_BINPATH="${LOCAL_OUTPUT_SUBPATH}" readonly LOCAL_OUTPUT_BINPATH="${LOCAL_OUTPUT_SUBPATH}/platforms"
readonly LOCAL_OUTPUT_BINTOOLSPATH="${LOCAL_OUTPUT_SUBPATH}/tools"
readonly LOCAL_OUTPUT_GOPATH="${LOCAL_OUTPUT_SUBPATH}/go" readonly LOCAL_OUTPUT_GOPATH="${LOCAL_OUTPUT_SUBPATH}/go"
readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images" readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images"
@ -86,28 +87,28 @@ readonly OPENIM_CONTAINER_RSYNC_PORT=8730
# #
# $1 - server architecture # $1 - server architecture
openim::build::get_docker_wrapped_binaries() { openim::build::get_docker_wrapped_binaries() {
local arch=$1 local arch=$1
local debian_base_version=v2.1.0 local debian_base_version=v2.1.0
local debian_iptables_version=v12.1.0 local debian_iptables_version=v12.1.0
### If you change any of these lists, please also update DOCKERIZED_BINARIES ### If you change any of these lists, please also update DOCKERIZED_BINARIES
### in build/BUILD. And openim::golang::server_image_targets ### in build/BUILD. And openim::golang::server_image_targets
local targets=( local targets=(
"openim-api,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-api,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-cmdutils,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-cmdutils,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-crontask,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-crontask,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-msggateway,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-msggateway,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-msgtransfer,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-msgtransfer,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-push,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-push,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-auth,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-auth,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-conversation,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-conversation,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-friend,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-friend,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-group,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-group,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-msg,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-msg,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-third,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-third,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
"openim-rpc-user,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}" "openim-rpc-user,${OPENIM_BASE_IMAGE_REGISTRY}/debian-base-${arch}:${debian_base_version}"
) )
echo "${targets[@]}" echo "${targets[@]}"
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -132,170 +133,170 @@ openim::build::get_docker_wrapped_binaries() {
# DOCKER_MOUNT_ARGS # DOCKER_MOUNT_ARGS
# LOCAL_OUTPUT_BUILD_CONTEXT # LOCAL_OUTPUT_BUILD_CONTEXT
function openim::build::verify_prereqs() { function openim::build::verify_prereqs() {
local -r require_docker=${1:-true} local -r require_docker=${1:-true}
openim::log::status "Verifying Prerequisites...." openim::log::status "Verifying Prerequisites...."
openim::build::ensure_tar || return 1 openim::build::ensure_tar || return 1
openim::build::ensure_rsync || return 1 openim::build::ensure_rsync || return 1
if ${require_docker}; then if ${require_docker}; then
openim::build::ensure_docker_in_path || return 1 openim::build::ensure_docker_in_path || return 1
openim::util::ensure_docker_daemon_connectivity || return 1 openim::util::ensure_docker_daemon_connectivity || return 1
if (( OPENIM_VERBOSE > 6 )); then if (( OPENIM_VERBOSE > 6 )); then
openim::log::status "Docker Version:" openim::log::status "Docker Version:"
"${DOCKER[@]}" version | openim::log::info_from_stdin "${DOCKER[@]}" version | openim::log::info_from_stdin
fi
fi fi
fi
OPENIM_GIT_BRANCH=$(git symbolic-ref --short -q HEAD 2>/dev/null || true)
OPENIM_ROOT_HASH=$(openim::build::short_hash "${HOSTNAME:-}:"${OPENIM_ROOT}":${OPENIM_GIT_BRANCH}") OPENIM_GIT_BRANCH=$(git symbolic-ref --short -q HEAD 2>/dev/null || true)
OPENIM_BUILD_IMAGE_TAG_BASE="build-${OPENIM_ROOT_HASH}" OPENIM_ROOT_HASH=$(openim::build::short_hash "${HOSTNAME:-}:${OPENIM_ROOT}:${OPENIM_GIT_BRANCH}")
#OPENIM_BUILD_IMAGE_TAG="${OPENIM_BUILD_IMAGE_TAG_BASE}-${OPENIM_BUILD_IMAGE_VERSION}" OPENIM_BUILD_IMAGE_TAG_BASE="build-${OPENIM_ROOT_HASH}"
#OPENIM_BUILD_IMAGE="${OPENIM_BUILD_IMAGE_REPO}:${OPENIM_BUILD_IMAGE_TAG}" #OPENIM_BUILD_IMAGE_TAG="${OPENIM_BUILD_IMAGE_TAG_BASE}-${OPENIM_BUILD_IMAGE_VERSION}"
OPENIM_BUILD_CONTAINER_NAME_BASE="openim-build-${OPENIM_ROOT_HASH}" #OPENIM_BUILD_IMAGE="${OPENIM_BUILD_IMAGE_REPO}:${OPENIM_BUILD_IMAGE_TAG}"
#OPENIM_BUILD_CONTAINER_NAME="${OPENIM_BUILD_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}" OPENIM_BUILD_CONTAINER_NAME_BASE="openim-build-${OPENIM_ROOT_HASH}"
OPENIM_RSYNC_CONTAINER_NAME_BASE="openim-rsync-${OPENIM_ROOT_HASH}" #OPENIM_BUILD_CONTAINER_NAME="${OPENIM_BUILD_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}"
#OPENIM_RSYNC_CONTAINER_NAME="${OPENIM_RSYNC_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}" OPENIM_RSYNC_CONTAINER_NAME_BASE="openim-rsync-${OPENIM_ROOT_HASH}"
OPENIM_DATA_CONTAINER_NAME_BASE="openim-build-data-${OPENIM_ROOT_HASH}" #OPENIM_RSYNC_CONTAINER_NAME="${OPENIM_RSYNC_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}"
#OPENIM_DATA_CONTAINER_NAME="${OPENIM_DATA_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}" OPENIM_DATA_CONTAINER_NAME_BASE="openim-build-data-${OPENIM_ROOT_HASH}"
#DOCKER_MOUNT_ARGS=(--volumes-from "${OPENIM_DATA_CONTAINER_NAME}") #OPENIM_DATA_CONTAINER_NAME="${OPENIM_DATA_CONTAINER_NAME_BASE}-${OPENIM_BUILD_IMAGE_VERSION}"
#LOCAL_OUTPUT_BUILD_CONTEXT="${LOCAL_OUTPUT_IMAGE_STAGING}/${OPENIM_BUILD_IMAGE}" #DOCKER_MOUNT_ARGS=(--volumes-from "${OPENIM_DATA_CONTAINER_NAME}")
#LOCAL_OUTPUT_BUILD_CONTEXT="${LOCAL_OUTPUT_IMAGE_STAGING}/${OPENIM_BUILD_IMAGE}"
openim::version::get_version_vars
#openim::version::save_version_vars ""${OPENIM_ROOT}"/.dockerized-openim-version-defs" openim::version::get_version_vars
#openim::version::save_version_vars "${OPENIM_ROOT}/.dockerized-openim-version-defs"
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Utility functions # Utility functions
function openim::build::docker_available_on_osx() { function openim::build::docker_available_on_osx() {
if [[ -z "${DOCKER_HOST}" ]]; then if [[ -z "${DOCKER_HOST}" ]]; then
if [[ -S "/var/run/docker.sock" ]]; then if [[ -S "/var/run/docker.sock" ]]; then
openim::log::status "Using Docker for MacOS" openim::log::status "Using Docker for MacOS"
return 0 return 0
fi fi
openim::log::status "No docker host is set. Checking options for setting one..." openim::log::status "No docker host is set. Checking options for setting one..."
if [[ -z "$(which docker-machine)" ]]; then if [[ -z "$(which docker-machine)" ]]; then
openim::log::status "It looks like you're running Mac OS X, yet neither Docker for Mac nor docker-machine can be found." openim::log::status "It looks like you're running Mac OS X, yet neither Docker for Mac nor docker-machine can be found."
openim::log::status "See: https://docs.docker.com/engine/installation/mac/ for installation instructions." openim::log::status "See: https://docs.docker.com/engine/installation/mac/ for installation instructions."
return 1 return 1
elif [[ -n "$(which docker-machine)" ]]; then elif [[ -n "$(which docker-machine)" ]]; then
openim::build::prepare_docker_machine openim::build::prepare_docker_machine
fi
fi fi
fi
} }
function openim::build::prepare_docker_machine() { function openim::build::prepare_docker_machine() {
openim::log::status "docker-machine was found." openim::log::status "docker-machine was found."
local available_memory_bytes local available_memory_bytes
available_memory_bytes=$(sysctl -n hw.memsize 2>/dev/null) available_memory_bytes=$(sysctl -n hw.memsize 2>/dev/null)
local bytes_in_mb=1048576 local bytes_in_mb=1048576
# Give virtualbox 1/2 the system memory. Its necessary to divide by 2, instead # Give virtualbox 1/2 the system memory. Its necessary to divide by 2, instead
# of multiple by .5, because bash can only multiply by ints. # of multiple by .5, because bash can only multiply by ints.
local memory_divisor=2 local memory_divisor=2
local virtualbox_memory_mb=$(( available_memory_bytes / (bytes_in_mb * memory_divisor) )) local virtualbox_memory_mb=$(( available_memory_bytes / (bytes_in_mb * memory_divisor) ))
docker-machine inspect "${DOCKER_MACHINE_NAME}" &> /dev/null || { docker-machine inspect "${DOCKER_MACHINE_NAME}" &> /dev/null || {
openim::log::status "Creating a machine to build OPENIM" openim::log::status "Creating a machine to build OPENIM"
docker-machine create --driver "${DOCKER_MACHINE_DRIVER}" \ docker-machine create --driver "${DOCKER_MACHINE_DRIVER}" \
--virtualbox-memory "${virtualbox_memory_mb}" \ --virtualbox-memory "${virtualbox_memory_mb}" \
--engine-env HTTP_PROXY="${OPENIMRNETES_HTTP_PROXY:-}" \ --engine-env HTTP_PROXY="${OPENIMRNETES_HTTP_PROXY:-}" \
--engine-env HTTPS_PROXY="${OPENIMRNETES_HTTPS_PROXY:-}" \ --engine-env HTTPS_PROXY="${OPENIMRNETES_HTTPS_PROXY:-}" \
--engine-env NO_PROXY="${OPENIMRNETES_NO_PROXY:-127.0.0.1}" \ --engine-env NO_PROXY="${OPENIMRNETES_NO_PROXY:-127.0.0.1}" \
"${DOCKER_MACHINE_NAME}" > /dev/null || { "${DOCKER_MACHINE_NAME}" > /dev/null || {
openim::log::error "Something went wrong creating a machine." openim::log::error "Something went wrong creating a machine."
openim::log::error "Try the following: " openim::log::error "Try the following: "
openim::log::error "docker-machine create -d ${DOCKER_MACHINE_DRIVER} --virtualbox-memory ${virtualbox_memory_mb} ${DOCKER_MACHINE_NAME}" openim::log::error "docker-machine create -d ${DOCKER_MACHINE_DRIVER} --virtualbox-memory ${virtualbox_memory_mb} ${DOCKER_MACHINE_NAME}"
return 1 return 1
}
} }
docker-machine start "${DOCKER_MACHINE_NAME}" &> /dev/null }
# it takes `docker-machine env` a few seconds to work if the machine was just started docker-machine start "${DOCKER_MACHINE_NAME}" &> /dev/null
local docker_machine_out # it takes `docker-machine env` a few seconds to work if the machine was just started
while ! docker_machine_out=$(docker-machine env "${DOCKER_MACHINE_NAME}" 2>&1); do local docker_machine_out
if [[ ${docker_machine_out} =~ "Error checking TLS connection" ]]; then while ! docker_machine_out=$(docker-machine env "${DOCKER_MACHINE_NAME}" 2>&1); do
echo "${docker_machine_out}" if [[ ${docker_machine_out} =~ "Error checking TLS connection" ]]; then
docker-machine regenerate-certs "${DOCKER_MACHINE_NAME}" echo "${docker_machine_out}"
else docker-machine regenerate-certs "${DOCKER_MACHINE_NAME}"
sleep 1 else
fi sleep 1
done fi
eval "$(docker-machine env "${DOCKER_MACHINE_NAME}")" done
openim::log::status "A Docker host using docker-machine named '${DOCKER_MACHINE_NAME}' is ready to go!" eval "$(docker-machine env "${DOCKER_MACHINE_NAME}")"
return 0 openim::log::status "A Docker host using docker-machine named '${DOCKER_MACHINE_NAME}' is ready to go!"
return 0
} }
function openim::build::is_gnu_sed() { function openim::build::is_gnu_sed() {
[[ $(sed --version 2>&1) == *GNU* ]] [[ $(sed --version 2>&1) == *GNU* ]]
} }
function openim::build::ensure_rsync() { function openim::build::ensure_rsync() {
if [[ -z "$(which rsync)" ]]; then if [[ -z "$(which rsync)" ]]; then
openim::log::error "Can't find 'rsync' in PATH, please fix and retry." openim::log::error "Can't find 'rsync' in PATH, please fix and retry."
return 1 return 1
fi fi
} }
function openim::build::update_dockerfile() { function openim::build::update_dockerfile() {
if openim::build::is_gnu_sed; then if openim::build::is_gnu_sed; then
sed_opts=(-i) sed_opts=(-i)
else else
sed_opts=(-i '') sed_opts=(-i '')
fi fi
sed "${sed_opts[@]}" "s/OPENIM_BUILD_IMAGE_CROSS_TAG/${OPENIM_BUILD_IMAGE_CROSS_TAG}/" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" sed "${sed_opts[@]}" "s/OPENIM_BUILD_IMAGE_CROSS_TAG/${OPENIM_BUILD_IMAGE_CROSS_TAG}/" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
} }
function openim::build::set_proxy() { function openim::build::set_proxy() {
if [[ -n "${OPENIMRNETES_HTTPS_PROXY:-}" ]]; then if [[ -n "${OPENIMRNETES_HTTPS_PROXY:-}" ]]; then
echo "ENV https_proxy $OPENIMRNETES_HTTPS_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" echo "ENV https_proxy $OPENIMRNETES_HTTPS_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
fi fi
if [[ -n "${OPENIMRNETES_HTTP_PROXY:-}" ]]; then if [[ -n "${OPENIMRNETES_HTTP_PROXY:-}" ]]; then
echo "ENV http_proxy $OPENIMRNETES_HTTP_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" echo "ENV http_proxy $OPENIMRNETES_HTTP_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
fi fi
if [[ -n "${OPENIMRNETES_NO_PROXY:-}" ]]; then if [[ -n "${OPENIMRNETES_NO_PROXY:-}" ]]; then
echo "ENV no_proxy $OPENIMRNETES_NO_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" echo "ENV no_proxy $OPENIMRNETES_NO_PROXY" >> "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
fi fi
} }
function openim::build::ensure_docker_in_path() { function openim::build::ensure_docker_in_path() {
if [[ -z "$(which docker)" ]]; then if [[ -z "$(which docker)" ]]; then
openim::log::error "Can't find 'docker' in PATH, please fix and retry." openim::log::error "Can't find 'docker' in PATH, please fix and retry."
openim::log::error "See https://docs.docker.com/installation/#installation for installation instructions." openim::log::error "See https://docs.docker.com/installation/#installation for installation instructions."
return 1 return 1
fi fi
} }
function openim::build::ensure_tar() { function openim::build::ensure_tar() {
if [[ -n "${TAR:-}" ]]; then if [[ -n "${TAR:-}" ]]; then
return return
fi fi
# Find gnu tar if it is available, bomb out if not. # Find gnu tar if it is available, bomb out if not.
TAR=tar TAR=tar
if which gtar &>/dev/null; then if which gtar &>/dev/null; then
TAR=gtar TAR=gtar
else else
if which gnutar &>/dev/null; then if which gnutar &>/dev/null; then
TAR=gnutar TAR=gnutar
fi
fi
if ! "${TAR}" --version | grep -q GNU; then
echo " !!! Cannot find GNU tar. Build on Linux or install GNU tar"
echo " on Mac OS X (brew install gnu-tar)."
return 1
fi fi
fi
if ! "${TAR}" --version | grep -q GNU; then
echo " !!! Cannot find GNU tar. Build on Linux or install GNU tar"
echo " on Mac OS X (brew install gnu-tar)."
return 1
fi
} }
function openim::build::has_docker() { function openim::build::has_docker() {
which docker &> /dev/null which docker &> /dev/null
} }
function openim::build::has_ip() { function openim::build::has_ip() {
which ip &> /dev/null && ip -Version | grep 'iproute2' &> /dev/null which ip &> /dev/null && ip -Version | grep 'iproute2' &> /dev/null
} }
# Detect if a specific image exists # Detect if a specific image exists
@ -303,12 +304,12 @@ function openim::build::has_ip() {
# $1 - image repo name # $1 - image repo name
# $2 - image tag # $2 - image tag
function openim::build::docker_image_exists() { function openim::build::docker_image_exists() {
[[ -n $1 && -n $2 ]] || { [[ -n $1 && -n $2 ]] || {
openim::log::error "Internal error. Image not specified in docker_image_exists." openim::log::error "Internal error. Image not specified in docker_image_exists."
exit 2 exit 2
} }
[[ $("${DOCKER[@]}" images -q "${1}:${2}") ]] [[ $("${DOCKER[@]}" images -q "${1}:${2}") ]]
} }
# Delete all images that match a tag prefix except for the "current" version # Delete all images that match a tag prefix except for the "current" version
@ -317,21 +318,21 @@ function openim::build::docker_image_exists() {
# $2: The tag base. We consider any image that matches $2* # $2: The tag base. We consider any image that matches $2*
# $3: The current image not to delete if provided # $3: The current image not to delete if provided
function openim::build::docker_delete_old_images() { function openim::build::docker_delete_old_images() {
# In Docker 1.12, we can replace this with # In Docker 1.12, we can replace this with
# docker images "$1" --format "{{.Tag}}" # docker images "$1" --format "{{.Tag}}"
for tag in $("${DOCKER[@]}" images "${1}" | tail -n +2 | awk '{print $2}') ; do for tag in $("${DOCKER[@]}" images "${1}" | tail -n +2 | awk '{print $2}') ; do
if [[ "${tag}" != "${2}"* ]] ; then if [[ "${tag}" != "${2}"* ]] ; then
V=3 openim::log::status "Keeping image ${1}:${tag}" V=3 openim::log::status "Keeping image ${1}:${tag}"
continue continue
fi fi
if [[ -z "${3:-}" || "${tag}" != "${3}" ]] ; then if [[ -z "${3:-}" || "${tag}" != "${3}" ]] ; then
V=2 openim::log::status "Deleting image ${1}:${tag}" V=2 openim::log::status "Deleting image ${1}:${tag}"
"${DOCKER[@]}" rmi "${1}:${tag}" >/dev/null "${DOCKER[@]}" rmi "${1}:${tag}" >/dev/null
else else
V=3 openim::log::status "Keeping image ${1}:${tag}" V=3 openim::log::status "Keeping image ${1}:${tag}"
fi fi
done done
} }
# Stop and delete all containers that match a pattern # Stop and delete all containers that match a pattern
@ -339,36 +340,36 @@ function openim::build::docker_delete_old_images() {
# $1: The base container prefix # $1: The base container prefix
# $2: The current container to keep, if provided # $2: The current container to keep, if provided
function openim::build::docker_delete_old_containers() { function openim::build::docker_delete_old_containers() {
# In Docker 1.12 we can replace this line with # In Docker 1.12 we can replace this line with
# docker ps -a --format="{{.Names}}" # docker ps -a --format="{{.Names}}"
for container in $("${DOCKER[@]}" ps -a | tail -n +2 | awk '{print $NF}') ; do for container in $("${DOCKER[@]}" ps -a | tail -n +2 | awk '{print $NF}') ; do
if [[ "${container}" != "${1}"* ]] ; then if [[ "${container}" != "${1}"* ]] ; then
V=3 openim::log::status "Keeping container ${container}" V=3 openim::log::status "Keeping container ${container}"
continue continue
fi fi
if [[ -z "${2:-}" || "${container}" != "${2}" ]] ; then if [[ -z "${2:-}" || "${container}" != "${2}" ]] ; then
V=2 openim::log::status "Deleting container ${container}" V=2 openim::log::status "Deleting container ${container}"
openim::build::destroy_container "${container}" openim::build::destroy_container "${container}"
else else
V=3 openim::log::status "Keeping container ${container}" V=3 openim::log::status "Keeping container ${container}"
fi fi
done done
} }
# Takes $1 and computes a short has for it. Useful for unique tag generation # Takes $1 and computes a short has for it. Useful for unique tag generation
function openim::build::short_hash() { function openim::build::short_hash() {
[[ $# -eq 1 ]] || { [[ $# -eq 1 ]] || {
openim::log::error "Internal error. No data based to short_hash." openim::log::error "Internal error. No data based to short_hash."
exit 2 exit 2
} }
local short_hash local short_hash
if which md5 >/dev/null 2>&1; then if which md5 >/dev/null 2>&1; then
short_hash=$(md5 -q -s "$1") short_hash=$(md5 -q -s "$1")
else else
short_hash=$(echo -n "$1" | md5sum) short_hash=$(echo -n "$1" | md5sum)
fi fi
echo "${short_hash:0:10}" echo "${short_hash:0:10}"
} }
# Pedantically kill, wait-on and remove a container. The -f -v options # Pedantically kill, wait-on and remove a container. The -f -v options
@ -376,15 +377,15 @@ function openim::build::short_hash() {
# container, wait to ensure it's stopped, then try the remove. This is # container, wait to ensure it's stopped, then try the remove. This is
# a workaround for bug https://github.com/docker/docker/issues/3968. # a workaround for bug https://github.com/docker/docker/issues/3968.
function openim::build::destroy_container() { function openim::build::destroy_container() {
"${DOCKER[@]}" kill "$1" >/dev/null 2>&1 || true "${DOCKER[@]}" kill "$1" >/dev/null 2>&1 || true
if [[ $("${DOCKER[@]}" version --format '{{.Server.Version}}') = 17.06.0* ]]; then if [[ $("${DOCKER[@]}" version --format '{{.Server.Version}}') = 17.06.0* ]]; then
# Workaround https://github.com/moby/moby/issues/33948. # Workaround https://github.com/moby/moby/issues/33948.
# TODO: remove when 17.06.0 is not relevant anymore # TODO: remove when 17.06.0 is not relevant anymore
DOCKER_API_VERSION=v1.29 "${DOCKER[@]}" wait "$1" >/dev/null 2>&1 || true DOCKER_API_VERSION=v1.29 "${DOCKER[@]}" wait "$1" >/dev/null 2>&1 || true
else else
"${DOCKER[@]}" wait "$1" >/dev/null 2>&1 || true "${DOCKER[@]}" wait "$1" >/dev/null 2>&1 || true
fi fi
"${DOCKER[@]}" rm -f -v "$1" >/dev/null 2>&1 || true "${DOCKER[@]}" rm -f -v "$1" >/dev/null 2>&1 || true
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -392,47 +393,47 @@ function openim::build::destroy_container() {
function openim::build::clean() { function openim::build::clean() {
if openim::build::has_docker ; then if openim::build::has_docker ; then
openim::build::docker_delete_old_containers "${OPENIM_BUILD_CONTAINER_NAME_BASE}" openim::build::docker_delete_old_containers "${OPENIM_BUILD_CONTAINER_NAME_BASE}"
openim::build::docker_delete_old_containers "${OPENIM_RSYNC_CONTAINER_NAME_BASE}" openim::build::docker_delete_old_containers "${OPENIM_RSYNC_CONTAINER_NAME_BASE}"
openim::build::docker_delete_old_containers "${OPENIM_DATA_CONTAINER_NAME_BASE}" openim::build::docker_delete_old_containers "${OPENIM_DATA_CONTAINER_NAME_BASE}"
openim::build::docker_delete_old_images "${OPENIM_BUILD_IMAGE_REPO}" "${OPENIM_BUILD_IMAGE_TAG_BASE}" openim::build::docker_delete_old_images "${OPENIM_BUILD_IMAGE_REPO}" "${OPENIM_BUILD_IMAGE_TAG_BASE}"
V=2 openim::log::status "Cleaning all untagged docker images" V=2 openim::log::status "Cleaning all untagged docker images"
"${DOCKER[@]}" rmi "$("${DOCKER[@]}" images -q --filter 'dangling=true')" 2> /dev/null || true "${DOCKER[@]}" rmi "$("${DOCKER[@]}" images -q --filter 'dangling=true')" 2> /dev/null || true
fi fi
if [[ -d "${LOCAL_OUTPUT_ROOT}" ]]; then if [[ -d "${LOCAL_OUTPUT_ROOT}" ]]; then
openim::log::status "Removing _output directory" openim::log::status "Removing _output directory"
rm -rf "${LOCAL_OUTPUT_ROOT}" rm -rf "${LOCAL_OUTPUT_ROOT}"
fi fi
} }
# Set up the context directory for the openim-build image and build it. # Set up the context directory for the openim-build image and build it.
function openim::build::build_image() { function openim::build::build_image() {
mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}" mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"
# Make sure the context directory owned by the right user for syncing sources to container. # Make sure the context directory owned by the right user for syncing sources to container.
chown -R "${USER_ID}":"${GROUP_ID}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" chown -R "${USER_ID}":"${GROUP_ID}" "${LOCAL_OUTPUT_BUILD_CONTEXT}"
cp /etc/localtime "${LOCAL_OUTPUT_BUILD_CONTEXT}/" cp /etc/localtime "${LOCAL_OUTPUT_BUILD_CONTEXT}/"
cp ""${OPENIM_ROOT}"/build/build-image/Dockerfile" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" cp "${OPENIM_ROOT}/build/build-image/Dockerfile" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
cp ""${OPENIM_ROOT}"/build/build-image/rsyncd.sh" "${LOCAL_OUTPUT_BUILD_CONTEXT}/" cp "${OPENIM_ROOT}/build/build-image/rsyncd.sh" "${LOCAL_OUTPUT_BUILD_CONTEXT}/"
dd if=/dev/urandom bs=512 count=1 2>/dev/null | LC_ALL=C tr -dc 'A-Za-z0-9' | dd bs=32 count=1 2>/dev/null > "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password" dd if=/dev/urandom bs=512 count=1 2>/dev/null | LC_ALL=C tr -dc 'A-Za-z0-9' | dd bs=32 count=1 2>/dev/null > "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"
chmod go= "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password" chmod go= "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"
openim::build::update_dockerfile openim::build::update_dockerfile
openim::build::set_proxy openim::build::set_proxy
openim::build::docker_build "${OPENIM_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false' openim::build::docker_build "${OPENIM_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false'
# Clean up old versions of everything # Clean up old versions of everything
openim::build::docker_delete_old_containers "${OPENIM_BUILD_CONTAINER_NAME_BASE}" "${OPENIM_BUILD_CONTAINER_NAME}" openim::build::docker_delete_old_containers "${OPENIM_BUILD_CONTAINER_NAME_BASE}" "${OPENIM_BUILD_CONTAINER_NAME}"
openim::build::docker_delete_old_containers "${OPENIM_RSYNC_CONTAINER_NAME_BASE}" "${OPENIM_RSYNC_CONTAINER_NAME}" openim::build::docker_delete_old_containers "${OPENIM_RSYNC_CONTAINER_NAME_BASE}" "${OPENIM_RSYNC_CONTAINER_NAME}"
openim::build::docker_delete_old_containers "${OPENIM_DATA_CONTAINER_NAME_BASE}" "${OPENIM_DATA_CONTAINER_NAME}" openim::build::docker_delete_old_containers "${OPENIM_DATA_CONTAINER_NAME_BASE}" "${OPENIM_DATA_CONTAINER_NAME}"
openim::build::docker_delete_old_images "${OPENIM_BUILD_IMAGE_REPO}" "${OPENIM_BUILD_IMAGE_TAG_BASE}" "${OPENIM_BUILD_IMAGE_TAG}" openim::build::docker_delete_old_images "${OPENIM_BUILD_IMAGE_REPO}" "${OPENIM_BUILD_IMAGE_TAG_BASE}" "${OPENIM_BUILD_IMAGE_TAG}"
openim::build::ensure_data_container openim::build::ensure_data_container
openim::build::sync_to_container openim::build::sync_to_container
} }
# Build a docker image from a Dockerfile. # Build a docker image from a Dockerfile.
@ -440,14 +441,14 @@ function openim::build::build_image() {
# $2 is the location of the "context" directory, with the Dockerfile at the root. # $2 is the location of the "context" directory, with the Dockerfile at the root.
# $3 is the value to set the --pull flag for docker build; true by default # $3 is the value to set the --pull flag for docker build; true by default
function openim::build::docker_build() { function openim::build::docker_build() {
local -r image=$1 local -r image=$1
local -r context_dir=$2 local -r context_dir=$2
local -r pull="${3:-true}" local -r pull="${3:-true}"
local -ra build_cmd=("${DOCKER[@]}" build -t "${image}" "--pull=${pull}" "${context_dir}") local -ra build_cmd=("${DOCKER[@]}" build -t "${image}" "--pull=${pull}" "${context_dir}")
openim::log::status "Building Docker image ${image}" openim::log::status "Building Docker image ${image}"
local docker_output local docker_output
docker_output=$("${build_cmd[@]}" 2>&1) || { docker_output=$("${build_cmd[@]}" 2>&1) || {
cat <<EOF >&2 cat <<EOF >&2
+++ Docker build command failed for ${image} +++ Docker build command failed for ${image}
@ -458,61 +459,61 @@ To retry manually, run:
${build_cmd[*]} ${build_cmd[*]}
EOF EOF
return 1 return 1
} }
} }
function openim::build::ensure_data_container() { function openim::build::ensure_data_container() {
# If the data container exists AND exited successfully, we can use it. # If the data container exists AND exited successfully, we can use it.
# Otherwise nuke it and start over. # Otherwise nuke it and start over.
local ret=0 local ret=0
local code=0 local code=0
code=$(docker inspect \ code=$(docker inspect \
-f '{{.State.ExitCode}}' \ -f '{{.State.ExitCode}}' \
"${OPENIM_DATA_CONTAINER_NAME}" 2>/dev/null) || ret=$? "${OPENIM_DATA_CONTAINER_NAME}" 2>/dev/null) || ret=$?
if [[ "${ret}" == 0 && "${code}" != 0 ]]; then if [[ "${ret}" == 0 && "${code}" != 0 ]]; then
openim::build::destroy_container "${OPENIM_DATA_CONTAINER_NAME}" openim::build::destroy_container "${OPENIM_DATA_CONTAINER_NAME}"
ret=1 ret=1
fi fi
if [[ "${ret}" != 0 ]]; then if [[ "${ret}" != 0 ]]; then
openim::log::status "Creating data container ${OPENIM_DATA_CONTAINER_NAME}" openim::log::status "Creating data container ${OPENIM_DATA_CONTAINER_NAME}"
# We have to ensure the directory exists, or else the docker run will # We have to ensure the directory exists, or else the docker run will
# create it as root. # create it as root.
mkdir -p "${LOCAL_OUTPUT_GOPATH}" mkdir -p "${LOCAL_OUTPUT_GOPATH}"
# We want this to run as root to be able to chown, so non-root users can # We want this to run as root to be able to chown, so non-root users can
# later use the result as a data container. This run both creates the data # later use the result as a data container. This run both creates the data
# container and chowns the GOPATH. # container and chowns the GOPATH.
# #
# The data container creates volumes for all of the directories that store # The data container creates volumes for all of the directories that store
# intermediates for the Go build. This enables incremental builds across # intermediates for the Go build. This enables incremental builds across
# Docker sessions. The *_cgo paths are re-compiled versions of the go std # Docker sessions. The *_cgo paths are re-compiled versions of the go std
# libraries for true static building. # libraries for true static building.
local -ra docker_cmd=( local -ra docker_cmd=(
"${DOCKER[@]}" run "${DOCKER[@]}" run
--volume "${REMOTE_ROOT}" # white-out the whole output dir --volume "${REMOTE_ROOT}" # white-out the whole output dir
--volume /usr/local/go/pkg/linux_386_cgo --volume /usr/local/go/pkg/linux_386_cgo
--volume /usr/local/go/pkg/linux_amd64_cgo --volume /usr/local/go/pkg/linux_amd64_cgo
--volume /usr/local/go/pkg/linux_arm_cgo --volume /usr/local/go/pkg/linux_arm_cgo
--volume /usr/local/go/pkg/linux_arm64_cgo --volume /usr/local/go/pkg/linux_arm64_cgo
--volume /usr/local/go/pkg/linux_ppc64le_cgo --volume /usr/local/go/pkg/linux_ppc64le_cgo
--volume /usr/local/go/pkg/darwin_amd64_cgo --volume /usr/local/go/pkg/darwin_amd64_cgo
--volume /usr/local/go/pkg/darwin_386_cgo --volume /usr/local/go/pkg/darwin_386_cgo
--volume /usr/local/go/pkg/windows_amd64_cgo --volume /usr/local/go/pkg/windows_amd64_cgo
--volume /usr/local/go/pkg/windows_386_cgo --volume /usr/local/go/pkg/windows_386_cgo
--name "${OPENIM_DATA_CONTAINER_NAME}" --name "${OPENIM_DATA_CONTAINER_NAME}"
--hostname "${HOSTNAME}" --hostname "${HOSTNAME}"
"${OPENIM_BUILD_IMAGE}" "${OPENIM_BUILD_IMAGE}"
chown -R "${USER_ID}":"${GROUP_ID}" chown -R "${USER_ID}":"${GROUP_ID}"
"${REMOTE_ROOT}" "${REMOTE_ROOT}"
/usr/local/go/pkg/ /usr/local/go/pkg/
) )
"${docker_cmd[@]}" "${docker_cmd[@]}"
fi fi
} }
# Build all openim commands. # Build all openim commands.
function openim::build::build_command() { function openim::build::build_command() {
openim::log::status "Running build command..." openim::log::status "Running build command..."
make -C "${OPENIM_ROOT}" multiarch make -C "${OPENIM_ROOT}" multiarch
} }

@ -19,11 +19,11 @@
echo "mode: atomic" > coverage.txt echo "mode: atomic" > coverage.txt
for d in $(find ./* -maxdepth 10 -type d); do for d in $(find ./* -maxdepth 10 -type d); do
if ls $d/*.go &> /dev/null; then if ls $d/*.go &> /dev/null; then
go test -coverprofile=profile.out -covermode=atomic $d go test -coverprofile=profile.out -covermode=atomic $d
if [ -f profile.out ]; then if [ -f profile.out ]; then
cat profile.out | grep -v "mode: " >> /tmp/coverage.txt cat profile.out | grep -v "mode: " >> /tmp/coverage.txt
rm profile.out rm profile.out
fi
fi fi
fi
done done

@ -15,16 +15,16 @@
if ! command -v pv &> /dev/null if ! command -v pv &> /dev/null
then then
echo "pv not found, installing..." echo "pv not found, installing..."
if [ -e /etc/debian_version ]; then if [ -e /etc/debian_version ]; then
sudo apt-get update sudo apt-get update
sudo apt-get install -y pv sudo apt-get install -y pv
elif [ -e /etc/redhat-release ]; then elif [ -e /etc/redhat-release ]; then
sudo yum install -y pv sudo yum install -y pv
else else
echo "Unsupported OS, please install pv manually." echo "Unsupported OS, please install pv manually."
exit 1 exit 1
fi fi
fi fi
readonly t_reset=$(tput sgr0) readonly t_reset=$(tput sgr0)
@ -42,8 +42,8 @@ openim::util::ensure-bash-version
trap 'openim::util::onCtrlC' INT trap 'openim::util::onCtrlC' INT
function openim::util::onCtrlC() { function openim::util::onCtrlC() {
echo -e "\n${t_reset}Ctrl+C Press it. It's exiting openim make init..." echo -e "\n${t_reset}Ctrl+C Press it. It's exiting openim make init..."
exit 0 exit 0
} }
openim::util::desc "========> Welcome to the OpenIM Demo" openim::util::desc "========> Welcome to the OpenIM Demo"

@ -22,61 +22,61 @@ cd "$OPENIM_ROOT"
openim::util::check_docker_and_compose_versions openim::util::check_docker_and_compose_versions
progress() { progress() {
local _main_pid="$1" local _main_pid="$1"
local _length=20 local _length=20
local _ratio=1 local _ratio=1
local _colors=("31" "32" "33" "34" "35" "36" "37") local _colors=("31" "32" "33" "34" "35" "36" "37")
local _wave=("▁" "▂" "▃" "▄" "▅" "▆" "▇" "█" "▇" "▆" "▅" "▄" "▃" "▂") local _wave=("▁" "▂" "▃" "▄" "▅" "▆" "▇" "█" "▇" "▆" "▅" "▄" "▃" "▂")
while pgrep -P "$_main_pid" &> /dev/null; do while pgrep -P "$_main_pid" &> /dev/null; do
local _mark='>' local _mark='>'
local _progress_bar= local _progress_bar=
for ((i = 1; i <= _length; i++)); do for ((i = 1; i <= _length; i++)); do
if ((i > _ratio)); then if ((i > _ratio)); then
_mark='-' _mark='-'
fi fi
_progress_bar="${_progress_bar}${_mark}" _progress_bar="${_progress_bar}${_mark}"
done
local _color_idx=$((_ratio % ${#_colors[@]}))
local _color_prefix="\033[${_colors[_color_idx]}m"
local _reset_suffix="\033[0m"
local _wave_idx=$((_ratio % ${#_wave[@]}))
local _wave_progress=${_wave[_wave_idx]}
printf "Progress: ${_color_prefix}${_progress_bar}${_reset_suffix} ${_wave_progress} Countdown: %2ds \r" "$_countdown"
((_ratio++))
((_ratio > _length)) && _ratio=1
sleep 0.1
done done
local _color_idx=$((_ratio % ${#_colors[@]}))
local _color_prefix="\033[${_colors[_color_idx]}m"
local _reset_suffix="\033[0m"
local _wave_idx=$((_ratio % ${#_wave[@]}))
local _wave_progress=${_wave[_wave_idx]}
printf "Progress: ${_color_prefix}${_progress_bar}${_reset_suffix} ${_wave_progress} Countdown: %2ds \r" "$_countdown"
((_ratio++))
((_ratio > _length)) && _ratio=1
sleep 0.1
done
} }
countdown() { countdown() {
local _duration="$1" local _duration="$1"
for ((i = _duration; i >= 1; i--)); do for ((i = _duration; i >= 1; i--)); do
printf "\rCountdown: %2ds \r" "$i" printf "\rCountdown: %2ds \r" "$i"
sleep 1 sleep 1
done done
printf "\rCountdown: %2ds \r" "$_duration" printf "\rCountdown: %2ds \r" "$_duration"
} }
do_sth() { do_sth() {
echo "++++++++++++++++++++++++" echo "++++++++++++++++++++++++"
progress $$ & progress $$ &
local _progress_pid=$! local _progress_pid=$!
local _countdown=30 local _countdown=30
countdown "$_countdown" & countdown "$_countdown" &
local _countdown_pid=$! local _countdown_pid=$!
sleep 30 sleep 30
kill "$_progress_pid" "$_countdown_pid" kill "$_progress_pid" "$_countdown_pid"
"${SCRIPTS_ROOT}/check-all.sh" "${SCRIPTS_ROOT}/check-all.sh"
echo -e "${PURPLE_PREFIX}=========> Check docker-compose status ${COLOR_SUFFIX} \n" echo -e "${PURPLE_PREFIX}=========> Check docker-compose status ${COLOR_SUFFIX} \n"
} }
set -e set -e

@ -28,8 +28,6 @@ openim::log::info "\n# Use Docker to start all openim service"
trap 'openim::util::onCtrlC' INT trap 'openim::util::onCtrlC' INT
"${OPENIM_ROOT}"/scripts/init-config.sh --skip
"${OPENIM_ROOT}"/scripts/start-all.sh "${OPENIM_ROOT}"/scripts/start-all.sh
sleep 5 sleep 5

@ -14,11 +14,13 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
version="${VERSION}" version="${VERSION}"
if [ "${version}" == "" ];then if [ "${version}" == "" ];then
version=v`gsemver bump` version=v$(${OPENIM_ROOT}/_output/tools/gsemver bump)
fi fi
if [ -z "`git tag -l ${version}`" ];then if [ -z "$(git tag -l ${version})" ];then
git tag -a -m "release version ${version}" ${version} git tag -a -m "release version ${version}" ${version}
fi fi

@ -67,7 +67,7 @@ echo -e "=== any\nRepresents an untyped JSON map - see the description of the fi
asciidoctor definitions.adoc asciidoctor definitions.adoc
asciidoctor paths.adoc asciidoctor paths.adoc
cp ${OPENIM_OUTPUT_TMP}/definitions.html ${OPENIM_OUTPUT_TMP}/_output/ cp "$OPENIM_OUTPUT_TMP/definitions.html" "$OPENIM_OUTPUT_TMP/_output/"
cp ${OPENIM_OUTPUT_TMP}/paths.html ${OPENIM_OUTPUT_TMP}/_output/operations.html cp "$OPENIM_OUTPUT_TMP/paths.html" "$OPENIM_OUTPUT_TMP/_output/operations.html"
success "SUCCESS" success "SUCCESS"

@ -25,20 +25,12 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${OPENIM_ROOT}/scripts/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
if [ $# -ne 2 ];then if [ $# -ne 2 ];then
openim::log::error "Usage: scripts/genconfig.sh scripts/environment.sh configs/openim-api.yaml" openim::log::error "Usage: scripts/genconfig.sh scripts/environment.sh configs/config.yaml"
exit 1 exit 1
fi fi
openim::util::require-dig if [ -z "${OPENIM_IP}" ]; then
result=$? openim::util::require-dig
if [ $result -ne 0 ]; then
openim::log::info "Please install 'dig' to use this feature."
openim::log::info "Installation instructions:"
openim::log::info " For Ubuntu/Debian: sudo apt-get install dnsutils"
openim::log::info " For CentOS/RedHat: sudo yum install bind-utils"
openim::log::info " For macOS: 'dig' should be preinstalled. If missing, try: brew install bind"
openim::log::info " For Windows: Install BIND9 tools from https://www.isc.org/download/"
openim::log::error_exit "Error: 'dig' command is required but not installed."
fi fi
source "${env_file}" source "${env_file}"
@ -48,17 +40,17 @@ declare -A envs
set +u set +u
for env in $(sed -n 's/^[^#].*${\(.*\)}.*/\1/p' ${template_file}) for env in $(sed -n 's/^[^#].*${\(.*\)}.*/\1/p' ${template_file})
do do
if [ -z "$(eval echo \$${env})" ];then if [ -z "$(eval echo \$${env})" ];then
openim::log::error "environment variable '${env}' not set" openim::log::error "environment variable '${env}' not set"
missing=true missing=true
fi fi
done done
if [ "${missing}" ];then if [ "${missing}" ];then
openim::log::error 'You may run `source scripts/environment.sh` to set these environment' openim::log::error "You may run 'source scripts/environment.sh' to set these environment"
exit 1 exit 1
fi fi
eval "cat << EOF eval "cat << EOF
$(cat ${template_file}) $(cat ${template_file})
EOF" EOF"

@ -14,43 +14,43 @@
# limitations under the License. # limitations under the License.
DEFAULT_DIRS=( DEFAULT_DIRS=(
"pkg" "pkg"
"internal/pkg" "internal/pkg"
) )
BASE_URL="github.com/openimsdk/open-im-server" BASE_URL="github.com/openimsdk/open-im-server"
usage() { usage() {
echo "Usage: $0 [OPTIONS]" echo "Usage: $0 [OPTIONS]"
echo echo
echo "This script iterates over directories and generates doc.go if necessary." echo "This script iterates over directories and generates doc.go if necessary."
echo "By default, it processes 'pkg' and 'internal/pkg' directories." echo "By default, it processes 'pkg' and 'internal/pkg' directories."
echo echo
echo "Options:" echo "Options:"
echo " -d DIRS, --dirs DIRS Specify the directories to be processed, separated by commas. E.g., 'pkg,internal/pkg'." echo " -d DIRS, --dirs DIRS Specify the directories to be processed, separated by commas. E.g., 'pkg,internal/pkg'."
echo " -u URL, --url URL Set the base URL for the import path. Default is '$BASE_URL'." echo " -u URL, --url URL Set the base URL for the import path. Default is '$BASE_URL'."
echo " -h, --help Show this help message." echo " -h, --help Show this help message."
echo echo
} }
process_dir() { process_dir() {
local dir=$1 local dir=$1
local base_url=$2 local base_url=$2
for d in $(find $dir -type d); do for d in $(find $dir -type d); do
if [ ! -f $d/doc.go ]; then if [ ! -f $d/doc.go ]; then
if ls $d/*.go > /dev/null 2>&1; then if ls $d/*.go > /dev/null 2>&1; then
echo $d/doc.go echo $d/doc.go
echo "package $(basename $d) // import \"$base_url/$d\"" > $d/doc.go echo "package $(basename $d) // import \"$base_url/$d\"" > $d/doc.go
fi fi
fi fi
done done
} }
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
key="$1" key="$1"
case $key in case $key in
-d|--dirs) -d|--dirs)
IFS=',' read -ra DIRS <<< "$2" IFS=',' read -ra DIRS <<< "$2"
shift # shift past argument shift # shift past argument
shift # shift past value shift # shift past value

@ -34,15 +34,15 @@ RED="\e[31m"
ENDCOLOR="\e[0m" ENDCOLOR="\e[0m"
printMessage() { printMessage() {
printf "${YELLOW}OpenIM : $1${ENDCOLOR}\n" printf "${YELLOW}OpenIM : $1${ENDCOLOR}\n"
} }
printSuccess() { printSuccess() {
printf "${GREEN}OpenIM : $1${ENDCOLOR}\n" printf "${GREEN}OpenIM : $1${ENDCOLOR}\n"
} }
printError() { printError() {
printf "${RED}OpenIM : $1${ENDCOLOR}\n" printf "${RED}OpenIM : $1${ENDCOLOR}\n"
} }
printMessage "Running the OpenIM commit-msg hook." printMessage "Running the OpenIM commit-msg hook."
@ -50,9 +50,9 @@ printMessage "Running the OpenIM commit-msg hook."
# This example catches duplicate Signed-off-by lines. # This example catches duplicate Signed-off-by lines.
test "" = "$(grep '^Signed-off-by: ' "$1" | test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines. echo >&2 Duplicate Signed-off-by lines.
exit 1 exit 1
} }
# TODO: go-gitlint dir set # TODO: go-gitlint dir set
@ -60,21 +60,21 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/../..
GITLINT_DIR="$OPENIM_ROOT/_output/tools/go-gitlint" GITLINT_DIR="$OPENIM_ROOT/_output/tools/go-gitlint"
$GITLINT_DIR \ $GITLINT_DIR \
--msg-file=$1 \ --msg-file=$1 \
--subject-regex="^(build|chore|ci|docs|feat|feature|fix|perf|refactor|revert|style|bot|test)(.*)?:\s?.*" \ --subject-regex="^(build|chore|ci|docs|feat|feature|fix|perf|refactor|revert|style|bot|test)(.*)?:\s?.*" \
--subject-maxlen=150 \ --subject-maxlen=150 \
--subject-minlen=10 \ --subject-minlen=10 \
--body-regex=".*" \ --body-regex=".*" \
--max-parents=1 --max-parents=1
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
if ! command -v $GITLINT_DIR &>/dev/null; then if ! command -v $GITLINT_DIR &>/dev/null; then
printError "$GITLINT_DIR not found. Please run 'make tools' OR 'make tools.verify.go-gitlint' make verto install it." printError "$GITLINT_DIR not found. Please run 'make tools' OR 'make tools.verify.go-gitlint' make verto install it."
fi fi
printError "Please fix your commit message to match kubecub coding standards" printError "Please fix your commit message to match kubecub coding standards"
printError "https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694#file-githook-md" printError "https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694#file-githook-md"
exit 1 exit 1
fi fi
### Add Sign-off-by line to the end of the commit message ### Add Sign-off-by line to the end of the commit message
@ -88,5 +88,5 @@ SIGNED_OFF_BY_EXISTS=$?
# Add "Signed-off-by" line if it doesn't exist # Add "Signed-off-by" line if it doesn't exist
if [ $SIGNED_OFF_BY_EXISTS -ne 0 ]; then if [ $SIGNED_OFF_BY_EXISTS -ne 0 ]; then
echo -e "\nSigned-off-by: $NAME <$EMAIL>" >> "$1" echo -e "\nSigned-off-by: $NAME <$EMAIL>" >> "$1"
fi fi

@ -34,15 +34,15 @@ RED="\e[31m"
ENDCOLOR="\e[0m" ENDCOLOR="\e[0m"
printMessage() { printMessage() {
printf "${YELLOW}openim : $1${ENDCOLOR}\n" printf "${YELLOW}openim : $1${ENDCOLOR}\n"
} }
printSuccess() { printSuccess() {
printf "${GREEN}openim : $1${ENDCOLOR}\n" printf "${GREEN}openim : $1${ENDCOLOR}\n"
} }
printError() { printError() {
printf "${RED}openim : $1${ENDCOLOR}\n" printf "${RED}openim : $1${ENDCOLOR}\n"
} }
printMessage "Running local openim pre-commit hook." printMessage "Running local openim pre-commit hook."
@ -55,9 +55,9 @@ limit=${GIT_FILE_SIZE_LIMIT:-2000000} # Default 2MB
limitInMB=$(( $limit / 1000000 )) limitInMB=$(( $limit / 1000000 ))
function file_too_large(){ function file_too_large(){
filename=$0 filename=$0
filesize=$(( $1 / 2**20 )) filesize=$(( $1 / 2**20 ))
cat <<HEREDOC cat <<HEREDOC
File $filename is $filesize MB, which is larger than github's maximum File $filename is $filesize MB, which is larger than github's maximum
@ -65,8 +65,8 @@ function file_too_large(){
Commit aborted Commit aborted
HEREDOC HEREDOC
git status git status
} }
# Move to the repo root so git files paths make sense # Move to the repo root so git files paths make sense
@ -77,9 +77,9 @@ empty_tree=$( git hash-object -t tree /dev/null )
if git rev-parse --verify HEAD > /dev/null 2>&1 if git rev-parse --verify HEAD > /dev/null 2>&1
then then
against=HEAD against=HEAD
else else
against="$empty_tree" against="$empty_tree"
fi fi
# Set split so that for loop below can handle spaces in file names by splitting on line breaks # Set split so that for loop below can handle spaces in file names by splitting on line breaks
@ -104,7 +104,7 @@ fi
if [[ ! $local_branch =~ $valid_branch_regex ]] if [[ ! $local_branch =~ $valid_branch_regex ]]
then then
printError "There is something wrong with your branch name. Branch names in this project must adhere to this contract: $valid_branch_regex. printError "There is something wrong with your branch name. Branch names in this project must adhere to this contract: $valid_branch_regex.
Your commit will be rejected. You should rename your branch to a valid name(feat/name OR bug/name) and try again." Your commit will be rejected. You should rename your branch to a valid name(feat/name OR bug/name) and try again."
printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694" printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694"
exit 1 exit 1

@ -25,20 +25,20 @@ local_branch="$(git rev-parse --abbrev-ref HEAD)"
valid_branch_regex="^(main|master|develop|release(-[a-zA-Z0-9._-]+)?)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$" valid_branch_regex="^(main|master|develop|release(-[a-zA-Z0-9._-]+)?)$|(feature|feat|openim|hotfix|test|bug|ci|cicd|style|)\/[a-z0-9._-]+$|^HEAD$"
printMessage() { printMessage() {
printf "${YELLOW}OpenIM : $1${ENDCOLOR}\n" printf "${YELLOW}OpenIM : $1${ENDCOLOR}\n"
} }
printSuccess() { printSuccess() {
printf "${GREEN}OpenIM : $1${ENDCOLOR}\n" printf "${GREEN}OpenIM : $1${ENDCOLOR}\n"
} }
printError() { printError() {
printf "${RED}OpenIM : $1${ENDCOLOR}\n" printf "${RED}OpenIM : $1${ENDCOLOR}\n"
} }
printMessage "Running local OpenIM pre-push hook." printMessage "Running local OpenIM pre-push hook."
if [[ `git status --porcelain` ]]; then if [[ $(git status --porcelain) ]]; then
printError "This scripts needs to run against committed code only. Please commit or stash you changes." printError "This scripts needs to run against committed code only. Please commit or stash you changes."
exit 1 exit 1
fi fi
@ -101,7 +101,7 @@ print_color "Deleted Files: ${deleted_files}" "${BACKGROUND_GREEN}"
if [[ ! $local_branch =~ $valid_branch_regex ]] if [[ ! $local_branch =~ $valid_branch_regex ]]
then then
printError "There is something wrong with your branch name. Branch names in this project must adhere to this contract: $valid_branch_regex. printError "There is something wrong with your branch name. Branch names in this project must adhere to this contract: $valid_branch_regex.
Your commit will be rejected. You should rename your branch to a valid name(feat/name OR fix/name) and try again." Your commit will be rejected. You should rename your branch to a valid name(feat/name OR fix/name) and try again."
printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694" printError "For more on this, read on: https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694"
exit 1 exit 1

@ -31,7 +31,7 @@ readonly ENV_FILE=${ENV_FILE:-"${OPENIM_ROOT}/scripts/install/environment.sh"}
# Templates for configuration files # Templates for configuration files
declare -A TEMPLATES=( declare -A TEMPLATES=(
["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/.env" ["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/.env"
["${OPENIM_ROOT}/deployments/templates/openim.yaml"]="${OPENIM_ROOT}/config/config.yaml" ["${OPENIM_ROOT}/deployments/templates/config.yaml"]="${OPENIM_ROOT}/config/config.yaml"
["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/prometheus.yml" ["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/prometheus.yml"
["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/alertmanager.yml" ["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/alertmanager.yml"
) )
@ -39,7 +39,7 @@ declare -A TEMPLATES=(
# Templates for example files # Templates for example files
declare -A EXAMPLES=( declare -A EXAMPLES=(
["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/config/templates/env.template" ["${OPENIM_ROOT}/deployments/templates/env-template.yaml"]="${OPENIM_ROOT}/config/templates/env.template"
["${OPENIM_ROOT}/deployments/templates/openim.yaml"]="${OPENIM_ROOT}/config/templates/config.yaml.template" ["${OPENIM_ROOT}/deployments/templates/config.yaml"]="${OPENIM_ROOT}/config/templates/config.yaml.template"
["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/templates/prometheus.yml.template" ["${OPENIM_ROOT}/deployments/templates/prometheus.yml"]="${OPENIM_ROOT}/config/templates/prometheus.yml.template"
["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/templates/alertmanager.yml.template" ["${OPENIM_ROOT}/deployments/templates/alertmanager.yml"]="${OPENIM_ROOT}/config/templates/alertmanager.yml.template"
) )
@ -84,7 +84,7 @@ generate_config_files() {
local output_file="${TEMPLATES[$template]}" local output_file="${TEMPLATES[$template]}"
process_file "$template" "$output_file" true process_file "$template" "$output_file" true
done done
# Handle COPY_TEMPLATES array # Handle COPY_TEMPLATES array
for template in "${!COPY_TEMPLATES[@]}"; do for template in "${!COPY_TEMPLATES[@]}"; do
local output_file="${COPY_TEMPLATES[$template]}" local output_file="${COPY_TEMPLATES[$template]}"
@ -95,22 +95,25 @@ generate_config_files() {
# Function to generate example files # Function to generate example files
generate_example_files() { generate_example_files() {
env_cmd="env -i" env_cmd="env -i"
env_vars["OPENIM_IP"]="127.0.0.1"
env_vars["LOG_STORAGE_LOCATION"]="../../"
for var in "${!env_vars[@]}"; do for var in "${!env_vars[@]}"; do
env_cmd+=" $var='${env_vars[$var]}'" env_cmd+=" $var='${env_vars[$var]}'"
done done
# Processing EXAMPLES array # Processing EXAMPLES array
for template in "${!EXAMPLES[@]}"; do for template in "${!EXAMPLES[@]}"; do
local example_file="${EXAMPLES[$template]}" local example_file="${EXAMPLES[$template]}"
process_file "$template" "$example_file" true process_file "$template" "$example_file" true
done done
# Processing COPY_EXAMPLES array # Processing COPY_EXAMPLES array
for template in "${!COPY_EXAMPLES[@]}"; do for template in "${!COPY_EXAMPLES[@]}"; do
local example_file="${COPY_EXAMPLES[$template]}" local example_file="${COPY_EXAMPLES[$template]}"
process_file "$template" "$example_file" false process_file "$template" "$example_file" false
done done
} }
# Function to process a single file, either by generating or copying # Function to process a single file, either by generating or copying
@ -118,11 +121,11 @@ process_file() {
local template=$1 local template=$1
local output_file=$2 local output_file=$2
local use_genconfig=$3 local use_genconfig=$3
if [[ -f "${output_file}" ]]; then if [[ -f "${output_file}" ]]; then
if [[ "${FORCE_OVERWRITE}" == true ]]; then if [[ "${FORCE_OVERWRITE}" == true ]]; then
openim::log::info "Force overwriting ${output_file}." openim::log::info "Force overwriting ${output_file}."
elif [[ "${SKIP_EXISTING}" == true ]]; then elif [[ "${SKIP_EXISTING}" == true ]]; then
openim::log::info "Skipping generation of ${output_file} as it already exists." openim::log::info "Skipping generation of ${output_file} as it already exists."
return return
else else
@ -139,7 +142,7 @@ process_file() {
openim::log::info "Generating ${output_file} as it does not exist." openim::log::info "Generating ${output_file} as it does not exist."
fi fi
fi fi
if [[ "$use_genconfig" == true ]]; then if [[ "$use_genconfig" == true ]]; then
openim::log::info "⌚ Working with template file: ${template} to generate ${output_file}..." openim::log::info "⌚ Working with template file: ${template} to generate ${output_file}..."
if [[ ! -f "${OPENIM_ROOT}/scripts/genconfig.sh" ]]; then if [[ ! -f "${OPENIM_ROOT}/scripts/genconfig.sh" ]]; then
@ -147,15 +150,15 @@ process_file() {
exit 1 exit 1
fi fi
if [[ -n "${env_cmd}" ]]; then if [[ -n "${env_cmd}" ]]; then
eval "$env_cmd ${OPENIM_ROOT}/scripts/genconfig.sh '${ENV_FILE}' '${template}' > '${output_file}'" || { eval "$env_cmd ${OPENIM_ROOT}/scripts/genconfig.sh '${ENV_FILE}' '${template}' > '${output_file}'" || {
openim::log::error "Error processing template file ${template}" openim::log::error "Error processing template file ${template}"
exit 1 exit 1
} }
else else
"${OPENIM_ROOT}/scripts/genconfig.sh" "${ENV_FILE}" "${template}" > "${output_file}" || { "${OPENIM_ROOT}/scripts/genconfig.sh" "${ENV_FILE}" "${template}" > "${output_file}" || {
openim::log::error "Error processing template file ${template}" openim::log::error "Error processing template file ${template}"
exit 1 exit 1
} }
fi fi
else else
openim::log::info "📋 Copying ${template} to ${output_file}..." openim::log::info "📋 Copying ${template} to ${output_file}..."
@ -164,7 +167,7 @@ process_file() {
exit 1 exit 1
} }
fi fi
sleep 0.5 sleep 0.5
} }
@ -181,7 +184,6 @@ clean_config_files() {
# Function to clean example files # Function to clean example files
clean_example_files() { clean_example_files() {
# 合并 EXAMPLES 和 COPY_EXAMPLES 数组
local all_examples=("${EXAMPLES[@]}" "${COPY_EXAMPLES[@]}") local all_examples=("${EXAMPLES[@]}" "${COPY_EXAMPLES[@]}")
for example_file in "${all_examples[@]}"; do for example_file in "${all_examples[@]}"; do
@ -197,32 +199,32 @@ while [[ $# -gt 0 ]]; do
-h|--help) -h|--help)
show_help show_help
exit 0 exit 0
;; ;;
--force) --force)
FORCE_OVERWRITE=true FORCE_OVERWRITE=true
shift shift
;; ;;
--skip) --skip)
SKIP_EXISTING=true SKIP_EXISTING=true
shift shift
;; ;;
--examples) --examples)
GENERATE_EXAMPLES=true GENERATE_EXAMPLES=true
shift shift
;; ;;
--clean-config) --clean-config)
CLEAN_CONFIG=true CLEAN_CONFIG=true
shift shift
;; ;;
--clean-examples) --clean-examples)
CLEAN_EXAMPLES=true CLEAN_EXAMPLES=true
shift shift
;; ;;
*) *)
echo "Unknown option: $1" echo "Unknown option: $1"
show_help show_help
exit 1 exit 1
;; ;;
esac esac
done done

@ -25,9 +25,9 @@ source "${OPENIM_ROOT}/scripts/install/common.sh"
openim::log::info "\n# Begin Install OpenIM Config" openim::log::info "\n# Begin Install OpenIM Config"
for file in "${OPENIM_SERVER_TARGETS[@]}"; do for file in "${OPENIM_SERVER_TARGETS[@]}"; do
VARNAME="$(echo $file | tr '[:lower:]' '[:upper:]' | tr '.' '_' | tr '-' '_')" VARNAME="$(echo $file | tr '[:lower:]' '[:upper:]' | tr '.' '_' | tr '-' '_')"
VARVALUE="$OPENIM_OUTPUT_HOSTBIN/$file" VARVALUE="$OPENIM_OUTPUT_HOSTBIN/$file"
# /etc/profile.d/openim-env.sh # /etc/profile.d/openim-env.sh
echo "export $VARNAME=$VARVALUE" > /etc/profile.d/openim-env.sh echo "export $VARNAME=$VARVALUE" > /etc/profile.d/openim-env.sh
source /etc/profile.d/openim-env.sh source /etc/profile.d/openim-env.sh
done done

@ -39,62 +39,62 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
HOOKS_DIR="${OPENIM_ROOT}/.git/hooks" HOOKS_DIR="${OPENIM_ROOT}/.git/hooks"
help_info() { help_info() {
echo "Usage: $0 [options]" echo "Usage: $0 [options]"
echo echo
echo "This script helps to manage git hooks." echo "This script helps to manage git hooks."
echo echo
echo "Options:" echo "Options:"
echo " -h, --help Show this help message and exit." echo " -h, --help Show this help message and exit."
echo " -d, --delete Delete the hooks that have been added." echo " -d, --delete Delete the hooks that have been added."
echo " By default, it will prompt to enable git hooks." echo " By default, it will prompt to enable git hooks."
} }
delete_hooks() { delete_hooks() {
for file in ${OPENIM_ROOT}/scripts/githooks/*.sh; do for file in "${OPENIM_ROOT}"/scripts/githooks/*.sh; do
hook_name=$(basename "$file" .sh) # This removes the .sh extension hook_name=$(basename "$file" .sh) # This removes the .sh extension
rm -f "$HOOKS_DIR/$hook_name" rm -f "$HOOKS_DIR/$hook_name"
done done
echo "Git hooks have been deleted." echo "Git hooks have been deleted."
} }
enable_hooks() { enable_hooks() {
echo "Would you like to:" echo "Would you like to:"
echo "1) Enable git hooks mode" echo "1) Enable git hooks mode"
echo "2) Delete existing git hooks" echo "2) Delete existing git hooks"
echo "Please select a number (or any other key to exit):" echo "Please select a number (or any other key to exit):"
read -r choice read -r choice
case "$choice" in case "$choice" in
1) 1)
for file in ${OPENIM_ROOT}/scripts/githooks/*.sh; do for file in ${OPENIM_ROOT}/scripts/githooks/*.sh; do
hook_name=$(basename "$file" .sh) # This removes the .sh extension hook_name=$(basename "$file" .sh) # This removes the .sh extension
cp -f "$file" "$HOOKS_DIR/$hook_name" cp -f "$file" "$HOOKS_DIR/$hook_name"
done done
chmod +x $HOOKS_DIR/* chmod +x $HOOKS_DIR/*
echo "Git hooks mode has been enabled." echo "Git hooks mode has been enabled."
echo "With git hooks enabled, every time you perform a git action (e.g. git commit), the corresponding hooks script will be triggered automatically." echo "With git hooks enabled, every time you perform a git action (e.g. git commit), the corresponding hooks script will be triggered automatically."
echo "This means that if the size of the file you're committing exceeds the set limit (e.g. 42MB), the commit will be rejected." echo "This means that if the size of the file you're committing exceeds the set limit (e.g. 42MB), the commit will be rejected."
;; ;;
2) 2)
delete_hooks delete_hooks
;; ;;
*) *)
echo "Exiting without making changes." echo "Exiting without making changes."
;; ;;
esac esac
} }
case "$1" in case "$1" in
-h|--help) -h|--help)
help_info help_info
;; ;;
-d|--delete) -d|--delete)
delete_hooks delete_hooks
;; ;;
*) *)
enable_hooks enable_hooks
;; ;;
esac esac

@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright © 2023 OpenIM. All rights reserved. # Copyright © 2024 OpenIM. All rights reserved.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -13,8 +13,20 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
#
# OpenIM Docker Deployment Script
#
# This script automates the process of building the OpenIM server image
# and deploying it using Docker Compose.
#
# Variables:
# - SERVER_IMAGE_VERSION: Version of the server image (default: test)
# - IMAGE_REGISTRY: Docker image registry (default: openim)
# - DOCKER_COMPOSE_FILE_URL: URL to the docker-compose.yml file
#
# Usage:
# SERVER_IMAGE_VERSION=latest IMAGE_REGISTRY=myregistry ./this_script.sh
# Common utilities, variables and checks for all build scripts.
set -o errexit set -o errexit
set -o nounset set -o nounset
set -o pipefail set -o pipefail
@ -28,35 +40,47 @@ chmod +x "${OPENIM_ROOT}"/scripts/*.sh
openim::util::ensure_docker_daemon_connectivity openim::util::ensure_docker_daemon_connectivity
# Default values for variables
: ${SERVER_IMAGE_VERSION:=test}
: ${IMAGE_REGISTRY:=openim}
: ${DOCKER_COMPOSE_FILE_URL:="https://raw.githubusercontent.com/openimsdk/openim-docker/main/docker-compose.yaml"}
DOCKER_COMPOSE_COMMAND= DOCKER_COMPOSE_COMMAND=
# Check if docker-compose command is available # Check if docker-compose command is available
openim::util::check_docker_and_compose_versions openim::util::check_docker_and_compose_versions
if command -v docker compose &> /dev/null; then
if command -v docker compose &> /dev/null openim::log::info "docker compose command is available"
then DOCKER_COMPOSE_COMMAND="docker compose"
openim::log::info "docker compose command is available"
DOCKER_COMPOSE_COMMAND="docker compose"
else else
DOCKER_COMPOSE_COMMAND="docker-compose" DOCKER_COMPOSE_COMMAND="docker-compose"
fi fi
export SERVER_IMAGE_VERSION
export IMAGE_REGISTRY
"${OPENIM_ROOT}"/scripts/init-config.sh "${OPENIM_ROOT}"/scripts/init-config.sh
pushd "${OPENIM_ROOT}" pushd "${OPENIM_ROOT}"
docker build -t "${IMAGE_REGISTRY}/openim-server:${SERVER_IMAGE_VERSION}" .
${DOCKER_COMPOSE_COMMAND} stop ${DOCKER_COMPOSE_COMMAND} stop
curl https://raw.githubusercontent.com/openimsdk/openim-docker/main/docker-compose.yaml -o docker-compose.yml curl "${DOCKER_COMPOSE_FILE_URL}" -o docker-compose.yml
${DOCKER_COMPOSE_COMMAND} up -d ${DOCKER_COMPOSE_COMMAND} up -d
# Function to check container status
check_containers() {
if ! ${DOCKER_COMPOSE_COMMAND} ps | grep -q 'Up'; then
echo "Error: One or more docker containers failed to start."
${DOCKER_COMPOSE_COMMAND} logs openim-server
${DOCKER_COMPOSE_COMMAND} logs openim-chat
return 1
fi
return 0
}
# Wait for a short period to allow containers to initialize # Wait for a short period to allow containers to initialize
sleep 30 sleep 30
# Check the status of the containers
if ! ${DOCKER_COMPOSE_COMMAND} ps | grep -q 'Up'; then
echo "Error: One or more docker containers failed to start."
${DOCKER_COMPOSE_COMMAND} logs
fi
sleep 30 # Keep the original 60-second wait, adjusted for the 10-second check above
${DOCKER_COMPOSE_COMMAND} logs openim-server
${DOCKER_COMPOSE_COMMAND} ps ${DOCKER_COMPOSE_COMMAND} ps
popd check_containers
popd

@ -24,66 +24,66 @@ OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P)
# Start MongoDB service # Start MongoDB service
docker run -d \ docker run -d \
--name mongo \ --name mongo \
-p 37017:27017 \ -p 37017:27017 \
-v "${DATA_DIR}/components/mongodb/data/db:/data/db" \ -v "${DATA_DIR}/components/mongodb/data/db:/data/db" \
-v "${DATA_DIR}/components/mongodb/data/logs:/data/logs" \ -v "${DATA_DIR}/components/mongodb/data/logs:/data/logs" \
-v "${DATA_DIR}/components/mongodb/data/conf:/etc/mongo" \ -v "${DATA_DIR}/components/mongodb/data/conf:/etc/mongo" \
-v "./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro" \ -v "./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro" \
-e TZ=Asia/Shanghai \ -e TZ=Asia/Shanghai \
-e wiredTigerCacheSizeGB=1 \ -e wiredTigerCacheSizeGB=1 \
-e MONGO_INITDB_ROOT_USERNAME=${OPENIM_USER} \ -e MONGO_INITDB_ROOT_USERNAME=${OPENIM_USER} \
-e MONGO_INITDB_ROOT_PASSWORD=${PASSWORD} \ -e MONGO_INITDB_ROOT_PASSWORD=${PASSWORD} \
-e MONGO_INITDB_DATABASE=openIM \ -e MONGO_INITDB_DATABASE=openim_v3 \
-e MONGO_OPENIM_USERNAME=${OPENIM_USER} \ -e MONGO_OPENIM_USERNAME=${OPENIM_USER} \
-e MONGO_OPENIM_PASSWORD=${PASSWORD} \ -e MONGO_OPENIM_PASSWORD=${PASSWORD} \
--restart always \ --restart always \
mongo:6.0.2 --wiredTigerCacheSizeGB 1 --auth mongo:6.0.2 --wiredTigerCacheSizeGB 1 --auth
# Start Redis service # Start Redis service
docker run -d \ docker run -d \
--name redis \ --name redis \
-p 16379:6379 \ -p 16379:6379 \
-v "${DATA_DIR}/components/redis/data:/data" \ -v "${DATA_DIR}/components/redis/data:/data" \
-v "${DATA_DIR}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf" \ -v "${DATA_DIR}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf" \
-e TZ=Asia/Shanghai \ -e TZ=Asia/Shanghai \
--sysctl net.core.somaxconn=1024 \ --sysctl net.core.somaxconn=1024 \
--restart always \ --restart always \
redis:7.0.0 redis-server --requirepass ${PASSWORD} --appendonly yes redis:7.0.0 redis-server --requirepass ${PASSWORD} --appendonly yes
# Start Zookeeper service # Start Zookeeper service
docker run -d \ docker run -d \
--name zookeeper \ --name zookeeper \
-p 2181:2181 \ -p 2181:2181 \
-v "/etc/localtime:/etc/localtime" \ -v "/etc/localtime:/etc/localtime" \
-e TZ=Asia/Shanghai \ -e TZ=Asia/Shanghai \
--restart always \ --restart always \
wurstmeister/zookeeper wurstmeister/zookeeper
# Start Kafka service # Start Kafka service
docker run -d \ docker run -d \
--name kafka \ --name kafka \
-p 9092:9092 \ -p 9092:9092 \
-e TZ=Asia/Shanghai \ -e TZ=Asia/Shanghai \
-e KAFKA_BROKER_ID=0 \ -e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_CREATE_TOPICS="latestMsgToRedis:8:1,msgToPush:8:1,offlineMsgToMongoMysql:8:1" \ -e KAFKA_CREATE_TOPICS="latestMsgToRedis:8:1,msgToPush:8:1,offlineMsgToMongoMysql:8:1" \
-e KAFKA_ADVERTISED_LISTENERS="INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092" \ -e KAFKA_ADVERTISED_LISTENERS="INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092" \
-e KAFKA_LISTENERS="INSIDE://:9092,OUTSIDE://:9093" \ -e KAFKA_LISTENERS="INSIDE://:9092,OUTSIDE://:9093" \
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP="INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT" \ -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP="INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT" \
-e KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE \ -e KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE \
--restart always \ --restart always \
--link zookeeper \ --link zookeeper \
wurstmeister/kafka wurstmeister/kafka
# Start MinIO service # Start MinIO service
docker run -d \ docker run -d \
--name minio \ --name minio \
-p 10005:9000 \ -p 10005:9000 \
-p 9090:9090 \ -p 9090:9090 \
-v "/mnt/data:/data" \ -v "/mnt/data:/data" \
-v "/mnt/config:/root/.minio" \ -v "/mnt/config:/root/.minio" \
-e MINIO_ROOT_USER=${OPENIM_USER} \ -e MINIO_ROOT_USER=${OPENIM_USER} \
-e MINIO_ROOT_PASSWORD=${PASSWORD} \ -e MINIO_ROOT_PASSWORD=${PASSWORD} \
--restart always \ --restart always \
minio/minio server /data --console-address ':9090' minio/minio server /data --console-address ':9090'

@ -22,13 +22,13 @@
OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
# 生成文件存放目录 # 生成文件存放目录
LOCAL_OUTPUT_ROOT=""${OPENIM_ROOT}"/${OUT_DIR:-_output}" LOCAL_OUTPUT_ROOT="${OPENIM_ROOT}/${OUT_DIR:-_output}"
source "${OPENIM_ROOT}/scripts/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
#TODO: Access to the OPENIM_IP networks outside, or you want to use the OPENIM_IP network #TODO: Access to the OPENIM_IP networks outside, or you want to use the OPENIM_IP network
# OPENIM_IP=127.0.0.1 # OPENIM_IP=127.0.0.1
if [ -z "${OPENIM_IP}" ]; then if [ -z "${OPENIM_IP}" ]; then
OPENIM_IP=$(openim::util::get_server_ip) OPENIM_IP=$(openim::util::get_server_ip)
fi fi
# config.gateway custom bridge modes # config.gateway custom bridge modes
@ -37,9 +37,9 @@ fi
# fi # fi
function def() { function def() {
local var_name="$1" local var_name="$1"
local default_value="${2:-}" local default_value="${2:-}"
eval "readonly $var_name=\"\${$var_name:-$(printf '%q' "$default_value")}\"" eval "readonly $var_name=\"\${$var_name:-$(printf '%q' "$default_value")}\""
} }
# OpenIM Docker Compose 数据存储的默认路径 # OpenIM Docker Compose 数据存储的默认路径
@ -52,7 +52,7 @@ def "OPENIM_USER" "root"
readonly PASSWORD=${PASSWORD:-'openIM123'} readonly PASSWORD=${PASSWORD:-'openIM123'}
# 设置统一的数据库名称,方便管理 # 设置统一的数据库名称,方便管理
def "DATABASE_NAME" "openIM_v3" def "DATABASE_NAME" "openim_v3"
# Linux系统 openim 用户 # Linux系统 openim 用户
def "LINUX_USERNAME" "openim" def "LINUX_USERNAME" "openim"
@ -62,7 +62,7 @@ readonly LINUX_PASSWORD=${LINUX_PASSWORD:-"${PASSWORD}"}
def "INSTALL_DIR" "${LOCAL_OUTPUT_ROOT}/installs" def "INSTALL_DIR" "${LOCAL_OUTPUT_ROOT}/installs"
mkdir -p ${INSTALL_DIR} mkdir -p ${INSTALL_DIR}
def "ENV_FILE" ""${OPENIM_ROOT}"/scripts/install/environment.sh" def "ENV_FILE" "${OPENIM_ROOT}/scripts/install/environment.sh"
###################### Docker compose ################### ###################### Docker compose ###################
# OPENIM AND CHAT # OPENIM AND CHAT
@ -89,8 +89,8 @@ SUBNET=$(echo $DOCKER_BRIDGE_SUBNET | cut -d '/' -f 2)
LAST_OCTET=$(echo $IP_PREFIX | cut -d '.' -f 4) LAST_OCTET=$(echo $IP_PREFIX | cut -d '.' -f 4)
generate_ip() { generate_ip() {
local NEW_IP="$(echo $IP_PREFIX | cut -d '.' -f 1-3).$((LAST_OCTET++))" local NEW_IP="$(echo $IP_PREFIX | cut -d '.' -f 1-3).$((LAST_OCTET++))"
echo $NEW_IP echo $NEW_IP
} }
LAST_OCTET=$((LAST_OCTET + 1)) LAST_OCTET=$((LAST_OCTET + 1))
DOCKER_BRIDGE_GATEWAY=$(generate_ip) DOCKER_BRIDGE_GATEWAY=$(generate_ip)
@ -128,7 +128,7 @@ def "OPENIM_CONFIG_DIR" "/etc/openim/config"
def "OPENIM_LOG_DIR" "/var/log/openim" def "OPENIM_LOG_DIR" "/var/log/openim"
def "CA_FILE" "${OPENIM_CONFIG_DIR}/cert/ca.pem" def "CA_FILE" "${OPENIM_CONFIG_DIR}/cert/ca.pem"
def "OPNEIM_CONFIG" ""${OPENIM_ROOT}"/config" def "OPNEIM_CONFIG" "${OPENIM_ROOT}/config"
def "OPENIM_SERVER_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # OpenIM服务地址 def "OPENIM_SERVER_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # OpenIM服务地址
# OpenIM Websocket端口 # OpenIM Websocket端口
@ -171,13 +171,13 @@ def "MONGO_URI" # MongoDB的URI
def "MONGO_PORT" "37017" # MongoDB的端口 def "MONGO_PORT" "37017" # MongoDB的端口
def "MONGO_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # MongoDB的地址 def "MONGO_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # MongoDB的地址
def "MONGO_DATABASE" "${DATABASE_NAME}" # MongoDB的数据库名 def "MONGO_DATABASE" "${DATABASE_NAME}" # MongoDB的数据库名
def "MONGO_USERNAME" "root" # MongoDB的管理员身份用户名 def "MONGO_USERNAME" "root" # MongoDB的管理员身份用户名
# MongoDB的管理员身份密码 # MongoDB的管理员身份密码
readonly MONGO_PASSWORD=${MONGO_PASSWORD:-"${PASSWORD}"} readonly MONGO_PASSWORD=${MONGO_PASSWORD:-"${PASSWORD}"}
# Mongo OpenIM 身份用户名 # Mongo OpenIM 身份用户名
def "MONGO_OPENIM_USERNAME" "openIM" def "MONGO_OPENIM_USERNAME" "openIM"
# Mongo OpenIM 身份密码 # Mongo OpenIM 身份密码
readonly MONGO_OPENIM_PASSWORD=${MONGO_OPENIM_PASSWORD:-'openIM123456'} readonly MONGO_OPENIM_PASSWORD=${MONGO_OPENIM_PASSWORD:-"${PASSWORD}"}
def "MONGO_MAX_POOL_SIZE" "100" # 最大连接池大小 def "MONGO_MAX_POOL_SIZE" "100" # 最大连接池大小
@ -243,8 +243,6 @@ def "KAFKA_CONSUMERGROUPID_PUSH" "push" # `Kafka` 的消费
###################### openim-web 配置信息 ###################### ###################### openim-web 配置信息 ######################
def "OPENIM_WEB_PORT" "11001" # openim-web的端口 def "OPENIM_WEB_PORT" "11001" # openim-web的端口
def "OPENIM_WEB_ADDRESS" "${DOCKER_BRIDGE_GATEWAY}" # openim-web的地址
def "OPENIM_WEB_DIST_PATH" "/app/dist" # openim-web的dist路径
###################### openim-admin-front 配置信息 ###################### ###################### openim-admin-front 配置信息 ######################
def "OPENIM_ADMIN_FRONT_PORT" "11002" # openim-admin-front的端口 def "OPENIM_ADMIN_FRONT_PORT" "11002" # openim-admin-front的端口
@ -326,7 +324,7 @@ def "OPENIM_CONVERSATION_NAME" "Conversation" # OpenIM对话服务名称
def "OPENIM_THIRD_NAME" "Third" # OpenIM第三方服务名称 def "OPENIM_THIRD_NAME" "Third" # OpenIM第三方服务名称
###################### Log Configuration Variables ###################### ###################### Log Configuration Variables ######################
def "LOG_STORAGE_LOCATION" ""${OPENIM_ROOT}"/logs/" # 日志存储位置 def "LOG_STORAGE_LOCATION" "${OPENIM_ROOT}/logs/" # 日志存储位置
def "LOG_ROTATION_TIME" "24" # 日志轮替时间 def "LOG_ROTATION_TIME" "24" # 日志轮替时间
def "LOG_REMAIN_ROTATION_COUNT" "2" # 保留的日志轮替数量 def "LOG_REMAIN_ROTATION_COUNT" "2" # 保留的日志轮替数量
def "LOG_REMAIN_LOG_LEVEL" "6" # 保留的日志级别 def "LOG_REMAIN_LOG_LEVEL" "6" # 保留的日志级别
@ -414,7 +412,7 @@ readonly MSG_TRANSFER_PROM_ADDRESS_PORT=${MSG_TRANSFER_PROM_ADDRESS_PORT:-"${DOC
###################### OpenIM openim-api ###################### ###################### OpenIM openim-api ######################
def "OPENIM_API_HOST" "127.0.0.1" def "OPENIM_API_HOST" "127.0.0.1"
def "OPENIM_API_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-api" # OpenIM openim-api 二进制文件路径 def "OPENIM_API_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-api" # OpenIM openim-api 二进制文件路径
def "OPENIM_API_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-api 配置文件路径 def "OPENIM_API_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-api 配置文件路径
def "OPENIM_API_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-api" # OpenIM openim-api 日志存储路径 def "OPENIM_API_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-api" # OpenIM openim-api 日志存储路径
def "OPENIM_API_LOG_LEVEL" "info" # OpenIM openim-api 日志级别 def "OPENIM_API_LOG_LEVEL" "info" # OpenIM openim-api 日志级别
def "OPENIM_API_LOG_MAX_SIZE" "100" # OpenIM openim-api 日志最大大小MB def "OPENIM_API_LOG_MAX_SIZE" "100" # OpenIM openim-api 日志最大大小MB
@ -426,7 +424,7 @@ def "OPENIM_API_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM openim-ap
###################### OpenIM openim-cmdutils ###################### ###################### OpenIM openim-cmdutils ######################
def "OPENIM_CMDUTILS_HOST" "127.0.0.1" def "OPENIM_CMDUTILS_HOST" "127.0.0.1"
def "OPENIM_CMDUTILS_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-cmdutils" # OpenIM openim-cmdutils 二进制文件路径 def "OPENIM_CMDUTILS_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-cmdutils" # OpenIM openim-cmdutils 二进制文件路径
def "OPENIM_CMDUTILS_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-cmdutils 配置文件路径 def "OPENIM_CMDUTILS_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-cmdutils 配置文件路径
def "OPENIM_CMDUTILS_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-cmdutils" # OpenIM openim-cmdutils 日志存储路径 def "OPENIM_CMDUTILS_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-cmdutils" # OpenIM openim-cmdutils 日志存储路径
def "OPENIM_CMDUTILS_LOG_LEVEL" "info" # OpenIM openim-cmdutils 日志级别 def "OPENIM_CMDUTILS_LOG_LEVEL" "info" # OpenIM openim-cmdutils 日志级别
def "OPENIM_CMDUTILS_LOG_MAX_SIZE" "100" # OpenIM openim-cmdutils 日志最大大小MB def "OPENIM_CMDUTILS_LOG_MAX_SIZE" "100" # OpenIM openim-cmdutils 日志最大大小MB
@ -438,7 +436,7 @@ def "OPENIM_CMDUTILS_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM
###################### OpenIM openim-crontask ###################### ###################### OpenIM openim-crontask ######################
def "OPENIM_CRONTASK_HOST" "127.0.0.1" def "OPENIM_CRONTASK_HOST" "127.0.0.1"
def "OPENIM_CRONTASK_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-crontask" # OpenIM openim-crontask 二进制文件路径 def "OPENIM_CRONTASK_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-crontask" # OpenIM openim-crontask 二进制文件路径
def "OPENIM_CRONTASK_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-crontask 配置文件路径 def "OPENIM_CRONTASK_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-crontask 配置文件路径
def "OPENIM_CRONTASK_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-crontask" # OpenIM openim-crontask 日志存储路径 def "OPENIM_CRONTASK_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-crontask" # OpenIM openim-crontask 日志存储路径
def "OPENIM_CRONTASK_LOG_LEVEL" "info" # OpenIM openim-crontask 日志级别 def "OPENIM_CRONTASK_LOG_LEVEL" "info" # OpenIM openim-crontask 日志级别
def "OPENIM_CRONTASK_LOG_MAX_SIZE" "100" # OpenIM openim-crontask 日志最大大小MB def "OPENIM_CRONTASK_LOG_MAX_SIZE" "100" # OpenIM openim-crontask 日志最大大小MB
@ -450,7 +448,7 @@ def "OPENIM_CRONTASK_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM
###################### OpenIM openim-msggateway ###################### ###################### OpenIM openim-msggateway ######################
def "OPENIM_MSGGATEWAY_HOST" "127.0.0.1" def "OPENIM_MSGGATEWAY_HOST" "127.0.0.1"
def "OPENIM_MSGGATEWAY_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-msggateway" def "OPENIM_MSGGATEWAY_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-msggateway"
def "OPENIM_MSGGATEWAY_CONFIG" ""${OPENIM_ROOT}"/config/" def "OPENIM_MSGGATEWAY_CONFIG" "${OPENIM_ROOT}/config/"
def "OPENIM_MSGGATEWAY_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-msggateway" def "OPENIM_MSGGATEWAY_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-msggateway"
def "OPENIM_MSGGATEWAY_LOG_LEVEL" "info" def "OPENIM_MSGGATEWAY_LOG_LEVEL" "info"
def "OPENIM_MSGGATEWAY_LOG_MAX_SIZE" "100" def "OPENIM_MSGGATEWAY_LOG_MAX_SIZE" "100"
@ -465,7 +463,7 @@ readonly OPENIM_MSGGATEWAY_NUM=${OPENIM_MSGGATEWAY_NUM:-'4'}
###################### OpenIM openim-msgtransfer ###################### ###################### OpenIM openim-msgtransfer ######################
def "OPENIM_MSGTRANSFER_HOST" "127.0.0.1" def "OPENIM_MSGTRANSFER_HOST" "127.0.0.1"
def "OPENIM_MSGTRANSFER_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-msgtransfer" # OpenIM openim-msgtransfer 二进制文件路径 def "OPENIM_MSGTRANSFER_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-msgtransfer" # OpenIM openim-msgtransfer 二进制文件路径
def "OPENIM_MSGTRANSFER_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-msgtransfer 配置文件路径 def "OPENIM_MSGTRANSFER_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-msgtransfer 配置文件路径
def "OPENIM_MSGTRANSFER_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-msgtransfer" # OpenIM openim-msgtransfer 日志存储路径 def "OPENIM_MSGTRANSFER_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-msgtransfer" # OpenIM openim-msgtransfer 日志存储路径
def "OPENIM_MSGTRANSFER_LOG_LEVEL" "info" # OpenIM openim-msgtransfer 日志级别 def "OPENIM_MSGTRANSFER_LOG_LEVEL" "info" # OpenIM openim-msgtransfer 日志级别
def "OPENIM_MSGTRANSFER_LOG_MAX_SIZE" "100" # OpenIM openim-msgtransfer 日志最大大小MB def "OPENIM_MSGTRANSFER_LOG_MAX_SIZE" "100" # OpenIM openim-msgtransfer 日志最大大小MB
@ -477,7 +475,7 @@ def "OPENIM_MSGTRANSFER_LOG_WITH_STACK" "${LOG_WITH_STACK}" #
###################### OpenIM openim-push ###################### ###################### OpenIM openim-push ######################
def "OPENIM_PUSH_HOST" "127.0.0.1" def "OPENIM_PUSH_HOST" "127.0.0.1"
def "OPENIM_PUSH_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-push" # OpenIM openim-push 二进制文件路径 def "OPENIM_PUSH_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-push" # OpenIM openim-push 二进制文件路径
def "OPENIM_PUSH_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-push 配置文件路径 def "OPENIM_PUSH_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-push 配置文件路径
def "OPENIM_PUSH_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-push" # OpenIM openim-push 日志存储路径 def "OPENIM_PUSH_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-push" # OpenIM openim-push 日志存储路径
def "OPENIM_PUSH_LOG_LEVEL" "info" # OpenIM openim-push 日志级别 def "OPENIM_PUSH_LOG_LEVEL" "info" # OpenIM openim-push 日志级别
def "OPENIM_PUSH_LOG_MAX_SIZE" "100" # OpenIM openim-push 日志最大大小MB def "OPENIM_PUSH_LOG_MAX_SIZE" "100" # OpenIM openim-push 日志最大大小MB
@ -489,7 +487,7 @@ def "OPENIM_PUSH_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM openim-
###################### OpenIM openim-rpc-auth ###################### ###################### OpenIM openim-rpc-auth ######################
def "OPENIM_RPC_AUTH_HOST" "127.0.0.1" def "OPENIM_RPC_AUTH_HOST" "127.0.0.1"
def "OPENIM_RPC_AUTH_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-auth" # OpenIM openim-rpc-auth 二进制文件路径 def "OPENIM_RPC_AUTH_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-auth" # OpenIM openim-rpc-auth 二进制文件路径
def "OPENIM_RPC_AUTH_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-auth 配置文件路径 def "OPENIM_RPC_AUTH_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-auth 配置文件路径
def "OPENIM_RPC_AUTH_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-auth" # OpenIM openim-rpc-auth 日志存储路径 def "OPENIM_RPC_AUTH_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-auth" # OpenIM openim-rpc-auth 日志存储路径
def "OPENIM_RPC_AUTH_LOG_LEVEL" "info" # OpenIM openim-rpc-auth 日志级别 def "OPENIM_RPC_AUTH_LOG_LEVEL" "info" # OpenIM openim-rpc-auth 日志级别
def "OPENIM_RPC_AUTH_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-auth 日志最大大小MB def "OPENIM_RPC_AUTH_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-auth 日志最大大小MB
@ -501,7 +499,7 @@ def "OPENIM_RPC_AUTH_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM
###################### OpenIM openim-rpc-conversation ###################### ###################### OpenIM openim-rpc-conversation ######################
def "OPENIM_RPC_CONVERSATION_HOST" "127.0.0.1" def "OPENIM_RPC_CONVERSATION_HOST" "127.0.0.1"
def "OPENIM_RPC_CONVERSATION_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-conversation" # OpenIM openim-rpc-conversation 二进制文件路径 def "OPENIM_RPC_CONVERSATION_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-conversation" # OpenIM openim-rpc-conversation 二进制文件路径
def "OPENIM_RPC_CONVERSATION_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-conversation 配置文件路径 def "OPENIM_RPC_CONVERSATION_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-conversation 配置文件路径
def "OPENIM_RPC_CONVERSATION_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-conversation" # OpenIM openim-rpc-conversation 日志存储路径 def "OPENIM_RPC_CONVERSATION_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-conversation" # OpenIM openim-rpc-conversation 日志存储路径
def "OPENIM_RPC_CONVERSATION_LOG_LEVEL" "info" # OpenIM openim-rpc-conversation 日志级别 def "OPENIM_RPC_CONVERSATION_LOG_LEVEL" "info" # OpenIM openim-rpc-conversation 日志级别
def "OPENIM_RPC_CONVERSATION_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-conversation 日志最大大小MB def "OPENIM_RPC_CONVERSATION_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-conversation 日志最大大小MB
@ -513,7 +511,7 @@ def "OPENIM_RPC_CONVERSATION_LOG_WITH_STACK" "${LOG_WITH_STACK}"
###################### OpenIM openim-rpc-friend ###################### ###################### OpenIM openim-rpc-friend ######################
def "OPENIM_RPC_FRIEND_HOST" "127.0.0.1" def "OPENIM_RPC_FRIEND_HOST" "127.0.0.1"
def "OPENIM_RPC_FRIEND_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-friend" # OpenIM openim-rpc-friend 二进制文件路径 def "OPENIM_RPC_FRIEND_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-friend" # OpenIM openim-rpc-friend 二进制文件路径
def "OPENIM_RPC_FRIEND_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-friend 配置文件路径 def "OPENIM_RPC_FRIEND_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-friend 配置文件路径
def "OPENIM_RPC_FRIEND_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-friend" # OpenIM openim-rpc-friend 日志存储路径 def "OPENIM_RPC_FRIEND_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-friend" # OpenIM openim-rpc-friend 日志存储路径
def "OPENIM_RPC_FRIEND_LOG_LEVEL" "info" # OpenIM openim-rpc-friend 日志级别 def "OPENIM_RPC_FRIEND_LOG_LEVEL" "info" # OpenIM openim-rpc-friend 日志级别
def "OPENIM_RPC_FRIEND_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-friend 日志最大大小MB def "OPENIM_RPC_FRIEND_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-friend 日志最大大小MB
@ -525,7 +523,7 @@ def "OPENIM_RPC_FRIEND_LOG_WITH_STACK" "${LOG_WITH_STACK}" # Op
###################### OpenIM openim-rpc-group ###################### ###################### OpenIM openim-rpc-group ######################
def "OPENIM_RPC_GROUP_HOST" "127.0.0.1" def "OPENIM_RPC_GROUP_HOST" "127.0.0.1"
def "OPENIM_RPC_GROUP_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-group" # OpenIM openim-rpc-group 二进制文件路径 def "OPENIM_RPC_GROUP_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-group" # OpenIM openim-rpc-group 二进制文件路径
def "OPENIM_RPC_GROUP_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-group 配置文件路径 def "OPENIM_RPC_GROUP_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-group 配置文件路径
def "OPENIM_RPC_GROUP_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-group" # OpenIM openim-rpc-group 日志存储路径 def "OPENIM_RPC_GROUP_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-group" # OpenIM openim-rpc-group 日志存储路径
def "OPENIM_RPC_GROUP_LOG_LEVEL" "info" # OpenIM openim-rpc-group 日志级别 def "OPENIM_RPC_GROUP_LOG_LEVEL" "info" # OpenIM openim-rpc-group 日志级别
def "OPENIM_RPC_GROUP_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-group 日志最大大小MB def "OPENIM_RPC_GROUP_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-group 日志最大大小MB
@ -537,7 +535,7 @@ def "OPENIM_RPC_GROUP_LOG_WITH_STACK" "${LOG_WITH_STACK}" # Open
###################### OpenIM openim-rpc-msg ###################### ###################### OpenIM openim-rpc-msg ######################
def "OPENIM_RPC_MSG_HOST" "127.0.0.1" def "OPENIM_RPC_MSG_HOST" "127.0.0.1"
def "OPENIM_RPC_MSG_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-msg" # OpenIM openim-rpc-msg 二进制文件路径 def "OPENIM_RPC_MSG_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-msg" # OpenIM openim-rpc-msg 二进制文件路径
def "OPENIM_RPC_MSG_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-msg 配置文件路径 def "OPENIM_RPC_MSG_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-msg 配置文件路径
def "OPENIM_RPC_MSG_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-msg" # OpenIM openim-rpc-msg 日志存储路径 def "OPENIM_RPC_MSG_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-msg" # OpenIM openim-rpc-msg 日志存储路径
def "OPENIM_RPC_MSG_LOG_LEVEL" "info" # OpenIM openim-rpc-msg 日志级别 def "OPENIM_RPC_MSG_LOG_LEVEL" "info" # OpenIM openim-rpc-msg 日志级别
def "OPENIM_RPC_MSG_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-msg 日志最大大小MB def "OPENIM_RPC_MSG_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-msg 日志最大大小MB
@ -549,7 +547,7 @@ def "OPENIM_RPC_MSG_LOG_WITH_STACK" "${LOG_WITH_STACK}" # OpenIM o
###################### OpenIM openim-rpc-third ###################### ###################### OpenIM openim-rpc-third ######################
def "OPENIM_RPC_THIRD_HOST" "127.0.0.1" def "OPENIM_RPC_THIRD_HOST" "127.0.0.1"
def "OPENIM_RPC_THIRD_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-third" # OpenIM openim-rpc-third 二进制文件路径 def "OPENIM_RPC_THIRD_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-third" # OpenIM openim-rpc-third 二进制文件路径
def "OPENIM_RPC_THIRD_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-third 配置文件路径 def "OPENIM_RPC_THIRD_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-third 配置文件路径
def "OPENIM_RPC_THIRD_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-third" # OpenIM openim-rpc-third 日志存储路径 def "OPENIM_RPC_THIRD_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-third" # OpenIM openim-rpc-third 日志存储路径
def "OPENIM_RPC_THIRD_LOG_LEVEL" "info" # OpenIM openim-rpc-third 日志级别 def "OPENIM_RPC_THIRD_LOG_LEVEL" "info" # OpenIM openim-rpc-third 日志级别
def "OPENIM_RPC_THIRD_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-third 日志最大大小MB def "OPENIM_RPC_THIRD_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-third 日志最大大小MB
@ -561,7 +559,7 @@ def "OPENIM_RPC_THIRD_LOG_WITH_STACK" "${LOG_WITH_STACK}" # Open
###################### OpenIM openim-rpc-user ###################### ###################### OpenIM openim-rpc-user ######################
def "OPENIM_RPC_USER_HOST" "127.0.0.1" def "OPENIM_RPC_USER_HOST" "127.0.0.1"
def "OPENIM_RPC_USER_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-user" # OpenIM openim-rpc-user 二进制文件路径 def "OPENIM_RPC_USER_BINARY" "${OPENIM_OUTPUT_HOSTBIN}/openim-rpc-user" # OpenIM openim-rpc-user 二进制文件路径
def "OPENIM_RPC_USER_CONFIG" ""${OPENIM_ROOT}"/config/" # OpenIM openim-rpc-user 配置文件路径 def "OPENIM_RPC_USER_CONFIG" "${OPENIM_ROOT}/config/" # OpenIM openim-rpc-user 配置文件路径
def "OPENIM_RPC_USER_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-user" # OpenIM openim-rpc-user 日志存储路径 def "OPENIM_RPC_USER_LOG_DIR" "${LOG_STORAGE_LOCATION}/openim-rpc-user" # OpenIM openim-rpc-user 日志存储路径
def "OPENIM_RPC_USER_LOG_LEVEL" "info" # OpenIM openim-rpc-user 日志级别 def "OPENIM_RPC_USER_LOG_LEVEL" "info" # OpenIM openim-rpc-user 日志级别
def "OPENIM_RPC_USER_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-user 日志最大大小MB def "OPENIM_RPC_USER_LOG_MAX_SIZE" "100" # OpenIM openim-rpc-user 日志最大大小MB

@ -21,17 +21,17 @@
# This tool is customized to meet the specific needs of OpenIM and resides in its separate repository. # This tool is customized to meet the specific needs of OpenIM and resides in its separate repository.
# It can be downloaded from the following link: # It can be downloaded from the following link:
# https://github.com/OpenIMSDK/Open-IM-Protoc/releases/tag/v1.0.0 # https://github.com/OpenIMSDK/Open-IM-Protoc/releases/tag/v1.0.0
# #
# About the tool: # About the tool:
# https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md # https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md
# Download link (Windows): https://github.com/OpenIMSDK/Open-IM-Protoc/releases/download/v1.0.0/windows.zip # Download link (Windows): https://github.com/OpenIMSDK/Open-IM-Protoc/releases/download/v1.0.0/windows.zip
# Download link (Linux): https://github.com/OpenIMSDK/Open-IM-Protoc/releases/download/v1.0.0/linux.zip # Download link (Linux): https://github.com/OpenIMSDK/Open-IM-Protoc/releases/download/v1.0.0/linux.zip
# #
# Installation steps (taking Windows as an example): # Installation steps (taking Windows as an example):
# 1. Visit the above link and download the version suitable for Windows. # 1. Visit the above link and download the version suitable for Windows.
# 2. Extract the downloaded file. # 2. Extract the downloaded file.
# 3. Add the extracted tool to your PATH environment variable so that it can be run directly from the command line. # 3. Add the extracted tool to your PATH environment variable so that it can be run directly from the command line.
# #
# Note: The specific installation and usage instructions may vary based on the tool's actual implementation. It's advised to refer to official documentation. # Note: The specific installation and usage instructions may vary based on the tool's actual implementation. It's advised to refer to official documentation.
# -------------------------------------------------------------- # --------------------------------------------------------------
@ -40,79 +40,79 @@ DOWNLOAD_DIR="/tmp/openim-protoc"
INSTALL_DIR="/usr/local/bin" INSTALL_DIR="/usr/local/bin"
function help_message { function help_message {
echo "Usage: ./install-protobuf.sh [option]" echo "Usage: ./install-protobuf.sh [option]"
echo "Options:" echo "Options:"
echo "-i, --install Install the OpenIM Protoc tool." echo "-i, --install Install the OpenIM Protoc tool."
echo "-u, --uninstall Uninstall the OpenIM Protoc tool." echo "-u, --uninstall Uninstall the OpenIM Protoc tool."
echo "-r, --reinstall Reinstall the OpenIM Protoc tool." echo "-r, --reinstall Reinstall the OpenIM Protoc tool."
echo "-c, --check Check if the OpenIM Protoc tool is installed." echo "-c, --check Check if the OpenIM Protoc tool is installed."
echo "-h, --help Display this help message." echo "-h, --help Display this help message."
} }
function install_protobuf { function install_protobuf {
echo "Installing OpenIM Protoc tool..." echo "Installing OpenIM Protoc tool..."
# Create temporary directory and download the zip file # Create temporary directory and download the zip file
mkdir -p $DOWNLOAD_DIR mkdir -p $DOWNLOAD_DIR
wget $PROTOC_DOWNLOAD_URL -O $DOWNLOAD_DIR/linux.zip wget $PROTOC_DOWNLOAD_URL -O $DOWNLOAD_DIR/linux.zip
# Unzip the file # Unzip the file
unzip -o $DOWNLOAD_DIR/linux.zip -d $DOWNLOAD_DIR unzip -o $DOWNLOAD_DIR/linux.zip -d $DOWNLOAD_DIR
# Move binaries to the install directory and make them executable # Move binaries to the install directory and make them executable
sudo cp $DOWNLOAD_DIR/linux/protoc $INSTALL_DIR/ sudo cp $DOWNLOAD_DIR/linux/protoc $INSTALL_DIR/
sudo cp $DOWNLOAD_DIR/linux/protoc-gen-go $INSTALL_DIR/ sudo cp $DOWNLOAD_DIR/linux/protoc-gen-go $INSTALL_DIR/
sudo chmod +x $INSTALL_DIR/protoc sudo chmod +x $INSTALL_DIR/protoc
sudo chmod +x $INSTALL_DIR/protoc-gen-go sudo chmod +x $INSTALL_DIR/protoc-gen-go
# Clean up # Clean up
rm -rf $DOWNLOAD_DIR rm -rf $DOWNLOAD_DIR
echo "OpenIM Protoc tool installed successfully!" echo "OpenIM Protoc tool installed successfully!"
} }
function uninstall_protobuf { function uninstall_protobuf {
echo "Uninstalling OpenIM Protoc tool..." echo "Uninstalling OpenIM Protoc tool..."
# Removing binaries from the install directory # Removing binaries from the install directory
sudo rm -f $INSTALL_DIR/protoc sudo rm -f $INSTALL_DIR/protoc
sudo rm -f $INSTALL_DIR/protoc-gen-go sudo rm -f $INSTALL_DIR/protoc-gen-go
echo "OpenIM Protoc tool uninstalled successfully!" echo "OpenIM Protoc tool uninstalled successfully!"
} }
function reinstall_protobuf { function reinstall_protobuf {
echo "Reinstalling OpenIM Protoc tool..." echo "Reinstalling OpenIM Protoc tool..."
uninstall_protobuf uninstall_protobuf
install_protobuf install_protobuf
} }
function check_protobuf { function check_protobuf {
echo "Checking for OpenIM Protoc tool installation..." echo "Checking for OpenIM Protoc tool installation..."
which protoc > /dev/null 2>&1 which protoc > /dev/null 2>&1
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "OpenIM Protoc tool is installed." echo "OpenIM Protoc tool is installed."
else else
echo "OpenIM Protoc tool is not installed." echo "OpenIM Protoc tool is not installed."
fi fi
} }
while [ "$1" != "" ]; do while [ "$1" != "" ]; do
case $1 in case $1 in
-i | --install ) install_protobuf -i | --install ) install_protobuf
;; ;;
-u | --uninstall ) uninstall_protobuf -u | --uninstall ) uninstall_protobuf
;; ;;
-r | --reinstall ) reinstall_protobuf -r | --reinstall ) reinstall_protobuf
;; ;;
-c | --check ) check_protobuf -c | --check ) check_protobuf
;; ;;
-h | --help ) help_message -h | --help ) help_message
exit exit
;; ;;
* ) help_message * ) help_message
exit 1 exit 1
esac esac
shift shift
done done

@ -14,38 +14,38 @@
# limitations under the License. # limitations under the License.
# #
# OpenIM Server Installation Script # OpenIM Server Installation Script
# #
# Description: # Description:
# This script is designed to handle the installation, Is a deployment solution # This script is designed to handle the installation, Is a deployment solution
# that uses the Linux systen extension. uninstallation, and # that uses the Linux systen extension. uninstallation, and
# status checking of OpenIM components on the server. OpenIM is a presumed # status checking of OpenIM components on the server. OpenIM is a presumed
# communication or messaging platform based on the context. # communication or messaging platform based on the context.
# #
# Usage: # Usage:
# To utilize this script, you need to invoke it with specific commands # To utilize this script, you need to invoke it with specific commands
# and options as detailed below. # and options as detailed below.
# #
# Commands: # Commands:
# -i, --install : Use this command to initiate the installation of all # -i, --install : Use this command to initiate the installation of all
# OpenIM components. # OpenIM components.
# -u, --uninstall : Use this command to uninstall or remove all # -u, --uninstall : Use this command to uninstall or remove all
# OpenIM components from the server. # OpenIM components from the server.
# -s, --status : This command can be used to check and report the # -s, --status : This command can be used to check and report the
# current operational status of the installed OpenIM components. # current operational status of the installed OpenIM components.
# -h, --help : For any assistance or to view the available commands, # -h, --help : For any assistance or to view the available commands,
# use this command to display the help menu. # use this command to display the help menu.
# #
# Example Usage: # Example Usage:
# To install all OpenIM components: # To install all OpenIM components:
# ./scripts/install/install.sh -i # ./scripts/install/install.sh -i
# or # or
# ./scripts/install/install.sh --install # ./scripts/install/install.sh --install
# #
# Note: # Note:
# Ensure you have the necessary privileges to execute installation or # Ensure you have the necessary privileges to execute installation or
# uninstallation operations. It's generally recommended to take a backup # uninstallation operations. It's generally recommended to take a backup
# before making major changes. # before making major changes.
# #
############################################################################### ###############################################################################
OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P) OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P)
@ -57,99 +57,99 @@ ${OPENIM_ROOT}/scripts/install/test.sh
# Detailed help function # Detailed help function
function openim::install::show_help() { function openim::install::show_help() {
echo "OpenIM Installer" echo "OpenIM Installer"
echo "Usage: $0 <command> [options]" echo "Usage: $0 <command> [options]"
echo "" echo ""
echo "Commands:" echo "Commands:"
echo " -i, --install Install all OpenIM components." echo " -i, --install Install all OpenIM components."
echo " -u, --uninstall Remove all OpenIM components." echo " -u, --uninstall Remove all OpenIM components."
echo " -s, --status Check the current status of OpenIM components." echo " -s, --status Check the current status of OpenIM components."
echo " -h, --help Show this help menu." echo " -h, --help Show this help menu."
echo "" echo ""
echo "Example: " echo "Example: "
echo " $0 -i Will install all OpenIM components." echo " $0 -i Will install all OpenIM components."
echo " $0 --install Same as above." echo " $0 --install Same as above."
} }
function openim::install::install_openim() { function openim::install::install_openim() {
openim::common::sudo "mkdir -p ${OPENIM_DATA_DIR} ${OPENIM_INSTALL_DIR} ${OPENIM_CONFIG_DIR} ${OPENIM_LOG_DIR}" openim::common::sudo "mkdir -p ${OPENIM_DATA_DIR} ${OPENIM_INSTALL_DIR} ${OPENIM_CONFIG_DIR} ${OPENIM_LOG_DIR}"
openim::log::info "check openim dependency" openim::log::info "check openim dependency"
openim::common::sudo "cp -r ${OPENIM_ROOT}/config/* ${OPENIM_CONFIG_DIR}/" openim::common::sudo "cp -r ${OPENIM_ROOT}/config/* ${OPENIM_CONFIG_DIR}/"
${OPENIM_ROOT}/scripts/genconfig.sh ${ENV_FILE} ${OPENIM_ROOT}/deployments/templates/openim.yaml > ${OPENIM_CONFIG_DIR}/config.yaml ${OPENIM_ROOT}/scripts/genconfig.sh ${ENV_FILE} ${OPENIM_ROOT}/deployments/templates/config.yaml > ${OPENIM_CONFIG_DIR}/config.yaml
${OPENIM_ROOT}/scripts/genconfig.sh ${ENV_FILE} ${OPENIM_ROOT}/deployments/templates/prometheus.yml > ${OPENIM_CONFIG_DIR}/prometheus.yml ${OPENIM_ROOT}/scripts/genconfig.sh ${ENV_FILE} ${OPENIM_ROOT}/deployments/templates/prometheus.yml > ${OPENIM_CONFIG_DIR}/prometheus.yml
openim::util::check_ports ${OPENIM_DEPENDENCY_PORT_LISTARIES[@]} openim::util::check_ports ${OPENIM_DEPENDENCY_PORT_LISTARIES[@]}
${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::install || return 1
${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::install || return 1
${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::install || return 1
${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::install || return 1
${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::install || return 1
${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::install || return 1 ${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::install || return 1
openim::common::sudo "cp -r ${OPENIM_ROOT}/deployments/templates/openim.target /etc/systemd/system/openim.target" openim::common::sudo "cp -r ${OPENIM_ROOT}/deployments/templates/openim.target /etc/systemd/system/openim.target"
openim::common::sudo "systemctl daemon-reload" openim::common::sudo "systemctl daemon-reload"
openim::common::sudo "systemctl restart openim.target" openim::common::sudo "systemctl restart openim.target"
openim::common::sudo "systemctl enable openim.target" openim::common::sudo "systemctl enable openim.target"
openim::log::success "openim install success" openim::log::success "openim install success"
} }
function openim::uninstall::uninstall_openim() { function openim::uninstall::uninstall_openim() {
openim::log::info "uninstall openim" openim::log::info "uninstall openim"
${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::uninstall || return 1
${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::uninstall || return 1
${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::uninstall || return 1
${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::uninstall || return 1
${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::uninstall || return 1
${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::uninstall || return 1 ${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::uninstall || return 1
set +o errexit set +o errexit
openim::common::sudo "systemctl stop openim.target" openim::common::sudo "systemctl stop openim.target"
openim::common::sudo "systemctl disable openim.target" openim::common::sudo "systemctl disable openim.target"
openim::common::sudo "rm -f /etc/systemd/system/openim.target" openim::common::sudo "rm -f /etc/systemd/system/openim.target"
set -o errexit set -o errexit
openim::log::success "openim uninstall success" openim::log::success "openim uninstall success"
} }
function openim::install::status() { function openim::install::status() {
openim::log::info "check openim status" openim::log::info "check openim status"
${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-msggateway.sh openim::msggateway::status || return 1
${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-msgtransfer.sh openim::msgtransfer::status || return 1
${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-push.sh openim::push::status || return 1
${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-crontask.sh openim::crontask::status || return 1
${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-rpc.sh openim::rpc::status || return 1
${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::status || return 1 ${OPENIM_ROOT}/scripts/install/openim-api.sh openim::api::status || return 1
openim::log::success "openim status success" openim::log::success "openim status success"
} }
# If no arguments are provided, show help # If no arguments are provided, show help
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
openim::install::show_help openim::install::show_help
exit 0 exit 0
fi fi
# Argument parsing to call functions based on user input # Argument parsing to call functions based on user input
while (( "$#" )); do while (( "$#" )); do
case "$1" in case "$1" in
-i|--install) -i|--install)
openim::install::install_openim openim::install::install_openim
shift shift
;; ;;
-u|--uninstall) -u|--uninstall)
openim::uninstall::uninstall_openim openim::uninstall::uninstall_openim
shift shift
;; ;;
-s|--status) -s|--status)
openim::install::status openim::install::status
shift shift
;; ;;
-h|--help|*) -h|--help|*)
openim::install::show_help openim::install::show_help
exit 0 exit 0
;; ;;
esac esac
done done

@ -34,55 +34,55 @@ readonly OPENIM_API_SERVICE_TARGETS=(
readonly OPENIM_API_SERVICE_LISTARIES=("${OPENIM_API_SERVICE_TARGETS[@]##*/}") readonly OPENIM_API_SERVICE_LISTARIES=("${OPENIM_API_SERVICE_TARGETS[@]##*/}")
function openim::api::start() { function openim::api::start() {
echo "++ OPENIM_API_SERVICE_LISTARIES: ${OPENIM_API_SERVICE_LISTARIES[@]}" echo "++ OPENIM_API_SERVICE_LISTARIES: ${OPENIM_API_SERVICE_LISTARIES[@]}"
echo "++ OPENIM_API_PORT_LISTARIES: ${OPENIM_API_PORT_LISTARIES[@]}" echo "++ OPENIM_API_PORT_LISTARIES: ${OPENIM_API_PORT_LISTARIES[@]}"
echo "++ OpenIM API config path: ${OPENIM_API_CONFIG}" echo "++ OpenIM API config path: ${OPENIM_API_CONFIG}"
openim::log::info "Starting ${SERVER_NAME} ..." openim::log::info "Starting ${SERVER_NAME} ..."
printf "+------------------------+--------------+\n" printf "+------------------------+--------------+\n"
printf "| Service Name | Port |\n" printf "| Service Name | Port |\n"
printf "+------------------------+--------------+\n" printf "+------------------------+--------------+\n"
length=${#OPENIM_API_SERVICE_LISTARIES[@]} length=${#OPENIM_API_SERVICE_LISTARIES[@]}
for ((i=0; i<$length; i++)); do for ((i=0; i<$length; i++)); do
printf "| %-22s | %6s |\n" "${OPENIM_API_SERVICE_LISTARIES[$i]}" "${OPENIM_API_PORT_LISTARIES[$i]}" printf "| %-22s | %6s |\n" "${OPENIM_API_SERVICE_LISTARIES[$i]}" "${OPENIM_API_PORT_LISTARIES[$i]}"
printf "+------------------------+--------------+\n" printf "+------------------------+--------------+\n"
done done
# start all api services # start all api services
for ((i = 0; i < ${#OPENIM_API_SERVICE_LISTARIES[*]}; i++)); do for ((i = 0; i < ${#OPENIM_API_SERVICE_LISTARIES[*]}; i++)); do
openim::util::stop_services_on_ports ${OPENIM_API_PORT_LISTARIES[$i]} openim::util::stop_services_on_ports ${OPENIM_API_PORT_LISTARIES[$i]}
openim::log::info "OpenIM ${OPENIM_API_SERVICE_LISTARIES[$i]} config path: ${OPENIM_API_CONFIG}" openim::log::info "OpenIM ${OPENIM_API_SERVICE_LISTARIES[$i]} config path: ${OPENIM_API_CONFIG}"
# Get the service and Prometheus ports. # Get the service and Prometheus ports.
OPENIM_API_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_API_PORT_LISTARIES[$i]}) ) OPENIM_API_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_API_PORT_LISTARIES[$i]}) )
# TODO Only one port is supported. An error occurs on multiple ports # TODO Only one port is supported. An error occurs on multiple ports
if [ ${#OPENIM_API_SERVICE_PORTS[@]} -ne 1 ]; then if [ ${#OPENIM_API_SERVICE_PORTS[@]} -ne 1 ]; then
openim::log::error_exit "Set only one port for ${OPENIM_API_SERVICE_LISTARIES[$i]} service." openim::log::error_exit "Set only one port for ${OPENIM_API_SERVICE_LISTARIES[$i]} service."
fi fi
for ((j = 0; j < ${#OPENIM_API_SERVICE_PORTS[@]}; j++)); do for ((j = 0; j < ${#OPENIM_API_SERVICE_PORTS[@]}; j++)); do
openim::log::info "Starting ${OPENIM_API_SERVICE_LISTARIES[$i]} service, port: ${OPENIM_API_SERVICE_PORTS[j]}, binary root: ${OPENIM_OUTPUT_HOSTBIN}/${OPENIM_API_SERVICE_LISTARIES[$i]}" openim::log::info "Starting ${OPENIM_API_SERVICE_LISTARIES[$i]} service, port: ${OPENIM_API_SERVICE_PORTS[j]}, binary root: ${OPENIM_OUTPUT_HOSTBIN}/${OPENIM_API_SERVICE_LISTARIES[$i]}"
openim::api::start_service "${OPENIM_API_SERVICE_LISTARIES[$i]}" "${OPENIM_API_PORT_LISTARIES[j]}" openim::api::start_service "${OPENIM_API_SERVICE_LISTARIES[$i]}" "${OPENIM_API_PORT_LISTARIES[j]}"
sleep 2 sleep 2
done
done done
done
OPENIM_API_PORT_STRINGARIES=( $(openim::util::list-to-string ${OPENIM_API_PORT_LISTARIES[@]}) )
openim::util::check_ports ${OPENIM_API_PORT_STRINGARIES[@]} OPENIM_API_PORT_STRINGARIES=( $(openim::util::list-to-string ${OPENIM_API_PORT_LISTARIES[@]}) )
openim::util::check_ports ${OPENIM_API_PORT_STRINGARIES[@]}
} }
function openim::api::start_service() { function openim::api::start_service() {
local binary_name="$1" local binary_name="$1"
local service_port="$2" local service_port="$2"
local prometheus_port="$3" local prometheus_port="$3"
local cmd="${OPENIM_OUTPUT_HOSTBIN}/${binary_name} --port ${service_port} -c ${OPENIM_API_CONFIG}" local cmd="${OPENIM_OUTPUT_HOSTBIN}/${binary_name} --port ${service_port} -c ${OPENIM_API_CONFIG}"
nohup ${cmd} >> "${LOG_FILE}" 2>&1 & nohup ${cmd} >> "${LOG_FILE}" 2>&1 &
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
openim::log::error_exit "Failed to start ${binary_name} on port ${service_port}." openim::log::error_exit "Failed to start ${binary_name} on port ${service_port}."
fi fi
@ -100,61 +100,61 @@ EOF
# install openim-api # install openim-api
function openim::api::install() { function openim::api::install() {
openim::log::info "Installing ${SERVER_NAME} ..." openim::log::info "Installing ${SERVER_NAME} ..."
pushd "${OPENIM_ROOT}" pushd "${OPENIM_ROOT}"
# 1. Build openim-api # 1. Build openim-api
make build BINS=${SERVER_NAME} make build BINS=${SERVER_NAME}
openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}" openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}"
openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}" openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}"
# 2. Generate and install the openim-api configuration file (config) # 2. Generate and install the openim-api configuration file (config)
openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml" openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml"
# 3. Create and install the ${SERVER_NAME} systemd unit file # 3. Create and install the ${SERVER_NAME} systemd unit file
echo ${LINUX_PASSWORD} | sudo -S bash -c \ echo ${LINUX_PASSWORD} | sudo -S bash -c \
"SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}" "SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}"
openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}" openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}"
# 4. Start the openim-api service # 4. Start the openim-api service
openim::common::sudo "systemctl daemon-reload" openim::common::sudo "systemctl daemon-reload"
openim::common::sudo "systemctl restart ${SERVER_NAME}" openim::common::sudo "systemctl restart ${SERVER_NAME}"
openim::common::sudo "systemctl enable ${SERVER_NAME}" openim::common::sudo "systemctl enable ${SERVER_NAME}"
openim::api::status || return 1 openim::api::status || return 1
openim::api::info openim::api::info
openim::log::info "install ${SERVER_NAME} successfully" openim::log::info "install ${SERVER_NAME} successfully"
popd popd
} }
# Unload # Unload
function openim::api::uninstall() { function openim::api::uninstall() {
openim::log::info "Uninstalling ${SERVER_NAME} ..." openim::log::info "Uninstalling ${SERVER_NAME} ..."
set +o errexit set +o errexit
openim::common::sudo "systemctl stop ${SERVER_NAME}" openim::common::sudo "systemctl stop ${SERVER_NAME}"
openim::common::sudo "systemctl disable ${SERVER_NAME}" openim::common::sudo "systemctl disable ${SERVER_NAME}"
openim::common::sudo "rm -f ${OPENIM_INSTALL_DIR}/${SERVER_NAME}" openim::common::sudo "rm -f ${OPENIM_INSTALL_DIR}/${SERVER_NAME}"
openim::common::sudo "rm -f ${OPENIM_CONFIG_DIR}/${SERVER_NAME}.yaml" openim::common::sudo "rm -f ${OPENIM_CONFIG_DIR}/${SERVER_NAME}.yaml"
openim::common::sudo "rm -f /etc/systemd/system/${SERVER_NAME}.service" openim::common::sudo "rm -f /etc/systemd/system/${SERVER_NAME}.service"
set -o errexit set -o errexit
openim::log::info "uninstall ${SERVER_NAME} successfully" openim::log::info "uninstall ${SERVER_NAME} successfully"
} }
# Status Check # Status Check
function openim::api::status() { function openim::api::status() {
openim::log::info "Checking ${SERVER_NAME} status ..." openim::log::info "Checking ${SERVER_NAME} status ..."
# Check the running status of the ${SERVER_NAME}. If active (running) is displayed, the ${SERVER_NAME} is started successfully. # Check the running status of the ${SERVER_NAME}. If active (running) is displayed, the ${SERVER_NAME} is started successfully.
systemctl status ${SERVER_NAME}|grep -q 'active' || { systemctl status ${SERVER_NAME}|grep -q 'active' || {
openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly" openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly"
return 1 return 1
} }
openim::util::check_ports ${OPENIM_API_PORT_LISTARIES[@]} openim::util::check_ports ${OPENIM_API_PORT_LISTARIES[@]}
} }
if [[ "$*" =~ openim::api:: ]];then if [[ "$*" =~ openim::api:: ]];then
eval $* eval $*
fi fi

@ -13,12 +13,12 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# OpenIM CronTask Control Script # OpenIM CronTask Control Script
# #
# Description: # Description:
# This script provides a control interface for the OpenIM CronTask service within a Linux environment. It supports two installation methods: installation via function calls to systemctl, and direct installation through background processes. # This script provides a control interface for the OpenIM CronTask service within a Linux environment. It supports two installation methods: installation via function calls to systemctl, and direct installation through background processes.
# #
# Features: # Features:
# 1. Robust error handling leveraging Bash built-ins such as 'errexit', 'nounset', and 'pipefail'. # 1. Robust error handling leveraging Bash built-ins such as 'errexit', 'nounset', and 'pipefail'.
# 2. Capability to source common utility functions and configurations, ensuring environmental consistency. # 2. Capability to source common utility functions and configurations, ensuring environmental consistency.
@ -30,13 +30,13 @@
# 1. Direct Script Execution: # 1. Direct Script Execution:
# This will start the OpenIM CronTask directly through a background process. # This will start the OpenIM CronTask directly through a background process.
# Example: ./openim-crontask.sh openim::crontask::start # Example: ./openim-crontask.sh openim::crontask::start
# #
# 2. Controlling through Functions for systemctl operations: # 2. Controlling through Functions for systemctl operations:
# Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script. # Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script.
# Example: ./openim-crontask.sh openim::crontask::install # Example: ./openim-crontask.sh openim::crontask::install
# #
# Note: Ensure that the appropriate permissions and environmental variables are set prior to script execution. # Note: Ensure that the appropriate permissions and environmental variables are set prior to script execution.
# #
OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P) OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P)
[[ -z ${COMMON_SOURCED} ]] && source "${OPENIM_ROOT}"/scripts/install/common.sh [[ -z ${COMMON_SOURCED} ]] && source "${OPENIM_ROOT}"/scripts/install/common.sh
@ -44,14 +44,14 @@ OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P)
SERVER_NAME="openim-crontask" SERVER_NAME="openim-crontask"
function openim::crontask::start() { function openim::crontask::start() {
openim::log::info "Start OpenIM Cron, binary root: ${SERVER_NAME}" openim::log::info "Start OpenIM Cron, binary root: ${SERVER_NAME}"
openim::log::status "Start OpenIM Cron, path: ${OPENIM_CRONTASK_BINARY}" openim::log::status "Start OpenIM Cron, path: ${OPENIM_CRONTASK_BINARY}"
openim::util::stop_services_with_name ${OPENIM_CRONTASK_BINARY} openim::util::stop_services_with_name ${OPENIM_CRONTASK_BINARY}
openim::log::status "start cron_task process, path: ${OPENIM_CRONTASK_BINARY}" openim::log::status "start cron_task process, path: ${OPENIM_CRONTASK_BINARY}"
nohup ${OPENIM_CRONTASK_BINARY} -c ${OPENIM_PUSH_CONFIG} >> ${LOG_FILE} 2>&1 & nohup ${OPENIM_CRONTASK_BINARY} -c ${OPENIM_PUSH_CONFIG} >> ${LOG_FILE} 2>&1 &
openim::util::check_process_names ${SERVER_NAME} openim::util::check_process_names ${SERVER_NAME}
} }
###################################### Linux Systemd ###################################### ###################################### Linux Systemd ######################################
@ -67,28 +67,28 @@ EOF
# install openim-crontask # install openim-crontask
function openim::crontask::install() { function openim::crontask::install() {
pushd "${OPENIM_ROOT}" pushd "${OPENIM_ROOT}"
# 1. Build openim-crontask # 1. Build openim-crontask
make build BINS=${SERVER_NAME} make build BINS=${SERVER_NAME}
openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}" openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}"
openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}" openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}"
# 2. Generate and install the openim-crontask configuration file (openim-crontask.yaml) # 2. Generate and install the openim-crontask configuration file (openim-crontask.yaml)
openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml" openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml"
# 3. Create and install the ${SERVER_NAME} systemd unit file # 3. Create and install the ${SERVER_NAME} systemd unit file
echo ${LINUX_PASSWORD} | sudo -S bash -c \ echo ${LINUX_PASSWORD} | sudo -S bash -c \
"SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}" "SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}"
openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}" openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}"
# 4. Start the openim-crontask service # 4. Start the openim-crontask service
openim::common::sudo "systemctl daemon-reload" openim::common::sudo "systemctl daemon-reload"
openim::common::sudo "systemctl restart ${SERVER_NAME}" openim::common::sudo "systemctl restart ${SERVER_NAME}"
openim::common::sudo "systemctl enable ${SERVER_NAME}" openim::common::sudo "systemctl enable ${SERVER_NAME}"
openim::crontask::status || return 1 openim::crontask::status || return 1
openim::crontask::info openim::crontask::info
openim::log::info "install ${SERVER_NAME} successfully" openim::log::info "install ${SERVER_NAME} successfully"
popd popd
} }

@ -17,7 +17,7 @@
# #
# Description: # Description:
# This script manages the man pages for the OpenIM software suite. # This script manages the man pages for the OpenIM software suite.
# It provides facilities to install, uninstall, and verify the # It provides facilities to install, uninstall, and verify the
# installation status of the man pages related to OpenIM components. # installation status of the man pages related to OpenIM components.
# #
# Usage: # Usage:
@ -26,15 +26,15 @@
# ./openim-man.sh openim::man::status - Check installation status # ./openim-man.sh openim::man::status - Check installation status
# #
# Dependencies: # Dependencies:
# - Assumes there's a common.sh in ""${OPENIM_ROOT}"/scripts/install/" # - Assumes there's a common.sh in "${OPENIM_ROOT}/scripts/install/"
# containing shared functions and variables. # containing shared functions and variables.
# - Relies on the script ""${OPENIM_ROOT}"/scripts/update-generated-docs.sh" # - Relies on the script "${OPENIM_ROOT}/scripts/update-generated-docs.sh"
# to generate the man pages. # to generate the man pages.
# #
# Notes: # Notes:
# - This script must be run with appropriate permissions to modify the # - This script must be run with appropriate permissions to modify the
# system man directories. # system man directories.
# - Always ensure you're in the script's directory or provide the correct # - Always ensure you're in the script's directory or provide the correct
# path when executing. # path when executing.
################################################################################ ################################################################################
@ -54,43 +54,43 @@ EOF
# Install the man pages for openim # Install the man pages for openim
function openim::man::install() { function openim::man::install() {
# Navigate to the openim root directory # Navigate to the openim root directory
pushd "${OPENIM_ROOT}" > /dev/null pushd "${OPENIM_ROOT}" > /dev/null
# Generate man pages for each component # Generate man pages for each component
""${OPENIM_ROOT}"/scripts/update-generated-docs.sh" "${OPENIM_ROOT}/scripts/update-generated-docs.sh"
openim::common::sudo "cp docs/man/man1/* /usr/share/man/man1/" openim::common::sudo "cp docs/man/man1/* /usr/share/man/man1/"
# Verify installation status # Verify installation status
if openim::man::status; then if openim::man::status; then
openim::log::info "Installed openim-server man page successfully" openim::log::info "Installed openim-server man page successfully"
openim::man::info openim::man::info
fi fi
# Return to the original directory # Return to the original directory
popd > /dev/null popd > /dev/null
} }
# Uninstall the man pages for openim # Uninstall the man pages for openim
function openim::man::uninstall() { function openim::man::uninstall() {
# Turn off exit-on-error temporarily to handle non-existing files gracefully # Turn off exit-on-error temporarily to handle non-existing files gracefully
set +o errexit set +o errexit
openim::common::sudo "rm -f /usr/share/man/man1/openim-*" openim::common::sudo "rm -f /usr/share/man/man1/openim-*"
set -o errexit set -o errexit
openim::log::info "Uninstalled openim man pages successfully" openim::log::info "Uninstalled openim man pages successfully"
} }
# Check the installation status of the man pages # Check the installation status of the man pages
function openim::man::status() { function openim::man::status() {
if ! ls /usr/share/man/man1/openim-* &> /dev/null; then if ! ls /usr/share/man/man1/openim-* &> /dev/null; then
openim::log::error "OpenIM man files not found. Perhaps they were not installed correctly." openim::log::error "OpenIM man files not found. Perhaps they were not installed correctly."
return 1 return 1
fi fi
return 0 return 0
} }
# Execute the appropriate function based on the given arguments # Execute the appropriate function based on the given arguments
if [[ "$*" =~ openim::man:: ]]; then if [[ "$*" =~ openim::man:: ]]; then
eval "$*" eval "$*"
fi fi

@ -26,19 +26,19 @@ openim::util::set_max_fd 200000
SERVER_NAME="openim-msggateway" SERVER_NAME="openim-msggateway"
function openim::msggateway::start() { function openim::msggateway::start() {
openim::log::info "Start OpenIM Msggateway, binary root: ${SERVER_NAME}" openim::log::info "Start OpenIM Msggateway, binary root: ${SERVER_NAME}"
openim::log::status "Start OpenIM Msggateway, path: ${OPENIM_MSGGATEWAY_BINARY}" openim::log::status "Start OpenIM Msggateway, path: ${OPENIM_MSGGATEWAY_BINARY}"
openim::util::stop_services_with_name ${OPENIM_MSGGATEWAY_BINARY} openim::util::stop_services_with_name ${OPENIM_MSGGATEWAY_BINARY}
# OpenIM message gateway service port # OpenIM message gateway service port
OPENIM_MESSAGE_GATEWAY_PORTS=$(openim::util::list-to-string ${OPENIM_MESSAGE_GATEWAY_PORT} ) OPENIM_MESSAGE_GATEWAY_PORTS=$(openim::util::list-to-string ${OPENIM_MESSAGE_GATEWAY_PORT} )
read -a OPENIM_MSGGATEWAY_PORTS_ARRAY <<< ${OPENIM_MESSAGE_GATEWAY_PORTS} read -a OPENIM_MSGGATEWAY_PORTS_ARRAY <<< ${OPENIM_MESSAGE_GATEWAY_PORTS}
openim::util::stop_services_on_ports ${OPENIM_MSGGATEWAY_PORTS_ARRAY[*]} openim::util::stop_services_on_ports ${OPENIM_MSGGATEWAY_PORTS_ARRAY[*]}
# OpenIM WS port # OpenIM WS port
OPENIM_WS_PORTS=$(openim::util::list-to-string ${OPENIM_WS_PORT} ) OPENIM_WS_PORTS=$(openim::util::list-to-string ${OPENIM_WS_PORT} )
read -a OPENIM_WS_PORTS_ARRAY <<< ${OPENIM_WS_PORTS} read -a OPENIM_WS_PORTS_ARRAY <<< ${OPENIM_WS_PORTS}
# Message Gateway Prometheus port of the service # Message Gateway Prometheus port of the service
MSG_GATEWAY_PROM_PORTS=$(openim::util::list-to-string ${MSG_GATEWAY_PROM_PORT} ) MSG_GATEWAY_PROM_PORTS=$(openim::util::list-to-string ${MSG_GATEWAY_PROM_PORT} )
read -a MSG_GATEWAY_PROM_PORTS_ARRAY <<< ${MSG_GATEWAY_PROM_PORTS} read -a MSG_GATEWAY_PROM_PORTS_ARRAY <<< ${MSG_GATEWAY_PROM_PORTS}
@ -123,7 +123,7 @@ function openim::msggateway::status() {
# Check the running status of the ${SERVER_NAME}. If active (running) is displayed, the ${SERVER_NAME} is started successfully. # Check the running status of the ${SERVER_NAME}. If active (running) is displayed, the ${SERVER_NAME} is started successfully.
systemctl status ${SERVER_NAME}|grep -q 'active' || { systemctl status ${SERVER_NAME}|grep -q 'active' || {
openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly" openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly"
return 1 return 1
} }

@ -12,6 +12,8 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# Use:
# ./scripts/install/openim-msgtransfer.sh openim::msgtransfer::start
# Common utilities, variables and checks for all build scripts. # Common utilities, variables and checks for all build scripts.
set -o errexit set -o errexit
@ -26,54 +28,59 @@ openim::util::set_max_fd 200000
SERVER_NAME="openim-msgtransfer" SERVER_NAME="openim-msgtransfer"
function openim::msgtransfer::start() { function openim::msgtransfer::start() {
openim::log::info "Start OpenIM Msggateway, binary root: ${SERVER_NAME}" openim::log::info "Start OpenIM Msggateway, binary root: ${SERVER_NAME}"
openim::log::status "Start OpenIM Msggateway, path: ${OPENIM_MSGTRANSFER_BINARY}" openim::log::status "Start OpenIM Msggateway, path: ${OPENIM_MSGTRANSFER_BINARY}"
openim::util::stop_services_with_name ${OPENIM_MSGTRANSFER_BINARY} openim::util::stop_services_with_name ${OPENIM_MSGTRANSFER_BINARY}
# Message Transfer Prometheus port list # Message Transfer Prometheus port list
MSG_TRANSFER_PROM_PORTS=(openim::util::list-to-string ${MSG_TRANSFER_PROM_PORT} ) MSG_TRANSFER_PROM_PORTS=(openim::util::list-to-string ${MSG_TRANSFER_PROM_PORT} )
openim::log::status "OpenIM Prometheus ports: ${MSG_TRANSFER_PROM_PORTS[*]}" openim::log::status "OpenIM Prometheus ports: ${MSG_TRANSFER_PROM_PORTS[*]}"
openim::log::status "OpenIM Msggateway config path: ${OPENIM_MSGTRANSFER_CONFIG}" openim::log::status "OpenIM Msggateway config path: ${OPENIM_MSGTRANSFER_CONFIG}"
openim::log::info "openim maggateway num: ${OPENIM_MSGGATEWAY_NUM}" openim::log::info "openim maggateway num: ${OPENIM_MSGGATEWAY_NUM}"
if [ "${OPENIM_MSGGATEWAY_NUM}" -lt 1 ]; then if [ "${OPENIM_MSGGATEWAY_NUM}" -lt 1 ]; then
opeim::log::error_exit "OPENIM_MSGGATEWAY_NUM must be greater than 0" opeim::log::error_exit "OPENIM_MSGGATEWAY_NUM must be greater than 0"
fi fi
if [ ${OPENIM_MSGGATEWAY_NUM} -ne $((${#MSG_TRANSFER_PROM_PORTS[@]} - 1)) ]; then if [ ${OPENIM_MSGGATEWAY_NUM} -ne $((${#MSG_TRANSFER_PROM_PORTS[@]} - 1)) ]; then
openim::log::error_exit "OPENIM_MSGGATEWAY_NUM must be equal to the number of MSG_TRANSFER_PROM_PORTS" openim::log::error_exit "OPENIM_MSGGATEWAY_NUM must be equal to the number of MSG_TRANSFER_PROM_PORTS"
fi
for (( i=0; i<$OPENIM_MSGGATEWAY_NUM; i++ )) do
openim::log::info "prometheus port: ${MSG_TRANSFER_PROM_PORTS[$i]}"
PROMETHEUS_PORT_OPTION=""
if [[ -n "${OPENIM_PROMETHEUS_PORTS[$i]}" ]]; then
PROMETHEUS_PORT_OPTION="--prometheus_port ${OPENIM_PROMETHEUS_PORTS[$i]}"
fi fi
nohup ${OPENIM_MSGTRANSFER_BINARY} ${PROMETHEUS_PORT_OPTION} -c ${OPENIM_MSGTRANSFER_CONFIG} -n ${i}>> ${LOG_FILE} 2>&1 &
for (( i=0; i<$OPENIM_MSGGATEWAY_NUM; i++ )) do done
openim::log::info "prometheus port: ${MSG_TRANSFER_PROM_PORTS[$i]}"
PROMETHEUS_PORT_OPTION="" openim::util::check_process_names "${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME}"
if [[ -n "${OPENIM_PROMETHEUS_PORTS[$i]}" ]]; then
PROMETHEUS_PORT_OPTION="--prometheus_port ${OPENIM_PROMETHEUS_PORTS[$i]}"
fi
nohup ${OPENIM_MSGTRANSFER_BINARY} ${PROMETHEUS_PORT_OPTION} -c ${OPENIM_MSGTRANSFER_CONFIG} -n ${i}>> ${LOG_FILE} 2>&1 &
done
openim::util::check_process_names "${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME}"
} }
function openim::msgtransfer::check() { function openim::msgtransfer::check() {
PIDS=$(pgrep -f "${OPENIM_OUTPUT_HOSTBIN}/openim-msgtransfer") PIDS=$(pgrep -f "${OPENIM_OUTPUT_HOSTBIN}/openim-msgtransfer")
NUM_PROCESSES=$(echo "$PIDS" | wc -l) NUM_PROCESSES=$(echo "$PIDS" | wc -l)
# NUM_PROCESSES=$(($NUM_PROCESSES - 1))
if [ "$NUM_PROCESSES" -eq "$OPENIM_MSGGATEWAY_NUM" ]; then
if [ "$NUM_PROCESSES" -eq "$OPENIM_MSGGATEWAY_NUM" ]; then openim::log::info "Found $OPENIM_MSGGATEWAY_NUM processes named $OPENIM_OUTPUT_HOSTBIN"
openim::log::info "Found $OPENIM_MSGGATEWAY_NUM processes named $OPENIM_OUTPUT_HOSTBIN" for PID in $PIDS; do
for PID in $PIDS; do if [[ "$OSTYPE" == "linux-gnu"* ]]; then
ps -p $PID -o pid,cmd ps -p $PID -o pid,cmd
done elif [[ "$OSTYPE" == "darwin"* ]]; then
else ps -p $PID -o pid,comm
openim::log::error_exit "Expected $OPENIM_MSGGATEWAY_NUM openim msgtransfer processes, but found $NUM_PROCESSES msgtransfer processes." else
fi openim::log::error "Unsupported OS type: $OSTYPE"
fi
done
else
openim::log::error_exit "Expected $OPENIM_MSGGATEWAY_NUM openim msgtransfer processes, but found $NUM_PROCESSES msgtransfer processes."
fi
} }
###################################### Linux Systemd ###################################### ###################################### Linux Systemd ######################################
@ -89,30 +96,30 @@ EOF
# install openim-msgtransfer # install openim-msgtransfer
function openim::msgtransfer::install() { function openim::msgtransfer::install() {
pushd "${OPENIM_ROOT}" pushd "${OPENIM_ROOT}"
# 1. Build openim-msgtransfer # 1. Build openim-msgtransfer
make build BINS=${SERVER_NAME} make build BINS=${SERVER_NAME}
openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}" openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}"
openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}" openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}"
openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/bin/${SERVER_NAME}" openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/bin/${SERVER_NAME}"
# 2. Generate and install the openim-msgtransfer configuration file (openim-msgtransfer.yaml) # 2. Generate and install the openim-msgtransfer configuration file (openim-msgtransfer.yaml)
# nono # nono
# 3. Create and install the ${SERVER_NAME} systemd unit file # 3. Create and install the ${SERVER_NAME} systemd unit file
echo ${LINUX_PASSWORD} | sudo -S bash -c \ echo ${LINUX_PASSWORD} | sudo -S bash -c \
"SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}" "SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}"
openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}" openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}"
# 4. Start the openim-msgtransfer service # 4. Start the openim-msgtransfer service
openim::common::sudo "systemctl daemon-reload" openim::common::sudo "systemctl daemon-reload"
openim::common::sudo "systemctl restart ${SERVER_NAME}" openim::common::sudo "systemctl restart ${SERVER_NAME}"
openim::common::sudo "systemctl enable ${SERVER_NAME}" openim::common::sudo "systemctl enable ${SERVER_NAME}"
openim::msgtransfer::status || return 1 openim::msgtransfer::status || return 1
openim::msgtransfer::info openim::msgtransfer::info
openim::log::info "install ${SERVER_NAME} successfully" openim::log::info "install ${SERVER_NAME} successfully"
popd popd
} }

@ -14,10 +14,10 @@
# limitations under the License. # limitations under the License.
# #
# OpenIM Push Control Script # OpenIM Push Control Script
# #
# Description: # Description:
# This script provides a control interface for the OpenIM Push service within a Linux environment. It supports two installation methods: installation via function calls to systemctl, and direct installation through background processes. # This script provides a control interface for the OpenIM Push service within a Linux environment. It supports two installation methods: installation via function calls to systemctl, and direct installation through background processes.
# #
# Features: # Features:
# 1. Robust error handling leveraging Bash built-ins such as 'errexit', 'nounset', and 'pipefail'. # 1. Robust error handling leveraging Bash built-ins such as 'errexit', 'nounset', and 'pipefail'.
# 2. Capability to source common utility functions and configurations, ensuring environmental consistency. # 2. Capability to source common utility functions and configurations, ensuring environmental consistency.
@ -29,7 +29,7 @@
# 1. Direct Script Execution: # 1. Direct Script Execution:
# This will start the OpenIM push directly through a background process. # This will start the OpenIM push directly through a background process.
# Example: ./openim-push.sh # Example: ./openim-push.sh
# #
# 2. Controlling through Functions for systemctl operations: # 2. Controlling through Functions for systemctl operations:
# Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script. # Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script.
# Example: ./openim-push.sh openim::push::install # Example: ./openim-push.sh openim::push::install
@ -39,7 +39,7 @@
# export OPENIM_PUSH_PORT="9090 9091 9092" # export OPENIM_PUSH_PORT="9090 9091 9092"
# #
# Note: Ensure that the appropriate permissions and environmental variables are set prior to script execution. # Note: Ensure that the appropriate permissions and environmental variables are set prior to script execution.
# #
set -o errexit set -o errexit
set +o nounset set +o nounset
set -o pipefail set -o pipefail
@ -50,30 +50,30 @@ OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P)
SERVER_NAME="openim-push" SERVER_NAME="openim-push"
function openim::push::start() { function openim::push::start() {
openim::log::status "Start OpenIM Push, binary root: ${SERVER_NAME}" openim::log::status "Start OpenIM Push, binary root: ${SERVER_NAME}"
openim::log::info "Start OpenIM Push, path: ${OPENIM_PUSH_BINARY}" openim::log::info "Start OpenIM Push, path: ${OPENIM_PUSH_BINARY}"
openim::log::status "prepare start push process, path: ${OPENIM_PUSH_BINARY}" openim::log::status "prepare start push process, path: ${OPENIM_PUSH_BINARY}"
openim::log::status "prepare start push process, port: ${OPENIM_PUSH_PORT}, prometheus port: ${PUSH_PROM_PORT}" openim::log::status "prepare start push process, port: ${OPENIM_PUSH_PORT}, prometheus port: ${PUSH_PROM_PORT}"
OPENIM_PUSH_PORTS_ARRAY=$(openim::util::list-to-string ${OPENIM_PUSH_PORT} ) OPENIM_PUSH_PORTS_ARRAY=$(openim::util::list-to-string ${OPENIM_PUSH_PORT} )
PUSH_PROM_PORTS_ARRAY=$(openim::util::list-to-string ${PUSH_PROM_PORT} ) PUSH_PROM_PORTS_ARRAY=$(openim::util::list-to-string ${PUSH_PROM_PORT} )
openim::util::stop_services_with_name ${SERVER_NAME} openim::util::stop_services_with_name ${SERVER_NAME}
openim::log::status "push port list: ${OPENIM_PUSH_PORTS_ARRAY[@]}" openim::log::status "push port list: ${OPENIM_PUSH_PORTS_ARRAY[@]}"
openim::log::status "prometheus port list: ${PUSH_PROM_PORTS_ARRAY[@]}" openim::log::status "prometheus port list: ${PUSH_PROM_PORTS_ARRAY[@]}"
if [ ${#OPENIM_PUSH_PORTS_ARRAY[@]} -ne ${#PUSH_PROM_PORTS_ARRAY[@]} ]; then if [ ${#OPENIM_PUSH_PORTS_ARRAY[@]} -ne ${#PUSH_PROM_PORTS_ARRAY[@]} ]; then
openim::log::error_exit "The length of the two port lists is different!" openim::log::error_exit "The length of the two port lists is different!"
fi fi
for (( i=0; i<${#OPENIM_PUSH_PORTS_ARRAY[@]}; i++ )); do for (( i=0; i<${#OPENIM_PUSH_PORTS_ARRAY[@]}; i++ )); do
openim::log::info "start push process, port: ${OPENIM_PUSH_PORTS_ARRAY[$i]}, prometheus port: ${PUSH_PROM_PORTS_ARRAY[$i]}" openim::log::info "start push process, port: ${OPENIM_PUSH_PORTS_ARRAY[$i]}, prometheus port: ${PUSH_PROM_PORTS_ARRAY[$i]}"
nohup ${OPENIM_PUSH_BINARY} --port ${OPENIM_PUSH_PORTS_ARRAY[$i]} -c ${OPENIM_PUSH_CONFIG} --prometheus_port ${PUSH_PROM_PORTS_ARRAY[$i]} >> ${LOG_FILE} 2>&1 & nohup ${OPENIM_PUSH_BINARY} --port ${OPENIM_PUSH_PORTS_ARRAY[$i]} -c ${OPENIM_PUSH_CONFIG} --prometheus_port ${PUSH_PROM_PORTS_ARRAY[$i]} >> ${LOG_FILE} 2>&1 &
done done
openim::util::check_process_names ${SERVER_NAME} openim::util::check_process_names ${SERVER_NAME}
} }
###################################### Linux Systemd ###################################### ###################################### Linux Systemd ######################################
@ -89,27 +89,27 @@ EOF
# install openim-push # install openim-push
function openim::push::install() { function openim::push::install() {
pushd "${OPENIM_ROOT}" pushd "${OPENIM_ROOT}"
# 1. Build openim-push # 1. Build openim-push
make build BINS=${SERVER_NAME} make build BINS=${SERVER_NAME}
openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}" openim::common::sudo "cp -r ${OPENIM_OUTPUT_HOSTBIN}/${SERVER_NAME} ${OPENIM_INSTALL_DIR}/${SERVER_NAME}"
openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}" openim::log::status "${SERVER_NAME} binary: ${OPENIM_INSTALL_DIR}/${SERVER_NAME}/${SERVER_NAME}"
# 2. Generate and install the openim-push configuration file (config) # 2. Generate and install the openim-push configuration file (config)
openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml" openim::log::status "${SERVER_NAME} config file: ${OPENIM_CONFIG_DIR}/config.yaml"
# 3. Create and install the ${SERVER_NAME} systemd unit file # 3. Create and install the ${SERVER_NAME} systemd unit file
echo ${LINUX_PASSWORD} | sudo -S bash -c \ echo ${LINUX_PASSWORD} | sudo -S bash -c \
"SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}" "SERVER_NAME=${SERVER_NAME} ./scripts/genconfig.sh ${ENV_FILE} deployments/templates/openim.service > ${SYSTEM_FILE_PATH}"
openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}" openim::log::status "${SERVER_NAME} systemd file: ${SYSTEM_FILE_PATH}"
# 4. Start the openim-push service # 4. Start the openim-push service
openim::common::sudo "systemctl daemon-reload" openim::common::sudo "systemctl daemon-reload"
openim::common::sudo "systemctl restart ${SERVER_NAME}" openim::common::sudo "systemctl restart ${SERVER_NAME}"
openim::common::sudo "systemctl enable ${SERVER_NAME}" openim::common::sudo "systemctl enable ${SERVER_NAME}"
openim::push::status || return 1 openim::push::status || return 1
openim::push::info openim::push::info
openim::log::info "install ${SERVER_NAME} successfully" openim::log::info "install ${SERVER_NAME} successfully"
popd popd
} }
@ -133,7 +133,7 @@ function openim::push::status() {
openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly" openim::log::error "${SERVER_NAME} failed to start, maybe not installed properly"
return 1 return 1
} }
# The listening port is hardcode in the configuration file # The listening port is hardcode in the configuration file
if echo | telnet ${OPENIM_MSGGATEWAY_HOST} ${OPENIM_PUSH_PORT} 2>&1|grep refused &>/dev/null;then # Assuming a different port for push if echo | telnet ${OPENIM_MSGGATEWAY_HOST} ${OPENIM_PUSH_PORT} 2>&1|grep refused &>/dev/null;then # Assuming a different port for push
openim::log::error "cannot access health check port, ${SERVER_NAME} maybe not startup" openim::log::error "cannot access health check port, ${SERVER_NAME} maybe not startup"

@ -15,10 +15,10 @@
# limitations under the License. # limitations under the License.
# #
# OpenIM RPC Service Control Script # OpenIM RPC Service Control Script
# #
# Description: # Description:
# This script provides a control interface for the OpenIM RPC service within a Linux environment. It offers functionalities to start multiple RPC services, each denoted by their respective names under openim::rpc::service_name. # This script provides a control interface for the OpenIM RPC service within a Linux environment. It offers functionalities to start multiple RPC services, each denoted by their respective names under openim::rpc::service_name.
# #
# Features: # Features:
# 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'. # 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'.
# 2. The capability to source common utility functions and configurations to ensure uniform environmental settings. # 2. The capability to source common utility functions and configurations to ensure uniform environmental settings.
@ -123,12 +123,13 @@ function openim::rpc::start() {
for ((i = 0; i < ${#OPENIM_RPC_SERVICE_LISTARIES[*]}; i++)); do for ((i = 0; i < ${#OPENIM_RPC_SERVICE_LISTARIES[*]}; i++)); do
# openim::util::stop_services_with_name ${OPENIM_RPC_SERVICE_LISTARIES # openim::util::stop_services_with_name ${OPENIM_RPC_SERVICE_LISTARIES
openim::util::stop_services_on_ports ${OPENIM_RPC_PORT_LISTARIES[$i]} openim::util::stop_services_on_ports ${OPENIM_RPC_PORT_LISTARIES[$i]}
openim::log::info "OpenIM ${OPENIM_RPC_SERVICE_LISTARIES[$i]} config path: ${OPENIM_RPC_CONFIG}" openim::log::info "OpenIM ${OPENIM_RPC_SERVICE_LISTARIES[$i]} config path: ${OPENIM_RPC_CONFIG}"
# Get the service and Prometheus ports. # Get the service and Prometheus ports.
OPENIM_RPC_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PORT_LISTARIES[$i]}) ) OPENIM_RPC_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PORT_LISTARIES[$i]}) )
read -a OPENIM_RPC_SERVICE_PORTS_ARRAY <<< ${OPENIM_RPC_SERVICE_PORTS} read -a OPENIM_RPC_SERVICE_PORTS_ARRAY <<< ${OPENIM_RPC_SERVICE_PORTS}
OPENIM_RPC_PROM_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PROM_PORT_LISTARIES[$i]}) ) OPENIM_RPC_PROM_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PROM_PORT_LISTARIES[$i]}) )
read -a OPENIM_RPC_PROM_PORTS_ARRAY <<< ${OPENIM_RPC_PROM_PORTS} read -a OPENIM_RPC_PROM_PORTS_ARRAY <<< ${OPENIM_RPC_PROM_PORTS}
@ -138,7 +139,7 @@ function openim::rpc::start() {
done done
done done
sleep 1 sleep 5
openim::util::check_ports ${OPENIM_RPC_PORT_TARGETS[@]} openim::util::check_ports ${OPENIM_RPC_PORT_TARGETS[@]}
# openim::util::check_ports ${OPENIM_RPC_PROM_PORT_TARGETS[@]} # openim::util::check_ports ${OPENIM_RPC_PROM_PORT_TARGETS[@]}

@ -18,9 +18,9 @@
# #
# Description: # Description:
# This script is responsible for managing the lifecycle of OpenIM tools, which include starting, stopping, # This script is responsible for managing the lifecycle of OpenIM tools, which include starting, stopping,
# and handling pre and post operations. It's designed to be modular and extensible, ensuring that the # and handling pre and post operations. It's designed to be modular and extensible, ensuring that the
# individual operations can be managed separately, and integrated seamlessly with Linux systemd. # individual operations can be managed separately, and integrated seamlessly with Linux systemd.
# #
# Features: # Features:
# 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'. # 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'.
# 2. The capability to source common utility functions and configurations to ensure uniform environmental settings. # 2. The capability to source common utility functions and configurations to ensure uniform environmental settings.
@ -104,7 +104,6 @@ function openim::tools::start_service() {
cmd="${cmd} --prometheus_port ${prometheus_port}" cmd="${cmd} --prometheus_port ${prometheus_port}"
fi fi
openim::log::status "Starting ${binary_name}..." openim::log::status "Starting ${binary_name}..."
# Later, after discarding Docker, the Docker keyword is unreliable, and Kubepods is used
${cmd} | tee -a "${LOG_FILE}" ${cmd} | tee -a "${LOG_FILE}"
} }

File diff suppressed because it is too large Load Diff

@ -27,15 +27,15 @@ openim::chat::validate() {
# validate if in path # validate if in path
command -v chat >/dev/null || { command -v chat >/dev/null || {
openim::log::usage "chat must be in your PATH" openim::log::usage "chat must be in your PATH"
openim::log::info "You can use 'hack/install-chat.sh' to install a copy in third_party/." openim::log::info "You can use 'scripts/install-chat.sh' to install a copy in third_party/."
exit 1 exit 1
} }
# validate chat port is free # validate chat port is free
local port_check_command local port_check_command
if command -v ss &> /dev/null && ss -Version | grep 'iproute2' &> /dev/null; then if command -v ss &> /dev/null && ss -Version | grep 'iproute2' &> /dev/null; then
port_check_command="ss" port_check_command="ss"
elif command -v netstat &>/dev/null; then elif command -v netstat &>/dev/null; then
port_check_command="netstat" port_check_command="netstat"
else else
openim::log::usage "unable to identify if chat is bound to port ${CHAT_PORT}. unable to find ss or netstat utilities." openim::log::usage "unable to identify if chat is bound to port ${CHAT_PORT}. unable to find ss or netstat utilities."
@ -46,24 +46,24 @@ openim::chat::validate() {
openim::log::usage "$(${port_check_command} -nat | grep "LISTEN" | grep "[\.:]${CHAT_PORT:?}")" openim::log::usage "$(${port_check_command} -nat | grep "LISTEN" | grep "[\.:]${CHAT_PORT:?}")"
exit 1 exit 1
fi fi
# need set the env of "CHAT_UNSUPPORTED_ARCH" on unstable arch. # need set the env of "CHAT_UNSUPPORTED_ARCH" on unstable arch.
arch=$(uname -m) arch=$(uname -m)
if [[ $arch =~ arm* ]]; then if [[ $arch =~ arm* ]]; then
export CHAT_UNSUPPORTED_ARCH=arm export CHAT_UNSUPPORTED_ARCH=arm
fi fi
# validate installed version is at least equal to minimum # validate installed version is at least equal to minimum
version=$(chat --version | grep Version | head -n 1 | cut -d " " -f 3) version=$(chat --version | grep Version | head -n 1 | cut -d " " -f 3)
if [[ $(openim::chat::version "${CHAT_VERSION}") -gt $(openim::chat::version "${version}") ]]; then if [[ $(openim::chat::version "${CHAT_VERSION}") -gt $(openim::chat::version "${version}") ]]; then
export PATH="${OPENIM_ROOT}"/third_party/chat:${PATH} export PATH="${OPENIM_ROOT}"/third_party/chat:${PATH}
hash chat hash chat
echo "${PATH}" echo "${PATH}"
version=$(chat --version | grep Version | head -n 1 | cut -d " " -f 3) version=$(chat --version | grep Version | head -n 1 | cut -d " " -f 3)
if [[ $(openim::chat::version "${CHAT_VERSION}") -gt $(openim::chat::version "${version}") ]]; then if [[ $(openim::chat::version "${CHAT_VERSION}") -gt $(openim::chat::version "${version}") ]]; then
openim::log::usage "chat version ${CHAT_VERSION} or greater required." openim::log::usage "chat version ${CHAT_VERSION} or greater required."
openim::log::info "You can use 'hack/install-chat.sh' to install a copy in third_party/." openim::log::info "You can use 'scripts/install-chat.sh' to install a copy in third_party/."
exit 1 exit 1
fi fi
fi fi
} }
@ -74,7 +74,7 @@ openim::chat::version() {
openim::chat::start() { openim::chat::start() {
# validate before running # validate before running
openim::chat::validate openim::chat::validate
# Start chat # Start chat
CHAT_DIR=${CHAT_DIR:-$(mktemp -d 2>/dev/null || mktemp -d -t test-chat.XXXXXX)} CHAT_DIR=${CHAT_DIR:-$(mktemp -d 2>/dev/null || mktemp -d -t test-chat.XXXXXX)}
if [[ -d "${ARTIFACTS:-}" ]]; then if [[ -d "${ARTIFACTS:-}" ]]; then
@ -85,7 +85,7 @@ openim::chat::start() {
openim::log::info "chat --advertise-client-urls ${OPENIM_INTEGRATION_CHAT_URL} --data-dir ${CHAT_DIR} --listen-client-urls http://${CHAT_HOST}:${CHAT_PORT} --log-level=${CHAT_LOGLEVEL} 2> \"${CHAT_LOGFILE}\" >/dev/null" openim::log::info "chat --advertise-client-urls ${OPENIM_INTEGRATION_CHAT_URL} --data-dir ${CHAT_DIR} --listen-client-urls http://${CHAT_HOST}:${CHAT_PORT} --log-level=${CHAT_LOGLEVEL} 2> \"${CHAT_LOGFILE}\" >/dev/null"
chat --advertise-client-urls "${OPENIM_INTEGRATION_CHAT_URL}" --data-dir "${CHAT_DIR}" --listen-client-urls "${OPENIM_INTEGRATION_CHAT_URL}" --log-level="${CHAT_LOGLEVEL}" 2> "${CHAT_LOGFILE}" >/dev/null & chat --advertise-client-urls "${OPENIM_INTEGRATION_CHAT_URL}" --data-dir "${CHAT_DIR}" --listen-client-urls "${OPENIM_INTEGRATION_CHAT_URL}" --log-level="${CHAT_LOGLEVEL}" 2> "${CHAT_LOGFILE}" >/dev/null &
CHAT_PID=$! CHAT_PID=$!
echo "Waiting for chat to come up." echo "Waiting for chat to come up."
openim::util::wait_for_url "${OPENIM_INTEGRATION_CHAT_URL}/health" "chat: " 0.25 80 openim::util::wait_for_url "${OPENIM_INTEGRATION_CHAT_URL}/health" "chat: " 0.25 80
curl -fs -X POST "${OPENIM_INTEGRATION_CHAT_URL}/v3/kv/put" -d '{"key": "X3Rlc3Q=", "value": ""}' curl -fs -X POST "${OPENIM_INTEGRATION_CHAT_URL}/v3/kv/put" -d '{"key": "X3Rlc3Q=", "value": ""}'
@ -108,7 +108,7 @@ openim::chat::start_scraping() {
} }
openim::chat::scrape() { openim::chat::scrape() {
curl -s -S "${OPENIM_INTEGRATION_CHAT_URL}/metrics" > "${CHAT_SCRAPE_DIR}/next" && mv "${CHAT_SCRAPE_DIR}/next" "${CHAT_SCRAPE_DIR}/$(date +%s).scrape" curl -s -S "${OPENIM_INTEGRATION_CHAT_URL}/metrics" > "${CHAT_SCRAPE_DIR}/next" && mv "${CHAT_SCRAPE_DIR}/next" "${CHAT_SCRAPE_DIR}/$(date +%s).scrape"
} }
openim::chat::stop() { openim::chat::stop() {
@ -144,17 +144,17 @@ openim::chat::install() {
( (
local os local os
local arch local arch
os=$(openim::util::host_os) os=$(openim::util::host_os)
arch=$(openim::util::host_arch) arch=$(openim::util::host_arch)
cd ""${OPENIM_ROOT}"/third_party" || return 1 cd "${OPENIM_ROOT}/third_party" || return 1
if [[ $(readlink chat) == chat-v${CHAT_VERSION}-${os}-* ]]; then if [[ $(readlink chat) == chat-v${CHAT_VERSION}-${os}-* ]]; then
openim::log::info "chat v${CHAT_VERSION} already installed. To use:" openim::log::info "chat v${CHAT_VERSION} already installed. To use:"
openim::log::info "export PATH=\"$(pwd)/chat:\${PATH}\"" openim::log::info "export PATH=\"$(pwd)/chat:\${PATH}\""
return #already installed return #already installed
fi fi
if [[ ${os} == "darwin" ]]; then if [[ ${os} == "darwin" ]]; then
download_file="chat-v${CHAT_VERSION}-${os}-${arch}.zip" download_file="chat-v${CHAT_VERSION}-${os}-${arch}.zip"
url="https://github.com/chat-io/chat/releases/download/v${CHAT_VERSION}/${download_file}" url="https://github.com/chat-io/chat/releases/download/v${CHAT_VERSION}/${download_file}"
@ -162,7 +162,7 @@ openim::chat::install() {
unzip -o "${download_file}" unzip -o "${download_file}"
ln -fns "chat-v${CHAT_VERSION}-${os}-${arch}" chat ln -fns "chat-v${CHAT_VERSION}-${os}-${arch}" chat
rm "${download_file}" rm "${download_file}"
elif [[ ${os} == "linux" ]]; then elif [[ ${os} == "linux" ]]; then
url="https://github.com/coreos/chat/releases/download/v${CHAT_VERSION}/chat-v${CHAT_VERSION}-${os}-${arch}.tar.gz" url="https://github.com/coreos/chat/releases/download/v${CHAT_VERSION}/chat-v${CHAT_VERSION}-${os}-${arch}.tar.gz"
download_file="chat-v${CHAT_VERSION}-${os}-${arch}.tar.gz" download_file="chat-v${CHAT_VERSION}-${os}-${arch}.tar.gz"
openim::util::download_file "${url}" "${download_file}" openim::util::download_file "${url}" "${download_file}"

@ -21,24 +21,24 @@
# shellcheck disable=SC2034 # shellcheck disable=SC2034
if [ -z "${COLOR_OPEN+x}" ]; then if [ -z "${COLOR_OPEN+x}" ]; then
COLOR_OPEN=1 COLOR_OPEN=1
fi fi
# Function for colored echo # Function for colored echo
openim::color::echo() { openim::color::echo() {
COLOR=$1 COLOR=$1
[ $COLOR_OPEN -eq 1 ] && echo -e "${COLOR} $(date '+%Y-%m-%d %H:%M:%S') $@ ${COLOR_SUFFIX}" [ $COLOR_OPEN -eq 1 ] && echo -e "${COLOR} $(date '+%Y-%m-%d %H:%M:%S') $@ ${COLOR_SUFFIX}"
shift shift
} }
# Define color variables # Define color variables
# --- Feature --- # --- Feature ---
COLOR_NORMAL='\033[0m';COLOR_BOLD='\033[1m';COLOR_DIM='\033[2m';COLOR_UNDER='\033[4m'; COLOR_NORMAL='\033[0m';COLOR_BOLD='\033[1m';COLOR_DIM='\033[2m';COLOR_UNDER='\033[4m';
COLOR_ITALIC='\033[3m';COLOR_NOITALIC='\033[23m';COLOR_BLINK='\033[5m'; COLOR_ITALIC='\033[3m';COLOR_NOITALIC='\033[23m';COLOR_BLINK='\033[5m';
COLOR_REVERSE='\033[7m';COLOR_CONCEAL='\033[8m';COLOR_NOBOLD='\033[22m'; COLOR_REVERSE='\033[7m';COLOR_CONCEAL='\033[8m';COLOR_NOBOLD='\033[22m';
COLOR_NOUNDER='\033[24m';COLOR_NOBLINK='\033[25m'; COLOR_NOUNDER='\033[24m';COLOR_NOBLINK='\033[25m';
# --- Front color --- # --- Front color ---
COLOR_BLACK='\033[30m'; COLOR_BLACK='\033[30m';
COLOR_RED='\033[31m'; COLOR_RED='\033[31m';
COLOR_GREEN='\033[32m'; COLOR_GREEN='\033[32m';
@ -48,13 +48,13 @@ COLOR_MAGENTA='\033[35m';
COLOR_CYAN='\033[36m'; COLOR_CYAN='\033[36m';
COLOR_WHITE='\033[37m'; COLOR_WHITE='\033[37m';
# --- background color --- # --- background color ---
COLOR_BBLACK='\033[40m';COLOR_BRED='\033[41m'; COLOR_BBLACK='\033[40m';COLOR_BRED='\033[41m';
COLOR_BGREEN='\033[42m';COLOR_BYELLOW='\033[43m'; COLOR_BGREEN='\033[42m';COLOR_BYELLOW='\033[43m';
COLOR_BBLUE='\033[44m';COLOR_BMAGENTA='\033[45m'; COLOR_BBLUE='\033[44m';COLOR_BMAGENTA='\033[45m';
COLOR_BCYAN='\033[46m';COLOR_BWHITE='\033[47m'; COLOR_BCYAN='\033[46m';COLOR_BWHITE='\033[47m';
# --- Color definitions --- # --- Color definitions ---
# Color definitions # Color definitions
COLOR_SUFFIX="\033[0m" # End all colors and special effects COLOR_SUFFIX="\033[0m" # End all colors and special effects
BLACK_PREFIX="\033[30m" # Black prefix BLACK_PREFIX="\033[30m" # Black prefix
@ -86,54 +86,54 @@ openim::color::print_color() {
# test functions # test functions
openim::color::test() { openim::color::test() {
echo "Starting the color tests..." echo "Starting the color tests..."
echo "Testing normal echo without color" echo "Testing normal echo without color"
openim::color::echo $COLOR_NORMAL "This is a normal text" openim::color::echo $COLOR_NORMAL "This is a normal text"
echo "Testing bold echo" echo "Testing bold echo"
openim::color::echo $COLOR_BOLD "This is bold text" openim::color::echo $COLOR_BOLD "This is bold text"
echo "Testing dim echo" echo "Testing dim echo"
openim::color::echo $COLOR_DIM "This is dim text" openim::color::echo $COLOR_DIM "This is dim text"
echo "Testing underlined echo" echo "Testing underlined echo"
openim::color::echo $COLOR_UNDER "This is underlined text" openim::color::echo $COLOR_UNDER "This is underlined text"
echo "Testing italic echo" echo "Testing italic echo"
openim::color::echo $COLOR_ITALIC "This is italic text" openim::color::echo $COLOR_ITALIC "This is italic text"
echo "Testing red color" echo "Testing red color"
openim::color::echo $COLOR_RED "This is red text" openim::color::echo $COLOR_RED "This is red text"
echo "Testing green color" echo "Testing green color"
openim::color::echo $COLOR_GREEN "This is green text" openim::color::echo $COLOR_GREEN "This is green text"
echo "Testing yellow color" echo "Testing yellow color"
openim::color::echo $COLOR_YELLOW "This is yellow text" openim::color::echo $COLOR_YELLOW "This is yellow text"
echo "Testing blue color" echo "Testing blue color"
openim::color::echo $COLOR_BLUE "This is blue text" openim::color::echo $COLOR_BLUE "This is blue text"
echo "Testing magenta color" echo "Testing magenta color"
openim::color::echo $COLOR_MAGENTA "This is magenta text" openim::color::echo $COLOR_MAGENTA "This is magenta text"
echo "Testing cyan color" echo "Testing cyan color"
openim::color::echo $COLOR_CYAN "This is cyan text" openim::color::echo $COLOR_CYAN "This is cyan text"
echo "Testing black background" echo "Testing black background"
openim::color::echo $COLOR_BBLACK "This is text with black background" openim::color::echo $COLOR_BBLACK "This is text with black background"
echo "Testing red background" echo "Testing red background"
openim::color::echo $COLOR_BRED "This is text with red background" openim::color::echo $COLOR_BRED "This is text with red background"
echo "Testing green background" echo "Testing green background"
openim::color::echo $COLOR_BGREEN "This is text with green background" openim::color::echo $COLOR_BGREEN "This is text with green background"
echo "Testing blue background" echo "Testing blue background"
openim::color::echo $COLOR_BBLUE "This is text with blue background" openim::color::echo $COLOR_BBLUE "This is text with blue background"
echo "All tests completed!" echo "All tests completed!"
} }
# openim::color::test # openim::color::test

@ -89,7 +89,7 @@ readonly OPENIM_SERVER_TARGETS
readonly OPENIM_SERVER_BINARIES=("${OPENIM_SERVER_TARGETS[@]##*/}") readonly OPENIM_SERVER_BINARIES=("${OPENIM_SERVER_TARGETS[@]##*/}")
# TODO: Label # TODO: Label
START_SCRIPTS_PATH=""${OPENIM_ROOT}"/scripts/install/" START_SCRIPTS_PATH="${OPENIM_ROOT}/scripts/install/"
openim::golang::start_script_list() { openim::golang::start_script_list() {
local targets=( local targets=(
openim-api.sh openim-api.sh
@ -261,7 +261,18 @@ openim::golang::setup_platforms
# The set of client targets that we are building for all platforms # The set of client targets that we are building for all platforms
# If you update this list, please also update build/BUILD. # If you update this list, please also update build/BUILD.
readonly OPENIM_CLIENT_TARGETS=( readonly OPENIM_CLIENT_TARGETS=(
imctl changelog
component
conversion-msg
conversion-mysql
formitychecker
imctl
infra
ncpu
openim-web
up35
versionchecker
yamlfmt
) )
readonly OPENIM_CLIENT_BINARIES=("${OPENIM_CLIENT_TARGETS[@]##*/}") readonly OPENIM_CLIENT_BINARIES=("${OPENIM_CLIENT_TARGETS[@]##*/}")

@ -25,7 +25,7 @@ unset CDPATH
# Until all GOPATH references are removed from all build scripts as well, # Until all GOPATH references are removed from all build scripts as well,
# explicitly disable module mode to avoid picking up user-set GO111MODULE preferences. # explicitly disable module mode to avoid picking up user-set GO111MODULE preferences.
# As individual scripts (like hack/update-vendor.sh) make use of go modules, # As individual scripts (like scripts/update-vendor.sh) make use of go modules,
# they can explicitly set GO111MODULE=on # they can explicitly set GO111MODULE=on
export GO111MODULE=on export GO111MODULE=on
@ -33,7 +33,7 @@ export GO111MODULE=on
OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
OPENIM_OUTPUT_SUBPATH="${OPENIM_OUTPUT_SUBPATH:-_output}" OPENIM_OUTPUT_SUBPATH="${OPENIM_OUTPUT_SUBPATH:-_output}"
OPENIM_OUTPUT=""${OPENIM_ROOT}"/${OPENIM_OUTPUT_SUBPATH}" OPENIM_OUTPUT="${OPENIM_ROOT}/${OPENIM_OUTPUT_SUBPATH}"
OPENIM_OUTPUT_BINPATH="${OPENIM_OUTPUT}/bin/platforms" OPENIM_OUTPUT_BINPATH="${OPENIM_OUTPUT}/bin/platforms"
OPENIM_OUTPUT_BINTOOLPATH="${OPENIM_OUTPUT}/bin/tools" OPENIM_OUTPUT_BINTOOLPATH="${OPENIM_OUTPUT}/bin/tools"
@ -50,8 +50,8 @@ OPENIM_RSYNC_COMPRESS="${KUBE_RSYNC_COMPRESS:-0}"
export no_proxy="127.0.0.1,localhost${no_proxy:+,${no_proxy}}" export no_proxy="127.0.0.1,localhost${no_proxy:+,${no_proxy}}"
# This is a symlink to binaries for "this platform", e.g. build tools. # This is a symlink to binaries for "this platform", e.g. build tools.
export THIS_PLATFORM_BIN=""${OPENIM_ROOT}"/_output/bin/platforms" export THIS_PLATFORM_BIN="${OPENIM_ROOT}/_output/bin/platforms"
export THIS_PLATFORM_BIN_TOOLS=""${OPENIM_ROOT}"/_output/bin/tools" export THIS_PLATFORM_BIN_TOOLS="${OPENIM_ROOT}/_output/bin/tools"
. $(dirname ${BASH_SOURCE})/color.sh . $(dirname ${BASH_SOURCE})/color.sh
. $(dirname ${BASH_SOURCE})/util.sh . $(dirname ${BASH_SOURCE})/util.sh
@ -62,7 +62,6 @@ openim::util::ensure-bash-version
. $(dirname ${BASH_SOURCE})/version.sh . $(dirname ${BASH_SOURCE})/version.sh
. $(dirname ${BASH_SOURCE})/golang.sh . $(dirname ${BASH_SOURCE})/golang.sh
. $(dirname ${BASH_SOURCE})/release.sh
. $(dirname ${BASH_SOURCE})/chat.sh . $(dirname ${BASH_SOURCE})/chat.sh
OPENIM_OUTPUT_HOSTBIN="${OPENIM_OUTPUT_BINPATH}/$(openim::util::host_platform)" OPENIM_OUTPUT_HOSTBIN="${OPENIM_OUTPUT_BINPATH}/$(openim::util::host_platform)"

@ -21,24 +21,24 @@ ENABLE_LOGGING="${ENABLE_LOGGING:-true}"
# If OPENIM_OUTPUT is not set, set it to the default value # If OPENIM_OUTPUT is not set, set it to the default value
if [ -z "${OPENIM_OUTPUT+x}" ]; then if [ -z "${OPENIM_OUTPUT+x}" ]; then
OPENIM_OUTPUT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../_output" && pwd -P)" OPENIM_OUTPUT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../_output" && pwd -P)"
fi fi
# Set the log file path # Set the log file path
LOG_FILE="${OPENIM_OUTPUT}/logs/openim_$(date '+%Y%m%d').log" LOG_FILE="${OPENIM_OUTPUT}/logs/openim_$(date '+%Y%m%d').log"
if [[ ! -d "${OPENIM_OUTPUT}/logs" ]]; then if [[ ! -d "${OPENIM_OUTPUT}/logs" ]]; then
mkdir -p "${OPENIM_OUTPUT}/logs" mkdir -p "${OPENIM_OUTPUT}/logs"
touch "$LOG_FILE" touch "$LOG_FILE"
fi fi
# Define the logging function # Define the logging function
function echo_log() { function echo_log() {
if $ENABLE_LOGGING; then if $ENABLE_LOGGING; then
echo -e "$@" | tee -a "${LOG_FILE}" echo -e "$@" | tee -a "${LOG_FILE}"
else else
echo -e "$@" echo -e "$@"
fi fi
} }
# MAX_LOG_SIZE=10485760 # 10MB # MAX_LOG_SIZE=10485760 # 10MB
@ -50,11 +50,11 @@ function echo_log() {
# Borrowed from https://gist.github.com/ahendrix/7030300 # Borrowed from https://gist.github.com/ahendrix/7030300
openim::log::errexit() { openim::log::errexit() {
local err="${PIPESTATUS[*]}" local err="${PIPESTATUS[*]}"
# If the shell we are in doesn't have errexit set (common in subshells) then # If the shell we are in doesn't have errexit set (common in subshells) then
# don't dump stacks. # don't dump stacks.
set +o | grep -qe "-o errexit" || return set +o | grep -qe "-o errexit" || return
set +o xtrace set +o xtrace
local code="${1:-1}" local code="${1:-1}"
# Print out the stack trace described by $function_stack # Print out the stack trace described by $function_stack
@ -73,7 +73,7 @@ openim::log::install_errexit() {
# trap ERR to provide an error handler whenever a command exits nonzero this # trap ERR to provide an error handler whenever a command exits nonzero this
# is a more verbose version of set -o errexit # is a more verbose version of set -o errexit
trap 'openim::log::errexit' ERR trap 'openim::log::errexit' ERR
# setting errtrace allows our ERR trap handler to be propagated to functions, # setting errtrace allows our ERR trap handler to be propagated to functions,
# expansions and subshells # expansions and subshells
set -o errtrace set -o errtrace
@ -110,7 +110,7 @@ openim::log::error_exit() {
local code="${2:-1}" local code="${2:-1}"
local stack_skip="${3:-0}" local stack_skip="${3:-0}"
stack_skip=$((stack_skip + 1)) stack_skip=$((stack_skip + 1))
if [[ ${OPENIM_VERBOSE} -ge 4 ]]; then if [[ ${OPENIM_VERBOSE} -ge 4 ]]; then
local source_file=${BASH_SOURCE[${stack_skip}]} local source_file=${BASH_SOURCE[${stack_skip}]}
local source_line=${BASH_LINENO[$((stack_skip - 1))]} local source_line=${BASH_LINENO[$((stack_skip - 1))]}
@ -118,12 +118,12 @@ openim::log::error_exit() {
[[ -z ${1-} ]] || { [[ -z ${1-} ]] || {
echo_log " ${1}" >&2 echo_log " ${1}" >&2
} }
openim::log::stack ${stack_skip} openim::log::stack ${stack_skip}
echo_log "Exiting with status ${code}" >&2 echo_log "Exiting with status ${code}" >&2
fi fi
exit "${code}" exit "${code}"
} }
@ -152,7 +152,7 @@ openim::log::usage_from_stdin() {
while read -r line; do while read -r line; do
messages+=("${line}") messages+=("${line}")
done done
openim::log::usage "${messages[@]}" openim::log::usage "${messages[@]}"
} }
@ -162,7 +162,7 @@ openim::log::info() {
if [[ ${OPENIM_VERBOSE} < ${V} ]]; then if [[ ${OPENIM_VERBOSE} < ${V} ]]; then
return return
fi fi
for message; do for message; do
echo_log "${message}" echo_log "${message}"
done done
@ -181,7 +181,7 @@ openim::log::info_from_stdin() {
while read -r line; do while read -r line; do
messages+=("${line}") messages+=("${line}")
done done
openim::log::info "${messages[@]}" openim::log::info "${messages[@]}"
} }
@ -191,7 +191,7 @@ openim::log::status() {
if [[ ${OPENIM_VERBOSE} < ${V} ]]; then if [[ ${OPENIM_VERBOSE} < ${V} ]]; then
return return
fi fi
timestamp=$(date +"[%m%d %H:%M:%S]") timestamp=$(date +"[%m%d %H:%M:%S]")
echo_log "+++ ${timestamp} ${1}" echo_log "+++ ${timestamp} ${1}"
shift shift
@ -203,20 +203,20 @@ openim::log::status() {
openim::log::success() { openim::log::success() {
local V="${V:-0}" local V="${V:-0}"
if [[ ${OPENIM_VERBOSE} < ${V} ]]; then if [[ ${OPENIM_VERBOSE} < ${V} ]]; then
return return
fi fi
timestamp=$(date +"%m%d %H:%M:%S") timestamp=$(date +"%m%d %H:%M:%S")
echo_log -e "${COLOR_GREEN}[success ${timestamp}] ${COLOR_SUFFIX}==> " "$@" echo_log -e "${COLOR_GREEN}[success ${timestamp}] ${COLOR_SUFFIX}==> " "$@"
} }
function openim::log::test_log() { function openim::log::test_log() {
echo_log "test log" echo_log "test log"
openim::log::info "openim::log::info" openim::log::info "openim::log::info"
openim::log::progress "openim::log::progress" openim::log::progress "openim::log::progress"
openim::log::status "openim::log::status" openim::log::status "openim::log::status"
openim::log::success "openim::log::success" openim::log::success "openim::log::success"
openim::log::error "openim::log::error" openim::log::error "openim::log::error"
openim::log::error_exit "openim::log::error_exit" openim::log::error_exit "openim::log::error_exit"
} }
# openim::log::test_log # openim::log::test_log

@ -25,6 +25,7 @@
readonly BUCKET="openim-1306374445" readonly BUCKET="openim-1306374445"
readonly REGION="ap-guangzhou" readonly REGION="ap-guangzhou"
readonly COS_RELEASE_DIR="openim-release" readonly COS_RELEASE_DIR="openim-release"
# readonly COS_RELEASE_DIR="openim-advanced-release" # !pro
# default cos command tool coscli or coscmd # default cos command tool coscli or coscmd
readonly COSTOOL="coscli" readonly COSTOOL="coscli"
@ -37,20 +38,22 @@ readonly RELEASE_IMAGES="${LOCAL_OUTPUT_ROOT}/release-images"
# OpenIM github account info # OpenIM github account info
readonly OPENIM_GITHUB_ORG=openimsdk readonly OPENIM_GITHUB_ORG=openimsdk
readonly OPENIM_GITHUB_REPO=open-im-server readonly OPENIM_GITHUB_REPO=open-im-server
readonly CHAT_GITHUB_REPO=chat # readonly OPENIM_GITHUB_REPO=open-im-server-enterprise # !pro
readonly ARTIFACT=openim.tar.gz readonly ARTIFACT=openim.tar.gz
# readonly ARTIFACT=openim-enterprise.tar.gz # !pro
readonly CHECKSUM=${ARTIFACT}.sha1sum readonly CHECKSUM=${ARTIFACT}.sha1sum
OPENIM_BUILD_CONFORMANCE=${OPENIM_BUILD_CONFORMANCE:-y} OPENIM_BUILD_CONFORMANCE=${OPENIM_BUILD_CONFORMANCE:-y}
OPENIM_BUILD_PULL_LATEST_IMAGES=${OPENIM_BUILD_PULL_LATEST_IMAGES:-y} OPENIM_BUILD_PULL_LATEST_IMAGES=${OPENIM_BUILD_PULL_LATEST_IMAGES:-y}
if [ -z "${OPENIM_ROOT}" ]; then if [ -z "${OPENIM_ROOT}" ]; then
OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" OPENIM_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
fi fi
if [ -z "${TOOLS_DIR}" ]; then if [ -z "${TOOLS_DIR}" ]; then
TOOLS_DIR="${OPENIM_ROOT}/_output/tools" TOOLS_DIR="${OPENIM_ROOT}/_output/tools"
fi fi
# Validate a ci version # Validate a ci version
@ -77,10 +80,10 @@ function openim::release::parse_and_validate_ci_version() {
openim::log::error "Invalid ci version: '${version}', must match regex ${version_regex}" openim::log::error "Invalid ci version: '${version}', must match regex ${version_regex}"
return 1 return 1
} }
# The VERSION variables are used when this file is sourced, hence # The VERSION variables are used when this file is sourced, hence
# the shellcheck SC2034 'appears unused' warning is to be ignored. # the shellcheck SC2034 'appears unused' warning is to be ignored.
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VERSION_MAJOR="${BASH_REMATCH[1]}" VERSION_MAJOR="${BASH_REMATCH[1]}"
# shellcheck disable=SC2034 # shellcheck disable=SC2034
@ -115,7 +118,7 @@ function openim::release::package_tarballs() {
openim::release::package_openim_manifests_tarball & openim::release::package_openim_manifests_tarball &
openim::release::package_server_tarballs & openim::release::package_server_tarballs &
openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; } openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
openim::release::package_final_tarball & # _final depends on some of the previous phases openim::release::package_final_tarball & # _final depends on some of the previous phases
openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; } openim::util::wait-for-jobs || { openim::log::error "previous tarball phase failed"; return 1; }
} }
@ -143,24 +146,24 @@ function openim::release::package_src_tarball() {
git archive -o "${src_tarball}" HEAD git archive -o "${src_tarball}" HEAD
else else
find "${OPENIM_ROOT}" -mindepth 1 -maxdepth 1 \ find "${OPENIM_ROOT}" -mindepth 1 -maxdepth 1 \
! \( \ ! \( \
\( -path "${OPENIM_ROOT}"/_\* -o \ \( -path "${OPENIM_ROOT}"/_\* -o \
-path "${OPENIM_ROOT}"/.git\* -o \ -path "${OPENIM_ROOT}"/.git\* -o \
-path "${OPENIM_ROOT}"/.github\* -o \ -path "${OPENIM_ROOT}"/.github\* -o \
-path "${OPENIM_ROOT}"/components\* -o \ -path "${OPENIM_ROOT}"/components\* -o \
-path "${OPENIM_ROOT}"/logs\* -o \ -path "${OPENIM_ROOT}"/logs\* -o \
-path "${OPENIM_ROOT}"/.gitignore\* -o \ -path "${OPENIM_ROOT}"/.gitignore\* -o \
-path "${OPENIM_ROOT}"/.gsemver.yml\* -o \ -path "${OPENIM_ROOT}"/.gsemver.yml\* -o \
-path "${OPENIM_ROOT}"/.config\* -o \ -path "${OPENIM_ROOT}"/.config\* -o \
-path "${OPENIM_ROOT}"/.chglog\* -o \ -path "${OPENIM_ROOT}"/.chglog\* -o \
-path "${OPENIM_ROOT}"/.gitlint -o \ -path "${OPENIM_ROOT}"/.gitlint -o \
-path "${OPENIM_ROOT}"/.golangci.yml -o \ -path "${OPENIM_ROOT}"/.golangci.yml -o \
-path "${OPENIM_ROOT}"/build/goreleaser.yaml -o \ -path "${OPENIM_ROOT}"/build/goreleaser.yaml -o \
-path "${OPENIM_ROOT}"/.note.md -o \ -path "${OPENIM_ROOT}"/.note.md -o \
-path "${OPENIM_ROOT}"/.todo.md \ -path "${OPENIM_ROOT}"/.todo.md \
\) -prune \ \) -prune \
\) -print0 \ \) -print0 \
| "${TAR}" czf "${src_tarball}" --transform "s|${OPENIM_ROOT#/*}|openim|" --null -T - | "${TAR}" czf "${src_tarball}" --transform "s|${OPENIM_ROOT#/*}|openim|" --null -T -
fi fi
} }
@ -168,7 +171,7 @@ function openim::release::package_src_tarball() {
function openim::release::package_server_tarballs() { function openim::release::package_server_tarballs() {
# Find all of the built client binaries # Find all of the built client binaries
local long_platforms=("${LOCAL_OUTPUT_BINPATH}"/*/*) local long_platforms=("${LOCAL_OUTPUT_BINPATH}"/*/*)
if [[ -n ${OPENIM_BUILD_PLATFORMS-} ]]; then if [[ -n ${OPENIM_BUILD_PLATFORMS-} ]]; then
read -ra long_platforms <<< "${OPENIM_BUILD_PLATFORMS}" read -ra long_platforms <<< "${OPENIM_BUILD_PLATFORMS}"
fi fi
@ -636,7 +639,7 @@ function openim::release::github_release() {
for file in ${RELEASE_TARS}/*.tar.gz; do for file in ${RELEASE_TARS}/*.tar.gz; do
if [[ -f "$file" ]]; then if [[ -f "$file" ]]; then
filename=$(basename "$file") filename=$(basename "$file")
openim::log::info "Update file ${filename} to release vertion ${OPENIM_GIT_VERSION}" openim::log::info "Update file ${filename} to release vertion ${OPENIM_GIT_VERSION}"
${TOOLS_DIR}/github-release upload \ ${TOOLS_DIR}/github-release upload \
--user ${OPENIM_GITHUB_ORG} \ --user ${OPENIM_GITHUB_ORG} \
--repo ${OPENIM_GITHUB_REPO} \ --repo ${OPENIM_GITHUB_REPO} \

@ -30,27 +30,27 @@ function openim:util::setup_ssh_key_copy() {
local hosts_file="$1" local hosts_file="$1"
local username="${2:-root}" local username="${2:-root}"
local password="${3:-123}" local password="${3:-123}"
local sshkey_file=~/.ssh/id_rsa.pub local sshkey_file=~/.ssh/id_rsa.pub
# check sshkey file # check sshkey file
if [[ ! -e $sshkey_file ]]; then if [[ ! -e $sshkey_file ]]; then
expect -c " expect -c "
spawn ssh-keygen -t rsa spawn ssh-keygen -t rsa
expect \"Enter*\" { send \"\n\"; exp_continue; } expect \"Enter*\" { send \"\n\"; exp_continue; }
" "
fi fi
# get hosts list # get hosts list
local hosts=$(awk '/^[^#]/ {print $1}' "${hosts_file}") local hosts=$(awk '/^[^#]/ {print $1}' "${hosts_file}")
ssh_key_copy() { ssh_key_copy() {
local target=$1 local target=$1
# delete history # delete history
sed -i "/$target/d" ~/.ssh/known_hosts sed -i "/$target/d" ~/.ssh/known_hosts
# copy key # copy key
expect -c " expect -c "
set timeout 100 set timeout 100
spawn ssh-copy-id $username@$target spawn ssh-copy-id $username@$target
@ -62,14 +62,14 @@ function openim:util::setup_ssh_key_copy() {
expect eof expect eof
" "
} }
# auto sshkey pair # auto sshkey pair
for host in $hosts; do for host in $hosts; do
if ! ping -i 0.2 -c 3 -W 1 "$host" > /dev/null 2>&1; then if ! ping -i 0.2 -c 3 -W 1 "$host" > /dev/null 2>&1; then
echo "[ERROR]: Can't connect $host" echo "[ERROR]: Can't connect $host"
continue continue
fi fi
local host_entry=$(awk "/$host/"'{print $1, $2}' /etc/hosts) local host_entry=$(awk "/$host/"'{print $1, $2}' /etc/hosts)
if [[ $host_entry ]]; then if [[ $host_entry ]]; then
local hostaddr=$(echo "$host_entry" | awk '{print $1}') local hostaddr=$(echo "$host_entry" | awk '{print $1}')
@ -102,7 +102,7 @@ openim::util::array_contains() {
for element; do for element; do
if [[ "${element}" == "${search}" ]]; then if [[ "${element}" == "${search}" ]]; then
return 0 return 0
fi fi
done done
return 1 return 1
} }
@ -113,12 +113,12 @@ openim::util::wait_for_url() {
local wait=${3:-1} local wait=${3:-1}
local times=${4:-30} local times=${4:-30}
local maxtime=${5:-1} local maxtime=${5:-1}
command -v curl >/dev/null || { command -v curl >/dev/null || {
openim::log::usage "curl must be installed" openim::log::usage "curl must be installed"
exit 1 exit 1
} }
local i local i
for i in $(seq 1 "${times}"); do for i in $(seq 1 "${times}"); do
local out local out
@ -156,20 +156,20 @@ openim::util::trap_add() {
local trap_add_cmd local trap_add_cmd
trap_add_cmd=$1 trap_add_cmd=$1
shift shift
for trap_add_name in "$@"; do for trap_add_name in "$@"; do
local existing_cmd local existing_cmd
local new_cmd local new_cmd
# Grab the currently defined trap commands for this trap # Grab the currently defined trap commands for this trap
existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}') existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}')
if [[ -z "${existing_cmd}" ]]; then if [[ -z "${existing_cmd}" ]]; then
new_cmd="${trap_add_cmd}" new_cmd="${trap_add_cmd}"
else else
new_cmd="${trap_add_cmd};${existing_cmd}" new_cmd="${trap_add_cmd};${existing_cmd}"
fi fi
# Assign the test. Disable the shellcheck warning telling that trap # Assign the test. Disable the shellcheck warning telling that trap
# commands should be single quoted to avoid evaluating them at this # commands should be single quoted to avoid evaluating them at this
# point instead evaluating them at run time. The logic of adding new # point instead evaluating them at run time. The logic of adding new
@ -200,14 +200,14 @@ openim::util::host_os() {
case "$(uname -s)" in case "$(uname -s)" in
Darwin) Darwin)
host_os=darwin host_os=darwin
;; ;;
Linux) Linux)
host_os=linux host_os=linux
;; ;;
*) *)
openim::log::error "Unsupported host OS. Must be Linux or Mac OS X." openim::log::error "Unsupported host OS. Must be Linux or Mac OS X."
exit 1 exit 1
;; ;;
esac esac
echo "${host_os}" echo "${host_os}"
} }
@ -217,70 +217,70 @@ openim::util::host_arch() {
case "$(uname -m)" in case "$(uname -m)" in
x86_64*) x86_64*)
host_arch=amd64 host_arch=amd64
;; ;;
i?86_64*) i?86_64*)
host_arch=amd64 host_arch=amd64
;; ;;
amd64*) amd64*)
host_arch=amd64 host_arch=amd64
;; ;;
aarch64*) aarch64*)
host_arch=arm64 host_arch=arm64
;; ;;
arm64*) arm64*)
host_arch=arm64 host_arch=arm64
;; ;;
arm*) arm*)
host_arch=arm host_arch=arm
;; ;;
i?86*) i?86*)
host_arch=x86 host_arch=x86
;; ;;
s390x*) s390x*)
host_arch=s390x host_arch=s390x
;; ;;
ppc64le*) ppc64le*)
host_arch=ppc64le host_arch=ppc64le
;; ;;
*) *)
openim::log::error "Unsupported host arch. Must be x86_64, 386, arm, arm64, s390x or ppc64le." openim::log::error "Unsupported host arch. Must be x86_64, 386, arm, arm64, s390x or ppc64le."
exit 1 exit 1
;; ;;
esac esac
echo "${host_arch}" echo "${host_arch}"
} }
# Define a bash function to check the versions of Docker and Docker Compose # Define a bash function to check the versions of Docker and Docker Compose
openim::util::check_docker_and_compose_versions() { openim::util::check_docker_and_compose_versions() {
# Define the required versions of Docker and Docker Compose # Define the required versions of Docker and Docker Compose
required_docker_version="20.10.0" required_docker_version="20.10.0"
required_compose_version="2.0" required_compose_version="2.0"
# Get the currently installed Docker version # Get the currently installed Docker version
installed_docker_version=$(docker --version | awk '{print $3}' | sed 's/,//') installed_docker_version=$(docker --version | awk '{print $3}' | sed 's/,//')
# Check if the installed Docker version matches the required version # Check if the installed Docker version matches the required version
if [[ "$installed_docker_version" < "$required_docker_version" ]]; then if [[ "$installed_docker_version" < "$required_docker_version" ]]; then
echo "Docker version mismatch. Installed: $installed_docker_version, Required: $required_docker_version" echo "Docker version mismatch. Installed: $installed_docker_version, Required: $required_docker_version"
return 1 return 1
fi fi
# Check if the docker compose sub-command is available # Check if the docker compose sub-command is available
if ! docker compose version &> /dev/null; then if ! docker compose version &> /dev/null; then
echo "Docker does not support the docker compose sub-command" echo "Docker does not support the docker compose sub-command"
echo "You need to upgrade Docker to the right version" echo "You need to upgrade Docker to the right version"
return 1 return 1
fi fi
# Get the currently installed Docker Compose version # Get the currently installed Docker Compose version
installed_compose_version=$(docker compose version --short) installed_compose_version=$(docker compose version --short)
# Check if the installed Docker Compose version matches the required version # Check if the installed Docker Compose version matches the required version
if [[ "$installed_compose_version" < "$required_compose_version" ]]; then if [[ "$installed_compose_version" < "$required_compose_version" ]]; then
echo "Docker Compose version mismatch. Installed: $installed_compose_version, Required: $required_compose_version" echo "Docker Compose version mismatch. Installed: $installed_compose_version, Required: $required_compose_version"
return 1 return 1
fi fi
} }
@ -292,80 +292,80 @@ openim::util::check_docker_and_compose_versions() {
# openim::util::check_ports 8080 8081 8082 # openim::util::check_ports 8080 8081 8082
# The function returns a status of 1 if any of the processes is not running. # The function returns a status of 1 if any of the processes is not running.
openim::util::check_ports() { openim::util::check_ports() {
# An array to collect ports of processes that are not running. # An array to collect ports of processes that are not running.
local not_started=() local not_started=()
# An array to collect information about processes that are running. # An array to collect information about processes that are running.
local started=() local started=()
openim::log::info "Checking ports: $*" openim::log::info "Checking ports: $*"
# Iterate over each given port. # Iterate over each given port.
for port in "$@"; do for port in "$@"; do
# Initialize variables # Initialize variables
# Check the OS and use the appropriate command # Check the OS and use the appropriate command
if [[ "$OSTYPE" == "linux-gnu"* ]]; then if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if command -v ss > /dev/null 2>&1; then if command -v ss > /dev/null 2>&1; then
info=$(ss -ltnp | grep ":$port" || true) info=$(ss -ltnp | grep ":$port" || true)
else else
info=$(netstat -ltnp | grep ":$port" || true) info=$(netstat -ltnp | grep ":$port" || true)
fi fi
elif [[ "$OSTYPE" == "darwin"* ]]; then elif [[ "$OSTYPE" == "darwin"* ]]; then
# For macOS, use lsof # For macOS, use lsof
info=$(lsof -P -i:"$port" | grep "LISTEN" || true) info=$(lsof -P -i:"$port" | grep "LISTEN" || true)
fi
# Check if any process is using the port
if [[ -z $info ]]; then
not_started+=($port)
else
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Extract relevant details for Linux: Process Name, PID, and FD.
details=$(echo $info | sed -n 's/.*users:(("\([^"]*\)",pid=\([^,]*\),fd=\([^)]*\))).*/\1 \2 \3/p')
command=$(echo $details | awk '{print $1}')
pid=$(echo $details | awk '{print $2}')
fd=$(echo $details | awk '{print $3}')
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Handle extraction for macOS
pid=$(echo $info | awk '{print $2}' | cut -d'/' -f1)
command=$(ps -p $pid -o comm= | xargs basename)
fd=$(echo $info | awk '{print $4}' | cut -d'/' -f1)
fi
# Get the start time of the process using the PID
if [[ -z $pid ]]; then
start_time="N/A"
else
start_time=$(ps -p $pid -o lstart=)
fi
started+=("Port $port - Command: $command, PID: $pid, FD: $fd, Started: $start_time")
fi
done
# Print information about ports whose processes are not running.
if [[ ${#not_started[@]} -ne 0 ]]; then
openim::log::info "\n### Not started ports:"
for port in "${not_started[@]}"; do
openim::log::error "Port $port is not started."
done
fi fi
# Print information about ports whose processes are running. # Check if any process is using the port
if [[ ${#started[@]} -ne 0 ]]; then if [[ -z $info ]]; then
openim::log::info "\n### Started ports:" not_started+=($port)
for info in "${started[@]}"; do
openim::log::info "$info"
done
fi
# If any of the processes is not running, return a status of 1.
if [[ ${#not_started[@]} -ne 0 ]]; then
echo "++++ OpenIM Log >> cat ${LOG_FILE}"
return 1
else else
openim::log::success "All specified processes are running." if [[ "$OSTYPE" == "linux-gnu"* ]]; then
return 0 # Extract relevant details for Linux: Process Name, PID, and FD.
details=$(echo $info | sed -n 's/.*users:(("\([^"]*\)",pid=\([^,]*\),fd=\([^)]*\))).*/\1 \2 \3/p')
command=$(echo $details | awk '{print $1}')
pid=$(echo $details | awk '{print $2}')
fd=$(echo $details | awk '{print $3}')
elif [[ "$OSTYPE" == "darwin"* ]]; then
# Handle extraction for macOS
pid=$(echo $info | awk '{print $2}' | cut -d'/' -f1)
command=$(ps -p $pid -o comm= | xargs basename)
fd=$(echo $info | awk '{print $4}' | cut -d'/' -f1)
fi
# Get the start time of the process using the PID
if [[ -z $pid ]]; then
start_time="N/A"
else
start_time=$(ps -p $pid -o lstart=)
fi
started+=("Port $port - Command: $command, PID: $pid, FD: $fd, Started: $start_time")
fi fi
done
# Print information about ports whose processes are not running.
if [[ ${#not_started[@]} -ne 0 ]]; then
openim::log::info "\n### Not started ports:"
for port in "${not_started[@]}"; do
openim::log::error "Port $port is not started."
done
fi
# Print information about ports whose processes are running.
if [[ ${#started[@]} -ne 0 ]]; then
openim::log::info "\n### Started ports:"
for info in "${started[@]}"; do
openim::log::info "$info"
done
fi
# If any of the processes is not running, return a status of 1.
if [[ ${#not_started[@]} -ne 0 ]]; then
echo "++++ OpenIM Log >> cat ${LOG_FILE}"
return 1
else
openim::log::success "All specified processes are running."
return 0
fi
} }
# set +o errexit # set +o errexit
@ -381,75 +381,75 @@ openim::util::check_ports() {
# openim::util::check_process_names nginx mysql redis # openim::util::check_process_names nginx mysql redis
# The function returns a status of 1 if any of the processes is not running. # The function returns a status of 1 if any of the processes is not running.
openim::util::check_process_names() { openim::util::check_process_names() {
# Function to get the port of a process # Function to get the port of a process
get_port() { get_port() {
local pid=$1 local pid=$1
if [[ "$OSTYPE" == "linux-gnu"* ]]; then if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux # Linux
ss -ltnp 2>/dev/null | grep $pid | awk '{print $4}' | cut -d ':' -f2 ss -ltnp 2>/dev/null | grep $pid | awk '{print $4}' | cut -d ':' -f2
elif [[ "$OSTYPE" == "darwin"* ]]; then elif [[ "$OSTYPE" == "darwin"* ]]; then
# macOS # macOS
lsof -nP -iTCP -sTCP:LISTEN -a -p $pid | awk 'NR>1 {print $9}' | sed 's/.*://' lsof -nP -iTCP -sTCP:LISTEN -a -p $pid | awk 'NR>1 {print $9}' | sed 's/.*://'
else else
echo "Unsupported OS" echo "Unsupported OS"
return 1 return 1
fi
}
# Arrays to collect details of processes
local not_started=()
local started=()
openim::log::info "Checking processes: $*"
# Iterate over each given process name
for process_name in "$@"; do
# Use `pgrep` to find process IDs related to the given process name
local pids=($(pgrep -f $process_name))
# Check if any process IDs were found
if [[ ${#pids[@]} -eq 0 ]]; then
not_started+=($process_name)
else
# If there are PIDs, loop through each one
for pid in "${pids[@]}"; do
local command=$(ps -p $pid -o cmd=)
local start_time=$(ps -p $pid -o lstart=)
local port=$(get_port $pid)
# Check if port information was found for the PID
if [[ -z $port ]]; then
port="N/A"
fi
started+=("Process $process_name - Command: $command, PID: $pid, Port: $port, Start time: $start_time")
done
fi
done
# Print information
if [[ ${#not_started[@]} -ne 0 ]]; then
openim::log::info "Not started processes:"
for process_name in "${not_started[@]}"; do
openim::log::error "Process $process_name is not started."
done
fi
if [[ ${#started[@]} -ne 0 ]]; then
echo
openim::log::info "Started processes:"
for info in "${started[@]}"; do
openim::log::info "$info"
done
fi fi
}
# Return status
if [[ ${#not_started[@]} -ne 0 ]]; then # Arrays to collect details of processes
echo "++++ OpenIM Log >> cat ${LOG_FILE}" local not_started=()
return 1 local started=()
openim::log::info "Checking processes: $*"
# Iterate over each given process name
for process_name in "$@"; do
# Use `pgrep` to find process IDs related to the given process name
local pids=($(pgrep -f $process_name))
# Check if any process IDs were found
if [[ ${#pids[@]} -eq 0 ]]; then
not_started+=($process_name)
else else
openim::log::success "All processes are running." # If there are PIDs, loop through each one
return 0 for pid in "${pids[@]}"; do
local command=$(ps -p $pid -o cmd=)
local start_time=$(ps -p $pid -o lstart=)
local port=$(get_port $pid)
# Check if port information was found for the PID
if [[ -z $port ]]; then
port="N/A"
fi
started+=("Process $process_name - Command: $command, PID: $pid, Port: $port, Start time: $start_time")
done
fi fi
done
# Print information
if [[ ${#not_started[@]} -ne 0 ]]; then
openim::log::info "Not started processes:"
for process_name in "${not_started[@]}"; do
openim::log::error "Process $process_name is not started."
done
fi
if [[ ${#started[@]} -ne 0 ]]; then
echo
openim::log::info "Started processes:"
for info in "${started[@]}"; do
openim::log::info "$info"
done
fi
# Return status
if [[ ${#not_started[@]} -ne 0 ]]; then
echo "++++ OpenIM Log >> cat ${LOG_FILE}"
return 1
else
openim::log::success "All processes are running."
return 0
fi
} }
# openim::util::check_process_names docker-pr # openim::util::check_process_names docker-pr
@ -462,30 +462,30 @@ openim::util::check_process_names() {
# openim::util::stop_services_on_ports 8080 8081 8082 # openim::util::stop_services_on_ports 8080 8081 8082
# The function returns a status of 1 if any service couldn't be stopped. # The function returns a status of 1 if any service couldn't be stopped.
openim::util::stop_services_on_ports() { openim::util::stop_services_on_ports() {
# An array to collect ports of processes that couldn't be stopped. # An array to collect ports of processes that couldn't be stopped.
local not_stopped=() local not_stopped=()
# An array to collect information about processes that were stopped. # An array to collect information about processes that were stopped.
local stopped=() local stopped=()
openim::log::info "Stopping services on ports: $*" openim::log::info "Stopping services on ports: $*"
# Iterate over each given port. # Iterate over each given port.
for port in "$@"; do for port in "$@"; do
# Use the `lsof` command to find process information related to the given port. # Use the `lsof` command to find process information related to the given port.
info=$(lsof -i :$port -n -P | grep LISTEN || true) info=$(lsof -i :$port -n -P | grep LISTEN || true)
# If there's process information, it means the process associated with the port is running. # If there's process information, it means the process associated with the port is running.
if [[ -n $info ]]; then if [[ -n $info ]]; then
# Extract the Process ID. # Extract the Process ID.
while read -r line; do while read -r line; do
local pid=$(echo $line | awk '{print $2}') local pid=$(echo $line | awk '{print $2}')
# Try to stop the service by killing its process. # Try to stop the service by killing its process.
if kill -TERM $pid; then if kill -TERM $pid; then
stopped+=($port) stopped+=($port)
else else
not_stopped+=($port) not_stopped+=($port)
fi fi
done <<< "$info" done <<< "$info"
fi fi
done done
@ -519,7 +519,7 @@ openim::util::stop_services_on_ports() {
# nc -l -p 12345 # nc -l -p 12345
# nc -l -p 123456 # nc -l -p 123456
# ps -ef | grep "nc -l" # ps -ef | grep "nc -l"
# openim::util::stop_services_on_ports 1234 12345 # openim::util::stop_services_on_ports 1234 12345
# The `openim::util::stop_services_with_name` function stops services with specified names. # The `openim::util::stop_services_with_name` function stops services with specified names.
@ -1086,7 +1086,7 @@ function openim::util::ensure-install-nginx {
exit 1 exit 1
fi fi
for port in 80 for port in "80"
do do
if echo |telnet 127.0.0.1 $port 2>&1|grep refused &>/dev/null;then if echo |telnet 127.0.0.1 $port 2>&1|grep refused &>/dev/null;then
exit 1 exit 1
@ -1263,7 +1263,7 @@ function openim:util::setup_ssh_key_copy() {
local sshkey_file=~/.ssh/id_rsa.pub local sshkey_file=~/.ssh/id_rsa.pub
# check sshkey file # check sshkey file
if [[ ! -e $sshkey_file ]]; then if [[ ! -e $sshkey_file ]]; then
expect -c " expect -c "
spawn ssh-keygen -t rsa spawn ssh-keygen -t rsa
@ -1280,7 +1280,7 @@ function openim:util::setup_ssh_key_copy() {
# delete history # delete history
sed -i "/$target/d" ~/.ssh/known_hosts sed -i "/$target/d" ~/.ssh/known_hosts
# copy key # copy key
expect -c " expect -c "
set timeout 100 set timeout 100
spawn ssh-copy-id $username@$target spawn ssh-copy-id $username@$target
@ -1571,7 +1571,7 @@ openim::util::check_ports() {
else else
start_time=$(ps -p $pid -o lstart=) start_time=$(ps -p $pid -o lstart=)
fi fi
started+=("Port $port - Command: $command, PID: $pid, FD: $fd, Started: $start_time") started+=("Port $port - Command: $command, PID: $pid, FD: $fd, Started: $start_time")
fi fi
done done
@ -1639,7 +1639,7 @@ openim::util::check_process_names() {
for process_name in "$@"; do for process_name in "$@"; do
# Use `pgrep` to find process IDs related to the given process name # Use `pgrep` to find process IDs related to the given process name
local pids=($(pgrep -f $process_name)) local pids=($(pgrep -f $process_name))
# Check if any process IDs were found # Check if any process IDs were found
if [[ ${#pids[@]} -eq 0 ]]; then if [[ ${#pids[@]} -eq 0 ]]; then
not_started+=($process_name) not_started+=($process_name)
@ -1713,7 +1713,7 @@ openim::util::stop_services_on_ports() {
# Extract the Process ID. # Extract the Process ID.
while read -r line; do while read -r line; do
local pid=$(echo $line | awk '{print $2}') local pid=$(echo $line | awk '{print $2}')
# Try to stop the service by killing its process. # Try to stop the service by killing its process.
if kill -TERM $pid; then if kill -TERM $pid; then
stopped+=($port) stopped+=($port)
@ -1753,7 +1753,7 @@ openim::util::stop_services_on_ports() {
# nc -l -p 12345 # nc -l -p 12345
# nc -l -p 123456 # nc -l -p 123456
# ps -ef | grep "nc -l" # ps -ef | grep "nc -l"
# openim::util::stop_services_on_ports 1234 12345 # openim::util::stop_services_on_ports 1234 12345
# The `openim::util::stop_services_with_name` function stops services with specified names. # The `openim::util::stop_services_with_name` function stops services with specified names.
@ -2320,7 +2320,7 @@ function openim::util::ensure-install-nginx {
exit 1 exit 1
fi fi
for port in 80 for port in "80"
do do
if echo |telnet 127.0.0.1 $port 2>&1|grep refused &>/dev/null;then if echo |telnet 127.0.0.1 $port 2>&1|grep refused &>/dev/null;then
exit 1 exit 1
@ -2467,7 +2467,7 @@ function openim::util::desc() {
} }
function openim::util:run::prompt() { function openim::util:run::prompt() {
echo -n "$yellow\$ $reset" echo -n "${yellow}\$ ${reset}"
} }
started="" started=""
@ -2488,7 +2488,7 @@ function openim::util::run() {
if [ -n "$DEMO_RUN_FAST" ]; then if [ -n "$DEMO_RUN_FAST" ]; then
rate=1000 rate=1000
fi fi
echo "$green$1$reset" | pv -qL $rate echo "${green}$1${reset}" | pv -qL "$rate"
if [ -n "$DEMO_RUN_FAST" ]; then if [ -n "$DEMO_RUN_FAST" ]; then
sleep 0.5 sleep 0.5
fi fi
@ -2516,7 +2516,7 @@ function openim::util::run::relative() {
# This function retrieves the IP address of the current server. # This function retrieves the IP address of the current server.
# It primarily uses the `curl` command to fetch the public IP address from ifconfig.me. # It primarily uses the `curl` command to fetch the public IP address from ifconfig.me.
# If curl or the service is not available, it falls back # If curl or the service is not available, it falls back
# to the internal IP address provided by the hostname command. # to the internal IP address provided by the hostname command.
# TODO: If a delay is found, the delay needs to be addressed # TODO: If a delay is found, the delay needs to be addressed
function openim::util::get_server_ip() { function openim::util::get_server_ip() {
@ -2524,7 +2524,7 @@ function openim::util::get_server_ip() {
if command -v curl &> /dev/null; then if command -v curl &> /dev/null; then
# Try to retrieve the public IP address using curl and ifconfig.me # Try to retrieve the public IP address using curl and ifconfig.me
IP=$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | sed 's/"//g' | tr -d '\n') IP=$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | sed 's/"//g' | tr -d '\n')
# Check if IP retrieval was successful # Check if IP retrieval was successful
if [[ -z "$IP" ]]; then if [[ -z "$IP" ]]; then
# If not, get the internal IP address # If not, get the internal IP address
@ -2534,7 +2534,7 @@ function openim::util::get_server_ip() {
# If curl is not available, get the internal IP address # If curl is not available, get the internal IP address
IP=$(ip addr show | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}' | cut -d'/' -f1 | head -n 1) IP=$(ip addr show | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}' | cut -d'/' -f1 | head -n 1)
fi fi
# Return the fetched IP address # Return the fetched IP address
echo "$IP" echo "$IP"
} }
@ -2580,7 +2580,7 @@ function openim::util::set_max_fd() {
if [ "$desired_fd" = "maximum" ] || [ "$desired_fd" = "max" ]; then if [ "$desired_fd" = "maximum" ] || [ "$desired_fd" = "max" ]; then
desired_fd="$max_fd_limit" desired_fd="$max_fd_limit"
fi fi
# Check if desired_fd is less than or equal to max_fd_limit. # Check if desired_fd is less than or equal to max_fd_limit.
if [ "$desired_fd" -le "$max_fd_limit" ]; then if [ "$desired_fd" -le "$max_fd_limit" ]; then
ulimit -n "$desired_fd" ulimit -n "$desired_fd"
@ -2696,7 +2696,7 @@ function openim::util::run::relative() {
# This function retrieves the IP address of the current server. # This function retrieves the IP address of the current server.
# It primarily uses the `curl` command to fetch the public IP address from ifconfig.me. # It primarily uses the `curl` command to fetch the public IP address from ifconfig.me.
# If curl or the service is not available, it falls back # If curl or the service is not available, it falls back
# to the internal IP address provided by the hostname command. # to the internal IP address provided by the hostname command.
# TODO: If a delay is found, the delay needs to be addressed # TODO: If a delay is found, the delay needs to be addressed
function openim::util::get_server_ip() { function openim::util::get_server_ip() {
@ -2704,7 +2704,7 @@ function openim::util::get_server_ip() {
if command -v curl &> /dev/null; then if command -v curl &> /dev/null; then
# Try to retrieve the public IP address using curl and ifconfig.me # Try to retrieve the public IP address using curl and ifconfig.me
IP=$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | sed 's/"//g' | tr -d '\n') IP=$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | sed 's/"//g' | tr -d '\n')
# Check if IP retrieval was successful # Check if IP retrieval was successful
if [[ -z "$IP" ]]; then if [[ -z "$IP" ]]; then
# If not, get the internal IP address # If not, get the internal IP address
@ -2714,7 +2714,7 @@ function openim::util::get_server_ip() {
# If curl is not available, get the internal IP address # If curl is not available, get the internal IP address
IP=$(ip addr show | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}' | cut -d'/' -f1 | head -n 1) IP=$(ip addr show | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}' | cut -d'/' -f1 | head -n 1)
fi fi
# Return the fetched IP address # Return the fetched IP address
echo "$IP" echo "$IP"
} }
@ -2760,7 +2760,7 @@ function openim::util::set_max_fd() {
if [ "$desired_fd" = "maximum" ] || [ "$desired_fd" = "max" ]; then if [ "$desired_fd" = "maximum" ] || [ "$desired_fd" = "max" ]; then
desired_fd="$max_fd_limit" desired_fd="$max_fd_limit"
fi fi
# Check if desired_fd is less than or equal to max_fd_limit. # Check if desired_fd is less than or equal to max_fd_limit.
if [ "$desired_fd" -le "$max_fd_limit" ]; then if [ "$desired_fd" -le "$max_fd_limit" ]; then
ulimit -n "$desired_fd" ulimit -n "$desired_fd"

@ -12,7 +12,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Version management helpers. These functions help to set, save and load the # Version management helpers. These functions help to set, save and load the
# following variables: # following variables:
@ -35,7 +35,7 @@ openim::version::get_version_vars() {
openim::version::load_version_vars "${OPENIM_GIT_VERSION_FILE}" openim::version::load_version_vars "${OPENIM_GIT_VERSION_FILE}"
return return
fi fi
# If the iamrnetes source was exported through git archive, then # If the iamrnetes source was exported through git archive, then
# we likely don't have a git tree, but these magic values may be filled in. # we likely don't have a git tree, but these magic values may be filled in.
# shellcheck disable=SC2016,SC2050 # shellcheck disable=SC2016,SC2050
@ -48,12 +48,12 @@ openim::version::get_version_vars() {
# something like 'HEAD -> release-1.8, tag: v1.8.3' where then 'tag: ' # something like 'HEAD -> release-1.8, tag: v1.8.3' where then 'tag: '
# can be extracted from it. # can be extracted from it.
if [[ '$Format:%D$' =~ tag:\ (v[^ ,]+) ]]; then if [[ '$Format:%D$' =~ tag:\ (v[^ ,]+) ]]; then
OPENIM_GIT_VERSION="${BASH_REMATCH[1]}" OPENIM_GIT_VERSION="${BASH_REMATCH[1]}"
fi fi
fi fi
local git=(git --work-tree "${OPENIM_ROOT}") local git=(git --work-tree "${OPENIM_ROOT}")
if [[ -n ${OPENIM_GIT_COMMIT-} ]] || OPENIM_GIT_COMMIT=$("${git[@]}" rev-parse "HEAD^{commit}" 2>/dev/null); then if [[ -n ${OPENIM_GIT_COMMIT-} ]] || OPENIM_GIT_COMMIT=$("${git[@]}" rev-parse "HEAD^{commit}" 2>/dev/null); then
if [[ -z ${OPENIM_GIT_TREE_STATE-} ]]; then if [[ -z ${OPENIM_GIT_TREE_STATE-} ]]; then
# Check if the tree is dirty. default to dirty # Check if the tree is dirty. default to dirty
@ -63,7 +63,7 @@ openim::version::get_version_vars() {
OPENIM_GIT_TREE_STATE="dirty" OPENIM_GIT_TREE_STATE="dirty"
fi fi
fi fi
# Use git describe to find the version based on tags. # Use git describe to find the version based on tags.
if [[ -n ${OPENIM_GIT_VERSION-} ]] || OPENIM_GIT_VERSION=$("${git[@]}" describe --tags --always --match='v*' 2>/dev/null); then if [[ -n ${OPENIM_GIT_VERSION-} ]] || OPENIM_GIT_VERSION=$("${git[@]}" describe --tags --always --match='v*' 2>/dev/null); then
# This translates the "git describe" to an actual semver.org # This translates the "git describe" to an actual semver.org
@ -81,7 +81,7 @@ openim::version::get_version_vars() {
# shellcheck disable=SC2001 # shellcheck disable=SC2001
# We have distance to subversion (v1.1.0-subversion-1-gCommitHash) # We have distance to subversion (v1.1.0-subversion-1-gCommitHash)
OPENIM_GIT_VERSION=$(echo "${OPENIM_GIT_VERSION}" | sed "s/-\([0-9]\{1,\}\)-g\([0-9a-f]\{14\}\)$/.\1\+\2/") OPENIM_GIT_VERSION=$(echo "${OPENIM_GIT_VERSION}" | sed "s/-\([0-9]\{1,\}\)-g\([0-9a-f]\{14\}\)$/.\1\+\2/")
elif [[ "${DASHES_IN_VERSION}" == "--" ]] ; then elif [[ "${DASHES_IN_VERSION}" == "--" ]] ; then
# shellcheck disable=SC2001 # shellcheck disable=SC2001
# We have distance to base tag (v1.1.0-1-gCommitHash) # We have distance to base tag (v1.1.0-1-gCommitHash)
OPENIM_GIT_VERSION=$(echo "${OPENIM_GIT_VERSION}" | sed "s/-g\([0-9a-f]\{14\}\)$/+\1/") OPENIM_GIT_VERSION=$(echo "${OPENIM_GIT_VERSION}" | sed "s/-g\([0-9a-f]\{14\}\)$/+\1/")
@ -94,7 +94,7 @@ openim::version::get_version_vars() {
#OPENIM_GIT_VERSION+="-dirty" #OPENIM_GIT_VERSION+="-dirty"
: :
fi fi
# Try to match the "git describe" output to a regex to try to extract # Try to match the "git describe" output to a regex to try to extract
# the "major" and "minor" versions and whether this is the exact tagged # the "major" and "minor" versions and whether this is the exact tagged
# version or whether the tree is between two tagged versions. # version or whether the tree is between two tagged versions.
@ -105,12 +105,12 @@ openim::version::get_version_vars() {
OPENIM_GIT_MINOR+="+" OPENIM_GIT_MINOR+="+"
fi fi
fi fi
# If OPENIM_GIT_VERSION is not a valid Semantic Version, then refuse to build. # If OPENIM_GIT_VERSION is not a valid Semantic Version, then refuse to build.
if ! [[ "${OPENIM_GIT_VERSION}" =~ ^v([0-9]+)\.([0-9]+)(\.[0-9]+)?(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then if ! [[ "${OPENIM_GIT_VERSION}" =~ ^v([0-9]+)\.([0-9]+)(\.[0-9]+)?(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then
echo "OPENIM_GIT_VERSION should be a valid Semantic Version. Current value: ${OPENIM_GIT_VERSION}" echo "OPENIM_GIT_VERSION should be a valid Semantic Version. Current value: ${OPENIM_GIT_VERSION}"
echo "Please see more details here: https://semver.org" echo "Please see more details here: https://semver.org"
exit 1 exit 1
fi fi
fi fi
fi fi
@ -123,7 +123,7 @@ openim::version::save_version_vars() {
echo "!!! Internal error. No file specified in openim::version::save_version_vars" echo "!!! Internal error. No file specified in openim::version::save_version_vars"
return 1 return 1
} }
cat <<EOF >"${version_file}" cat <<EOF >"${version_file}"
OPENIM_GIT_COMMIT='${OPENIM_GIT_COMMIT-}' OPENIM_GIT_COMMIT='${OPENIM_GIT_COMMIT-}'
OPENIM_GIT_TREE_STATE='${OPENIM_GIT_TREE_STATE-}' OPENIM_GIT_TREE_STATE='${OPENIM_GIT_TREE_STATE-}'
@ -140,6 +140,6 @@ openim::version::load_version_vars() {
echo "!!! Internal error. No file specified in openim::version::load_version_vars" echo "!!! Internal error. No file specified in openim::version::load_version_vars"
return 1 return 1
} }
source "${version_file}" source "${version_file}"
} }

@ -73,7 +73,8 @@ endif
ifeq ($(origin VERSION), undefined) ifeq ($(origin VERSION), undefined)
# VERSION := $(shell git describe --tags --always --match='v*') # VERSION := $(shell git describe --tags --always --match='v*')
# git describe --tags --always --match="v*" --dirty # git describe --tags --always --match="v*" --dirty
VERSION := $(shell git describe --tags --always --match="v*" --dirty | sed 's/-/./g') #v2.3.3.631.g00abdc9b.dirty # VERSION := $(shell git describe --tags --always --match="v*" --dirty | sed 's/-/./g') #v2.3.3.631.g00abdc9b.dirty
VERSION := $(shell git describe --tags --always --match='v*')
# v2.3.3: git tag # v2.3.3: git tag
endif endif
@ -100,7 +101,7 @@ endif
# The OS must be linux when building docker images # The OS must be linux when building docker images
# PLATFORMS ?= linux_amd64 linux_arm64 # PLATFORMS ?= linux_amd64 linux_arm64
# The OS can be linux/windows/darwin when building binaries # The OS can be linux/windows/darwin when building binaries
PLATFORMS ?= linux_s390x linux_mips64 linux_mips64le darwin_amd64 windows_amd64 linux_amd64 linux_arm64 linux_ppc64le # wasip1_wasm PLATFORMS ?= linux_s390x linux_mips64 linux_mips64le darwin_amd64 darwin_arm64 windows_amd64 linux_amd64 linux_arm64 linux_ppc64le # wasip1_wasm
# set a specific PLATFORM, defaults to the host platform # set a specific PLATFORM, defaults to the host platform
ifeq ($(origin PLATFORM), undefined) ifeq ($(origin PLATFORM), undefined)
@ -125,11 +126,11 @@ APIROOT=$(ROOT_DIR)/pkg/proto
# Linux command settings # Linux command settings
# TODO: Whether you need to join utils? # TODO: Whether you need to join utils?
FIND := find . ! -path './utils/*' ! -path './vendor/*' ! -path './third_party/*' FIND := find . ! -path './utils/*' ! -path './vendor/*' ! -path './third_party/*' ! -path './components/*' ! -path './logs/*'
XARGS := xargs -r --no-run-if-empty XARGS := xargs -r --no-run-if-empty
# Linux command settings-CODE DIRS Copyright # Linux command settings-CODE DIRS Copyright
CODE_DIRS := $(ROOT_DIR)/pkg $(ROOT_DIR)/cmd $(ROOT_DIR)/config $(ROOT_DIR)/.docker-compose_cfg $(ROOT_DIR)/internal $(ROOT_DIR)/scripts $(ROOT_DIR)/test $(ROOT_DIR)/.github $(ROOT_DIR)/build $(ROOT_DIR)/tools $(ROOT_DIR)/deployments CODE_DIRS := $(ROOT_DIR)/pkg $(ROOT_DIR)/cmd $(ROOT_DIR)/config $(ROOT_DIR)/internal $(ROOT_DIR)/scripts $(ROOT_DIR)/test $(ROOT_DIR)/.github $(ROOT_DIR)/build $(ROOT_DIR)/tools $(ROOT_DIR)/deployments
FINDS := find $(CODE_DIRS) FINDS := find $(CODE_DIRS)
# Makefile settings: Select different behaviors by determining whether V option is set # Makefile settings: Select different behaviors by determining whether V option is set

@ -244,7 +244,7 @@ go.imports: tools.verify.goimports
## go.verify: execute all verity scripts. ## go.verify: execute all verity scripts.
.PHONY: go.verify .PHONY: go.verify
go.verify: go.verify: tools.verify.misspell
@echo "Starting verification..." @echo "Starting verification..."
@scripts_list=$$(find $(ROOT_DIR)/scripts -type f -name 'verify-*' | sort); \ @scripts_list=$$(find $(ROOT_DIR)/scripts -type f -name 'verify-*' | sort); \
for script in $$scripts_list; do \ for script in $$scripts_list; do \

@ -45,7 +45,8 @@ endif
IMAGES_DIR ?= $(wildcard ${ROOT_DIR}/build/images/*) IMAGES_DIR ?= $(wildcard ${ROOT_DIR}/build/images/*)
# Determine images names by stripping out the dir names, and filter out the undesired directories # Determine images names by stripping out the dir names, and filter out the undesired directories
# IMAGES ?= $(filter-out Dockerfile,$(foreach image,${IMAGES_DIR},$(notdir ${image}))) # IMAGES ?= $(filter-out Dockerfile,$(foreach image,${IMAGES_DIR},$(notdir ${image})))
IMAGES ?= $(filter-out Dockerfile openim-tools openim-cmdutils,$(foreach image,${IMAGES_DIR},$(notdir ${image}))) IMAGES ?= $(filter-out Dockerfile openim-tools openim-rpc-extend-msg openim-rpc-encryption openim-cmdutils,$(foreach image,${IMAGES_DIR},$(notdir ${image})))
# IMAGES ?= $(filter-out Dockerfile openim-tools openim-cmdutils,$(foreach image,${IMAGES_DIR},$(notdir ${image}))) # !pro
ifeq (${IMAGES},) ifeq (${IMAGES},)
$(error Could not determine IMAGES, set ROOT_DIR or run in source dir) $(error Could not determine IMAGES, set ROOT_DIR or run in source dir)

@ -146,7 +146,7 @@ install.github-release:
# amd64 # amd64
.PHONY: install.coscli .PHONY: install.coscli
install.coscli: install.coscli:
@wget -q https://ghproxy.com/https://github.com/tencentyun/coscli/releases/download/v0.13.0-beta/coscli-linux -O ${TOOLS_DIR}/coscli @wget -q https://github.com/tencentyun/coscli/releases/download/v0.19.0-beta/coscli-linux -O ${TOOLS_DIR}/coscli
@chmod +x ${TOOLS_DIR}/coscli @chmod +x ${TOOLS_DIR}/coscli
## install.coscmd: Install coscmd, used to upload files to cos ## install.coscmd: Install coscmd, used to upload files to cos
@ -217,6 +217,11 @@ install.depth:
install.go-callvis: install.go-callvis:
@$(GO) install github.com/ofabry/go-callvis@latest @$(GO) install github.com/ofabry/go-callvis@latest
## install.misspell
.PHONY: install.misspell
install.misspell:
@$(GO) install github.com/client9/misspell/cmd/misspell@latest
## install.gothanks: Install gothanks, used to thank go dependencies ## install.gothanks: Install gothanks, used to thank go dependencies
.PHONY: install.gothanks .PHONY: install.gothanks
install.gothanks: install.gothanks:

@ -18,7 +18,6 @@ mongosh <<EOF
use admin use admin
db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD') db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD')
db = db.getSiblingDB('$MONGO_INITDB_DATABASE') db = db.getSiblingDB('$MONGO_INITDB_DATABASE')
db.createUser({ db.createUser({
user: "$MONGO_OPENIM_USERNAME", user: "$MONGO_OPENIM_USERNAME",
@ -29,4 +28,3 @@ db.createUser({
] ]
}); });
EOF EOF

@ -14,9 +14,9 @@
# limitations under the License. # limitations under the License.
# Description: # Description:
# This script automates the process of building and releasing OpenIM, # This script automates the process of building and releasing OpenIM,
# including tasks like setting up the environment, verifying prerequisites, # including tasks like setting up the environment, verifying prerequisites,
# building commands, packaging tarballs, uploading tarballs, creating GitHub # building commands, packaging tarballs, uploading tarballs, creating GitHub
# releases, and generating changelogs. # releases, and generating changelogs.
# #
# Usage: # Usage:
@ -35,12 +35,12 @@
# This script can also be executed via the 'make release' command as an alternative. # This script can also be executed via the 'make release' command as an alternative.
# #
# Dependencies: # Dependencies:
# This script depends on external scripts found in the 'scripts' directory and # This script depends on external scripts found in the 'scripts' directory and
# assumes the presence of necessary tools and permissions for building and # assumes the presence of necessary tools and permissions for building and
# releasing software. # releasing software.
# #
# Note: # Note:
# The script uses standard bash script practices with error handling, # The script uses standard bash script practices with error handling,
# and it defaults to executing all steps if no specific option is provided. # and it defaults to executing all steps if no specific option is provided.
# #
# Build a OpenIM release. This will build the binaries, create the Docker # Build a OpenIM release. This will build the binaries, create the Docker
@ -58,17 +58,17 @@ OPENIM_RELEASE_RUN_TESTS=${OPENIM_RELEASE_RUN_TESTS-y}
# Function to show help message # Function to show help message
show_help() { show_help() {
echo "Usage: $(basename $0) [options]" echo "Usage: $(basename $0) [options]"
echo "Options:" echo "Options:"
echo " -h, --help Show this help message" echo " -h, --help Show this help message"
echo " -se, --setup-env Execute setup environment" echo " -se, --setup-env Execute setup environment"
echo " -vp, --verify-prereqs Execute prerequisites verification" echo " -vp, --verify-prereqs Execute prerequisites verification"
echo " -bc, --build-command Execute build command" echo " -bc, --build-command Execute build command"
echo " -bi, --build-image Execute build image (default: not executed)" echo " -bi, --build-image Execute build image (default: not executed)"
echo " -pt, --package-tarballs Execute package tarballs" echo " -pt, --package-tarballs Execute package tarballs"
echo " -ut, --upload-tarballs Execute upload tarballs" echo " -ut, --upload-tarballs Execute upload tarballs"
echo " -gr, --github-release Execute GitHub release" echo " -gr, --github-release Execute GitHub release"
echo " -gc, --generate-changelog Execute generate changelog" echo " -gc, --generate-changelog Execute generate changelog"
} }
# Initialize all actions to false # Initialize all actions to false
@ -83,57 +83,57 @@ perform_generate_changelog=false
# Process command-line arguments # Process command-line arguments
while getopts "hsevpbciptutgrgc-" opt; do while getopts "hsevpbciptutgrgc-" opt; do
case "${opt}" in case "${opt}" in
h) show_help; exit 0 ;; h) show_help; exit 0 ;;
se) perform_setup_env=true ;; se) perform_setup_env=true ;;
vp) perform_verify_prereqs=true ;; vp) perform_verify_prereqs=true ;;
bc) perform_build_command=true ;; bc) perform_build_command=true ;;
bi) perform_build_image=true ;; # Handling new option bi) perform_build_image=true ;; # Handling new option
pt) perform_package_tarballs=true ;; pt) perform_package_tarballs=true ;;
ut) perform_upload_tarballs=true ;; ut) perform_upload_tarballs=true ;;
gr) perform_github_release=true ;; gr) perform_github_release=true ;;
gc) perform_generate_changelog=true ;; gc) perform_generate_changelog=true ;;
--) case "${OPTARG}" in --) case "${OPTARG}" in
help) show_help; exit 0 ;; help) show_help; exit 0 ;;
setup-env) perform_setup_env=true ;; setup-env) perform_setup_env=true ;;
verify-prereqs) perform_verify_prereqs=true ;; verify-prereqs) perform_verify_prereqs=true ;;
build-command) perform_build_command=true ;; build-command) perform_build_command=true ;;
build-image) perform_build_image=true ;; # Handling new long option build-image) perform_build_image=true ;; # Handling new long option
package-tarballs) perform_package_tarballs=true ;; package-tarballs) perform_package_tarballs=true ;;
upload-tarballs) perform_upload_tarballs=true ;; upload-tarballs) perform_upload_tarballs=true ;;
github-release) perform_github_release=true ;; github-release) perform_github_release=true ;;
generate-changelog) perform_generate_changelog=true ;; generate-changelog) perform_generate_changelog=true ;;
*) echo "Invalid option: --${OPTARG}"; show_help; exit 1 ;; *) echo "Invalid option: --${OPTARG}"; show_help; exit 1 ;;
esac ;; esac ;;
*) show_help; exit 1 ;; *) show_help; exit 1 ;;
esac esac
done done
# Enable all actions by default if no options are provided # Enable all actions by default if no options are provided
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
perform_setup_env=true perform_setup_env=true
perform_verify_prereqs=true perform_verify_prereqs=true
perform_build_command=true perform_build_command=true
perform_package_tarballs=true perform_package_tarballs=true
perform_upload_tarballs=true perform_upload_tarballs=true
perform_github_release=true perform_github_release=true
perform_generate_changelog=true perform_generate_changelog=true
# TODO: Not enabling build_image by default # TODO: Not enabling build_image by default
# perform_build_image=true # perform_build_image=true
fi fi
# Function to perform actions # Function to perform actions
perform_action() { perform_action() {
local flag=$1 local flag=$1
local message=$2 local message=$2
local command=$3 local command=$3
if [ "$flag" == true ]; then if [ "$flag" == true ]; then
openim::log::info "## $message..." openim::log::info "## $message..."
if ! $command; then if ! eval "$command"; then
openim::log::errexit "Error in $message" openim::log::errexit "Error in $message"
fi
fi fi
fi
} }
echo "Starting script execution..." echo "Starting script execution..."

@ -32,39 +32,41 @@ if [[ $? -ne 0 ]]; then
fi fi
set -o errexit set -o errexit
"${OPENIM_ROOT}"/scripts/init-config.sh --skip
echo "You need to start the following scripts in order: ${OPENIM_SERVER_SCRIPTARIES[@]}" echo "You need to start the following scripts in order: ${OPENIM_SERVER_SCRIPTARIES[@]}"
openim::log::install_errexit openim::log::install_errexit
# Function to execute the scripts. # Function to execute the scripts.
function execute_scripts() { function execute_scripts() {
for script_path in "${OPENIM_SERVER_SCRIPT_START_LIST[@]}"; do for script_path in "${OPENIM_SERVER_SCRIPT_START_LIST[@]}"; do
# Extract the script name without extension for argument generation. # Extract the script name without extension for argument generation.
script_name_with_prefix=$(basename "$script_path" .sh) script_name_with_prefix=$(basename "$script_path" .sh)
# Remove the "openim-" prefix. # Remove the "openim-" prefix.
script_name=${script_name_with_prefix#openim-} script_name=${script_name_with_prefix#openim-}
# Construct the argument based on the script name. # Construct the argument based on the script name.
arg="openim::${script_name}::start" arg="openim::${script_name}::start"
# Check if the script file exists and is executable. # Check if the script file exists and is executable.
if [[ -x "$script_path" ]]; then if [[ -x "$script_path" ]]; then
openim::log::status "Starting script: ${script_path##*/}" # Log the script name. openim::log::status "Starting script: ${script_path##*/}" # Log the script name.
# Execute the script with the constructed argument. # Execute the script with the constructed argument.
"$script_path" "$arg" "$script_path" "$arg"
# Check if the script executed successfully. # Check if the script executed successfully.
if [[ $? -eq 0 ]]; then if [[ $? -eq 0 ]]; then
openim::log::info "${script_path##*/} executed successfully." openim::log::info "${script_path##*/} executed successfully."
else else
openim::log::errexit "Error executing ${script_path##*/}." openim::log::errexit "Error executing ${script_path##*/}."
fi fi
else else
openim::log::errexit "Script ${script_path##*/} is missing or not executable." openim::log::errexit "Script ${script_path##*/} is missing or not executable."
fi fi
done done
sleep 0.5 sleep 0.5
} }

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# This script is stop all openim service # This script is stop all openim service
# #
# Usage: `scripts/stop.sh`. # Usage: `scripts/stop.sh`.
# Encapsulated as: `make stop`. # Encapsulated as: `make stop`.
@ -34,4 +34,13 @@ openim::util::stop_services_on_ports ${OPENIM_SERVER_PORT_LISTARIES[@]}
echo -e "\n++ Stop all processes in the path ${OPENIM_OUTPUT_HOSTBIN}" echo -e "\n++ Stop all processes in the path ${OPENIM_OUTPUT_HOSTBIN}"
openim::util::stop_services_with_name "${OPENIM_OUTPUT_HOSTBIN}" openim::util::stop_services_with_name "${OPENIM_OUTPUT_HOSTBIN}"
echo -n "Stopping services 15 seconds."
for i in {1..15}; do
echo -n "."
sleep 1
done
echo -e "\nServices stopped."
openim::log::success "✨ Wait 15 seconds for all processes to be killed"

@ -23,15 +23,15 @@ set -o nounset
set -o pipefail set -o pipefail
OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${OPENIM_ROOT}/hack/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
openim::golang::setup_env openim::golang::setup_env
BINS=( BINS=(
gendocs gendocs
genopenimdocs genopenimdocs
genman genman
genyaml genyaml
) )
make -C "${OPENIM_ROOT}" WHAT="${BINS[*]}" make -C "${OPENIM_ROOT}" WHAT="${BINS[*]}"

@ -19,9 +19,9 @@ set -o nounset
set -o pipefail set -o pipefail
OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
source "${OPENIM_ROOT}/hack/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
kube::golang::setup_env openim::golang::setup_env
cd "${OPENIM_ROOT}" cd "${OPENIM_ROOT}"
@ -40,4 +40,4 @@ find_files() {
} }
export GO111MODULE=on export GO111MODULE=on
find_files | xargs go run tools/yamlfmt/main.go find_files | xargs go run tools/yamlfmt/yamlfmt.go

@ -43,6 +43,54 @@ disabled=(
1091 1091
# this lint prefers command -v to which, they are not the same # this lint prefers command -v to which, they are not the same
2230 2230
# Error SC2155 indicates that you should separate variable declaration and assignment to avoid masking the return value of the command.
# In Bash scripts, when you declare and assign a local variable at the same time a command is executed, you only get the output of the command, but not the exit status (return value) of the command. #
2155
# ShellCheck issues SC2086 warnings when you refer to a variable in a script but don't put it in double quotes.This can lead to unexpected behavior when scripts encounter Spaces,
# newlines, and wildcards in file names or other data.
2086
2206
# TODO: 需要修复,然后开启
2034
2048
2148
2059
2214
2145
2128
2550
2046
2181
1102
2045
2068
2145
2207
2231
2013
2154
2120
1083
2001
2012
2016
2164
2223
2166
2119
2162
2295
2002
2004
2202
2178
2064
2260
2043
2178
2044
2153
) )
# comma separate for passing to shellcheck # comma separate for passing to shellcheck
join_by() { join_by() {
@ -65,14 +113,18 @@ cd "${OPENIM_ROOT}"
# forked should be linted and fixed. # forked should be linted and fixed.
all_shell_scripts=() all_shell_scripts=()
while IFS=$'\n' read -r script; while IFS=$'\n' read -r script;
do git check-ignore -q "$script" || all_shell_scripts+=("$script"); do git check-ignore -q "$script" || all_shell_scripts+=("$script");
done < <(find . -name "*.sh" \ done < <(find . -name "*.sh" \
-not \( \ -not \( \
-path ./_\* -o \ -path ./_\* -o \
-path ./.git\* -o \ -path ./.git\* -o \
-path ./vendor\* -o \ -path ./Godeps\* -o \
\( -path ./third_party\* -a -not -path ./third_party/forked\* \) \ -path ./_output\* -o \
\)) -path ./components\* -o \
-path ./logs\* -o \
-path ./vendor\* -o \
\( -path ./third_party\* -a -not -path ./third_party/forked\* \) \
\) -print 2>/dev/null)
# detect if the host machine has the required shellcheck version installed # detect if the host machine has the required shellcheck version installed
# if so, we will use that instead. # if so, we will use that instead.
@ -113,8 +165,8 @@ if ${HAVE_SHELLCHECK}; then
else else
openim::log::info "Using shellcheck ${SHELLCHECK_VERSION} docker image." openim::log::info "Using shellcheck ${SHELLCHECK_VERSION} docker image."
"${DOCKER}" run \ "${DOCKER}" run \
--rm -v ""${OPENIM_ROOT}":"${OPENIM_ROOT}"" -w "${OPENIM_ROOT}" \ --rm -v "${OPENIM_ROOT}:${OPENIM_ROOT}" -w "${OPENIM_ROOT}" \
"${SHELLCHECK_IMAGE}" \ "${SHELLCHECK_IMAGE}" \
shellcheck "${SHELLCHECK_OPTIONS[@]}" "${all_shell_scripts[@]}" >&2 || res=$? shellcheck "${SHELLCHECK_OPTIONS[@]}" "${all_shell_scripts[@]}" >&2 || res=$?
fi fi

@ -25,17 +25,8 @@ OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
export OPENIM_ROOT export OPENIM_ROOT
source "${OPENIM_ROOT}/scripts/lib/init.sh" source "${OPENIM_ROOT}/scripts/lib/init.sh"
# Ensure that we find the binaries we build before anything else.
export GOBIN="${KUBE_OUTPUT_BINPATH}"
PATH="${GOBIN}:${PATH}"
# Install tools we need
pushd ""${OPENIM_ROOT}"/tools" >/dev/null
GO111MODULE=on go install github.com/client9/misspell/cmd/misspell
popd >/dev/null
# Spell checking # Spell checking
# All the skipping files are defined in scripts/.spelling_failures # All the skipping files are defined in scripts/.spelling_failures
skipping_file=""${OPENIM_ROOT}"/scripts/.spelling_failures" skipping_file="${OPENIM_ROOT}/scripts/.spelling_failures"
failing_packages=$(sed "s| | -e |g" "${skipping_file}") failing_packages=$(sed "s| | -e |g" "${skipping_file}")
git ls-files | grep -v -e "${failing_packages}" | xargs misspell -i "Creater,creater,ect" -error -o stderr git ls-files | grep -v -e "${failing_packages}" | xargs "$OPENIM_ROOT/_output/tools/misspell" -i "Creater,creater,ect" -error -o stderr

@ -33,7 +33,7 @@ cd "${OPENIM_ROOT}"
ret=0 ret=0
TYPECHECK_SERIAL="${TYPECHECK_SERIAL:-false}" TYPECHECK_SERIAL="${TYPECHECK_SERIAL:-false}"
scripts/run-in-gopath.sh \ scripts/run-in-gopath.sh \
go run test/typecheck/typecheck.go "$@" "--serial=$TYPECHECK_SERIAL" || ret=$? go run test/typecheck/typecheck.go "$@" "--serial=$TYPECHECK_SERIAL" || ret=$?
if [[ $ret -ne 0 ]]; then if [[ $ret -ne 0 ]]; then
openim::log::error "Type Check has failed. This may cause cross platform build failures." >&2 openim::log::error "Type Check has failed. This may cause cross platform build failures." >&2
openim::log::error "Please see https://github.com/openimsdk/open-im-server/tree/main/test/typecheck for more information." >&2 openim::log::error "Please see https://github.com/openimsdk/open-im-server/tree/main/test/typecheck for more information." >&2

@ -36,13 +36,13 @@ openim::util::trap_add "git worktree remove -f ${_tmpdir}" EXIT
cd "${_tmpdir}" cd "${_tmpdir}"
# Format YAML files # Format YAML files
hack/update-yamlfmt.sh scripts/update-yamlfmt.sh
# Test for diffs # Test for diffs
diffs=$(git status --porcelain | wc -l) diffs=$(git status --porcelain | wc -l)
if [[ ${diffs} -gt 0 ]]; then if [[ ${diffs} -gt 0 ]]; then
echo "YAML files need to be formatted" >&2 echo "YAML files need to be formatted" >&2
git diff git diff
echo "Please run 'hack/update-yamlfmt.sh'" >&2 echo "Please run 'scripts/update-yamlfmt.sh'" >&2
exit 1 exit 1
fi fi

@ -30,119 +30,119 @@ Usage:
Timeout in seconds, zero for no timeout Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes -- COMMAND ARGS Execute command with args after the test finishes
USAGE USAGE
exit 1 exit 1
} }
wait_for() { wait_for() {
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi fi
WAITFORIT_start_ts=$(date +%s) if [[ $WAITFORIT_result -eq 0 ]]; then
while : WAITFORIT_end_ts=$(date +%s)
do echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then break
nc -z $WAITFORIT_HOST $WAITFORIT_PORT fi
WAITFORIT_result=$? sleep 1
else done
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 return $WAITFORIT_result
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
} }
wait_for_wrapper() { wait_for_wrapper() {
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi fi
WAITFORIT_PID=$! WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID wait $WAITFORIT_PID
WAITFORIT_RESULT=$? WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi fi
return $WAITFORIT_RESULT return $WAITFORIT_RESULT
} }
# process arguments # process arguments
while [[ $# -gt 0 ]] while [[ $# -gt 0 ]]
do do
case "$1" in case "$1" in
*:* ) *:* )
WAITFORIT_hostport=(${1//:/ }) WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]} WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]} WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1 shift 1
;; ;;
--child) --child)
WAITFORIT_CHILD=1 WAITFORIT_CHILD=1
shift 1 shift 1
;; ;;
-q | --quiet) -q | --quiet)
WAITFORIT_QUIET=1 WAITFORIT_QUIET=1
shift 1 shift 1
;; ;;
-s | --strict) -s | --strict)
WAITFORIT_STRICT=1 WAITFORIT_STRICT=1
shift 1 shift 1
;; ;;
-h) -h)
WAITFORIT_HOST="$2" WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2 shift 2
;; ;;
--host=*) --host=*)
WAITFORIT_HOST="${1#*=}" WAITFORIT_HOST="${1#*=}"
shift 1 shift 1
;; ;;
-p) -p)
WAITFORIT_PORT="$2" WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2 shift 2
;; ;;
--port=*) --port=*)
WAITFORIT_PORT="${1#*=}" WAITFORIT_PORT="${1#*=}"
shift 1 shift 1
;; ;;
-t) -t)
WAITFORIT_TIMEOUT="$2" WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2 shift 2
;; ;;
--timeout=*) --timeout=*)
WAITFORIT_TIMEOUT="${1#*=}" WAITFORIT_TIMEOUT="${1#*=}"
shift 1 shift 1
;; ;;
--) --)
shift shift
WAITFORIT_CLI=("$@") WAITFORIT_CLI=("$@")
break break
;; ;;
--help) --help)
usage usage
;; ;;
*) *)
echoerr "Unknown argument: $1" echoerr "Unknown argument: $1"
usage usage
;; ;;
esac esac
done done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test." echoerr "Error: you need to provide a host and port to test."
usage usage
fi fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
@ -156,36 +156,36 @@ WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlin
WAITFORIT_BUSYTIMEFLAG="" WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1 WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag # Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore) # (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t" WAITFORIT_BUSYTIMEFLAG="-t"
fi fi
else else
WAITFORIT_ISBUSY=0 WAITFORIT_ISBUSY=0
fi fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for wait_for
WAITFORIT_RESULT=$? WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT fi
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi fi
if [[ $WAITFORIT_CLI != "" ]]; then if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi fi

@ -31,7 +31,7 @@ var (
usernameV3 = "root" usernameV3 = "root"
passwordV3 = "openIM123" passwordV3 = "openIM123"
addrV3 = "127.0.0.1:13306" addrV3 = "127.0.0.1:13306"
databaseV3 = "openIM_v3" databaseV3 = "openim_v3"
) )
``` ```

@ -0,0 +1,102 @@
# Development of a Go-Based Conformity Checker for Project File and Directory Naming Standards
### 1. Project Overview
#### Project Name
- `GoConformityChecker`
#### Functionality Description
- Checks if the file and subdirectory names in a specified directory adhere to specific naming conventions.
- Supports specific file types (e.g., `.go`, `.yml`, `.yaml`, `.md`, `.sh`, etc.).
- Allows users to specify directories to be checked and directories to be ignored.
- More read https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md
#### Naming Conventions
- Go files: Only underscores are allowed.
- YAML, YML, and Markdown files: Only hyphens are allowed.
- Directories: Only underscores are allowed.
### 2. File Structure
- `main.go`: Entry point of the program, handles command-line arguments.
- `checker/checker.go`: Contains the core logic.
- `config/config.go`: Parses and stores configuration information.
### 3. Core Code Design
#### main.go
- Parses command-line arguments, including the directory to be checked and directories to be ignored.
- Calls the `checker` module for checking.
#### config.go
- Defines a configuration structure, such as directories to check and ignore.
#### checker.go
- Iterates through the specified directory.
- Applies different naming rules based on file types and directory names.
- Records files or directories that do not conform to the standards.
### 4. Pseudocode Example
#### main.go
```go
package main
import (
"flag"
"fmt"
"GoConformityChecker/checker"
)
func main() {
// Parse command-line arguments
var targetDir string
var ignoreDirs string
flag.StringVar(&targetDir, "target", ".", "Directory to check")
flag.StringVar(&ignoreDirs, "ignore", "", "Directories to ignore")
flag.Parse()
// Call the checker
err := checker.CheckDirectory(targetDir, ignoreDirs)
if err != nil {
fmt.Println("Error:", err)
}
}
```
#### checker.go
```go
package checker
import (
// Import necessary packages
)
func CheckDirectory(targetDir, ignoreDirs string) error {
// Iterate through the directory, applying rules to check file and directory names
// Return any found errors or non-conformities
return nil
}
```
### 5. Implementation Details
- **File and Directory Traversal**: Use Go's `path/filepath` package to traverse directories and subdirectories.
- **Naming Rules Checking**: Apply different regex expressions for naming checks based on file extensions.
- **Error Handling and Reporting**: Record files or directories that do not conform and report to the user.
### 6. Future Development and Extensions
- Support more file types and naming rules.
- Provide more detailed error reports, such as showing line numbers and specific naming mistakes.
- Add a graphical or web interface for non-command-line users.
The above is an overview of the entire project's design. Following this design, specific coding implementation can begin. Note that the actual implementation may need adjustments based on real-world conditions.

@ -36,20 +36,6 @@ config/config.yaml
.env .env
./.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 # files used by the developer
.idea.md .idea.md
.todo.md .todo.md

@ -37,7 +37,6 @@ Variables can be set as above, Environment variables can also be set
example: example:
```bash ```bash
$ export OPENIM_WEB_DIST_PATH="/app/dist"
$ export OPENIM_WEB_PPRT="11001" $ export OPENIM_WEB_PPRT="11001"
``` ```

@ -1,10 +0,0 @@
# See the OWNERS docs at https://go.k8s.io/owners
reviewers:
- cubxxw
- kubbot
approvers:
- cubxxw
labels:
- sig/testing
- sig/contributor-experience
Loading…
Cancel
Save