From e7eb116d93004eab69a55e4f037e7a8564c32976 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 7 Oct 2025 15:18:42 +0200 Subject: [PATCH] Add local composite actions to manage ejabberd and databases --- .github/actions/manage-database/action.yml | 153 ++++++++++++++++++ .github/actions/manage-ejabberd/action.yml | 178 +++++++++++++++++++++ 2 files changed, 331 insertions(+) create mode 100644 .github/actions/manage-database/action.yml create mode 100644 .github/actions/manage-ejabberd/action.yml diff --git a/.github/actions/manage-database/action.yml b/.github/actions/manage-database/action.yml new file mode 100644 index 000000000..3c3c8274a --- /dev/null +++ b/.github/actions/manage-database/action.yml @@ -0,0 +1,153 @@ +name: 'Manage Database' + +inputs: + for: + default: "" + description: 'One or more databases to manage: + mysql, pgsql, redis, mssql' + + do: + default: "" + description: 'One or more tasks to do: + install, start, user, create, drop, dump' + + dump-suffix: + default: "" + description: 'Suffix to append to the dump file name' + + mssql-schema: + default: "" + description: 'SQL schema for the MSSQL database: + singlehost or multihost' + +runs: + using: "composite" + steps: + + ############################################################# Install ##### + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'install') + shell: sh + run: | + sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf + sudo rm -f /var/lib/man-db/auto-update || echo ok + sudo apt-get -q -y install postgresql + + - if: contains(inputs.for, 'redis') && contains(inputs.do, 'install') + shell: sh + run: | + sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf + sudo rm -f /var/lib/man-db/auto-update || echo ok + sudo apt-get -q -y install redis-server + + - if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install') + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: tdsodbc + + - if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install') + shell: sh + run: | + docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \ + -v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \ + -v $(pwd)/sql/mssql.sql:/mssql.sql:ro \ + -v $(pwd)/sql/mssql.new.sql:/mssql.new.sql:ro \ + -p 1433:1433 --name ejabberd-mssql \ + "mcr.microsoft.com/mssql/server:2019-latest" + sleep 10 + docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \ + -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql + + - if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install') + && inputs.mssql-schema == 'singlehost' + shell: sh + run: | + docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \ + -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \ + -i /mssql.sql + + - if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install') + && inputs.mssql-schema == 'multihost' + shell: sh + run: | + docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \ + -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \ + -i /mssql.new.sql + + ############################################################### Start ##### + + - if: contains(inputs.for, 'mysql') && contains(inputs.do, 'start') + shell: sh + run: | + sudo systemctl start mysql.service + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'start') + shell: sh + run: | + sudo systemctl start postgresql.service + pg_isready + + ################################################################ User ##### + + - if: contains(inputs.for, 'mysql') && contains(inputs.do, 'user') + shell: sh + run: | + mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost' + IDENTIFIED BY 'ejabberd_test';" + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'user') + shell: sh + run: | + sudo -u postgres psql -c "CREATE USER ejabberd_test + WITH PASSWORD 'ejabberd_test';" + + ################################################################ Dump ##### + + - if: contains(inputs.for, 'mysql') && contains(inputs.do, 'dump') + shell: sh + run: | + sudo mysqldump -u root -proot ejabberd_test \ + > mysql-${{ inputs.dump-suffix }}.sql + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'dump') + shell: sh + run: | + sudo -u postgres pg_dump ejabberd_test \ + > pgsql-${{ inputs.dump-suffix }}.sql + + ################################################################ Drop ##### + + - if: contains(inputs.for, 'mysql') && contains(inputs.do, 'drop') + shell: sh + run: | + mysql -u root -proot -e "DROP DATABASE ejabberd_test;" + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'drop') + shell: sh + run: | + sudo -u postgres psql -c "DROP DATABASE ejabberd_test;" + + ############################################################## Create ##### + + - if: contains(inputs.for, 'mysql') && contains(inputs.do, 'create') + shell: sh + run: | + mysql -u root -proot -e "CREATE DATABASE ejabberd_test;" + mysql -u root -proot -e "GRANT ALL ON ejabberd_test.* + TO 'ejabberd_test'@'localhost';" + + - if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'create') + shell: sh + run: | + sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;" + sudo -u postgres psql -c "GRANT ALL PRIVILEGES + ON DATABASE ejabberd_test TO ejabberd_test;" + sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;" + sudo -u postgres psql -c "ALTER DATABASE ejabberd_test + OWNER TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + TABLES IN SCHEMA public + TO ejabberd_test;" + sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL + SEQUENCES IN SCHEMA public + TO ejabberd_test;" diff --git a/.github/actions/manage-ejabberd/action.yml b/.github/actions/manage-ejabberd/action.yml new file mode 100644 index 000000000..c2543c056 --- /dev/null +++ b/.github/actions/manage-ejabberd/action.yml @@ -0,0 +1,178 @@ +name: 'Manage ejabberd' + +inputs: + for: + default: "" + description: 'Release method, one of: + prod, dev, install, run, deb' + do: + default: "" + description: 'One or more tasks to perform: + deploy, no_acme, no_tls, + start, register, update_sql, stop, + logs, check' + username: + default: "user1" + description: 'Username part of the account JID' + host: + default: "localhost" + description: 'Host part of the account JID' + tool: + default: "rebar3" + description: 'Build tool to use: + rebar or rebar3 (only relevant to make rebar2)' + rel_name_vsn: + default: "" + description: 'Base name of installer files' + +runs: + using: "composite" + steps: + + - name: Path Definitions + id: path + shell: bash + run: | + case ${{ inputs.for }} in + 'prod') + BASE="_build/prod/rel/ejabberd" + echo "conf=$BASE/conf" >> $GITHUB_OUTPUT + echo "logs=$BASE/logs" >> $GITHUB_OUTPUT + echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT + ;; + 'dev') + BASE="_build/dev/rel/ejabberd" + echo "conf=$BASE/conf" >> $GITHUB_OUTPUT + echo "logs=$BASE/logs" >> $GITHUB_OUTPUT + echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT + ;; + 'install') + BASE="/tmp/ejabberd" + echo "conf=$BASE/etc/ejabberd" >> $GITHUB_OUTPUT + echo "logs=$BASE/var/log/ejabberd" >> $GITHUB_OUTPUT + echo "ectl=$BASE/sbin/ejabberdctl" >> $GITHUB_OUTPUT + ;; + 'deb') + BASE="/opt/ejabberd" + echo "base=$BASE" >> $GITHUB_OUTPUT + echo "conf=$BASE/conf" >> $GITHUB_OUTPUT + echo "logs=$BASE/logs" >> $GITHUB_OUTPUT + echo "ectl=sudo /opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT + ;; + 'run') + BASE="$HOME/opt/ejabberd" + echo "base=$BASE" >> $GITHUB_OUTPUT + echo "conf=$BASE/conf" >> $GITHUB_OUTPUT + echo "logs=$BASE/logs" >> $GITHUB_OUTPUT + echo "ectl=$HOME/opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT + ;; + esac + + ############################################################## Deploy ##### + + - if: contains(inputs.do, 'deploy') && + inputs.for == 'prod' && inputs.tool == 'rebar' + shell: sh + run: | + mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel + + - if: contains(inputs.do, 'deploy') && + inputs.for == 'dev' && inputs.tool == 'rebar' + shell: sh + run: | + mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel + + - if: contains(inputs.do, 'deploy') && + (inputs.for == 'prod' || + inputs.for == 'dev' || + inputs.for == 'install') + shell: sh + run: | + make ${{ inputs.for }} + + - if: contains(inputs.do, 'deploy') && + inputs.for == 'deb' + shell: sh + run: | + sudo dpkg -i $(ls -1 *.deb) + + - if: contains(inputs.do, 'deploy') && + inputs.for == 'run' + shell: sh + run: | + ./$(ls -1 *.run) + + ################################################################ ACME ##### + + - if: contains(inputs.do, 'no_acme') + shell: sh + run: | + sed -i 's/loglevel/acme:\n auto: false\nloglevel/g' \ + ${{ steps.path.outputs.conf }}/ejabberd.yml + + ################################################################# TLS ##### + + - if: contains(inputs.do, 'no_tls') && + inputs.for == 'dev' + shell: sh + run: | + sed -i 's/starttls_required: true/starttls_required: false/g' \ + ${{ steps.path.outputs.conf }}/ejabberd.yml + + ############################################################### Start ##### + + - if: contains(inputs.do, 'start') + shell: sh + run: | + ${{ steps.path.outputs.ectl }} start + ${{ steps.path.outputs.ectl }} started + + ############################################################ Register ##### + + - if: contains(inputs.do, 'register') + shell: sh + run: | + ${{ steps.path.outputs.ectl }} \ + register ${{ inputs.username }} ${{ inputs.host }} s0mePass + ${{ steps.path.outputs.ectl }} \ + registered_users ${{ inputs.host }} >> registered.log + grep -q '${{ inputs.username }}' registered.log + + ########################################################### UpdateSQL ##### + + - if: contains(inputs.do, 'update_sql') + shell: sh + run: | + ${{ steps.path.outputs.ectl }} \ + update_sql + + ################################################################ Stop ##### + + - if: contains(inputs.do, 'stop') + shell: sh + run: | + ${{ steps.path.outputs.ectl }} stop + ${{ steps.path.outputs.ectl }} stopped + + ################################################################ Logs ##### + + - if: contains(inputs.do, 'logs') + shell: sh + run: | + SUDO=sudo + [ "${{ inputs.for }}" = "deb" ] || SUDO="" + echo "::group::View ejabberd.log" + $SUDO cat ${{ steps.path.outputs.logs }}/ejabberd.log + echo "::endgroup::" + echo "::group::View error.log" + $SUDO cat ${{ steps.path.outputs.logs }}/error.log + echo "::endgroup::" + + ############################################################### Check ##### + + - if: contains(inputs.do, 'check') + shell: sh + run: | + grep -q 'is started' ${{ steps.path.outputs.logs }}/ejabberd.log + grep -q 'is stopped' ${{ steps.path.outputs.logs }}/ejabberd.log + test $(find ${{ steps.path.outputs.logs }}/ -empty -name error.log)