mirror of
https://github.com/processone/ejabberd.git
synced 2024-10-31 15:21:38 +01:00
Compare commits
No commits in common. "master" and "20.07" have entirely different histories.
@ -1 +0,0 @@
|
|||||||
FROM ghcr.io/processone/devcontainer:latest
|
|
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ejabberd",
|
|
||||||
"build": {"dockerfile": "Dockerfile"},
|
|
||||||
"extensions": ["erlang-ls.erlang-ls"],
|
|
||||||
"postCreateCommand": ".devcontainer/prepare-container.sh",
|
|
||||||
"remoteUser": "vscode"
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
echo "export PATH=/workspaces/ejabberd/_build/relive:$PATH" >>$HOME/.bashrc
|
|
||||||
echo "COOKIE" >$HOME/.erlang.cookie
|
|
||||||
chmod 400 $HOME/.erlang.cookie
|
|
@ -1,46 +1,3 @@
|
|||||||
.git
|
.git
|
||||||
.win32
|
.win32
|
||||||
.examples
|
.examples
|
||||||
*.swp
|
|
||||||
*~
|
|
||||||
\#*#
|
|
||||||
.#*
|
|
||||||
.edts
|
|
||||||
*.dump
|
|
||||||
/Makefile
|
|
||||||
/config.log
|
|
||||||
/config.status
|
|
||||||
/config/releases.exs
|
|
||||||
/configure
|
|
||||||
/aclocal.m4
|
|
||||||
/*.cache
|
|
||||||
/deps/
|
|
||||||
/.deps-update/
|
|
||||||
/ebin/
|
|
||||||
/ejabberd.init
|
|
||||||
/ejabberd.service
|
|
||||||
/ejabberdctl
|
|
||||||
/ejabberdctl.example
|
|
||||||
/rel/ejabberd/
|
|
||||||
/rel/overlays/
|
|
||||||
/src/eldap_filter_yecc.erl
|
|
||||||
/vars.config
|
|
||||||
/dialyzer/
|
|
||||||
/test/*.beam
|
|
||||||
/test/*.ctc
|
|
||||||
/logs/
|
|
||||||
/priv/bin/captcha*sh
|
|
||||||
/priv/sql
|
|
||||||
/rel/ejabberd
|
|
||||||
/_build
|
|
||||||
/database/
|
|
||||||
/.rebar
|
|
||||||
/rebar.lock
|
|
||||||
/log/
|
|
||||||
Mnesia.nonode@nohost/
|
|
||||||
# Binaries created with tools/make-{binaries,installers,packages}:
|
|
||||||
/ejabberd_*.deb
|
|
||||||
/ejabberd-*.rpm
|
|
||||||
/ejabberd-*.run
|
|
||||||
/ejabberd-*.tar.gz
|
|
||||||
/.github/container/Dockerfile
|
|
||||||
|
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -6,8 +6,6 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
|
||||||
|
|
||||||
## Environment
|
## Environment
|
||||||
|
|
||||||
- ejabberd version: 18.09
|
- ejabberd version: 18.09
|
||||||
|
8
.github/ISSUE_TEMPLATE/feature_request.md
vendored
8
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -7,20 +7,14 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when...
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
**Describe the solution you'd like**
|
||||||
|
|
||||||
A clear and concise description of what you want to happen.
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
**Describe alternatives you've considered**
|
||||||
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
|
|
||||||
Add any other context or screenshots about the feature request here.
|
Add any other context or screenshots about the feature request here.
|
||||||
|
192
.github/container/Dockerfile
vendored
192
.github/container/Dockerfile
vendored
@ -1,192 +0,0 @@
|
|||||||
#' Define default build variables
|
|
||||||
## specifc ARGs for METHOD='direct'
|
|
||||||
ARG OTP_VSN='26.2'
|
|
||||||
ARG ELIXIR_VSN='1.16.2'
|
|
||||||
## specifc ARGs for METHOD='package'
|
|
||||||
ARG ALPINE_VSN='3.19'
|
|
||||||
## general ARGs
|
|
||||||
ARG UID='9000'
|
|
||||||
ARG USER='ejabberd'
|
|
||||||
ARG HOME="opt/$USER"
|
|
||||||
ARG METHOD='direct'
|
|
||||||
ARG BUILD_DIR="/$USER"
|
|
||||||
ARG VERSION='master'
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' METHOD='direct' - build and install ejabberd directly from source
|
|
||||||
FROM docker.io/erlang:${OTP_VSN}-alpine AS direct
|
|
||||||
|
|
||||||
RUN apk -U add --no-cache \
|
|
||||||
autoconf \
|
|
||||||
automake \
|
|
||||||
bash \
|
|
||||||
build-base \
|
|
||||||
curl \
|
|
||||||
expat-dev \
|
|
||||||
file \
|
|
||||||
gd-dev \
|
|
||||||
git \
|
|
||||||
jpeg-dev \
|
|
||||||
libpng-dev \
|
|
||||||
libwebp-dev \
|
|
||||||
linux-pam-dev \
|
|
||||||
openssl-dev \
|
|
||||||
sqlite-dev \
|
|
||||||
yaml-dev \
|
|
||||||
zlib-dev
|
|
||||||
|
|
||||||
ARG ELIXIR_VSN
|
|
||||||
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
|
|
||||||
| tar -xzf -
|
|
||||||
|
|
||||||
WORKDIR elixir-$ELIXIR_VSN
|
|
||||||
RUN make install clean
|
|
||||||
|
|
||||||
RUN mix local.hex --force \
|
|
||||||
&& mix local.rebar --force
|
|
||||||
|
|
||||||
ARG BUILD_DIR
|
|
||||||
COPY / $BUILD_DIR/
|
|
||||||
|
|
||||||
WORKDIR $BUILD_DIR
|
|
||||||
RUN mv .github/container/ejabberdctl.template . \
|
|
||||||
&& ./autogen.sh \
|
|
||||||
&& ./configure --with-rebar=mix --enable-all \
|
|
||||||
&& make deps \
|
|
||||||
&& make rel
|
|
||||||
|
|
||||||
WORKDIR /rootfs
|
|
||||||
ARG VERSION
|
|
||||||
ARG HOME
|
|
||||||
RUN mkdir -p $HOME $HOME-$VERSION \
|
|
||||||
&& cp -r $BUILD_DIR/_build/prod/rel/ejabberd/* $HOME-$VERSION \
|
|
||||||
&& mv $HOME-$VERSION/conf $HOME/conf
|
|
||||||
|
|
||||||
RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
|
|
||||||
|
|
||||||
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
|
|
||||||
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
|
|
||||||
|
|
||||||
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
|
|
||||||
&& sed -i '/^loglevel:/a \ \
|
|
||||||
\nca_file: /opt/ejabberd/conf/cacert.pem \
|
|
||||||
\ncertfiles: \
|
|
||||||
\n - /opt/ejabberd/conf/server.pem' "$HOME/conf/ejabberd.yml"
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' METHOD='package' - install ejabberd from binary tarball package
|
|
||||||
FROM docker.io/alpine:${ALPINE_VSN} AS package
|
|
||||||
COPY tarballs/ejabberd-*-linux-musl-*.tar.gz /tmp/
|
|
||||||
WORKDIR /rootfs
|
|
||||||
ARG HOME
|
|
||||||
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
|
|
||||||
&& mkdir -p $home_root_dir \
|
|
||||||
&& ARCH=$(uname -m | sed -e 's/x86_64/x64/;s/aarch64/arm64/') \
|
|
||||||
&& tar -xzf /tmp/ejabberd-*-linux-musl-$ARCH.tar.gz -C $home_root_dir
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' Prepare ejabberd for runtime
|
|
||||||
FROM ${METHOD} AS ejabberd
|
|
||||||
RUN apk -U add --no-cache \
|
|
||||||
git \
|
|
||||||
libcap \
|
|
||||||
openssl
|
|
||||||
|
|
||||||
WORKDIR /rootfs
|
|
||||||
ARG HOME
|
|
||||||
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
|
|
||||||
|
|
||||||
ARG BUILD_DIR
|
|
||||||
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
|
|
||||||
then \
|
|
||||||
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
|
|
||||||
then cp -r $BUILD_DIR/.ejabberd-modules $HOME; \
|
|
||||||
else git clone https://github.com/processone/ejabberd-contrib --depth 1 \
|
|
||||||
$HOME/.ejabberd-modules/sources/ejabberd-contrib; \
|
|
||||||
fi \
|
|
||||||
fi
|
|
||||||
|
|
||||||
RUN export PEM=$HOME/conf/server.pem \
|
|
||||||
&& openssl req -x509 \
|
|
||||||
-batch \
|
|
||||||
-nodes \
|
|
||||||
-newkey rsa:4096 \
|
|
||||||
-keyout $PEM \
|
|
||||||
-out $PEM \
|
|
||||||
-days 3650 \
|
|
||||||
-subj "/CN=localhost"
|
|
||||||
|
|
||||||
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
|
|
||||||
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
|
|
||||||
&& echo -e \
|
|
||||||
"#!/bin/sh \
|
|
||||||
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
|
|
||||||
\nexport CONFIG_DIR=/$HOME/conf \
|
|
||||||
\nexport LOGS_DIR=/$HOME/logs \
|
|
||||||
\nexport SPOOL_DIR=/$HOME/database \
|
|
||||||
\nexec /$(find $home_root_dir -name ejabberdctl) \"\$@\"" \
|
|
||||||
> usr/local/bin/ejabberdctl \
|
|
||||||
&& chmod +x usr/local/bin/* \
|
|
||||||
&& scanelf --needed --nobanner --format '%n#p' --recursive $home_root_dir \
|
|
||||||
| tr ',' '\n' \
|
|
||||||
| sort -u \
|
|
||||||
| awk 'system("[ -e $home_root_dir" $1 " ]") == 0 { next } { print "so:" $1 }' \
|
|
||||||
| sed -e "s|so:libc.so|so:libc.musl-$(uname -m).so.1|" \
|
|
||||||
> /tmp/runDeps
|
|
||||||
|
|
||||||
ARG UID
|
|
||||||
RUN chown -R $UID:$UID $HOME
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' METHOD='direct' - Remove erlang/OTP & rebar3
|
|
||||||
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime-direct
|
|
||||||
RUN apk del .erlang-rundeps \
|
|
||||||
&& rm -f $(which rebar3) \
|
|
||||||
&& find /usr -type d -name 'erlang' -exec rm -rf {} + \
|
|
||||||
&& find /usr -type l -exec test ! -e {} \; -delete
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' METHOD='package' - define runtime base image
|
|
||||||
FROM docker.io/alpine:${ALPINE_VSN} AS runtime-package
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' Update alpine, finalize runtime environment
|
|
||||||
FROM runtime-${METHOD} AS runtime
|
|
||||||
COPY --from=ejabberd /tmp/runDeps /tmp/runDeps
|
|
||||||
RUN apk -U upgrade --available --no-cache \
|
|
||||||
&& apk add --no-cache \
|
|
||||||
$(cat /tmp/runDeps) \
|
|
||||||
so:libcap.so.2 \
|
|
||||||
so:libtdsodbc.so.0 \
|
|
||||||
tini \
|
|
||||||
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
|
|
||||||
|
|
||||||
ARG USER
|
|
||||||
ARG UID
|
|
||||||
ARG HOME
|
|
||||||
RUN addgroup $USER -g $UID \
|
|
||||||
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
#' Build together production image
|
|
||||||
FROM scratch AS prod
|
|
||||||
ARG USER
|
|
||||||
ARG HOME
|
|
||||||
|
|
||||||
COPY --from=runtime / /
|
|
||||||
COPY --from=ejabberd /rootfs /
|
|
||||||
|
|
||||||
HEALTHCHECK \
|
|
||||||
--interval=1m \
|
|
||||||
--timeout=5s \
|
|
||||||
--start-period=5s \
|
|
||||||
--retries=10 \
|
|
||||||
CMD ejabberdctl status
|
|
||||||
|
|
||||||
WORKDIR /$HOME
|
|
||||||
USER $USER
|
|
||||||
VOLUME ["/$HOME"]
|
|
||||||
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
|
|
||||||
|
|
||||||
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
|
|
||||||
CMD ["foreground"]
|
|
294
.github/container/ejabberd-container-install.bat
vendored
294
.github/container/ejabberd-container-install.bat
vendored
@ -1,294 +0,0 @@
|
|||||||
@echo off
|
|
||||||
|
|
||||||
::
|
|
||||||
:: ejabberd container installer for Windows
|
|
||||||
:: -------------------------------------
|
|
||||||
:: v0.4
|
|
||||||
::
|
|
||||||
:: This batch script downloads an ejabberd container image
|
|
||||||
:: and setups a docker container to run ejabberd.
|
|
||||||
|
|
||||||
::
|
|
||||||
:: 1. Download and install Docker:
|
|
||||||
::
|
|
||||||
:: If you use Windows 10, download Docker Desktop from:
|
|
||||||
:: https://www.docker.com/
|
|
||||||
::
|
|
||||||
:: If you use Windows 7 or 8, download Docker Toolbox from:
|
|
||||||
:: https://github.com/docker/toolbox/releases
|
|
||||||
:: After installation, run Docker Quickstart Installer
|
|
||||||
::
|
|
||||||
|
|
||||||
::
|
|
||||||
:: 2. Edit those options:
|
|
||||||
|
|
||||||
:: Directory where your ejabberd deployment files will be installed
|
|
||||||
:: (configuration, database, logs, ...)
|
|
||||||
::
|
|
||||||
:: In Windows 10 you can configure the path:
|
|
||||||
|
|
||||||
set INSTALL_DIR_WINDOWS10=C:\ejabberd
|
|
||||||
|
|
||||||
:: In older Windows, not configurable, it will be installed in:
|
|
||||||
:: C:\Users\%USERNAME%\ejabberd
|
|
||||||
|
|
||||||
:: Please enter the desired ejabberd domain name.
|
|
||||||
:: The domain is the visible attribute that is added to the username
|
|
||||||
:: to form the Jabber Identifier (for example: user@example.net).
|
|
||||||
:: This computer must be known on the network with this address name.
|
|
||||||
:: You can later add more in conf/ejabberd.yml
|
|
||||||
|
|
||||||
set HOST=localhost
|
|
||||||
|
|
||||||
:: Please enter the administrator username for the current
|
|
||||||
:: ejabberd installation. A Jabber account with this username
|
|
||||||
:: will be created and granted administrative privileges.
|
|
||||||
:: Don't use blankspaces in the username.
|
|
||||||
|
|
||||||
set USER=admin
|
|
||||||
|
|
||||||
:: Please provide a password for that new administrator account
|
|
||||||
|
|
||||||
set PASSWORD=
|
|
||||||
|
|
||||||
:: By default this downloads 'latest' ejabberd version,
|
|
||||||
:: but you can set a specific version, for example '22.05'
|
|
||||||
:: or the bleeding edge 'master'. See available tags in
|
|
||||||
:: https://github.com/processone/ejabberd/pkgs/container/ejabberd
|
|
||||||
|
|
||||||
set VERSION=latest
|
|
||||||
|
|
||||||
:: This tells docker what ports ejabberd will use.
|
|
||||||
:: You can later configure them in conf/ejabberd.yml
|
|
||||||
|
|
||||||
set PORTS=5180 5222 5269 5443
|
|
||||||
|
|
||||||
::
|
|
||||||
:: 3. Now save this script and run it.
|
|
||||||
::
|
|
||||||
|
|
||||||
::
|
|
||||||
:: 4. When installation is completed:
|
|
||||||
::
|
|
||||||
:: If using Windows 10, open Docker Desktop and you can:
|
|
||||||
::
|
|
||||||
:: - (>) START the ejabberd container
|
|
||||||
:: - Enter WebAdmin: click the ([->]) OPEN IN BROWSER button
|
|
||||||
:: - To try ejabberdctl, click the (>_) CLI button, then: ejabberdctl
|
|
||||||
:: - ([]) STOP the ejabberd container
|
|
||||||
::
|
|
||||||
:: If using an old Windows, open Kitematic and you can:
|
|
||||||
::
|
|
||||||
:: - START the ejabberd container
|
|
||||||
:: - Open your configuration, logs, ... in Settings > Volumes
|
|
||||||
:: - Enter WebAdmin in Settings > Hostname/Ports > click on the 5180 port
|
|
||||||
:: - Try ejabberdctl in EXEC, then: ejabberdctl
|
|
||||||
:: - STOP the ejabberd container
|
|
||||||
::
|
|
||||||
:: You can delete the container and create it again running this script,
|
|
||||||
:: the configuration and database are maintained.
|
|
||||||
::
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Check Windows version
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
set INSTALL_DIR_DOCKER=c/Users/%USERNAME%/ejabberd
|
|
||||||
|
|
||||||
for /f "tokens=4-5 delims=. " %%i in ('ver') do set WVERSION=%%i.%%j
|
|
||||||
if "%wversion%" == "10.0" (
|
|
||||||
echo === Preparing paths to install in Windows 10...
|
|
||||||
set INSTALL_DIR=%INSTALL_DIR_WINDOWS10%
|
|
||||||
set VC=-v %INSTALL_DIR_WINDOWS10%\conf:/opt/ejabberd/conf
|
|
||||||
set VD=-v %INSTALL_DIR_WINDOWS10%\database:/opt/ejabberd/database
|
|
||||||
set VL=-v %INSTALL_DIR_WINDOWS10%\logs:/opt/ejabberd/logs
|
|
||||||
set VM=-v %INSTALL_DIR_WINDOWS10%\ejabberd-modules:/opt/ejabberd/.ejabberd-modules
|
|
||||||
set DOCKERDOWNLOAD="First download and install Docker Desktop from https://www.docker.com/"
|
|
||||||
) else (
|
|
||||||
echo === Preparing paths to install in Windows older than 10...
|
|
||||||
set INSTALL_DIR=C:\Users\%USERNAME%\ejabberd
|
|
||||||
set VC=-v "/%INSTALL_DIR_DOCKER%/conf:/opt/ejabberd/conf"
|
|
||||||
set VD=-v "/%INSTALL_DIR_DOCKER%/database:/opt/ejabberd/database"
|
|
||||||
set VL=-v "/%INSTALL_DIR_DOCKER%/logs:/opt/ejabberd/logs"
|
|
||||||
set VM=-v "/%INSTALL_DIR_DOCKER%/ejabberd-modules:/opt/ejabberd/.ejabberd-modules"
|
|
||||||
set DOCKERDOWNLOAD="First download and install Docker Toolbox from https://github.com/docker/toolbox/releases"
|
|
||||||
)
|
|
||||||
set VOLUMES=%VC% %VD% %VL% %VM%
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Check docker is installed
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
docker version >NUL
|
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
|
||||||
echo.
|
|
||||||
echo === ERROR: It seems docker is not installed!!!
|
|
||||||
echo.
|
|
||||||
echo %DOCKERDOWNLOAD%
|
|
||||||
echo === Then try to run this script again.
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit 1
|
|
||||||
)
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Check install options are correctly set
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
if [%PASSWORD%]==[] (
|
|
||||||
echo.
|
|
||||||
echo === ERROR: PASSWORD not set!!!
|
|
||||||
echo.
|
|
||||||
echo === Please edit this script and set the PASSWORD.
|
|
||||||
echo === Then try to run this script again.
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit 1
|
|
||||||
)
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Download Docker image
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
set IMAGE=ghcr.io/processone/ejabberd:%VERSION%
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Checking if the '%IMAGE%' container image was already downloaded...
|
|
||||||
docker image history %IMAGE% >NUL
|
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
|
||||||
echo === The '%IMAGE%' container image was not downloaded yet.
|
|
||||||
echo.
|
|
||||||
echo === Downloading the '%IMAGE%' container image, please wait...
|
|
||||||
docker pull %IMAGE%
|
|
||||||
) else (
|
|
||||||
echo === The '%IMAGE%' container image was already downloaded.
|
|
||||||
)
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Create preliminary container
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Checking if the 'ejabberd' container already exists...
|
|
||||||
docker container logs ejabberd
|
|
||||||
if %ERRORLEVEL% EQU 0 (
|
|
||||||
echo.
|
|
||||||
echo === The 'ejabberd' container already exists.
|
|
||||||
echo === Nothing to do, so installation finishes now.
|
|
||||||
echo === You can go to Docker Desktop and start the 'ejabberd' container.
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
exit 1
|
|
||||||
) else (
|
|
||||||
echo === The 'ejabberd' container doesn't yet exist,
|
|
||||||
echo === so let's continue the installation process.
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
if exist %INSTALL_DIR% (
|
|
||||||
echo === The INSTALL_DIR %INSTALL_DIR% already exists.
|
|
||||||
echo === No need to create the preliminary 'ejabberd-pre' image.
|
|
||||||
) else (
|
|
||||||
echo === The INSTALL_DIR %INSTALL_DIR% doesn't exist.
|
|
||||||
echo === Let's create the preliminary 'ejabberd-pre' image.
|
|
||||||
CALL :create-ejabberd-pre
|
|
||||||
)
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Create final container
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Creating the final 'ejabberd' container using %IMAGE% image...
|
|
||||||
|
|
||||||
setlocal EnableDelayedExpansion
|
|
||||||
set PS=
|
|
||||||
for %%a in (%PORTS%) do (
|
|
||||||
set PS=!PS! -p %%a:%%a
|
|
||||||
)
|
|
||||||
|
|
||||||
docker create --name ejabberd --hostname localhost %PS% %VOLUMES% %IMAGE%
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Installation completed.
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
|
|
||||||
EXIT /B %ERRORLEVEL%
|
|
||||||
|
|
||||||
::===============================================================
|
|
||||||
:: Function to create preliminary container
|
|
||||||
::
|
|
||||||
::===============================================================
|
|
||||||
|
|
||||||
:create-ejabberd-pre
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Creating a preliminary 'ejabberd-pre' container using %IMAGE% image...
|
|
||||||
docker create --name ejabberd-pre --hostname localhost %IMAGE%
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Now 'ejabberd-pre' will be started.
|
|
||||||
docker container start ejabberd-pre
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Waiting ejabberd to be running...
|
|
||||||
set /A timeout = 10
|
|
||||||
set status=4
|
|
||||||
goto :while
|
|
||||||
|
|
||||||
:statusstart
|
|
||||||
docker exec -it ejabberd-pre ejabberdctl status
|
|
||||||
goto :statusend
|
|
||||||
|
|
||||||
:while
|
|
||||||
if %status% GTR 0 (
|
|
||||||
echo.
|
|
||||||
timeout /t 1 /nobreak >NUL
|
|
||||||
set /A timeout = timeout - 1
|
|
||||||
if %timeout% EQU 0 (
|
|
||||||
set status=-1
|
|
||||||
) else (
|
|
||||||
goto :statusstart
|
|
||||||
:statusend
|
|
||||||
set status=%ERRORLEVEL%
|
|
||||||
)
|
|
||||||
goto :while
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Setting a few options...
|
|
||||||
docker exec -it ejabberd-pre sed -i "s!- localhost!- %HOST%!g" conf/ejabberd.yml
|
|
||||||
docker exec -it ejabberd-pre sed -i "s!^acl:!acl:\n admin:\n user:\n - \"%USER%@%HOST%\"!g" conf/ejabberd.yml
|
|
||||||
docker exec -it ejabberd-pre sed -i "s!5280!5180!g" conf/ejabberd.yml
|
|
||||||
docker exec -it ejabberd-pre sed -i "s!/admin!/!g" conf/ejabberd.yml
|
|
||||||
docker exec -it ejabberd-pre ejabberdctl reload_config
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Registering the administrator account...
|
|
||||||
docker exec -it ejabberd-pre ejabberdctl register %USER% %HOST% %PASSWORD%
|
|
||||||
docker exec -it ejabberd-pre ejabberdctl stop
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Copying conf, database, logs...
|
|
||||||
mkdir %INSTALL_DIR%
|
|
||||||
mkdir %INSTALL_DIR%\conf
|
|
||||||
mkdir %INSTALL_DIR%\database
|
|
||||||
mkdir %INSTALL_DIR%\logs
|
|
||||||
mkdir %INSTALL_DIR%\ejabberd-modules
|
|
||||||
docker cp ejabberd-pre:/opt/ejabberd/conf/ %INSTALL_DIR%
|
|
||||||
docker cp ejabberd-pre:/opt/ejabberd/database/ %INSTALL_DIR%
|
|
||||||
docker cp ejabberd-pre:/opt/ejabberd/logs/ %INSTALL_DIR%
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo === Deleting the preliminary 'ejabberd-pre' container...
|
|
||||||
docker stop ejabberd-pre
|
|
||||||
docker rm ejabberd-pre
|
|
||||||
|
|
||||||
EXIT /B 0
|
|
466
.github/container/ejabberdctl.template
vendored
466
.github/container/ejabberdctl.template
vendored
@ -1,466 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# define default configuration
|
|
||||||
POLL=true
|
|
||||||
ERL_MAX_PORTS=32000
|
|
||||||
ERL_PROCESSES=250000
|
|
||||||
ERL_MAX_ETS_TABLES=1400
|
|
||||||
FIREWALL_WINDOW=""
|
|
||||||
INET_DIST_INTERFACE=""
|
|
||||||
ERLANG_NODE=ejabberd@localhost
|
|
||||||
|
|
||||||
# define default environment variables
|
|
||||||
[ -z "$SCRIPT" ] && SCRIPT=$0
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
ERTS_VSN="{{erts_vsn}}"
|
|
||||||
ERL="{{erl}}"
|
|
||||||
EPMD="{{epmd}}"
|
|
||||||
IEX="{{iexpath}}"
|
|
||||||
COOKIE_FILE="$HOME"/.erlang.cookie
|
|
||||||
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$COOKIE_FILE" ] && echo "$ERLANG_COOKIE" > "$COOKIE_FILE" && chmod 400 "$COOKIE_FILE"
|
|
||||||
|
|
||||||
# check the proper system user is used
|
|
||||||
case $(id -un) in
|
|
||||||
"$INSTALLUSER")
|
|
||||||
EXEC_CMD="as_current_user"
|
|
||||||
;;
|
|
||||||
root)
|
|
||||||
if [ -n "$INSTALLUSER" ] ; then
|
|
||||||
EXEC_CMD="as_install_user"
|
|
||||||
else
|
|
||||||
EXEC_CMD="as_current_user"
|
|
||||||
echo "WARNING: It is not recommended to run ejabberd as root" >&2
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if [ -n "$INSTALLUSER" ] ; then
|
|
||||||
echo "ERROR: This command can only be run by root or the user $INSTALLUSER" >&2
|
|
||||||
exit 7
|
|
||||||
else
|
|
||||||
EXEC_CMD="as_current_user"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# parse command line parameters
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
case $1 in
|
|
||||||
-n|--node) ERLANG_NODE_ARG=$2; shift 2;;
|
|
||||||
-s|--spool) SPOOL_DIR=$2; shift 2;;
|
|
||||||
-l|--logs) LOGS_DIR=$2; shift 2;;
|
|
||||||
-f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;;
|
|
||||||
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;;
|
|
||||||
-d|--config-dir) CONFIG_DIR=$2; shift 2;;
|
|
||||||
-t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;;
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# define ejabberd variables if not already defined from the command line
|
|
||||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
|
||||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
|
||||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
|
||||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
|
||||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
|
||||||
: "${VMARGS:="$CONFIG_DIR/vm.args"}"
|
|
||||||
# shellcheck source=ejabberdctl.cfg.example
|
|
||||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
|
||||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
|
||||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
|
||||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
|
||||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
|
||||||
|
|
||||||
# define erl parameters
|
|
||||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
|
||||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
|
||||||
fi
|
|
||||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
|
||||||
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
|
||||||
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
|
||||||
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
|
|
||||||
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
|
|
||||||
fi
|
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -erl_epmd_port $ERL_DIST_PORT -start_epmd false"
|
|
||||||
# if vm.args file exists in config directory, pass it to Erlang VM
|
|
||||||
[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS"
|
|
||||||
ERL_LIBS='{{libdir}}'
|
|
||||||
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
|
||||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
|
||||||
|
|
||||||
# define ejabberd parameters
|
|
||||||
EJABBERD_OPTS="\
|
|
||||||
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
|
||||||
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
|
||||||
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
|
||||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
|
||||||
$EJABBERD_OPTS"
|
|
||||||
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
|
||||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
|
||||||
|
|
||||||
# export global variables
|
|
||||||
export EJABBERD_CONFIG_PATH
|
|
||||||
export EJABBERD_LOG_PATH
|
|
||||||
export EJABBERD_PID_PATH
|
|
||||||
export ERL_CRASH_DUMP
|
|
||||||
export ERL_EPMD_ADDRESS
|
|
||||||
export ERL_DIST_PORT
|
|
||||||
export ERL_INETRC
|
|
||||||
export ERL_MAX_PORTS
|
|
||||||
export ERL_MAX_ETS_TABLES
|
|
||||||
export CONTRIB_MODULES_PATH
|
|
||||||
export CONTRIB_MODULES_CONF_DIR
|
|
||||||
export ERL_LIBS
|
|
||||||
export SCRIPT_DIR
|
|
||||||
|
|
||||||
set_dist_client()
|
|
||||||
{
|
|
||||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
|
|
||||||
}
|
|
||||||
|
|
||||||
# run command either directly or via su $INSTALLUSER
|
|
||||||
run_cmd()
|
|
||||||
{
|
|
||||||
case $EXEC_CMD in
|
|
||||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
|
||||||
as_current_user) "$@" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
exec_cmd()
|
|
||||||
{
|
|
||||||
case $EXEC_CMD in
|
|
||||||
as_current_user) exec "$@" ;;
|
|
||||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
run_erl()
|
|
||||||
{
|
|
||||||
NODE=$1; shift
|
|
||||||
run_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@"
|
|
||||||
}
|
|
||||||
exec_erl()
|
|
||||||
{
|
|
||||||
NODE=$1; shift
|
|
||||||
exec_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@"
|
|
||||||
}
|
|
||||||
exec_iex()
|
|
||||||
{
|
|
||||||
NODE=$1; shift
|
|
||||||
exec_cmd "$IEX" -${S:--}name "$NODE" --erl "$ERLANG_OPTS" "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# usage
|
|
||||||
debugwarning()
|
|
||||||
{
|
|
||||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
|
||||||
echo "--------------------------------------------------------------------"
|
|
||||||
echo ""
|
|
||||||
echo "IMPORTANT: we will attempt to attach an INTERACTIVE shell"
|
|
||||||
echo "to an already running ejabberd node."
|
|
||||||
echo "If an ERROR is printed, it means the connection was not successful."
|
|
||||||
echo "You can interact with the ejabberd node if you know how to use it."
|
|
||||||
echo "Please be extremely cautious with your actions,"
|
|
||||||
echo "and exit immediately if you are not completely sure."
|
|
||||||
echo ""
|
|
||||||
echo "To exit and detach this shell from ejabberd, press:"
|
|
||||||
echo " control+g and then q"
|
|
||||||
echo ""
|
|
||||||
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
|
||||||
#vt100 echo ""
|
|
||||||
echo "--------------------------------------------------------------------"
|
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
|
||||||
echo "Press return to continue"
|
|
||||||
read -r _
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
livewarning()
|
|
||||||
{
|
|
||||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
|
||||||
echo "--------------------------------------------------------------------"
|
|
||||||
echo ""
|
|
||||||
echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode."
|
|
||||||
echo "All log messages will be shown in the command shell."
|
|
||||||
echo "You can interact with the ejabberd node if you know how to use it."
|
|
||||||
echo "Please be extremely cautious with your actions,"
|
|
||||||
echo "and exit immediately if you are not completely sure."
|
|
||||||
echo ""
|
|
||||||
echo "To exit and detach this shell from ejabberd, press:"
|
|
||||||
echo " control+g and then q"
|
|
||||||
echo ""
|
|
||||||
echo "--------------------------------------------------------------------"
|
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
|
||||||
echo "Press return to continue"
|
|
||||||
read -r _
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_etop_result()
|
|
||||||
{
|
|
||||||
result=$?
|
|
||||||
if [ $result -eq 1 ] ; then
|
|
||||||
echo ""
|
|
||||||
echo "It seems there was some problem running 'ejabberdctl etop'."
|
|
||||||
echo "Is the error message something like this?"
|
|
||||||
echo " Failed to load module 'etop' because it cannot be found..."
|
|
||||||
echo "Then probably ejabberd was compiled with development tools disabled."
|
|
||||||
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
|
|
||||||
echo ""
|
|
||||||
exit $result
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_iex_result()
|
|
||||||
{
|
|
||||||
result=$?
|
|
||||||
if [ $result -eq 127 ] ; then
|
|
||||||
echo ""
|
|
||||||
echo "It seems there was some problem finding 'iex' binary from Elixir."
|
|
||||||
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
|
|
||||||
echo " ./configure"
|
|
||||||
echo "which is equivalent to:"
|
|
||||||
echo " ./configure --with-rebar=rebar3 --disable-elixir"
|
|
||||||
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
|
|
||||||
echo " ./configure --enable-elixir"
|
|
||||||
echo " ./configure --with-rebar=mix"
|
|
||||||
echo ""
|
|
||||||
exit $result
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
help()
|
|
||||||
{
|
|
||||||
echo ""
|
|
||||||
echo "Commands to start an ejabberd node:"
|
|
||||||
echo " start Start in server mode"
|
|
||||||
echo " foreground Start in server mode (attached)"
|
|
||||||
echo " foreground-quiet Start in server mode (attached), show only critical messages"
|
|
||||||
echo " live Start in interactive mode, with Erlang shell"
|
|
||||||
echo " iexlive Start in interactive mode, with Elixir shell"
|
|
||||||
echo ""
|
|
||||||
echo "Commands to interact with a running ejabberd node:"
|
|
||||||
echo " debug Attach an interactive Erlang shell to a running node"
|
|
||||||
echo " iexdebug Attach an interactive Elixir shell to a running node"
|
|
||||||
echo " etop Attach to a running node and start Erlang Top"
|
|
||||||
echo " ping Send ping to the node, returns pong or pang"
|
|
||||||
echo " started|stopped Wait for the node to fully start|stop"
|
|
||||||
echo ""
|
|
||||||
echo "Optional parameters when starting an ejabberd node:"
|
|
||||||
echo " --config-dir dir Config ejabberd: $CONFIG_DIR"
|
|
||||||
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
|
||||||
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
|
||||||
echo " --logs dir Directory for logs: $LOGS_DIR"
|
|
||||||
echo " --spool dir Database spool dir: $SPOOL_DIR"
|
|
||||||
echo " --node nodename ejabberd node name: $ERLANG_NODE"
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
# dynamic node name helper
|
|
||||||
uid() {
|
|
||||||
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
|
|
||||||
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
|
||||||
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
|
||||||
N=1
|
|
||||||
PF=$(( $$ % 97 ))
|
|
||||||
while
|
|
||||||
case $# in
|
|
||||||
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
|
||||||
;;
|
|
||||||
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
|
|
||||||
;;
|
|
||||||
2) NN="${PF}-${N}-${1}@${2}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
N=$(( N + 1 + ( $$ % 5 ) ))
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
|
|
||||||
do :; done
|
|
||||||
echo $NN
|
|
||||||
else
|
|
||||||
# Erlang/OTP 23 or higher: use native dynamic node code
|
|
||||||
# https://www.erlang.org/patches/otp-23.0#OTP-13812
|
|
||||||
if [ "$ERLANG_NODE" != "${ERLANG_NODE%.*}" ]; then
|
|
||||||
echo "undefined@${ERLANG_NODE#*@}"
|
|
||||||
else
|
|
||||||
echo "undefined"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# stop epmd if there is no other running node
|
|
||||||
stop_epmd()
|
|
||||||
{
|
|
||||||
[ -n "$ERL_DIST_PORT" ] && return
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# make sure node not already running and node name unregistered
|
|
||||||
# if all ok, ensure runtime directory exists and make it current directory
|
|
||||||
check_start()
|
|
||||||
{
|
|
||||||
[ -n "$ERL_DIST_PORT" ] && return
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
|
||||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
|
||||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
|
||||||
exit 4
|
|
||||||
}
|
|
||||||
pgrep beam >/dev/null && {
|
|
||||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered,"
|
|
||||||
echo " but no related beam process has been found."
|
|
||||||
echo "Shutdown all other erlang nodes, and call 'epmd -kill'."
|
|
||||||
exit 5
|
|
||||||
}
|
|
||||||
"$EPMD" -kill >/dev/null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
post_waiter_fork()
|
|
||||||
{
|
|
||||||
(FIRST_RUN=$FIRST_RUN "$0" post_waiter)&
|
|
||||||
}
|
|
||||||
|
|
||||||
post_waiter_waiting()
|
|
||||||
{
|
|
||||||
$0 started
|
|
||||||
[ -n "$FIRST_RUN" ] && [ -n "$CTL_ON_CREATE" ] && (post_waiter_loop $CTL_ON_CREATE)
|
|
||||||
[ -n "$CTL_ON_START" ] && post_waiter_loop $CTL_ON_START
|
|
||||||
}
|
|
||||||
|
|
||||||
post_waiter_loop()
|
|
||||||
{
|
|
||||||
LIST=$@
|
|
||||||
HEAD=${LIST%% ; *}
|
|
||||||
TAIL=${LIST#* ; }
|
|
||||||
HEAD2=${HEAD#\! *}
|
|
||||||
echo ":> ejabberdctl $HEAD2"
|
|
||||||
$0 $HEAD2
|
|
||||||
ctlstatus=$?
|
|
||||||
if [ $ctlstatus -ne 0 ] ; then
|
|
||||||
if [ "$HEAD" != "$HEAD2" ] ; then
|
|
||||||
echo ":> FAILURE in command '$HEAD2' !!! Ignoring result"
|
|
||||||
else
|
|
||||||
echo ":> FAILURE in command '$HEAD' !!! Stopping ejabberd..."
|
|
||||||
$0 halt > /dev/null
|
|
||||||
exit $ctlstatus
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
[ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL
|
|
||||||
}
|
|
||||||
|
|
||||||
# allow sync calls
|
|
||||||
wait_status()
|
|
||||||
{
|
|
||||||
# args: status try delay
|
|
||||||
# return: 0 OK, 1 KO
|
|
||||||
timeout="$2"
|
|
||||||
status=4
|
|
||||||
while [ "$status" -ne "$1" ] ; do
|
|
||||||
sleep "$3"
|
|
||||||
timeout=$((timeout - 1))
|
|
||||||
if [ $timeout -eq 0 ] ; then
|
|
||||||
status="$1"
|
|
||||||
else
|
|
||||||
run_erl "$(uid ctl)" -hidden -noinput \
|
|
||||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
|
||||||
-s ejabberd_ctl \
|
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
|
||||||
status="$?"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
[ $timeout -gt 0 ]
|
|
||||||
}
|
|
||||||
|
|
||||||
# ensure we can change current directory to SPOOL_DIR
|
|
||||||
[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true
|
|
||||||
[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR"
|
|
||||||
cd "$SPOOL_DIR" || {
|
|
||||||
echo "ERROR: can not access directory $SPOOL_DIR"
|
|
||||||
exit 6
|
|
||||||
}
|
|
||||||
|
|
||||||
# main
|
|
||||||
case $1 in
|
|
||||||
start)
|
|
||||||
check_start
|
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
|
||||||
;;
|
|
||||||
foreground)
|
|
||||||
check_start
|
|
||||||
post_waiter_fork
|
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput
|
|
||||||
;;
|
|
||||||
foreground-quiet)
|
|
||||||
check_start
|
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput -ejabberd quiet true
|
|
||||||
;;
|
|
||||||
live)
|
|
||||||
livewarning
|
|
||||||
check_start
|
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS
|
|
||||||
;;
|
|
||||||
debug)
|
|
||||||
debugwarning
|
|
||||||
set_dist_client
|
|
||||||
exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE"
|
|
||||||
;;
|
|
||||||
etop)
|
|
||||||
set_dist_client
|
|
||||||
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" \
|
|
||||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
|
||||||
-s etop \
|
|
||||||
-output text
|
|
||||||
check_etop_result
|
|
||||||
;;
|
|
||||||
iexdebug)
|
|
||||||
debugwarning
|
|
||||||
set_dist_client
|
|
||||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
|
||||||
check_iex_result
|
|
||||||
;;
|
|
||||||
iexlive)
|
|
||||||
livewarning
|
|
||||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
|
||||||
check_iex_result
|
|
||||||
;;
|
|
||||||
ping)
|
|
||||||
PEER=${2:-$ERLANG_NODE}
|
|
||||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
|
||||||
set_dist_client
|
|
||||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
|
||||||
-noinput -hidden \
|
|
||||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
|
||||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
|
||||||
-s erlang halt -output text
|
|
||||||
;;
|
|
||||||
started)
|
|
||||||
set_dist_client
|
|
||||||
wait_status 0 30 2 # wait 30x2s before timeout
|
|
||||||
;;
|
|
||||||
stopped)
|
|
||||||
set_dist_client
|
|
||||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
|
||||||
;;
|
|
||||||
post_waiter)
|
|
||||||
post_waiter_waiting
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set_dist_client
|
|
||||||
run_erl "$(uid ctl)" -hidden -noinput \
|
|
||||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
|
||||||
-s ejabberd_ctl \
|
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
|
||||||
result=$?
|
|
||||||
case $result in
|
|
||||||
2|3) help;;
|
|
||||||
*) :;;
|
|
||||||
esac
|
|
||||||
exit $result
|
|
||||||
;;
|
|
||||||
esac
|
|
329
.github/workflows/ci.yml
vendored
329
.github/workflows/ci.yml
vendored
@ -1,329 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- '.devcontainer/**'
|
|
||||||
- 'examples/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'man/**'
|
|
||||||
- 'priv/**'
|
|
||||||
- '**.md'
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '.devcontainer/**'
|
|
||||||
- 'examples/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'man/**'
|
|
||||||
- 'priv/**'
|
|
||||||
- '**.md'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
tests:
|
|
||||||
name: Tests
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
otp: ['20.0', '25', '26', '27']
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
services:
|
|
||||||
redis:
|
|
||||||
image: redis
|
|
||||||
ports:
|
|
||||||
- 6379:6379
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test shell scripts
|
|
||||||
if: matrix.otp == '26'
|
|
||||||
run: |
|
|
||||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
|
||||||
shellcheck tools/captcha.sh
|
|
||||||
shellcheck ejabberd.init.template
|
|
||||||
shellcheck -x ejabberdctl.template
|
|
||||||
|
|
||||||
- name: Get specific Erlang/OTP
|
|
||||||
uses: erlef/setup-beam@v1
|
|
||||||
with:
|
|
||||||
otp-version: ${{ matrix.otp }}
|
|
||||||
|
|
||||||
- name: Get a compatible Rebar3
|
|
||||||
if: matrix.otp < 24
|
|
||||||
run: |
|
|
||||||
rm rebar3
|
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
|
||||||
chmod +x rebar3
|
|
||||||
|
|
||||||
- name: Install MS SQL Server
|
|
||||||
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
|
|
||||||
|
|
||||||
- name: Prepare databases
|
|
||||||
run: |
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
|
|
||||||
sudo systemctl start mysql.service
|
|
||||||
sudo systemctl start postgresql.service
|
|
||||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
|
||||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
|
||||||
IDENTIFIED BY 'ejabberd_test';"
|
|
||||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
|
||||||
TO 'ejabberd_test'@'localhost';"
|
|
||||||
pg_isready
|
|
||||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
|
||||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
|
||||||
WITH PASSWORD 'ejabberd_test';"
|
|
||||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
|
||||||
ON DATABASE ejabberd_test 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;"
|
|
||||||
|
|
||||||
- name: Prepare libraries
|
|
||||||
run: |
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get -y purge libgd3 nginx
|
|
||||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
|
||||||
|
|
||||||
- name: Remove syntax_tools from release
|
|
||||||
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
|
||||||
|
|
||||||
- name: Cache Hex.pm
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cache/rebar3/
|
|
||||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
|
||||||
|
|
||||||
- name: Download test logs
|
|
||||||
if: matrix.otp == '26' && github.repository == 'processone/ejabberd'
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
mkdir -p _build/test
|
|
||||||
curl -sSL https://github.com/processone/ecil/tarball/gh-pages |
|
|
||||||
tar -C _build/test --strip-components=1 --wildcards -xzf -
|
|
||||||
rm -rf _build/test/logs/last/
|
|
||||||
|
|
||||||
- name: Compile
|
|
||||||
run: |
|
|
||||||
./autogen.sh
|
|
||||||
./configure --with-rebar=./rebar3 \
|
|
||||||
--prefix=/tmp/ejabberd \
|
|
||||||
--enable-all \
|
|
||||||
--disable-elixir \
|
|
||||||
--disable-mssql \
|
|
||||||
--disable-odbc
|
|
||||||
make
|
|
||||||
|
|
||||||
- run: make install -s
|
|
||||||
- run: make hooks
|
|
||||||
- run: make options
|
|
||||||
- run: make xref
|
|
||||||
- run: make dialyzer
|
|
||||||
- run: make test-eunit
|
|
||||||
- run: make elvis
|
|
||||||
if: matrix.otp >= 23
|
|
||||||
|
|
||||||
- name: Check Production Release
|
|
||||||
run: |
|
|
||||||
make rel
|
|
||||||
RE=_build/prod/rel/ejabberd
|
|
||||||
$RE/bin/ejabberdctl start
|
|
||||||
$RE/bin/ejabberdctl started
|
|
||||||
$RE/bin/ejabberdctl stop
|
|
||||||
$RE/bin/ejabberdctl stopped
|
|
||||||
cat $RE/logs/ejabberd.log
|
|
||||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
|
||||||
|
|
||||||
- name: Start Development Release
|
|
||||||
run: |
|
|
||||||
make dev
|
|
||||||
RE=_build/dev/rel/ejabberd
|
|
||||||
sed -i 's/starttls_required: true/starttls_required: false/g' $RE/conf/ejabberd.yml
|
|
||||||
$RE/bin/ejabberdctl start
|
|
||||||
$RE/bin/ejabberdctl started
|
|
||||||
$RE/bin/ejabberdctl register admin localhost admin
|
|
||||||
grep -q "is started in" $RE/logs/ejabberd.log
|
|
||||||
|
|
||||||
- name: Run XMPP Interoperability Tests against CI server.
|
|
||||||
if: matrix.otp == '26'
|
|
||||||
continue-on-error: true
|
|
||||||
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.4.0
|
|
||||||
with:
|
|
||||||
domain: 'localhost'
|
|
||||||
adminAccountUsername: 'admin'
|
|
||||||
adminAccountPassword: 'admin'
|
|
||||||
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,XEP-0363,XEP-0384
|
|
||||||
|
|
||||||
- name: Stop Development Release
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
RE=_build/dev/rel/ejabberd
|
|
||||||
$RE/bin/ejabberdctl stop
|
|
||||||
$RE/bin/ejabberdctl stopped
|
|
||||||
cat $RE/logs/ejabberd.log
|
|
||||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
id: ct
|
|
||||||
run: |
|
|
||||||
(cd priv && ln -sf ../sql)
|
|
||||||
sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
|
||||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
|
||||||
DATE=`date +%s`
|
|
||||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
|
||||||
NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT
|
|
||||||
LABEL=`git show -s --format=%s | cut -c 1-30`
|
|
||||||
./rebar3 ct --name $NODENAME --label "$LABEL"
|
|
||||||
./rebar3 cover
|
|
||||||
|
|
||||||
- name: Check results
|
|
||||||
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
|
|
||||||
id: ctresults
|
|
||||||
run: |
|
|
||||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
|
||||||
ln `find logs/ -name suite.log` logs/suite.log
|
|
||||||
grep 'TEST COMPLETE' logs/suite.log
|
|
||||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
|
||||||
test $(find logs/ -empty -name error.log)
|
|
||||||
|
|
||||||
- name: View logs failures
|
|
||||||
if: failure() && steps.ctresults.outcome == 'failure'
|
|
||||||
run: |
|
|
||||||
cat logs/suite.log | awk \
|
|
||||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
|
||||||
find logs/ -name error.log -exec cat '{}' ';'
|
|
||||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
|
||||||
|
|
||||||
- name: Send to coveralls
|
|
||||||
if: matrix.otp == '26'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
DIAGNOSTIC=1 ./rebar3 as test coveralls send
|
|
||||||
curl -v -k https://coveralls.io/webhook \
|
|
||||||
--header "Content-Type: application/json" \
|
|
||||||
--data '{"repo_name":"$GITHUB_REPOSITORY",
|
|
||||||
"repo_token":"$GITHUB_TOKEN",
|
|
||||||
"payload":{"build_num":$GITHUB_RUN_ID,
|
|
||||||
"status":"done"}}'
|
|
||||||
|
|
||||||
- name: Upload test logs
|
|
||||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
|
||||||
uses: peaceiris/actions-gh-pages@v4
|
|
||||||
with:
|
|
||||||
publish_dir: _build/test
|
|
||||||
exclude_assets: '.github,lib,plugins'
|
|
||||||
external_repository: processone/ecil
|
|
||||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
|
||||||
keep_files: true
|
|
||||||
|
|
||||||
- name: View ECIL address
|
|
||||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
|
||||||
run: |
|
|
||||||
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
|
|
||||||
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
|
|
||||||
|
|
||||||
- name: Check for changes to trigger schema upgrade test
|
|
||||||
uses: dorny/paths-filter@v3
|
|
||||||
id: filter
|
|
||||||
with:
|
|
||||||
filters: |
|
|
||||||
sql:
|
|
||||||
- 'sql/**'
|
|
||||||
- 'src/mod_admin_update_sql.erl'
|
|
||||||
|
|
||||||
- name: Prepare for schema upgrade test
|
|
||||||
id: prepupgradetest
|
|
||||||
if: ${{ steps.filter.outputs.sql == 'true' }}
|
|
||||||
run: |
|
|
||||||
[[ -d logs ]] && rm -rf logs
|
|
||||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
|
||||||
sed -i 's|update_sql, false|update_sql, true|g' test/suite.erl
|
|
||||||
- name: Run DB tests on upgraded schema (mssql, mysql, pgsql)
|
|
||||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
|
||||||
if: always() && steps.prepupgradetest.outcome != 'skipped'
|
|
||||||
id: ctupgradedschema
|
|
||||||
- name: Check results
|
|
||||||
if: always() && steps.ctupgradedschema.outcome != 'skipped'
|
|
||||||
run: |
|
|
||||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
|
||||||
ln `find logs/ -name suite.log` logs/suite.log
|
|
||||||
grep 'TEST COMPLETE' logs/suite.log
|
|
||||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
|
||||||
test $(find logs/ -empty -name error.log)
|
|
||||||
- name: View logs failures
|
|
||||||
if: failure() && steps.ctupgradedschema.outcome != 'skipped'
|
|
||||||
run: |
|
|
||||||
cat logs/suite.log | awk \
|
|
||||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
|
||||||
find logs/ -name error.log -exec cat '{}' ';'
|
|
||||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
|
||||||
|
|
||||||
- name: Prepare new schema
|
|
||||||
run: |
|
|
||||||
[[ -d logs ]] && rm -rf logs
|
|
||||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
|
|
||||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
|
||||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
|
||||||
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
|
|
||||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
|
||||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
|
||||||
TO 'ejabberd_test'@'localhost';"
|
|
||||||
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 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;"
|
|
||||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
|
||||||
- name: Run DB tests on new schema (mssql, mysql, pgsql)
|
|
||||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
|
||||||
id: ctnewschema
|
|
||||||
- name: Check results
|
|
||||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
|
||||||
run: |
|
|
||||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
|
||||||
ln `find logs/ -name suite.log` logs/suite.log
|
|
||||||
grep 'TEST COMPLETE' logs/suite.log
|
|
||||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
|
||||||
test $(find logs/ -empty -name error.log)
|
|
||||||
- name: View logs failures
|
|
||||||
if: failure() && steps.ctnewschema.outcome != 'skipped'
|
|
||||||
run: |
|
|
||||||
cat logs/suite.log | awk \
|
|
||||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
|
||||||
find logs/ -name error.log -exec cat '{}' ';'
|
|
||||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
|
||||||
|
|
||||||
- name: Upload CT logs
|
|
||||||
if: failure()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ejabberd-ct-logs-${{matrix.otp}}
|
|
||||||
#
|
|
||||||
# Appending the wildcard character ("*") is a trick to make
|
|
||||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
|
||||||
#
|
|
||||||
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
|
|
||||||
#
|
|
||||||
path: _build/test/logs
|
|
||||||
retention-days: 14
|
|
123
.github/workflows/container.yml
vendored
123
.github/workflows/container.yml
vendored
@ -1,123 +0,0 @@
|
|||||||
name: Container
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '22 2 */6 * *' # every 6 days to avoid gha cache being evicted
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- '.devcontainer/**'
|
|
||||||
- 'examples/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'man/**'
|
|
||||||
- 'priv/**'
|
|
||||||
- '**.md'
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
container:
|
|
||||||
name: Container
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
permissions:
|
|
||||||
packages: write
|
|
||||||
steps:
|
|
||||||
- name: Check out repository code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Cache build directory
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/build/
|
|
||||||
key: ${{runner.os}}-ctr-ct-ng-1.26.0
|
|
||||||
|
|
||||||
- name: Get erlang/OTP version for bootstrapping
|
|
||||||
run: |
|
|
||||||
echo "OTP_VSN=$(awk '/^otp_vsn=/ {{gsub(/[^0-9.rc-]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
|
|
||||||
echo "ELIXIR_VSN=$(awk '/^elixir_vsn=/ {{gsub(/[^0-9.]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Install prerequisites
|
|
||||||
run: |
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get -qq install makeself
|
|
||||||
# https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile
|
|
||||||
sudo apt-get -qq install build-essential autoconf bison flex gawk
|
|
||||||
sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin
|
|
||||||
sudo apt-get -qq install python3-dev texinfo unzip
|
|
||||||
|
|
||||||
- name: Install erlang/OTP
|
|
||||||
uses: erlef/setup-beam@v1
|
|
||||||
with:
|
|
||||||
otp-version: ${{ env.OTP_VSN }}
|
|
||||||
elixir-version: ${{ env.ELIXIR_VSN }}
|
|
||||||
version-type: strict
|
|
||||||
|
|
||||||
- name: Remove Elixir Matchers
|
|
||||||
run: |
|
|
||||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
|
||||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
|
||||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
|
||||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
|
||||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
|
||||||
|
|
||||||
- name: Build musl-libc based binary archives
|
|
||||||
run: |
|
|
||||||
sed -i "s|targets='.*'|targets='x86_64-linux-musl aarch64-linux-musl'|" tools/make-binaries
|
|
||||||
mv .github/container/ejabberdctl.template .
|
|
||||||
CHECK_DEPS=false tools/make-binaries
|
|
||||||
|
|
||||||
- name: Collect packages
|
|
||||||
run: |
|
|
||||||
mkdir tarballs
|
|
||||||
mv ejabberd-*.tar.gz tarballs
|
|
||||||
|
|
||||||
- name: Checkout ejabberd-contrib
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
repository: processone/ejabberd-contrib
|
|
||||||
path: .ejabberd-modules/sources/ejabberd-contrib
|
|
||||||
|
|
||||||
- name: Log in to the Container registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get git describe
|
|
||||||
id: gitdescribe
|
|
||||||
run: echo "ver=$(git describe --tags)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
||||||
labels: |
|
|
||||||
org.opencontainers.image.revision=${{ steps.gitdescribe.outputs.ver }}
|
|
||||||
org.opencontainers.image.licenses=GPL-2.0
|
|
||||||
org.opencontainers.image.vendor=ProcessOne
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
build-args: |
|
|
||||||
METHOD=package
|
|
||||||
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
context: .
|
|
||||||
file: .github/container/Dockerfile
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
84
.github/workflows/installers.yml
vendored
84
.github/workflows/installers.yml
vendored
@ -1,84 +0,0 @@
|
|||||||
name: Installers
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- '.devcontainer/**'
|
|
||||||
- 'examples/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'man/**'
|
|
||||||
- 'priv/**'
|
|
||||||
- '**.md'
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '.devcontainer/**'
|
|
||||||
- 'examples/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'man/**'
|
|
||||||
- 'priv/**'
|
|
||||||
- '**.md'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
binaries:
|
|
||||||
name: Binaries
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Cache build directory
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/build/
|
|
||||||
key: ${{runner.os}}-ct-ng-1.26.0
|
|
||||||
- name: Install prerequisites
|
|
||||||
run: |
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get -qq install makeself
|
|
||||||
# https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile
|
|
||||||
sudo apt-get -qq install build-essential autoconf bison flex gawk
|
|
||||||
sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin
|
|
||||||
sudo apt-get -qq install python3-dev texinfo unzip
|
|
||||||
- name: Install FPM
|
|
||||||
run: |
|
|
||||||
gem install --no-document --user-install fpm
|
|
||||||
echo $HOME/.local/share/gem/ruby/*/bin >> $GITHUB_PATH
|
|
||||||
- name: Check out repository code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Build binary archives
|
|
||||||
run: CHECK_DEPS=false tools/make-binaries
|
|
||||||
- name: Build DEB and RPM packages
|
|
||||||
run: tools/make-packages
|
|
||||||
- name: Build installers
|
|
||||||
run: tools/make-installers
|
|
||||||
- name: Collect packages
|
|
||||||
run: |
|
|
||||||
mkdir ejabberd-packages
|
|
||||||
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
|
||||||
- name: Upload packages
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ejabberd-packages
|
|
||||||
#
|
|
||||||
# Appending the wildcard character ("*") is a trick to make
|
|
||||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
|
||||||
#
|
|
||||||
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
|
|
||||||
#
|
|
||||||
path: ejabberd-packages*
|
|
||||||
retention-days: 14
|
|
||||||
|
|
||||||
release:
|
|
||||||
name: Release
|
|
||||||
needs: [binaries]
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
if: github.ref_type == 'tag'
|
|
||||||
steps:
|
|
||||||
- name: Download packages
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ejabberd-packages
|
|
||||||
- name: Draft Release
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
draft: true
|
|
||||||
files: ejabberd-packages/*
|
|
454
.github/workflows/runtime.yml
vendored
454
.github/workflows/runtime.yml
vendored
@ -1,454 +0,0 @@
|
|||||||
name: Runtime
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- '*'
|
|
||||||
- '!*.md'
|
|
||||||
- '.github/workflows/runtime.yml'
|
|
||||||
- 'checkouts/**'
|
|
||||||
- 'config/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'm4/**'
|
|
||||||
- 'plugins/**'
|
|
||||||
- 'rel/**'
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- '*'
|
|
||||||
- '!*.md'
|
|
||||||
- '.github/workflows/runtime.yml'
|
|
||||||
- 'checkouts/**'
|
|
||||||
- 'config/**'
|
|
||||||
- 'lib/**'
|
|
||||||
- 'm4/**'
|
|
||||||
- 'plugins/**'
|
|
||||||
- 'rel/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
rebars:
|
|
||||||
name: Rebars
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
otp: ['20', '25', '26', '27']
|
|
||||||
rebar: ['rebar', 'rebar3']
|
|
||||||
exclude:
|
|
||||||
- otp: '27'
|
|
||||||
rebar: 'rebar'
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
container:
|
|
||||||
image: erlang:${{ matrix.otp }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get compatible Rebar binaries
|
|
||||||
if: matrix.otp < 24
|
|
||||||
run: |
|
|
||||||
rm rebar
|
|
||||||
rm rebar3
|
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
|
||||||
chmod +x rebar
|
|
||||||
chmod +x rebar3
|
|
||||||
|
|
||||||
- name: Prepare libraries
|
|
||||||
run: |
|
|
||||||
apt-get -qq update
|
|
||||||
apt-get purge -y libgd3 nginx
|
|
||||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
|
||||||
|
|
||||||
- name: Cache Hex.pm
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cache/rebar3/
|
|
||||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
|
||||||
|
|
||||||
- name: Compile
|
|
||||||
run: |
|
|
||||||
./autogen.sh
|
|
||||||
./configure --with-rebar=./${{ matrix.rebar }} \
|
|
||||||
--prefix=/tmp/ejabberd \
|
|
||||||
--enable-all \
|
|
||||||
--disable-elixir \
|
|
||||||
--disable-tools \
|
|
||||||
--disable-odbc
|
|
||||||
make
|
|
||||||
|
|
||||||
- run: make xref
|
|
||||||
|
|
||||||
- name: Prepare rel (rebar2)
|
|
||||||
if: matrix.rebar == 'rebar'
|
|
||||||
run: |
|
|
||||||
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
|
|
||||||
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
|
|
||||||
|
|
||||||
- name: Run rel
|
|
||||||
run: |
|
|
||||||
make rel
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run dev
|
|
||||||
run: |
|
|
||||||
make dev
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run install
|
|
||||||
run: |
|
|
||||||
make install
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: View logs
|
|
||||||
run: |
|
|
||||||
echo "===> Registered:"
|
|
||||||
cat registered.log
|
|
||||||
echo "===> Prod:"
|
|
||||||
cat _build/prod/rel/ejabberd/logs/*
|
|
||||||
echo "===> Dev:"
|
|
||||||
cat _build/dev/rel/ejabberd/logs/*
|
|
||||||
echo "===> Install:"
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
|
||||||
|
|
||||||
- name: Check logs
|
|
||||||
run: |
|
|
||||||
grep -q '^user1$' registered.log
|
|
||||||
grep -q '^user2$' registered.log
|
|
||||||
grep -q '^user3$' registered.log
|
|
||||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/prod/rel/ -empty -name error.log)
|
|
||||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/dev/rel/ -empty -name error.log)
|
|
||||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
|
||||||
|
|
||||||
- name: View logs failures
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/prod/rel/ejabberd/logs/error.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/error.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
|
||||||
|
|
||||||
rebar3-elixir:
|
|
||||||
name: Rebar3+Elixir
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
otp: ['23.0', '25', '26', '27']
|
|
||||||
elixir: ['1.13', '1.15', '1.16', '1.17']
|
|
||||||
exclude:
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.15'
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.16'
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.17'
|
|
||||||
- otp: '26'
|
|
||||||
elixir: '1.13'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.13'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.15'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.16'
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get specific Erlang/OTP
|
|
||||||
uses: erlef/setup-beam@v1
|
|
||||||
with:
|
|
||||||
otp-version: ${{matrix.otp}}
|
|
||||||
elixir-version: ${{matrix.elixir}}
|
|
||||||
|
|
||||||
- name: Get compatible Rebar binaries
|
|
||||||
if: matrix.otp < 24
|
|
||||||
run: |
|
|
||||||
rm rebar
|
|
||||||
rm rebar3
|
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
|
||||||
chmod +x rebar
|
|
||||||
chmod +x rebar3
|
|
||||||
|
|
||||||
- name: Prepare libraries
|
|
||||||
run: |
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get -y purge libgd3 nginx
|
|
||||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
|
||||||
|
|
||||||
- name: Enable ModPresenceDemo and an Elixir dependency
|
|
||||||
run: |
|
|
||||||
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
|
|
||||||
cat ejabberd.yml.example
|
|
||||||
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
|
|
||||||
cat rebar.config
|
|
||||||
|
|
||||||
- name: Cache Hex.pm
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cache/rebar3/
|
|
||||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
|
||||||
|
|
||||||
- name: Compile
|
|
||||||
run: |
|
|
||||||
./autogen.sh
|
|
||||||
./configure --with-rebar=./rebar3 \
|
|
||||||
--prefix=/tmp/ejabberd \
|
|
||||||
--enable-all \
|
|
||||||
--disable-odbc
|
|
||||||
make
|
|
||||||
|
|
||||||
- run: make xref
|
|
||||||
|
|
||||||
- name: Run rel
|
|
||||||
run: |
|
|
||||||
make rel
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run dev
|
|
||||||
run: |
|
|
||||||
make dev
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run install
|
|
||||||
run: |
|
|
||||||
make install
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: View logs
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
echo "===> Registered:"
|
|
||||||
cat registered.log
|
|
||||||
echo "===> Prod:"
|
|
||||||
cat _build/prod/rel/ejabberd/logs/*
|
|
||||||
echo "===> Dev:"
|
|
||||||
cat _build/dev/rel/ejabberd/logs/*
|
|
||||||
echo "===> Install:"
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
|
||||||
|
|
||||||
- name: Check logs
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
grep -q '^user1$' registered.log
|
|
||||||
grep -q '^user2$' registered.log
|
|
||||||
grep -q '^user3$' registered.log
|
|
||||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/prod/ -empty -name error.log)
|
|
||||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/dev/ -empty -name error.log)
|
|
||||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
|
||||||
|
|
||||||
- name: View logs failures
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/prod/rel/ejabberd/logs/error.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/error.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
|
||||||
|
|
||||||
mix:
|
|
||||||
name: Mix
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
otp: ['23.0', '25', '26', '27']
|
|
||||||
elixir: ['1.13', '1.15', '1.16', '1.17']
|
|
||||||
exclude:
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.15'
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.16'
|
|
||||||
- otp: '23.0'
|
|
||||||
elixir: '1.17'
|
|
||||||
- otp: '26'
|
|
||||||
elixir: '1.13'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.13'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.15'
|
|
||||||
- otp: '27'
|
|
||||||
elixir: '1.16'
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get specific Erlang/OTP
|
|
||||||
uses: erlef/setup-beam@v1
|
|
||||||
with:
|
|
||||||
otp-version: ${{matrix.otp}}
|
|
||||||
elixir-version: ${{matrix.elixir}}
|
|
||||||
|
|
||||||
- name: Prepare libraries
|
|
||||||
run: |
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get -y purge libgd3 nginx
|
|
||||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
|
||||||
|
|
||||||
- name: Remove Elixir Matchers
|
|
||||||
run: |
|
|
||||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
|
||||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
|
||||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
|
||||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
|
||||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
|
||||||
|
|
||||||
- name: Enable ModPresenceDemo and an Elixir dependency
|
|
||||||
run: |
|
|
||||||
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
|
|
||||||
cat ejabberd.yml.example
|
|
||||||
sed -i 's|^{deps, \(.*\)|{deps, \1\n {decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}}, |g' rebar.config
|
|
||||||
cat rebar.config
|
|
||||||
|
|
||||||
- name: Unlock Jose dependency on older Erlang
|
|
||||||
if: matrix.otp < 24
|
|
||||||
run: |
|
|
||||||
mix deps.unlock jose
|
|
||||||
|
|
||||||
- name: Cache Hex.pm
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.hex/
|
|
||||||
key: ${{matrix.otp}}-${{hashFiles('mix.exs')}}
|
|
||||||
|
|
||||||
- name: Compile
|
|
||||||
run: |
|
|
||||||
./autogen.sh
|
|
||||||
./configure --with-rebar=mix \
|
|
||||||
--prefix=/tmp/ejabberd \
|
|
||||||
--enable-all
|
|
||||||
make
|
|
||||||
|
|
||||||
- run: make xref
|
|
||||||
|
|
||||||
- run: make dialyzer
|
|
||||||
|
|
||||||
- run: make edoc
|
|
||||||
|
|
||||||
- name: Run rel
|
|
||||||
run: |
|
|
||||||
make rel
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run dev
|
|
||||||
run: |
|
|
||||||
make dev
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: Run install
|
|
||||||
run: |
|
|
||||||
make install
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
|
||||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
|
||||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
|
||||||
|
|
||||||
- name: View logs
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
echo "===> Registered:"
|
|
||||||
cat registered.log
|
|
||||||
echo "===> Prod:"
|
|
||||||
cat _build/prod/rel/ejabberd/logs/*
|
|
||||||
echo "===> Dev:"
|
|
||||||
cat _build/dev/rel/ejabberd/logs/*
|
|
||||||
echo "===> Install:"
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
|
||||||
|
|
||||||
- name: Check logs
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
grep -q '^user1$' registered.log
|
|
||||||
grep -q '^user2$' registered.log
|
|
||||||
grep -q '^user3$' registered.log
|
|
||||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/prod/ -empty -name error.log)
|
|
||||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
test $(find _build/dev/ -empty -name error.log)
|
|
||||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
|
||||||
|
|
||||||
- name: View logs failures
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/prod/rel/ejabberd/logs/error.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
|
||||||
cat _build/dev/rel/ejabberd/logs/error.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
|
||||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
|
38
.gitignore
vendored
38
.gitignore
vendored
@ -5,45 +5,45 @@
|
|||||||
\#*#
|
\#*#
|
||||||
.#*
|
.#*
|
||||||
.edts
|
.edts
|
||||||
.tool-versions
|
|
||||||
*.dump
|
*.dump
|
||||||
/Makefile
|
/Makefile
|
||||||
/doc
|
|
||||||
/config.log
|
/config.log
|
||||||
/config.status
|
/config.status
|
||||||
/config/releases.exs
|
|
||||||
/configure
|
/configure
|
||||||
/aclocal.m4
|
/aclocal.m4
|
||||||
|
/contrib/extract_translations/extract_translations.beam
|
||||||
/*.cache
|
/*.cache
|
||||||
/deps/
|
/deps/
|
||||||
/.deps-update/
|
/doc/*.aux
|
||||||
/.ejabberd-modules/
|
/doc/*.haux
|
||||||
|
/doc/*.html
|
||||||
|
/doc/*.htoc
|
||||||
|
/doc/*.idx
|
||||||
|
/doc/*.ilg
|
||||||
|
/doc/*.ind
|
||||||
|
/doc/*.log
|
||||||
|
/doc/*.out
|
||||||
|
/doc/*.pdf
|
||||||
|
/doc/*.toc
|
||||||
|
/doc/contributed_modules.tex
|
||||||
|
/doc/version.tex
|
||||||
/ebin/
|
/ebin/
|
||||||
/ejabberd.init
|
/ejabberd.init
|
||||||
/ejabberd.service
|
/ejabberd.service
|
||||||
/ejabberdctl
|
|
||||||
/ejabberdctl.example
|
/ejabberdctl.example
|
||||||
|
XmppAddr.hrl
|
||||||
/rel/ejabberd/
|
/rel/ejabberd/
|
||||||
/rel/overlays/
|
/src/XmppAddr.asn1db
|
||||||
|
/src/XmppAddr.erl
|
||||||
|
/src/ejabberd.app.src
|
||||||
/src/eldap_filter_yecc.erl
|
/src/eldap_filter_yecc.erl
|
||||||
/vars.config
|
/vars.config
|
||||||
/dialyzer/
|
/dialyzer/
|
||||||
/test/*.beam
|
/test/*.beam
|
||||||
/test/*.ctc
|
/test/*.ctc
|
||||||
/logs/
|
/logs/
|
||||||
/priv/bin/captcha*sh
|
|
||||||
/priv/sql
|
/priv/sql
|
||||||
/rel/ejabberd
|
/rel/ejabberd
|
||||||
/recompile.log
|
|
||||||
/_build
|
/_build
|
||||||
/database/
|
/mnesiadb
|
||||||
/.rebar
|
/.rebar
|
||||||
/log/
|
|
||||||
Mnesia.nonode@nohost/
|
|
||||||
/TAGS
|
|
||||||
/tags
|
|
||||||
# Binaries created with tools/make-{binaries,installers,packages}:
|
|
||||||
/ejabberd_*.deb
|
|
||||||
/ejabberd-*.rpm
|
|
||||||
/ejabberd-*.run
|
|
||||||
/ejabberd-*.tar.gz
|
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
disable=SC2016,SC2086,SC2089,SC2090
|
|
||||||
external-sources=true
|
|
||||||
source=ejabberdctl.cfg.example
|
|
||||||
shell=sh
|
|
77
.travis.yml
Normal file
77
.travis.yml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
language: erlang
|
||||||
|
|
||||||
|
otp_release:
|
||||||
|
- 19.3
|
||||||
|
- 22.3
|
||||||
|
- 23.0
|
||||||
|
|
||||||
|
os: linux
|
||||||
|
|
||||||
|
dist: xenial
|
||||||
|
|
||||||
|
services:
|
||||||
|
- redis
|
||||||
|
- postgresql
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
#
|
||||||
|
# We need MySQL 5.6 or newer in order to get support for FULLTEXT indexes
|
||||||
|
# with InnoDB. As soon as Travis ships that version, the following lines
|
||||||
|
# (except for the "apt-get update" call) can go away.
|
||||||
|
#
|
||||||
|
# See: https://github.com/travis-ci/travis-ci/issues/1986
|
||||||
|
#
|
||||||
|
- sudo sed -i -e s/table_cache/table_open_cache/ -e /log_slow_queries/d /etc/mysql/my.cnf
|
||||||
|
- sudo apt-key adv --import .travis/mysql_repo_key.asc
|
||||||
|
- sudo add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.6'
|
||||||
|
- sudo apt-get -qq update
|
||||||
|
- sudo apt-get -qq -o Dpkg::Options::=--force-confold install mysql-server
|
||||||
|
- sudo service mysql start
|
||||||
|
- sudo mysql_upgrade
|
||||||
|
# /END MYSQL 5.6
|
||||||
|
- pip install --user coveralls-merge
|
||||||
|
|
||||||
|
install:
|
||||||
|
- sudo apt-get -qq install libexpat1-dev libyaml-dev libpam0g-dev libsqlite3-dev libgd-dev libwebp-dev
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
# Ulimit: See Travis-CI issue report: https://github.com/travis-ci/travis-ci/issues/3328
|
||||||
|
- mysql -u root -e "CREATE USER 'ejabberd_test'@'localhost' IDENTIFIED BY 'ejabberd_test';"
|
||||||
|
- mysql -u root -e "CREATE DATABASE ejabberd_test;"
|
||||||
|
- mysql -u root -e "GRANT ALL ON ejabberd_test.* TO 'ejabberd_test'@'localhost';"
|
||||||
|
- mysql -u root ejabberd_test < sql/mysql.sql
|
||||||
|
- psql -U postgres -c "CREATE USER ejabberd_test WITH PASSWORD 'ejabberd_test';"
|
||||||
|
- psql -U postgres -c "CREATE DATABASE ejabberd_test;"
|
||||||
|
- psql -U postgres ejabberd_test -f sql/pg.sql
|
||||||
|
- psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||||
|
- psql -U postgres ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ejabberd_test;"
|
||||||
|
- psql -U postgres ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ejabberd_test;"
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./autogen.sh
|
||||||
|
- ./configure --prefix=/tmp/ejabberd --enable-all --disable-odbc --disable-elixir
|
||||||
|
- make
|
||||||
|
- make install -s
|
||||||
|
- make xref
|
||||||
|
- ./tools/hook_deps.sh ebin
|
||||||
|
- sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
||||||
|
- ln -sf ../sql priv/
|
||||||
|
- echo "" >> rebar.config
|
||||||
|
- echo '{ct_extra_params, "-verbosity 20"}.' >> rebar.config
|
||||||
|
- escript ./rebar skip_deps=true ct -v
|
||||||
|
- grep -q 'TEST COMPLETE,.* 0 failed' logs/raw.log
|
||||||
|
- test $(find logs -empty -name error.log)
|
||||||
|
|
||||||
|
after_script:
|
||||||
|
- find logs -name suite.log -exec cat '{}' ';'
|
||||||
|
|
||||||
|
after_failure:
|
||||||
|
- find logs -name exunit.log -exec cat '{}' ';'
|
||||||
|
- find logs -name ejabberd.log -exec cat '{}' ';'
|
||||||
|
- find logs -name suite.log -exec cat '{}' ';' | awk 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- coveralls-merge erlang.json
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email: false
|
432
.travis/mysql_repo_key.asc
Normal file
432
.travis/mysql_repo_key.asc
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1
|
||||||
|
|
||||||
|
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
|
||||||
|
roUTAKClYAhZuX2nUNwH4vlEJQHDqYa5yQ==
|
||||||
|
=ghXk
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
5
.vscode/extensions.json
vendored
5
.vscode/extensions.json
vendored
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"erlang-ls.erlang-ls"
|
|
||||||
]
|
|
||||||
}
|
|
66
.vscode/launch.json
vendored
66
.vscode/launch.json
vendored
@ -1,66 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "Relive (Vim)",
|
|
||||||
"type": "erlang",
|
|
||||||
"request": "launch",
|
|
||||||
"runinterminal": [
|
|
||||||
"./rebar3", "shell",
|
|
||||||
"--apps", "ejabberd",
|
|
||||||
"--config", "rel/relive.config",
|
|
||||||
"--script", "rel/relive.escript",
|
|
||||||
"--name", "ejabberd@localhost",
|
|
||||||
"--setcookie", "COOKIE"
|
|
||||||
],
|
|
||||||
"projectnode": "ejabberd@localhost",
|
|
||||||
"cookie": "COOKIE",
|
|
||||||
"timeout": 900,
|
|
||||||
"cwd": "."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Relive",
|
|
||||||
"type": "erlang",
|
|
||||||
"request": "launch",
|
|
||||||
"runinterminal": [
|
|
||||||
".vscode/relive.sh"
|
|
||||||
],
|
|
||||||
"projectnode": "ejabberd@localhost",
|
|
||||||
"cookie": "COOKIE",
|
|
||||||
"timeout": 300,
|
|
||||||
"cwd": "${workspaceRoot}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Relive (alternate)",
|
|
||||||
"type": "erlang",
|
|
||||||
"request": "launch",
|
|
||||||
"runinterminal": [
|
|
||||||
"./rebar3", "shell",
|
|
||||||
"--apps", "ejabberd",
|
|
||||||
"--config", "rel/relive.config",
|
|
||||||
"--script", "rel/relive.escript",
|
|
||||||
"--name", "ejabberd@localhost",
|
|
||||||
"--setcookie", "COOKIE"
|
|
||||||
],
|
|
||||||
"projectnode": "ejabberd@localhost",
|
|
||||||
"cookie": "COOKIE",
|
|
||||||
"timeout": 300,
|
|
||||||
"cwd": "${workspaceRoot}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Attach",
|
|
||||||
"type": "erlang",
|
|
||||||
"request": "attach",
|
|
||||||
"runinterminal": [
|
|
||||||
"./rebar3", "shell",
|
|
||||||
"--sname", "clean@localhost",
|
|
||||||
"--setcookie", "COOKIE",
|
|
||||||
"--start-clean"
|
|
||||||
],
|
|
||||||
"projectnode": "ejabberd@localhost",
|
|
||||||
"cookie": "COOKIE",
|
|
||||||
"timeout": 300,
|
|
||||||
"cwd": "${workspaceRoot}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
6
.vscode/relive.sh
vendored
6
.vscode/relive.sh
vendored
@ -1,6 +0,0 @@
|
|||||||
[ ! -f Makefile ] \
|
|
||||||
&& ./autogen.sh \
|
|
||||||
&& ./configure --with-rebar=rebar3 \
|
|
||||||
&& make deps
|
|
||||||
|
|
||||||
make relive
|
|
13
.vscode/settings.json
vendored
13
.vscode/settings.json
vendored
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"editor.tabSize": 8,
|
|
||||||
"remote.portsAttributes": {
|
|
||||||
"1883": {"label": "MQTT", "onAutoForward": "silent"},
|
|
||||||
"4369": {"label": "EPMD", "onAutoForward": "silent"},
|
|
||||||
"5222": {"label": "XMPP C2S", "onAutoForward": "silent"},
|
|
||||||
"5223": {"label": "XMPP C2S (legacy)", "onAutoForward": "silent"},
|
|
||||||
"5269": {"label": "XMPP S2S", "onAutoForward": "silent"},
|
|
||||||
"5280": {"label": "HTTP", "onAutoForward": "silent"},
|
|
||||||
"5443": {"label": "HTTPS", "onAutoForward": "silent"},
|
|
||||||
"7777": {"label": "XMPP SOCKS5 (proxy65)", "onAutoForward": "silent"}
|
|
||||||
}
|
|
||||||
}
|
|
1135
CHANGELOG.md
1135
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@ -22,21 +22,6 @@ Examples of unacceptable behavior by participants include:
|
|||||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
|
|
||||||
## Guidelines for Respectful and Efficient Communication on Issues, Discussions, and PRs
|
|
||||||
|
|
||||||
To ensure that our maintainers can efficiently manage issues and provide timely updates, we kindly ask that all comments on GitHub tickets remain relevant to the topic of the issue. Please avoid posting comments solely to ping maintainers or ask for updates. If you need information on the status of an issue, consider the following:
|
|
||||||
|
|
||||||
- **Check the Issue Timeline:** Review the existing comments and updates on the issue before posting.
|
|
||||||
- **Use Reactions:** If you want to show that you are interested in an issue, use GitHub's reaction feature (e.g., thumbs up) instead of commenting.
|
|
||||||
- **Be Patient:** Understand that maintainers may be working on multiple tasks and will provide updates as soon as possible.
|
|
||||||
|
|
||||||
Additionally, please be aware that:
|
|
||||||
|
|
||||||
- **User Responses:** Users who report issues may no longer be using the software, may have switched to other projects, or may simply be busy. It is their right not to respond to follow-up questions or comments.
|
|
||||||
- **Maintainer Priorities:** Maintainers have the right to define their own priorities and schedule. They will address issues based on their availability and the project's needs.
|
|
||||||
|
|
||||||
By following these guidelines, you help us maintain a productive and respectful environment for everyone involved.
|
|
||||||
|
|
||||||
## Our Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||||
@ -49,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe
|
|||||||
|
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at the email address: conduct AT process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||||
|
|
||||||
|
122
COMPILE.md
122
COMPILE.md
@ -1,122 +0,0 @@
|
|||||||
Compile and Install ejabberd
|
|
||||||
============================
|
|
||||||
|
|
||||||
This document explains how to compile and install ejabberd
|
|
||||||
from source code.
|
|
||||||
|
|
||||||
For a more detailed explanation, please check the
|
|
||||||
ejabberd Docs: [Source Code Installation][docs-source].
|
|
||||||
|
|
||||||
[docs-source]: https://docs.ejabberd.im/admin/install/source/
|
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
------------
|
|
||||||
|
|
||||||
To compile ejabberd you need:
|
|
||||||
|
|
||||||
- GNU Make
|
|
||||||
- GCC
|
|
||||||
- Libexpat ≥ 1.95
|
|
||||||
- Libyaml ≥ 0.1.4
|
|
||||||
- Erlang/OTP ≥ 20.0
|
|
||||||
- OpenSSL ≥ 1.0.0
|
|
||||||
|
|
||||||
Other optional libraries are:
|
|
||||||
|
|
||||||
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
|
|
||||||
- PAM library, for Pluggable Authentication Modules (PAM)
|
|
||||||
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
|
||||||
challenges
|
|
||||||
- Elixir ≥ 1.10.3, for Elixir support. It is recommended Elixir 1.13.4 or higher
|
|
||||||
and Erlang/OTP 23.0 or higher.
|
|
||||||
|
|
||||||
If your system splits packages in libraries and development headers,
|
|
||||||
install the development packages too.
|
|
||||||
|
|
||||||
|
|
||||||
Download Source Code
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
There are several ways to obtain the ejabberd source code:
|
|
||||||
|
|
||||||
- Source code archive from [ProcessOne Downloads][p1dl]
|
|
||||||
- Source code package from [ejabberd GitHub Releases][ghr]
|
|
||||||
- Latest development code from [ejabberd Git repository][gitrepo]
|
|
||||||
|
|
||||||
[p1dl]: https://www.process-one.net/en/ejabberd/downloads/
|
|
||||||
[ghr]: https://github.com/processone/ejabberd/releases
|
|
||||||
[gitrepo]: https://github.com/processone/ejabberd
|
|
||||||
|
|
||||||
|
|
||||||
Compile
|
|
||||||
-------
|
|
||||||
|
|
||||||
The general instructions to compile ejabberd are:
|
|
||||||
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
|
|
||||||
If the source code doesn't contain a `configure` script,
|
|
||||||
first of all install `autoconf` and run this to generate it:
|
|
||||||
|
|
||||||
./autogen.sh
|
|
||||||
|
|
||||||
To configure the compilation, features, install paths...
|
|
||||||
|
|
||||||
./configure --help
|
|
||||||
|
|
||||||
|
|
||||||
Install in the System
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
To install ejabberd in the system, run this with system administrator rights (root user):
|
|
||||||
|
|
||||||
sudo make install
|
|
||||||
|
|
||||||
This will:
|
|
||||||
|
|
||||||
- Install the configuration files in `/etc/ejabberd/`
|
|
||||||
- Install ejabberd binary, header and runtime files in `/lib/ejabberd/`
|
|
||||||
- Install the administration script: `/sbin/ejabberdctl`
|
|
||||||
- Install ejabberd documentation in `/share/doc/ejabberd/`
|
|
||||||
- Create a spool directory: `/var/lib/ejabberd/`
|
|
||||||
- Create a directory for log files: `/var/log/ejabberd/`
|
|
||||||
|
|
||||||
|
|
||||||
Build an OTP Release
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Instead of installing ejabberd in the system, you can build an OTP release
|
|
||||||
that includes all necessary to run ejabberd in a subdirectory:
|
|
||||||
|
|
||||||
./configure
|
|
||||||
make prod
|
|
||||||
|
|
||||||
Check the full list of targets:
|
|
||||||
|
|
||||||
make help
|
|
||||||
|
|
||||||
|
|
||||||
Start ejabberd
|
|
||||||
--------------
|
|
||||||
|
|
||||||
You can use the `ejabberdctl` command line administration script to
|
|
||||||
start and stop ejabberd. Some examples, depending on your installation method:
|
|
||||||
|
|
||||||
- When installed in the system:
|
|
||||||
```
|
|
||||||
ejabberdctl start
|
|
||||||
/sbin/ejabberdctl start
|
|
||||||
```
|
|
||||||
|
|
||||||
- When built an OTP production release:
|
|
||||||
```
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl start
|
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl live
|
|
||||||
```
|
|
||||||
|
|
||||||
- Start interactively without installing or building OTP release:
|
|
||||||
```
|
|
||||||
make relive
|
|
||||||
```
|
|
457
CONTAINER.md
457
CONTAINER.md
@ -1,457 +0,0 @@
|
|||||||
|
|
||||||
[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=49c0c4)](https://github.com/processone/ejabberd/tags)
|
|
||||||
[![ejabberd Container on GitHub](https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
|
||||||
[![ecs Container on Docker](https://img.shields.io/docker/v/ejabberd/ecs?label=ecs&sort=semver&logo=docker)](https://hub.docker.com/r/ejabberd/ecs/)
|
|
||||||
|
|
||||||
`ejabberd` Container Image
|
|
||||||
==========================
|
|
||||||
|
|
||||||
[ejabberd][home] is an open-source,
|
|
||||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
|
||||||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
|
||||||
|
|
||||||
[home]: https://ejabberd.im/
|
|
||||||
[erlang]: https://www.erlang.org/
|
|
||||||
[xmpp]: https://xmpp.org/
|
|
||||||
[mqtt]: https://mqtt.org/
|
|
||||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
|
||||||
|
|
||||||
This document explains how to use the `ejabberd` container image available in
|
|
||||||
[ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd),
|
|
||||||
built using the files in `.github/container/`.
|
|
||||||
This image is based in Alpine 3.19, includes Erlang/OTP 26.2 and Elixir 1.16.1.
|
|
||||||
|
|
||||||
Alternatively, there is also the `ecs` container image available in
|
|
||||||
[docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/),
|
|
||||||
built using the
|
|
||||||
[docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs)
|
|
||||||
repository.
|
|
||||||
Check the [differences between `ejabberd` and `ecs` images](https://github.com/processone/docker-ejabberd/blob/master/ecs/HUB-README.md#alternative-image-in-github).
|
|
||||||
|
|
||||||
If you are using a Windows operating system, check the tutorials mentioned in
|
|
||||||
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/install/container/#ejabberd-container-image).
|
|
||||||
|
|
||||||
|
|
||||||
Start ejabberd
|
|
||||||
--------------
|
|
||||||
|
|
||||||
### With default configuration
|
|
||||||
|
|
||||||
Start ejabberd in a new container:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --name ejabberd -d -p 5222:5222 ghcr.io/processone/ejabberd
|
|
||||||
```
|
|
||||||
|
|
||||||
That runs the container as a daemon,
|
|
||||||
using ejabberd default configuration file and XMPP domain "localhost".
|
|
||||||
|
|
||||||
Stop the running container:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker stop ejabberd
|
|
||||||
```
|
|
||||||
|
|
||||||
Restart the stopped ejabberd container:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker restart ejabberd
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Start with Erlang console attached
|
|
||||||
|
|
||||||
Start ejabberd with an Erlang console attached using the `live` command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --name ejabberd -it -p 5222:5222 ghcr.io/processone/ejabberd live
|
|
||||||
```
|
|
||||||
|
|
||||||
That uses the default configuration file and XMPP domain "localhost".
|
|
||||||
|
|
||||||
|
|
||||||
### Start with your configuration and database
|
|
||||||
|
|
||||||
Pass a configuration file as a volume
|
|
||||||
and share the local directory to store database:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdir database
|
|
||||||
chown ejabberd database
|
|
||||||
|
|
||||||
cp ejabberd.yml.example ejabberd.yml
|
|
||||||
|
|
||||||
docker run --name ejabberd -it \
|
|
||||||
-v $(pwd)/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml \
|
|
||||||
-v $(pwd)/database:/opt/ejabberd/database \
|
|
||||||
-p 5222:5222 ghcr.io/processone/ejabberd live
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice that ejabberd runs in the container with an account named `ejabberd`,
|
|
||||||
and the volumes you mount must grant proper rights to that account.
|
|
||||||
|
|
||||||
|
|
||||||
Next steps
|
|
||||||
----------
|
|
||||||
|
|
||||||
### Register the administrator account
|
|
||||||
|
|
||||||
The default ejabberd configuration does not grant admin privileges
|
|
||||||
to any account,
|
|
||||||
you may want to register a new account in ejabberd
|
|
||||||
and grant it admin rights.
|
|
||||||
|
|
||||||
Register an account using the `ejabberdctl` script:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec -it ejabberd ejabberdctl register admin localhost passw0rd
|
|
||||||
```
|
|
||||||
|
|
||||||
Then edit conf/ejabberd.yml and add the ACL as explained in
|
|
||||||
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/install/next-steps/#administration-account)
|
|
||||||
|
|
||||||
|
|
||||||
### Check ejabberd log files
|
|
||||||
|
|
||||||
Check the content of the log files inside the container,
|
|
||||||
even if you do not put it on a shared persistent drive:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec -it ejabberd tail -f logs/ejabberd.log
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Inspect the container files
|
|
||||||
|
|
||||||
The container uses Alpine Linux. Start a shell inside the container:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec -it ejabberd sh
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Open ejabberd debug console
|
|
||||||
|
|
||||||
Open an interactive debug Erlang console attached to a running ejabberd in a running container:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec -it ejabberd ejabberdctl debug
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### CAPTCHA
|
|
||||||
|
|
||||||
ejabberd includes two example CAPTCHA scripts.
|
|
||||||
If you want to use any of them, first install some additional required libraries:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker exec --user root ejabberd apk add imagemagick ghostscript-fonts bash
|
|
||||||
```
|
|
||||||
|
|
||||||
Now update your ejabberd configuration file, for example:
|
|
||||||
```bash
|
|
||||||
docker exec -it ejabberd vi conf/ejabberd.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
and add this option:
|
|
||||||
```yaml
|
|
||||||
captcha_cmd: /opt/ejabberd-22.04/lib/captcha.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, reload the configuration file or restart the container:
|
|
||||||
```bash
|
|
||||||
docker exec ejabberd ejabberdctl reload_config
|
|
||||||
```
|
|
||||||
|
|
||||||
If the CAPTCHA image is not visible, there may be a problem generating it
|
|
||||||
(the ejabberd log file may show some error message);
|
|
||||||
or the image URL may not be correctly detected by ejabberd,
|
|
||||||
in that case you can set the correct URL manually, for example:
|
|
||||||
```yaml
|
|
||||||
captcha_url: https://localhost:5443/captcha
|
|
||||||
```
|
|
||||||
|
|
||||||
For more details about CAPTCHA options, please check the
|
|
||||||
[CAPTCHA](https://docs.ejabberd.im/admin/configuration/basic/#captcha)
|
|
||||||
documentation section.
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Container Configuration
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
### Ports
|
|
||||||
|
|
||||||
This container image exposes the ports:
|
|
||||||
|
|
||||||
- `5222`: The default port for XMPP clients.
|
|
||||||
- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers.
|
|
||||||
- `5280`: For admin interface.
|
|
||||||
- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH.
|
|
||||||
- `1883`: Used for MQTT
|
|
||||||
- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering
|
|
||||||
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD
|
|
||||||
|
|
||||||
|
|
||||||
### Volumes
|
|
||||||
|
|
||||||
ejabberd produces two types of data: log files and database spool files (Mnesia).
|
|
||||||
This is the kind of data you probably want to store on a persistent or local drive (at least the database).
|
|
||||||
|
|
||||||
The volumes you may want to map:
|
|
||||||
|
|
||||||
- `/opt/ejabberd/conf/`: Directory containing configuration and certificates
|
|
||||||
- `/opt/ejabberd/database/`: Directory containing Mnesia database.
|
|
||||||
You should back up or export the content of the directory to persistent storage
|
|
||||||
(host storage, local storage, any storage plugin)
|
|
||||||
- `/opt/ejabberd/logs/`: Directory containing log files
|
|
||||||
- `/opt/ejabberd/upload/`: Directory containing uploaded files. This should also be backed up.
|
|
||||||
|
|
||||||
All these files are owned by `ejabberd` user inside the container.
|
|
||||||
|
|
||||||
It's possible to install additional ejabberd modules using volumes,
|
|
||||||
[this comment](https://github.com/processone/docker-ejabberd/issues/81#issuecomment-1036115146)
|
|
||||||
explains how to install an additional module using docker-compose.
|
|
||||||
|
|
||||||
|
|
||||||
### Commands on start
|
|
||||||
|
|
||||||
The ejabberdctl script reads the `CTL_ON_CREATE` environment variable
|
|
||||||
the first time the container is started,
|
|
||||||
and reads `CTL_ON_START` every time the container is started.
|
|
||||||
Those variables can contain one ejabberdctl command,
|
|
||||||
or several commands separated with the blankspace and `;` characters.
|
|
||||||
|
|
||||||
By default failure of any of commands executed that way would
|
|
||||||
abort start, this can be disabled by prefixing commands with `!`
|
|
||||||
|
|
||||||
Example usage (or check the [full example](#customized-example)):
|
|
||||||
```yaml
|
|
||||||
environment:
|
|
||||||
- CTL_ON_CREATE=! register admin localhost asd
|
|
||||||
- CTL_ON_START=stats registeredusers ;
|
|
||||||
check_password admin localhost asd ;
|
|
||||||
status
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Clustering
|
|
||||||
|
|
||||||
When setting several containers to form a
|
|
||||||
[cluster of ejabberd nodes](https://docs.ejabberd.im/admin/guide/clustering/),
|
|
||||||
each one must have a different
|
|
||||||
[Erlang Node Name](https://docs.ejabberd.im/admin/guide/security/#erlang-node-name)
|
|
||||||
and the same
|
|
||||||
[Erlang Cookie](https://docs.ejabberd.im/admin/guide/security/#erlang-cookie).
|
|
||||||
|
|
||||||
For this you can either:
|
|
||||||
- edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE`
|
|
||||||
- set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE`
|
|
||||||
|
|
||||||
Example to connect a local `ejabberdctl` to a containerized ejabberd:
|
|
||||||
1. When creating the container, export port 5210, and set `ERLANG_COOKIE`:
|
|
||||||
```sh
|
|
||||||
docker run --name ejabberd -it \
|
|
||||||
-e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \
|
|
||||||
-p 5210:5210 -p 5222:5222 \
|
|
||||||
ghcr.io/processone/ejabberd
|
|
||||||
```
|
|
||||||
2. Set `ERL_DIST_PORT=5210` in ejabberdctl.cfg of container and local ejabberd
|
|
||||||
3. Restart the container
|
|
||||||
4. Now use `ejabberdctl` in your local ejabberd deployment
|
|
||||||
|
|
||||||
To connect using a local `ejabberd` script:
|
|
||||||
```sh
|
|
||||||
ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping
|
|
||||||
```
|
|
||||||
|
|
||||||
Example using environment variables (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)):
|
|
||||||
```yaml
|
|
||||||
environment:
|
|
||||||
- ERLANG_NODE_ARG=ejabberd@node7
|
|
||||||
- ERLANG_COOKIE=dummycookie123
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Build a Container Image
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
This container image includes ejabberd as a standalone OTP release built using Elixir.
|
|
||||||
That OTP release is configured with:
|
|
||||||
|
|
||||||
- `mix.exs`: Customize ejabberd release
|
|
||||||
- `vars.config`: ejabberd compilation configuration options
|
|
||||||
- `config/runtime.exs`: Customize ejabberd paths
|
|
||||||
- `ejabberd.yml.template`: ejabberd default config file
|
|
||||||
|
|
||||||
### Direct build
|
|
||||||
|
|
||||||
Build ejabberd Community Server container image from ejabberd master git repository:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker buildx build \
|
|
||||||
-t personal/ejabberd \
|
|
||||||
-f .github/container/Dockerfile \
|
|
||||||
.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Podman build
|
|
||||||
|
|
||||||
It's also possible to use podman instead of docker, just notice:
|
|
||||||
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
|
|
||||||
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
|
|
||||||
- to start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
|
||||||
```bash
|
|
||||||
podman build \
|
|
||||||
-t ejabberd \
|
|
||||||
-f .github/container/Dockerfile \
|
|
||||||
.
|
|
||||||
|
|
||||||
podman run --name eja1 -d -p 5222:5222 localhost/ejabberd
|
|
||||||
|
|
||||||
podman exec eja1 ejabberdctl status
|
|
||||||
|
|
||||||
podman exec -it eja1 sh
|
|
||||||
|
|
||||||
podman stop eja1
|
|
||||||
|
|
||||||
podman run --name eja1 -it -e EJABBERD_BYPASS_WARNINGS=true -p 5222:5222 localhost/ejabberd live
|
|
||||||
```
|
|
||||||
|
|
||||||
### Package build for `arm64`
|
|
||||||
|
|
||||||
By default, `.github/container/Dockerfile` builds this container by directly compiling ejabberd,
|
|
||||||
it is a fast and direct method.
|
|
||||||
However, a problem with QEMU prevents building the container in QEMU using Erlang/OTP 25
|
|
||||||
for the `arm64` architecture.
|
|
||||||
|
|
||||||
Providing `--build-arg METHOD=package` is an alternate method to build the container
|
|
||||||
used by the Github Actions workflow that provides `amd64` and `arm64` container images.
|
|
||||||
It first builds an ejabberd binary package, and later installs it in the image.
|
|
||||||
That method avoids using QEMU, so it can build `arm64` container images, but is extremely
|
|
||||||
slow the first time it's used, and consequently not recommended for general use.
|
|
||||||
|
|
||||||
In this case, to build the ejabberd container image for arm64 architecture:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker buildx build \
|
|
||||||
--build-arg METHOD=package \
|
|
||||||
--platform linux/arm64 \
|
|
||||||
-t personal/ejabberd:$VERSION \
|
|
||||||
-f .github/container/Dockerfile \
|
|
||||||
.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Composer Examples
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
### Minimal Example
|
|
||||||
|
|
||||||
This is the barely minimal file to get a usable ejabberd.
|
|
||||||
Store it as `docker-compose.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
main:
|
|
||||||
image: ghcr.io/processone/ejabberd
|
|
||||||
container_name: ejabberd
|
|
||||||
ports:
|
|
||||||
- "5222:5222"
|
|
||||||
- "5269:5269"
|
|
||||||
- "5280:5280"
|
|
||||||
- "5443:5443"
|
|
||||||
```
|
|
||||||
|
|
||||||
Create and start the container with the command:
|
|
||||||
```bash
|
|
||||||
docker-compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
### Customized Example
|
|
||||||
|
|
||||||
This example shows the usage of several customizations:
|
|
||||||
it uses a local configuration file,
|
|
||||||
stores the mnesia database in a local path,
|
|
||||||
registers an account when it's created,
|
|
||||||
and checks the number of registered accounts every time it's started.
|
|
||||||
|
|
||||||
Download or copy the ejabberd configuration file:
|
|
||||||
```bash
|
|
||||||
wget https://raw.githubusercontent.com/processone/ejabberd/master/ejabberd.yml.example
|
|
||||||
mv ejabberd.yml.example ejabberd.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
Create the database directory and allow the container access to it:
|
|
||||||
```bash
|
|
||||||
mkdir database
|
|
||||||
sudo chown 9000:9000 database
|
|
||||||
```
|
|
||||||
|
|
||||||
Now write this `docker-compose.yml` file:
|
|
||||||
```yaml
|
|
||||||
version: '3.7'
|
|
||||||
|
|
||||||
services:
|
|
||||||
|
|
||||||
main:
|
|
||||||
image: ghcr.io/processone/ejabberd
|
|
||||||
container_name: ejabberd
|
|
||||||
environment:
|
|
||||||
- CTL_ON_CREATE=register admin localhost asd
|
|
||||||
- CTL_ON_START=registered_users localhost ;
|
|
||||||
status
|
|
||||||
ports:
|
|
||||||
- "5222:5222"
|
|
||||||
- "5269:5269"
|
|
||||||
- "5280:5280"
|
|
||||||
- "5443:5443"
|
|
||||||
volumes:
|
|
||||||
- ./ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml:ro
|
|
||||||
- ./database:/opt/ejabberd/database
|
|
||||||
```
|
|
||||||
|
|
||||||
### Clustering Example
|
|
||||||
|
|
||||||
In this example, the main container is created first.
|
|
||||||
Once it is fully started and healthy, a second container is created,
|
|
||||||
and once ejabberd is started in it, it joins the first one.
|
|
||||||
|
|
||||||
An account is registered in the first node when created (and
|
|
||||||
we ignore errors that can happen when doing that - for example
|
|
||||||
whenn account already exists),
|
|
||||||
and it should exist in the second node after join.
|
|
||||||
|
|
||||||
Notice that in this example the main container does not have access
|
|
||||||
to the exterior; the replica exports the ports and can be accessed.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: '3.7'
|
|
||||||
|
|
||||||
services:
|
|
||||||
|
|
||||||
main:
|
|
||||||
image: ghcr.io/processone/ejabberd
|
|
||||||
container_name: ejabberd
|
|
||||||
environment:
|
|
||||||
- ERLANG_NODE_ARG=ejabberd@main
|
|
||||||
- ERLANG_COOKIE=dummycookie123
|
|
||||||
- CTL_ON_CREATE=! register admin localhost asd
|
|
||||||
|
|
||||||
replica:
|
|
||||||
image: ghcr.io/processone/ejabberd
|
|
||||||
container_name: replica
|
|
||||||
depends_on:
|
|
||||||
main:
|
|
||||||
condition: service_healthy
|
|
||||||
ports:
|
|
||||||
- "5222:5222"
|
|
||||||
- "5269:5269"
|
|
||||||
- "5280:5280"
|
|
||||||
- "5443:5443"
|
|
||||||
environment:
|
|
||||||
- ERLANG_NODE_ARG=ejabberd@replica
|
|
||||||
- ERLANG_COOKIE=dummycookie123
|
|
||||||
- CTL_ON_CREATE=join_cluster ejabberd@main
|
|
||||||
- CTL_ON_START=registered_users localhost ;
|
|
||||||
status
|
|
||||||
```
|
|
@ -3,21 +3,21 @@
|
|||||||
We'd love for you to contribute to our source code and to make ejabberd even better than it is
|
We'd love for you to contribute to our source code and to make ejabberd even better than it is
|
||||||
today! Here are the guidelines we'd like you to follow:
|
today! Here are the guidelines we'd like you to follow:
|
||||||
|
|
||||||
* [Code of Conduct](#code-of-conduct)
|
* [Code of Conduct](#coc)
|
||||||
* [Questions and Problems](#questions-bugs-features)
|
* [Questions and Problems](#question)
|
||||||
* [Issues and Bugs](#found-an-issue-or-bug)
|
* [Issues and Bugs](#issue)
|
||||||
* [Feature Requests](#missing-a-feature)
|
* [Feature Requests](#feature)
|
||||||
* [Issue Submission Guidelines](#issue-submission-guidelines)
|
* [Issue Submission Guidelines](#submit)
|
||||||
* [Pull Request Submission Guidelines](#pull-request-submission-guidelines)
|
* [Pull Request Submission Guidelines](#submit-pr)
|
||||||
* [Signing the CLA](#signing-the-contributor-license-agreement-cla)
|
* [Signing the CLA](#cla)
|
||||||
|
|
||||||
## Code of Conduct
|
## <a name="coc"></a> Code of Conduct
|
||||||
|
|
||||||
Help us keep ejabberd community open-minded and inclusive. Please read and follow our [Code of Conduct][coc].
|
Help us keep ejabberd community open-minded and inclusive. Please read and follow our [Code of Conduct][coc].
|
||||||
|
|
||||||
## Questions, Bugs, Features
|
## <a name="requests"></a> Questions, Bugs, Features
|
||||||
|
|
||||||
### Got a Question or Problem?
|
### <a name="question"></a> Got a Question or Problem?
|
||||||
|
|
||||||
Do not open issues for general support questions as we want to keep GitHub issues for bug reports
|
Do not open issues for general support questions as we want to keep GitHub issues for bug reports
|
||||||
and feature requests. You've got much better chances of getting your question answered on dedicated
|
and feature requests. You've got much better chances of getting your question answered on dedicated
|
||||||
@ -34,16 +34,15 @@ To save your and our time, we will systematically close all issues that are requ
|
|||||||
support and redirect people to the section you are reading right now.
|
support and redirect people to the section you are reading right now.
|
||||||
|
|
||||||
Other channels for support are:
|
Other channels for support are:
|
||||||
- ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
|
|
||||||
- [ejabberd XMPP room logs][logs]
|
|
||||||
- [ejabberd Mailing List][list]
|
- [ejabberd Mailing List][list]
|
||||||
|
- [ejabberd XMPP room][muc]: ejabberd@conference.process-one.net
|
||||||
|
|
||||||
### Found an Issue or Bug?
|
### <a name="issue"></a> Found an Issue or Bug?
|
||||||
|
|
||||||
If you find a bug in the source code, you can help us by submitting an issue to our
|
If you find a bug in the source code, you can help us by submitting an issue to our
|
||||||
[GitHub Repository][github]. Even better, you can submit a Pull Request with a fix.
|
[GitHub Repository][github]. Even better, you can submit a Pull Request with a fix.
|
||||||
|
|
||||||
### Missing a Feature?
|
### <a name="feature"></a> Missing a Feature?
|
||||||
|
|
||||||
You can request a new feature by submitting an issue to our [GitHub Repository][github-issues].
|
You can request a new feature by submitting an issue to our [GitHub Repository][github-issues].
|
||||||
|
|
||||||
@ -52,9 +51,9 @@ If you would like to implement a new feature then consider what kind of change i
|
|||||||
* **Major Changes** that you wish to contribute to the project should be discussed first in an
|
* **Major Changes** that you wish to contribute to the project should be discussed first in an
|
||||||
[GitHub issue][github-issues] that clearly outlines the changes and benefits of the feature.
|
[GitHub issue][github-issues] that clearly outlines the changes and benefits of the feature.
|
||||||
* **Small Changes** can directly be crafted and submitted to the [GitHub Repository][github]
|
* **Small Changes** can directly be crafted and submitted to the [GitHub Repository][github]
|
||||||
as a Pull Request. See the section about [Pull Request Submission Guidelines](#pull-request-submission-guidelines).
|
as a Pull Request. See the section about [Pull Request Submission Guidelines](#submit-pr).
|
||||||
|
|
||||||
## Issue Submission Guidelines
|
## <a name="submit"></a> Issue Submission Guidelines
|
||||||
|
|
||||||
Before you submit your issue search the archive, maybe your question was already answered.
|
Before you submit your issue search the archive, maybe your question was already answered.
|
||||||
|
|
||||||
@ -64,7 +63,7 @@ the effort we can spend fixing issues and adding new features, by not reporting
|
|||||||
The "[new issue][github-new-issue]" form contains a number of prompts that you should fill out to
|
The "[new issue][github-new-issue]" form contains a number of prompts that you should fill out to
|
||||||
make it easier to understand and categorize the issue.
|
make it easier to understand and categorize the issue.
|
||||||
|
|
||||||
## Pull Request Submission Guidelines
|
## <a name="submit-pr"></a> Pull Request Submission Guidelines
|
||||||
|
|
||||||
By submitting a pull request for a code or doc contribution, you need to have the right
|
By submitting a pull request for a code or doc contribution, you need to have the right
|
||||||
to grant your contribution's copyright license to ProcessOne. Please check [ProcessOne CLA][cla]
|
to grant your contribution's copyright license to ProcessOne. Please check [ProcessOne CLA][cla]
|
||||||
@ -96,10 +95,10 @@ Before you submit your pull request consider the following guidelines:
|
|||||||
git push origin my-fix-branch
|
git push origin my-fix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
* In GitHub, send a pull request to `ejabberd:master`. This will trigger the automated testing.
|
* In GitHub, send a pull request to `ejabberd:master`. This will trigger the Travis integration and run the test.
|
||||||
We will also notify you if you have not yet signed the [contribution agreement][cla].
|
We will also notify you if you have not yet signed the [contribution agreement][cla].
|
||||||
|
|
||||||
* If you find that the tests have failed, look into the logs to find out
|
* If you find that the Travis integration has failed, look into the logs on Travis to find out
|
||||||
if your changes caused test failures, the commit message was malformed etc. If you find that the
|
if your changes caused test failures, the commit message was malformed etc. If you find that the
|
||||||
tests failed or times out for unrelated reasons, you can ping a team member so that the build can be
|
tests failed or times out for unrelated reasons, you can ping a team member so that the build can be
|
||||||
restarted.
|
restarted.
|
||||||
@ -123,7 +122,7 @@ restarted.
|
|||||||
|
|
||||||
That's it! Thank you for your contribution!
|
That's it! Thank you for your contribution!
|
||||||
|
|
||||||
## Signing the Contributor License Agreement (CLA)
|
## <a name="cla"></a> Signing the Contributor License Agreement (CLA)
|
||||||
|
|
||||||
Upon submitting a Pull Request, we will ask you to sign our CLA if you haven't done
|
Upon submitting a Pull Request, we will ask you to sign our CLA if you haven't done
|
||||||
so before. It's a quick process, we promise, and you will be able to do it all online
|
so before. It's a quick process, we promise, and you will be able to do it all online
|
||||||
@ -137,9 +136,8 @@ gives us the option to relicense the code with a more permissive license in the
|
|||||||
|
|
||||||
[coc]: https://github.com/processone/ejabberd/blob/master/CODE_OF_CONDUCT.md
|
[coc]: https://github.com/processone/ejabberd/blob/master/CODE_OF_CONDUCT.md
|
||||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
||||||
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
|
[list]: http://lists.jabber.ru/mailman/listinfo/ejabberd
|
||||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
[muc]: xmpp:ejabberd@conference.process-one.net
|
||||||
[logs]: https://process-one.net/logs/ejabberd@conference.process-one.net/
|
|
||||||
[github]: https://github.com/processone/ejabberd
|
[github]: https://github.com/processone/ejabberd
|
||||||
[github-issues]: https://github.com/processone/ejabberd/issues
|
[github-issues]: https://github.com/processone/ejabberd/issues
|
||||||
[github-new-issue]: https://github.com/processone/ejabberd/issues/new
|
[github-new-issue]: https://github.com/processone/ejabberd/issues/new
|
||||||
@ -147,3 +145,4 @@ gives us the option to relicense the code with a more permissive license in the
|
|||||||
[doc-repo]: https://github.com/processone/docs.ejabberd.im
|
[doc-repo]: https://github.com/processone/docs.ejabberd.im
|
||||||
[developer-setup]: https://docs.ejabberd.im/developer/
|
[developer-setup]: https://docs.ejabberd.im/developer/
|
||||||
[cla]: https://www.process-one.net/resources/ejabberd-cla.pdf
|
[cla]: https://www.process-one.net/resources/ejabberd-cla.pdf
|
||||||
|
[license]: https://github.com/processone/ejabberd/blob/master/COPYING
|
||||||
|
626
Makefile.in
626
Makefile.in
@ -1,22 +1,7 @@
|
|||||||
#.
|
REBAR = @ESCRIPT@ rebar
|
||||||
#' definitions
|
|
||||||
#
|
|
||||||
|
|
||||||
ESCRIPT = @ESCRIPT@
|
|
||||||
REBAR = @rebar@
|
|
||||||
MIX = @rebar@
|
|
||||||
AWK = @AWK@
|
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
ERL = @ERL@
|
ERL = @ERL@
|
||||||
EPMD = @EPMD@
|
|
||||||
IEX = @IEX@
|
|
||||||
|
|
||||||
INSTALLUSER=@INSTALLUSER@
|
|
||||||
INSTALLGROUP=@INSTALLGROUP@
|
|
||||||
|
|
||||||
REBAR_ENABLE_ELIXIR = @elixir@
|
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
@ -24,27 +9,27 @@ exec_prefix = @exec_prefix@
|
|||||||
DESTDIR =
|
DESTDIR =
|
||||||
|
|
||||||
# /etc/ejabberd/
|
# /etc/ejabberd/
|
||||||
ETCDIR = @sysconfdir@/ejabberd
|
ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
|
||||||
|
|
||||||
# /bin/
|
# /bin/
|
||||||
BINDIR = @bindir@
|
BINDIR = $(DESTDIR)@bindir@
|
||||||
|
|
||||||
# /sbin/
|
# /sbin/
|
||||||
SBINDIR = @sbindir@
|
SBINDIR = $(DESTDIR)@sbindir@
|
||||||
|
|
||||||
# /lib/
|
# /lib/
|
||||||
LIBDIR = @libdir@
|
LIBDIR = $(DESTDIR)@libdir@
|
||||||
|
|
||||||
# /lib/ejabberd/
|
# /lib/ejabberd/
|
||||||
EJABBERDDIR = @libdir@/ejabberd
|
EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
|
||||||
|
|
||||||
# /share/doc/ejabberd
|
# /share/doc/ejabberd
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
datarootdir = @datarootdir@
|
datarootdir = @datarootdir@
|
||||||
DOCDIR = @docdir@
|
DOCDIR = $(DESTDIR)@docdir@
|
||||||
|
|
||||||
# /share/doc/man/man5
|
# /share/doc/man/man5
|
||||||
MANDIR = @mandir@/man5
|
MANDIR = $(DESTDIR)@mandir@/man5
|
||||||
|
|
||||||
# /usr/lib/ejabberd/ebin/
|
# /usr/lib/ejabberd/ebin/
|
||||||
BEAMDIR = $(EJABBERDDIR)/ebin
|
BEAMDIR = $(EJABBERDDIR)/ebin
|
||||||
@ -80,15 +65,18 @@ SQLDIR = $(PRIVDIR)/sql
|
|||||||
LUADIR = $(PRIVDIR)/lua
|
LUADIR = $(PRIVDIR)/lua
|
||||||
|
|
||||||
# /var/lib/ejabberd/
|
# /var/lib/ejabberd/
|
||||||
SPOOLDIR = @localstatedir@/lib/ejabberd
|
SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
|
||||||
|
|
||||||
|
# /var/lock/ejabberdctl
|
||||||
|
CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl
|
||||||
|
|
||||||
|
# /var/lib/ejabberd/.erlang.cookie
|
||||||
|
COOKIEFILE = $(SPOOLDIR)/.erlang.cookie
|
||||||
|
|
||||||
# /var/log/ejabberd/
|
# /var/log/ejabberd/
|
||||||
LOGDIR = @localstatedir@/log/ejabberd
|
LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd
|
||||||
|
|
||||||
#.
|
|
||||||
#' install user
|
|
||||||
#
|
|
||||||
|
|
||||||
|
INSTALLUSER=@INSTALLUSER@
|
||||||
# if no user was enabled, don't set privileges or ownership
|
# if no user was enabled, don't set privileges or ownership
|
||||||
ifeq ($(INSTALLUSER),)
|
ifeq ($(INSTALLUSER),)
|
||||||
O_USER=
|
O_USER=
|
||||||
@ -103,206 +91,75 @@ else
|
|||||||
CHOWN_OUTPUT=&1
|
CHOWN_OUTPUT=&1
|
||||||
INIT_USER=$(INSTALLUSER)
|
INIT_USER=$(INSTALLUSER)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# if no group was enabled, don't set privileges or ownership
|
# if no group was enabled, don't set privileges or ownership
|
||||||
|
INSTALLGROUP=@INSTALLGROUP@
|
||||||
ifneq ($(INSTALLGROUP),)
|
ifneq ($(INSTALLGROUP),)
|
||||||
G_USER=-g $(INSTALLGROUP)
|
G_USER=-g $(INSTALLGROUP)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#.
|
all: deps src
|
||||||
#' rebar / rebar3 / mix
|
|
||||||
#
|
|
||||||
|
|
||||||
ifeq "$(notdir $(MIX))" "mix"
|
deps: deps/.got
|
||||||
REBAR_VER:=6
|
|
||||||
REBAR_VER_318:=0
|
|
||||||
else
|
|
||||||
REBAR_VER:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print $$2}')
|
|
||||||
REBAR_VER_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(REBAR_VER)" "6"
|
deps/.got:
|
||||||
REBAR=$(MIX)
|
rm -rf deps/.got
|
||||||
SKIPDEPS=
|
rm -rf deps/.built
|
||||||
LISTDEPS=deps.tree
|
mkdir -p deps
|
||||||
UPDATEDEPS=deps.update
|
$(REBAR) get-deps && :> deps/.got
|
||||||
DEPSPATTERN="s/.*─ \([a-z0-9_]*\) .*/\1/p;"
|
|
||||||
DEPSBASE=_build
|
|
||||||
DEPSDIR=$(DEPSBASE)/dev/lib
|
|
||||||
GET_DEPS= deps.get
|
|
||||||
CONFIGURE_DEPS=(cd deps/eimp; ./configure)
|
|
||||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
|
||||||
XREFOPTIONS=graph
|
|
||||||
EDOCPRE=MIX_ENV=edoc
|
|
||||||
EDOCTASK=docs --proglang erlang
|
|
||||||
CLEANARG=--deps
|
|
||||||
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
|
|
||||||
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
|
|
||||||
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
|
|
||||||
REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite
|
|
||||||
RELIVECMD=$(ESCRIPT) rel/relive.escript && MIX_ENV=dev RELIVE=true $(IEX) --name ejabberd@localhost -S mix run
|
|
||||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
|
||||||
COPY_REL_TARGET = dev
|
|
||||||
GET_DEPS_TRANSLATIONS=MIX_ENV=translations $(REBAR) $(GET_DEPS)
|
|
||||||
DEPSDIR_TRANSLATIONS=deps
|
|
||||||
else
|
|
||||||
ifeq ($(REBAR_ENABLE_ELIXIR),true)
|
|
||||||
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
|
|
||||||
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
|
|
||||||
EXPLICIT_ELIXIR_COMPILE=MIX_ENV=default mix compile.elixir
|
|
||||||
EXPLICIT_ELIXIR_COMPILE_DEV=MIX_ENV=dev mix compile.elixir
|
|
||||||
PREPARE_ELIXIR_SCRIPTS=$(MKDIR_P) rel/overlays; cp $(ELIXIR_LIBDIR_RAW)/../bin/iex rel/overlays/; cp $(ELIXIR_LIBDIR_RAW)/../bin/elixir rel/overlays/; sed -i 's|ERTS_BIN=$$|ERTS_BIN=$$SCRIPT_PATH/../../erts-{{erts_vsn}}/bin/|' rel/overlays/elixir
|
|
||||||
endif
|
|
||||||
ifeq "$(REBAR_VER)" "3"
|
|
||||||
SKIPDEPS=
|
|
||||||
LISTDEPS=tree
|
|
||||||
ifeq "$(REBAR_VER_318)" "1"
|
|
||||||
UPDATEDEPS=upgrade --all
|
|
||||||
else
|
|
||||||
UPDATEDEPS=upgrade
|
|
||||||
endif
|
|
||||||
DEPSPATTERN="s/ (.*//; /^ / s/.* \([a-z0-9_]*\).*/\1/p;"
|
|
||||||
DEPSBASE=_build
|
|
||||||
DEPSDIR=$(DEPSBASE)/default/lib
|
|
||||||
GET_DEPS= get-deps
|
|
||||||
CONFIGURE_DEPS=$(REBAR) configure-deps
|
|
||||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
|
||||||
XREFOPTIONS=
|
|
||||||
CLEANARG=--all
|
|
||||||
REBARREL=$(REBAR) as prod tar
|
|
||||||
REBARDEV=$(REBAR) as dev release
|
|
||||||
RELIVECMD=$(REBAR) as dev relive
|
|
||||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
|
||||||
COPY_REL_TARGET = dev
|
|
||||||
GET_DEPS_TRANSLATIONS=$(REBAR) as translations $(GET_DEPS)
|
|
||||||
DEPSDIR_TRANSLATIONS=_build/translations/lib
|
|
||||||
else
|
|
||||||
SKIPDEPS=skip_deps=true
|
|
||||||
LISTDEPS=-q list-deps
|
|
||||||
UPDATEDEPS=update-deps
|
|
||||||
DEPSPATTERN="/ TAG / s/ .*// p; / REV / s/ .*// p; / BRANCH / s/ .*// p;"
|
|
||||||
DEPSBASE=deps
|
|
||||||
DEPSDIR=$(DEPSBASE)
|
|
||||||
GET_DEPS= get-deps
|
|
||||||
CONFIGURE_DEPS=$(REBAR) configure-deps
|
|
||||||
EBINDIR=ebin
|
|
||||||
XREFOPTIONS=
|
|
||||||
CLEANARG=
|
|
||||||
REBARREL=$(REBAR) generate
|
|
||||||
REBARDEV=
|
|
||||||
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
|
|
||||||
\nTry: ./configure --with-rebar=rebar3 ; make relive"
|
|
||||||
REL_LIB_DIR = rel/ejabberd/lib
|
|
||||||
COPY_REL_TARGET = rel
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
#.
|
deps/.built: deps/.got
|
||||||
#' main targets
|
$(REBAR) configure-deps
|
||||||
#
|
$(REBAR) compile && :> deps/.built
|
||||||
|
|
||||||
all: scripts deps src
|
src: deps/.built
|
||||||
|
$(REBAR) skip_deps=true compile
|
||||||
deps: $(DEPSDIR)/.got
|
|
||||||
|
|
||||||
$(DEPSDIR)/.got:
|
|
||||||
rm -rf $(DEPSDIR)/.got
|
|
||||||
rm -rf $(DEPSDIR)/.built
|
|
||||||
$(MKDIR_P) $(DEPSDIR)
|
|
||||||
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
|
|
||||||
$(CONFIGURE_DEPS)
|
|
||||||
|
|
||||||
$(DEPSDIR)/.built: $(DEPSDIR)/.got
|
|
||||||
$(REBAR) compile && :> $(DEPSDIR)/.built
|
|
||||||
|
|
||||||
src: $(DEPSDIR)/.built
|
|
||||||
$(REBAR) $(SKIPDEPS) compile
|
|
||||||
$(EXPLICIT_ELIXIR_COMPILE)
|
|
||||||
|
|
||||||
update:
|
update:
|
||||||
rm -rf $(DEPSDIR)/.got
|
rm -rf deps/.got
|
||||||
rm -rf $(DEPSDIR)/.built
|
rm -rf deps/.built
|
||||||
$(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got
|
$(REBAR) update-deps && :> deps/.got
|
||||||
$(CONFIGURE_DEPS)
|
|
||||||
|
|
||||||
xref: all
|
xref: all
|
||||||
$(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS)
|
$(REBAR) skip_deps=true xref
|
||||||
|
|
||||||
hooks: all
|
hooks: all
|
||||||
tools/hook_deps.sh $(EBINDIR)
|
tools/hook_deps.sh ebin
|
||||||
|
|
||||||
options: all
|
options: all
|
||||||
tools/opt_types.sh ejabberd_option $(EBINDIR)
|
tools/opt_types.sh ejabberd_option ebin
|
||||||
|
|
||||||
translations:
|
translations:
|
||||||
$(GET_DEPS_TRANSLATIONS)
|
tools/prepare-tr.sh
|
||||||
tools/prepare-tr.sh $(DEPSDIR_TRANSLATIONS)
|
|
||||||
|
|
||||||
doap:
|
edoc:
|
||||||
tools/generate-doap.sh
|
$(ERL) -noinput +B -eval \
|
||||||
|
'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
|
||||||
#.
|
|
||||||
#' edoc
|
|
||||||
#
|
|
||||||
|
|
||||||
edoc: edoc_files edoc_compile
|
|
||||||
$(EDOCPRE) $(REBAR) $(EDOCTASK)
|
|
||||||
|
|
||||||
edoc_compile: deps
|
|
||||||
$(EDOCPRE) $(REBAR) compile
|
|
||||||
|
|
||||||
edoc_files: _build/edoc/docs.md _build/edoc/logo.png
|
|
||||||
|
|
||||||
_build/edoc/docs.md: edoc_compile
|
|
||||||
echo "For much more detailed and complete ejabberd documentation, " \
|
|
||||||
"go to the [ejabberd Docs](https://docs.ejabberd.im/) site." \
|
|
||||||
> _build/edoc/docs.md
|
|
||||||
|
|
||||||
_build/edoc/logo.png: edoc_compile
|
|
||||||
wget https://docs.ejabberd.im/assets/img/footer_logo_e.png -O _build/edoc/logo.png
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' format / indent
|
|
||||||
#
|
|
||||||
|
|
||||||
format:
|
|
||||||
tools/rebar3-format.sh $(REBAR)
|
|
||||||
|
|
||||||
indent:
|
|
||||||
tools/emacs-indent.sh
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' copy-files
|
|
||||||
#
|
|
||||||
|
|
||||||
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
|
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
|
||||||
|
|
||||||
VERSIONED_DEP=$(if $(DEP_$(1)_VERSION),$(DEP_$(1)_VERSION),$(1))
|
VERSIONED_DEP=$(if $(DEP_$(1)_VERSION),$(DEP_$(1)_VERSION),$(1))
|
||||||
|
|
||||||
DEPIX:=$(words $(subst /, ,$(DEPSDIR)))
|
|
||||||
LIBIX:=$(shell expr "$(DEPIX)" + 2)
|
|
||||||
|
|
||||||
ELIXIR_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 5,1000,$(1))
|
ELIXIR_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 5,1000,$(1))
|
||||||
DEPS_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 3,1000,$(1))
|
DEPS_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 3,1000,$(1))
|
||||||
MAIN_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,ejabberd) $(1)
|
MAIN_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,ejabberd) $(1)
|
||||||
TO_DEST_SINGLE=$(if $(subst X$(DEPSBASE)X,,X$(word 1,$(1))X),$(call MAIN_TO_DEST,$(1)),$(if $(subst XlibX,,X$(word $(LIBIX),$(1))X),$(call DEPS_TO_DEST,$(wordlist $(DEPIX),1000,$(1))),$(call ELIXIR_TO_DEST,$(wordlist $(DEPIX),1000,$(1)))))
|
TO_DEST_SINGLE=$(if $(subst XdepsX,,X$(word 1,$(1))X),$(call MAIN_TO_DEST,$(1)),$(if $(subst XlibX,,X$(word 3,$(1))X),$(call DEPS_TO_DEST,$(1)),$(call ELIXIR_TO_DEST,$(1))))
|
||||||
TO_DEST=$(foreach path,$(1),$(call JOIN_PATHS,$(DESTDIR)$(call TO_DEST_SINGLE,$(subst /, ,$(path)))))
|
TO_DEST=$(foreach path,$(1),$(call JOIN_PATHS,$(call TO_DEST_SINGLE,$(subst /, ,$(path)))))
|
||||||
|
|
||||||
FILTER_DIRS=$(foreach path,$(1),$(if $(wildcard $(path)/*),,$(path)))
|
FILTER_DIRS=$(foreach path,$(1),$(if $(wildcard $(path)/*),,$(path)))
|
||||||
FILES_WILDCARD=$(call FILTER_DIRS,$(foreach w,$(1),$(wildcard $(w))))
|
FILES_WILDCARD=$(call FILTER_DIRS,$(foreach w,$(1),$(wildcard $(w))))
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),copy-files-sub)
|
ifeq ($(MAKECMDGOALS),copy-files-sub)
|
||||||
|
|
||||||
DEPS:=$(sort $(shell QUIET=1 $(REBAR) $(LISTDEPS) | $(SED) -ne $(DEPSPATTERN) ))
|
DEPS:=$(sort $(shell $(REBAR) -q list-deps|$(SED) -ne '/ TAG / s/ .*// p; / REV / s/ .*// p; / BRANCH / s/ .*// p'))
|
||||||
|
|
||||||
DEPS_FILES=$(call FILES_WILDCARD,$(foreach DEP,$(DEPS),$(DEPSDIR)/$(DEP)/ebin/*.beam $(DEPSDIR)/$(DEP)/ebin/*.app $(DEPSDIR)/$(DEP)/priv/* $(DEPSDIR)/$(DEP)/priv/lib/* $(DEPSDIR)/$(DEP)/priv/bin/* $(DEPSDIR)/$(DEP)/include/*.hrl $(DEPSDIR)/$(DEP)/COPY* $(DEPSDIR)/$(DEP)/LICENSE* $(DEPSDIR)/$(DEP)/lib/*/ebin/*.beam $(DEPSDIR)/$(DEP)/lib/*/ebin/*.app))
|
DEPS_FILES=$(call FILES_WILDCARD,$(foreach DEP,$(DEPS),deps/$(DEP)/ebin/*.beam deps/$(DEP)/ebin/*.app deps/$(DEP)/priv/* deps/$(DEP)/priv/lib/* deps/$(DEP)/priv/bin/* deps/$(DEP)/include/*.hrl deps/$(DEP)/COPY* deps/$(DEP)/LICENSE* deps/$(DEP)/lib/*/ebin/*.beam deps/$(DEP)/lib/*/ebin/*.app))
|
||||||
|
|
||||||
BINARIES=$(DEPSDIR)/epam/priv/bin/epam $(DEPSDIR)/eimp/priv/bin/eimp $(DEPSDIR)/fs/priv/mac_listener
|
BINARIES=deps/epam/priv/bin/epam deps/eimp/priv/bin/eimp deps/fs/priv/mac_listener
|
||||||
|
|
||||||
DEPS_FILES_FILTERED=$(filter-out $(BINARIES) $(DEPSDIR)/elixir/ebin/elixir.app,$(DEPS_FILES))
|
DEPS_FILES_FILTERED=$(filter-out $(BINARIES) deps/elixir/ebin/elixir.app,$(DEPS_FILES))
|
||||||
DEPS_DIRS=$(sort $(DEPSDIR)/ $(foreach DEP,$(DEPS),$(DEPSDIR)/$(DEP)/) $(dir $(DEPS_FILES)))
|
DEPS_DIRS=$(sort deps/ $(foreach DEP,$(DEPS),deps/$(DEP)/) $(dir $(DEPS_FILES)))
|
||||||
|
|
||||||
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,$(EBINDIR)/*.beam $(EBINDIR)/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING))
|
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,ebin/*.beam ebin/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING))
|
||||||
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua)
|
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua)
|
||||||
|
|
||||||
define DEP_VERSION_template
|
define DEP_VERSION_template
|
||||||
@ -311,8 +168,8 @@ endef
|
|||||||
|
|
||||||
DELETE_TARGET_SO=$(if $(subst X.soX,,X$(suffix $(1))X),,rm -f $(call TO_DEST,$(1));)
|
DELETE_TARGET_SO=$(if $(subst X.soX,,X$(suffix $(1))X),,rm -f $(call TO_DEST,$(1));)
|
||||||
|
|
||||||
$(foreach DEP,$(DEPS),$(eval $(call DEP_VERSION_template,$(DEP),$(DEPSDIR)/$(DEP)/ebin/$(DEP).app)))
|
$(foreach DEP,$(DEPS),$(eval $(call DEP_VERSION_template,$(DEP),deps/$(DEP)/ebin/$(DEP).app)))
|
||||||
$(eval $(call DEP_VERSION_template,ejabberd,$(EBINDIR)/ejabberd.app))
|
$(eval $(call DEP_VERSION_template,ejabberd,ebin/ejabberd.app))
|
||||||
|
|
||||||
define COPY_template
|
define COPY_template
|
||||||
$(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; $(call DELETE_TARGET_SO, $(1)) $$(INSTALL) -m 644 $(1) $(call TO_DEST,$(1))
|
$(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; $(call DELETE_TARGET_SO, $(1)) $$(INSTALL) -m 644 $(1) $(call TO_DEST,$(1))
|
||||||
@ -327,29 +184,18 @@ $(foreach file,$(DEPS_FILES_FILTERED) $(MAIN_FILES),$(eval $(call COPY_template,
|
|||||||
$(foreach file,$(BINARIES),$(eval $(call COPY_BINARY_template,$(file))))
|
$(foreach file,$(BINARIES),$(eval $(call COPY_BINARY_template,$(file))))
|
||||||
|
|
||||||
$(sort $(call TO_DEST,$(MAIN_DIRS) $(DEPS_DIRS))):
|
$(sort $(call TO_DEST,$(MAIN_DIRS) $(DEPS_DIRS))):
|
||||||
$(INSTALL) -d $@
|
$(INSTALL) -d $@
|
||||||
|
|
||||||
$(call TO_DEST,priv/sql/lite.sql): sql/lite.sql $(call TO_DEST,priv/sql)
|
$(call TO_DEST,priv/sql/lite.sql): sql/lite.sql $(call TO_DEST,priv/sql)
|
||||||
$(INSTALL) -m 644 $< $@
|
$(INSTALL) -m 644 $< $@
|
||||||
|
|
||||||
$(call TO_DEST,priv/sql/lite.new.sql): sql/lite.new.sql $(call TO_DEST,priv/sql)
|
|
||||||
$(INSTALL) -m 644 $< $@
|
|
||||||
|
|
||||||
$(call TO_DEST,priv/bin/captcha.sh): tools/captcha.sh $(call TO_DEST,priv/bin)
|
$(call TO_DEST,priv/bin/captcha.sh): tools/captcha.sh $(call TO_DEST,priv/bin)
|
||||||
$(INSTALL) -m 755 $(O_USER) $< $@
|
$(INSTALL) -m 755 $(O_USER) $< $@
|
||||||
|
|
||||||
$(call TO_DEST,priv/lua/redis_sm.lua): priv/lua/redis_sm.lua $(call TO_DEST,priv/lua)
|
$(call TO_DEST,priv/lua/redis_sm.lua): priv/lua/redis_sm.lua $(call TO_DEST,priv/lua)
|
||||||
$(INSTALL) -m 644 $< $@
|
$(INSTALL) -m 644 $< $@
|
||||||
|
|
||||||
ifeq (@sqlite@,true)
|
copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh priv/sql/lite.sql priv/lua/redis_sm.lua)
|
||||||
SQLITE_FILES = priv/sql/lite.sql priv/sql/lite.new.sql
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (@redis@,true)
|
|
||||||
REDIS_FILES = priv/lua/redis_sm.lua
|
|
||||||
endif
|
|
||||||
|
|
||||||
copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh $(SQLITE_FILES) $(REDIS_FILES))
|
|
||||||
|
|
||||||
.PHONY: $(call TO_DEST,$(DEPS_FILES) $(MAIN_DIRS) $(DEPS_DIRS))
|
.PHONY: $(call TO_DEST,$(DEPS_FILES) $(MAIN_DIRS) $(DEPS_DIRS))
|
||||||
|
|
||||||
@ -360,251 +206,142 @@ copy-files:
|
|||||||
|
|
||||||
copy-files-sub: copy-files-sub2
|
copy-files-sub: copy-files-sub2
|
||||||
|
|
||||||
#.
|
install: all copy-files
|
||||||
#' copy-files-rel
|
|
||||||
#
|
|
||||||
|
|
||||||
copy-files-rel: $(COPY_REL_TARGET)
|
|
||||||
#
|
#
|
||||||
# Libraries
|
# Configuration files
|
||||||
(cd $(REL_LIB_DIR) && find . -follow -type f ! -executable -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
$(INSTALL) -d -m 750 $(G_USER) $(ETCDIR)
|
||||||
|
[ -f $(ETCDIR)/ejabberd.yml ] \
|
||||||
|
&& $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \
|
||||||
|
|| $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml
|
||||||
|
$(SED) -e "s*{{rootdir}}*@prefix@*g" \
|
||||||
|
-e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||||
|
-e "s*{{bindir}}*@bindir@*g" \
|
||||||
|
-e "s*{{libdir}}*@libdir@*g" \
|
||||||
|
-e "s*{{sysconfdir}}*@sysconfdir@*g" \
|
||||||
|
-e "s*{{localstatedir}}*@localstatedir@*g" \
|
||||||
|
-e "s*{{docdir}}*@docdir@*g" \
|
||||||
|
-e "s*{{erl}}*@ERL@*g" \
|
||||||
|
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||||
|
> ejabberdctl.example
|
||||||
|
[ -f $(ETCDIR)/ejabberdctl.cfg ] \
|
||||||
|
&& $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
|
||||||
|
|| $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
|
||||||
|
$(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
|
||||||
#
|
#
|
||||||
# *.so:
|
# Administration script
|
||||||
(cd $(REL_LIB_DIR) && find . -follow -type f -executable -name *.so -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
[ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR)
|
||||||
|
$(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
|
||||||
|
# Elixir binaries
|
||||||
|
[ -d $(BINDIR) ] || $(INSTALL) -d -m 755 $(BINDIR)
|
||||||
|
[ -f deps/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/iex $(BINDIR)/iex || true
|
||||||
|
[ -f deps/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/elixir $(BINDIR)/elixir || true
|
||||||
|
[ -f deps/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/mix $(BINDIR)/mix || true
|
||||||
#
|
#
|
||||||
# Executable files
|
# Init script
|
||||||
(cd $(REL_LIB_DIR) && find . -follow -type f -executable ! -name *.so -exec $(INSTALL) -vDm 550 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' uninstall-librel
|
|
||||||
#
|
|
||||||
|
|
||||||
uninstall-librel:
|
|
||||||
(cd $(REL_LIB_DIR) && find . -follow -type f -exec rm -fv -v $(DESTDIR)$(LIBDIR)/{} \;)
|
|
||||||
(cd $(REL_LIB_DIR) && find . -follow -depth -type d -exec rm -dv -v $(DESTDIR)$(LIBDIR)/{} \;)
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' relive
|
|
||||||
#
|
|
||||||
|
|
||||||
relive:
|
|
||||||
$(EXPLICIT_ELIXIR_COMPILE_DEV)
|
|
||||||
$(RELIVECMD)
|
|
||||||
|
|
||||||
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
|
||||||
relivedir=$(shell pwd)/_build/relive
|
|
||||||
CONFIG_DIR = ${relivedir}/conf
|
|
||||||
SPOOL_DIR = ${relivedir}/database
|
|
||||||
LOGS_DIR = ${relivedir}/logs
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' scripts
|
|
||||||
#
|
|
||||||
|
|
||||||
ejabberdctl.relive:
|
|
||||||
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
|
||||||
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
|
||||||
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
|
||||||
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
|
||||||
-e "s*{{bindir}}*${BINDIR}*g" \
|
|
||||||
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
|
|
||||||
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
|
||||||
-e "s*{{iexpath}}*${IEX}*g" \
|
|
||||||
-e "s*{{erl}}*${ERL}*g" \
|
|
||||||
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
|
||||||
> ejabberdctl.relive
|
|
||||||
|
|
||||||
ejabberd.init:
|
|
||||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
|
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
|
||||||
-e "s*@installuser@*$(INIT_USER)*g" ejabberd.init.template \
|
-e "s*@installuser@*$(INIT_USER)*g" ejabberd.init.template \
|
||||||
> ejabberd.init
|
> ejabberd.init
|
||||||
chmod 755 ejabberd.init
|
chmod 755 ejabberd.init
|
||||||
|
#
|
||||||
ejabberd.service:
|
# Service script
|
||||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
|
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" ejabberd.service.template \
|
||||||
-e "s*@installuser@*$(INIT_USER)*g" ejabberd.service.template \
|
|
||||||
> ejabberd.service
|
> ejabberd.service
|
||||||
chmod 644 ejabberd.service
|
chmod 644 ejabberd.service
|
||||||
|
|
||||||
ejabberdctl.example: vars.config
|
|
||||||
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
|
||||||
-e "s*{{config_dir}}*${ETCDIR}*g" \
|
|
||||||
-e "s*{{logs_dir}}*${LOGDIR}*g" \
|
|
||||||
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
|
|
||||||
-e "s*{{bindir}}*${BINDIR}*g" \
|
|
||||||
-e "s*{{libdir}}*${LIBDIR}${ELIXIR_LIBDIR}*g" \
|
|
||||||
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
|
||||||
-e "s*{{iexpath}}*${IEX}*g" \
|
|
||||||
-e "s*{{erl}}*${ERL}*g" \
|
|
||||||
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
|
||||||
> ejabberdctl.example
|
|
||||||
|
|
||||||
scripts: ejabberd.init ejabberd.service ejabberdctl.example
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' install
|
|
||||||
#
|
|
||||||
|
|
||||||
install: copy-files install-main
|
|
||||||
|
|
||||||
install-rel: copy-files-rel install-main
|
|
||||||
|
|
||||||
install-main:
|
|
||||||
#
|
|
||||||
# Configuration files
|
|
||||||
$(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR)
|
|
||||||
[ -f $(DESTDIR)$(ETCDIR)/ejabberd.yml ] \
|
|
||||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(DESTDIR)$(ETCDIR)/ejabberd.yml-new \
|
|
||||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(DESTDIR)$(ETCDIR)/ejabberd.yml
|
|
||||||
[ -f $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg ] \
|
|
||||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg-new \
|
|
||||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(DESTDIR)$(ETCDIR)/ejabberdctl.cfg
|
|
||||||
$(INSTALL) -b -m 644 $(G_USER) inetrc $(DESTDIR)$(ETCDIR)/inetrc
|
|
||||||
#
|
|
||||||
# Administration script
|
|
||||||
[ -d $(DESTDIR)$(SBINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(SBINDIR)
|
|
||||||
$(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(DESTDIR)$(SBINDIR)/ejabberdctl
|
|
||||||
# Elixir binaries
|
|
||||||
[ -d $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)
|
|
||||||
[ -f $(DEPSDIR)/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/iex $(DESTDIR)$(BINDIR)/iex || true
|
|
||||||
[ -f $(DEPSDIR)/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/elixir $(DESTDIR)$(BINDIR)/elixir || true
|
|
||||||
[ -f $(DEPSDIR)/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) $(DEPSDIR)/elixir/bin/mix $(DESTDIR)$(BINDIR)/mix || true
|
|
||||||
#
|
#
|
||||||
# Spool directory
|
# Spool directory
|
||||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR)
|
$(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR)
|
||||||
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT)
|
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT)
|
||||||
chmod -R 750 $(DESTDIR)$(SPOOLDIR)
|
chmod -R 750 $(SPOOLDIR)
|
||||||
|
[ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; }
|
||||||
|
#
|
||||||
|
# ejabberdctl lock directory
|
||||||
|
$(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR)
|
||||||
|
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT)
|
||||||
|
chmod -R 750 $(CTLLOCKDIR)
|
||||||
#
|
#
|
||||||
# Log directory
|
# Log directory
|
||||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(LOGDIR)
|
$(INSTALL) -d -m 750 $(O_USER) $(LOGDIR)
|
||||||
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT)
|
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT)
|
||||||
chmod -R 750 $(DESTDIR)$(LOGDIR)
|
chmod -R 750 $(LOGDIR)
|
||||||
#
|
#
|
||||||
# Documentation
|
# Documentation
|
||||||
$(INSTALL) -d $(DESTDIR)$(MANDIR)
|
$(INSTALL) -d $(MANDIR)
|
||||||
$(INSTALL) -d $(DESTDIR)$(DOCDIR)
|
$(INSTALL) -d $(DOCDIR)
|
||||||
[ -f man/ejabberd.yml.5 ] \
|
[ -f man/ejabberd.yml.5 ] \
|
||||||
&& $(INSTALL) -m 644 man/ejabberd.yml.5 $(DESTDIR)$(MANDIR) \
|
&& $(INSTALL) -m 644 man/ejabberd.yml.5 $(MANDIR) \
|
||||||
|| echo "Man page not included in sources"
|
|| echo "Man page not included in sources"
|
||||||
$(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR)
|
$(INSTALL) -m 644 COPYING $(DOCDIR)
|
||||||
|
|
||||||
#.
|
|
||||||
#' uninstall
|
|
||||||
#
|
|
||||||
|
|
||||||
uninstall: uninstall-binary
|
uninstall: uninstall-binary
|
||||||
|
|
||||||
uninstall-rel: uninstall-binary uninstall-librel
|
|
||||||
|
|
||||||
uninstall-binary:
|
uninstall-binary:
|
||||||
rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl
|
rm -f $(SBINDIR)/ejabberdctl
|
||||||
rm -f $(DESTDIR)$(BINDIR)/iex
|
rm -f $(BINDIR)/iex
|
||||||
rm -f $(DESTDIR)$(BINDIR)/elixir
|
rm -f $(BINDIR)/elixir
|
||||||
rm -f $(DESTDIR)$(BINDIR)/mix
|
rm -f $(BINDIR)/mix
|
||||||
rm -fr $(DESTDIR)$(DOCDIR)
|
rm -fr $(DOCDIR)
|
||||||
rm -f $(DESTDIR)$(BEAMDIR)/*.beam
|
rm -f $(BEAMDIR)/*.beam
|
||||||
rm -f $(DESTDIR)$(BEAMDIR)/*.app
|
rm -f $(BEAMDIR)/*.app
|
||||||
rm -fr $(DESTDIR)$(BEAMDIR)
|
rm -fr $(BEAMDIR)
|
||||||
rm -f $(DESTDIR)$(INCLUDEDIR)/*.hrl
|
rm -f $(INCLUDEDIR)/*.hrl
|
||||||
rm -fr $(DESTDIR)$(INCLUDEDIR)
|
rm -fr $(INCLUDEDIR)
|
||||||
rm -fr $(DESTDIR)$(PBINDIR)
|
rm -fr $(PBINDIR)
|
||||||
rm -f $(DESTDIR)$(SODIR)/*.so
|
rm -f $(SODIR)/*.so
|
||||||
rm -fr $(DESTDIR)$(SODIR)
|
rm -fr $(SODIR)
|
||||||
rm -f $(DESTDIR)$(MSGSDIR)/*.msg
|
rm -f $(MSGSDIR)/*.msg
|
||||||
rm -fr $(DESTDIR)$(MSGSDIR)
|
rm -fr $(MSGSDIR)
|
||||||
rm -f $(DESTDIR)$(CSSDIR)/*.css
|
rm -f $(CSSDIR)/*.css
|
||||||
rm -fr $(DESTDIR)$(CSSDIR)
|
rm -fr $(CSSDIR)
|
||||||
rm -f $(DESTDIR)$(IMGDIR)/*.png
|
rm -f $(IMGDIR)/*.png
|
||||||
rm -fr $(DESTDIR)$(IMGDIR)
|
rm -fr $(IMGDIR)
|
||||||
rm -f $(DESTDIR)$(JSDIR)/*.js
|
rm -f $(JSDIR)/*.js
|
||||||
rm -fr $(DESTDIR)$(JSDIR)
|
rm -fr $(JSDIR)
|
||||||
rm -f $(DESTDIR)$(SQLDIR)/*.sql
|
rm -f $(SQLDIR)/*.sql
|
||||||
rm -fr $(DESTDIR)$(SQLDIR)
|
rm -fr $(SQLDIR)
|
||||||
rm -fr $(DESTDIR)$(LUADIR)/*.lua
|
rm -fr $(LUADIR)/*.lua
|
||||||
rm -fr $(DESTDIR)$(LUADIR)
|
rm -fr $(LUADIR)
|
||||||
rm -fr $(DESTDIR)$(PRIVDIR)
|
rm -fr $(PRIVDIR)
|
||||||
rm -fr $(DESTDIR)$(EJABBERDDIR)
|
rm -fr $(EJABBERDDIR)
|
||||||
rm -f $(DESTDIR)$(MANDIR)/ejabberd.yml.5
|
|
||||||
|
|
||||||
uninstall-all: uninstall-binary
|
uninstall-all: uninstall-binary
|
||||||
rm -rf $(DESTDIR)$(ETCDIR)
|
rm -rf $(ETCDIR)
|
||||||
rm -rf $(DESTDIR)$(EJABBERDDIR)
|
rm -rf $(EJABBERDDIR)
|
||||||
rm -rf $(DESTDIR)$(SPOOLDIR)
|
rm -rf $(SPOOLDIR)
|
||||||
rm -rf $(DESTDIR)$(LOGDIR)
|
rm -rf $(CTLLOCKDIR)
|
||||||
|
rm -rf $(LOGDIR)
|
||||||
#.
|
|
||||||
#' clean
|
|
||||||
#
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(DEPSDIR)/.got
|
rm -rf deps/.got
|
||||||
rm -rf $(DEPSDIR)/.built
|
rm -rf deps/.built
|
||||||
rm -rf test/*.beam
|
rm -rf test/*.beam
|
||||||
rm -f rebar.lock
|
$(REBAR) clean
|
||||||
rm -f ejabberdctl.example ejabberd.init ejabberd.service
|
|
||||||
$(REBAR) clean $(CLEANARG)
|
|
||||||
|
|
||||||
clean-rel:
|
clean-rel:
|
||||||
rm -rf rel/ejabberd
|
rm -rf rel/ejabberd
|
||||||
|
|
||||||
distclean: clean clean-rel
|
distclean: clean clean-rel
|
||||||
rm -f aclocal.m4
|
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
rm -f config.log
|
rm -f config.log
|
||||||
rm -rf autom4te.cache
|
rm -rf autom4te.cache
|
||||||
rm -rf $(EBINDIR)
|
|
||||||
rm -rf $(DEPSBASE)
|
|
||||||
rm -rf deps
|
rm -rf deps
|
||||||
|
rm -rf ebin
|
||||||
rm -f Makefile
|
rm -f Makefile
|
||||||
rm -f vars.config
|
rm -f vars.config
|
||||||
|
rm -f src/ejabberd.app.src
|
||||||
|
[ ! -f ../ChangeLog ] || rm -f ../ChangeLog
|
||||||
|
|
||||||
#.
|
rel: all
|
||||||
#' releases
|
$(REBAR) generate
|
||||||
#
|
|
||||||
|
|
||||||
rel: prod
|
|
||||||
|
|
||||||
prod:
|
|
||||||
$(PREPARE_ELIXIR_SCRIPTS)
|
|
||||||
$(REBARREL)
|
|
||||||
|
|
||||||
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
|
|
||||||
|
|
||||||
dev $(DEV_CONFIG):
|
|
||||||
$(PREPARE_ELIXIR_SCRIPTS)
|
|
||||||
$(REBARDEV)
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' tags
|
|
||||||
#
|
|
||||||
|
|
||||||
TAGS:
|
TAGS:
|
||||||
etags src/*.erl
|
etags *.erl
|
||||||
|
|
||||||
#.
|
|
||||||
#' makefile
|
|
||||||
#
|
|
||||||
|
|
||||||
Makefile: Makefile.in
|
Makefile: Makefile.in
|
||||||
|
|
||||||
#.
|
deps := $(wildcard deps/*/ebin)
|
||||||
#' dialyzer
|
|
||||||
#
|
|
||||||
|
|
||||||
ifeq "$(REBAR_VER)" "6" # Mix
|
|
||||||
dialyzer:
|
|
||||||
MIX_ENV=test $(REBAR) dialyzer
|
|
||||||
|
|
||||||
else
|
|
||||||
ifeq "$(REBAR_VER)" "3" # Rebar3
|
|
||||||
dialyzer:
|
|
||||||
$(REBAR) dialyzer
|
|
||||||
|
|
||||||
else # Rebar2
|
|
||||||
deps := $(wildcard $(DEPSDIR)/*/ebin)
|
|
||||||
|
|
||||||
dialyzer/erlang.plt:
|
dialyzer/erlang.plt:
|
||||||
@$(MKDIR_P) dialyzer
|
@mkdir -p dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
|
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
|
||||||
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
|
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
|
||||||
public_key ssl mnesia inets odbc compiler erts \
|
public_key ssl mnesia inets odbc compiler erts \
|
||||||
@ -612,13 +349,13 @@ dialyzer/erlang.plt:
|
|||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
|
|
||||||
dialyzer/deps.plt:
|
dialyzer/deps.plt:
|
||||||
@$(MKDIR_P) dialyzer
|
@mkdir -p dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
|
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
|
||||||
-o dialyzer/deps.log $(deps); \
|
-o dialyzer/deps.log $(deps); \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
|
|
||||||
dialyzer/ejabberd.plt:
|
dialyzer/ejabberd.plt:
|
||||||
@$(MKDIR_P) dialyzer
|
@mkdir -p dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
|
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
|
||||||
-o dialyzer/ejabberd.log ebin; \
|
-o dialyzer/ejabberd.log ebin; \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
@ -639,79 +376,14 @@ dialyzer: erlang_plt deps_plt ejabberd_plt
|
|||||||
@dialyzer --plts dialyzer/*.plt --no_check_plt \
|
@dialyzer --plts dialyzer/*.plt --no_check_plt \
|
||||||
--get_warnings -o dialyzer/error.log ebin; \
|
--get_warnings -o dialyzer/error.log ebin; \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' elvis
|
|
||||||
#
|
|
||||||
|
|
||||||
elvis:
|
|
||||||
$(REBAR) lint
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' test
|
|
||||||
#
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@echo "************************** NOTICE ***************************************"
|
@echo "************************** NOTICE ***************************************"
|
||||||
@cat test/README
|
@cat test/README
|
||||||
@echo "*************************************************************************"
|
@echo "*************************************************************************"
|
||||||
@cd priv && ln -sf ../sql
|
@cd priv && ln -sf ../sql
|
||||||
$(REBAR) $(SKIPDEPS) ct
|
$(REBAR) skip_deps=true ct
|
||||||
|
|
||||||
test-eunit:
|
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
|
||||||
$(REBAR) $(SKIPDEPS) eunit --verbose
|
install uninstall uninstall-binary uninstall-all translations deps test \
|
||||||
|
quicktest erlang_plt deps_plt ejabberd_plt xref hooks options
|
||||||
#.
|
|
||||||
#' phony
|
|
||||||
#
|
|
||||||
|
|
||||||
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
|
|
||||||
install uninstall uninstall-binary uninstall-all translations deps test test-eunit \
|
|
||||||
all dev doap help install-rel relive scripts uninstall-rel update \
|
|
||||||
erlang_plt deps_plt ejabberd_plt xref hooks options format indent
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' help
|
|
||||||
#
|
|
||||||
|
|
||||||
help:
|
|
||||||
@echo ""
|
|
||||||
@echo " [all] "
|
|
||||||
@echo " scripts Prepare ejabberd start scripts"
|
|
||||||
@echo " deps Get and configure dependencies"
|
|
||||||
@echo " src Compile dependencies and ejabberd"
|
|
||||||
@echo " update Update dependencies source code"
|
|
||||||
@echo " clean Clean binary files"
|
|
||||||
@echo " distclean Clean completely the development files"
|
|
||||||
@echo ""
|
|
||||||
@echo " install Install ejabberd to /usr/local"
|
|
||||||
@echo " install-rel Install ejabberd to /usr/local (using release)"
|
|
||||||
@echo " uninstall Uninstall ejabberd (buggy)"
|
|
||||||
@echo " uninstall-rel Uninstall ejabberd (using release)"
|
|
||||||
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
|
|
||||||
@echo ""
|
|
||||||
@echo " prod Build a production release"
|
|
||||||
@echo " dev Build a development release"
|
|
||||||
@echo " relive Start a live ejabberd in _build/relive/"
|
|
||||||
@echo ""
|
|
||||||
@echo " doap Generate DOAP file"
|
|
||||||
@echo " edoc Generate EDoc documentation [mix]"
|
|
||||||
@echo " options Generate ejabberd_option.erl"
|
|
||||||
@echo " translations Extract translation files"
|
|
||||||
@echo " TAGS Generate tags file for text editors"
|
|
||||||
@echo ""
|
|
||||||
@echo " format Format source code using rebar3_format [rebar3]"
|
|
||||||
@echo " indent Indent source code using erlang-mode [emacs]"
|
|
||||||
@echo ""
|
|
||||||
@echo " dialyzer Run Dialyzer static analyzer"
|
|
||||||
@echo " elvis Run Elvis source code style reviewer [rebar3]"
|
|
||||||
@echo " hooks Run hooks validator"
|
|
||||||
@echo " test Run Common Tests suite [rebar3]"
|
|
||||||
@echo " test-eunit Run EUnit suite [rebar3]"
|
|
||||||
@echo " xref Run cross reference analysis [rebar3]"
|
|
||||||
|
|
||||||
#.
|
|
||||||
#'
|
|
||||||
# vim: foldmarker=#',#. foldmethod=marker:
|
|
||||||
|
265
README.md
265
README.md
@ -1,132 +1,177 @@
|
|||||||
|
ejabberd Community Edition
|
||||||
|
==========================
|
||||||
|
|
||||||
<p align="center">
|
[![Build Status](https://travis-ci.org/processone/ejabberd.svg?branch=master)](https://travis-ci.org/processone/ejabberd) [![Hex version](https://img.shields.io/hexpm/v/ejabberd.svg "Hex version")](https://hex.pm/packages/ejabberd)
|
||||||
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png">
|
|
||||||
</p>
|
ejabberd is a distributed, fault-tolerant technology that allows the creation
|
||||||
<p align="center">
|
of large-scale instant messaging applications. The server can reliably support
|
||||||
<a href="https://github.com/processone/ejabberd/tags" alt="GitHub tag (latest SemVer)">
|
thousands of simultaneous users on a single node and has been designed to
|
||||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=3fb0d2&logoWidth=20" /></a>
|
provide exceptional standards of fault tolerance. As an open source
|
||||||
<a href="https://hex.pm/packages/ejabberd" alt="Hex version">
|
technology, based on industry-standards, ejabberd can be used to build bespoke
|
||||||
<img src="https://img.shields.io/hexpm/v/ejabberd.svg" /></a>
|
solutions very cost effectively.
|
||||||
<a href="https://formulae.brew.sh/formula/ejabberd" alt="homebrew version">
|
|
||||||
<img src="https://img.shields.io/homebrew/v/ejabberd" /></a>
|
|
||||||
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
|
|
||||||
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=ecs&logo=docker" /></a>
|
|
||||||
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
|
|
||||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker" /></a>
|
|
||||||
<br />
|
|
||||||
<a href="https://github.com/processone/ejabberd/actions/workflows/ci.yml" alt="CI">
|
|
||||||
<img src="https://github.com/processone/ejabberd/actions/workflows/ci.yml/badge.svg" /></a>
|
|
||||||
<a href="https://coveralls.io/github/processone/ejabberd?branch=master" alt="Coverage Status">
|
|
||||||
<img src="https://coveralls.io/repos/github/processone/ejabberd/badge.svg?branch=master" /></a>
|
|
||||||
<a href="https://hosted.weblate.org/projects/ejabberd/ejabberd-po/" alt="Translation status">
|
|
||||||
<img src="https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg" /></a>
|
|
||||||
<a href="https://docs.ejabberd.im/" alt="ejabberd Docs">
|
|
||||||
<img src="https://img.shields.io/github/v/tag/processone/docs.ejabberd.im?sort=semver&logo=&label=docs&logoWidth=0" /></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
[ejabberd][im] is an open-source,
|
Key Features
|
||||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
|
||||||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
|
||||||
|
|
||||||
Check the features in [ejabberd.im][im], [ejabberd Docs][features],
|
|
||||||
[ejabberd at ProcessOne][p1home], and the list of [supported protocols in ProcessOne][xeps]
|
|
||||||
and [XMPP.org][xmppej].
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
------------
|
||||||
|
|
||||||
There are several ways to install ejabberd:
|
- **Cross-platform**
|
||||||
|
ejabberd runs under Microsoft Windows and Unix-derived systems such as
|
||||||
|
Linux, FreeBSD and NetBSD.
|
||||||
|
|
||||||
- Source code: compile yourself, see [COMPILE](COMPILE.md)
|
- **Distributed**
|
||||||
- Installers: [ProcessOne Download][p1download] and [GitHub Releases][releases] for releases, [GitHub Actions](https://github.com/processone/ejabberd/actions/workflows/installers.yml) for master branch (run/deb/rpm for x64 and arm64)
|
You can run ejabberd on a cluster of machines and all of them will serve the
|
||||||
- `ecs` container image: [Docker Hub][hubecs] and [Github Packages][packagesecs], see [ecs README][docker-ecs-readme] (for x64)
|
same XMPP domain(s). When you need more capacity you can simply add a new
|
||||||
- `ejabberd` container image: [Github Packages][packages] for releases and master branch, see [CONTAINER](CONTAINER.md) (for x64 and arm64)
|
cheap node to your cluster. Accordingly, you do not need to buy an expensive
|
||||||
- Using your [Operating System package][osp]
|
high-end machine to support tens of thousands concurrent users.
|
||||||
- Using the [Homebrew][homebrew] package manager
|
|
||||||
|
- **Fault-tolerant**
|
||||||
|
You can deploy an ejabberd cluster so that all the information required for
|
||||||
|
a properly working service will be replicated permanently on all nodes. This
|
||||||
|
means that if one of the nodes crashes, the others will continue working
|
||||||
|
without disruption. In addition, nodes also can be added or replaced ‘on
|
||||||
|
the fly’.
|
||||||
|
|
||||||
|
- **Administrator-friendly**
|
||||||
|
ejabberd is built on top of the Open Source Erlang. As a result you do not
|
||||||
|
need to install an external database, an external web server, amongst others
|
||||||
|
because everything is already included, and ready to run out of the box.
|
||||||
|
Other administrator benefits include:
|
||||||
|
- Comprehensive documentation.
|
||||||
|
- Straightforward installers for Linux.
|
||||||
|
- Docker packaging to help with deploy / development on Linux, Windows or MacOS.
|
||||||
|
- Deb and RPM packaging to support most Linux distributions.
|
||||||
|
- Web administration.
|
||||||
|
- Shared roster groups.
|
||||||
|
- Command line administration tool.
|
||||||
|
- Can integrate with existing authentication mechanisms.
|
||||||
|
- Capability to send announce messages.
|
||||||
|
|
||||||
|
- **Internationalized**
|
||||||
|
ejabberd leads in internationalization. Hence it is very well suited in a
|
||||||
|
globalized world. Related features are:
|
||||||
|
- Translated to 25 languages.
|
||||||
|
- Support for IDNA.
|
||||||
|
|
||||||
|
- **Open Standards**
|
||||||
|
ejabberd is the first Open Source Jabber server claiming to fully comply to
|
||||||
|
the XMPP standard.
|
||||||
|
- Fully XMPP-compliant.
|
||||||
|
- XML-based protocol.
|
||||||
|
- Many protocols supported.
|
||||||
|
|
||||||
|
|
||||||
Documentation
|
Additional Features
|
||||||
-------------
|
-------------------
|
||||||
|
|
||||||
Please check the [ejabberd Docs][docs] website.
|
Moreover, ejabberd comes with a wide range of other state-of-the-art features:
|
||||||
|
|
||||||
When compiling from source code, you can get some help with:
|
- **Modularity**
|
||||||
|
- Load only the modules you want.
|
||||||
|
- Extend ejabberd with your own custom modules.
|
||||||
|
|
||||||
./configure --help
|
- **Security**
|
||||||
make help
|
- SASL and STARTTLS for c2s and s2s connections.
|
||||||
|
- STARTTLS and Dialback s2s connections.
|
||||||
|
- Web Admin accessible via HTTPS secure access.
|
||||||
|
|
||||||
Once ejabberd is installed, try:
|
- **Databases**
|
||||||
|
- Internal database for fast deployment (Mnesia).
|
||||||
|
- Native MySQL support.
|
||||||
|
- Native PostgreSQL support.
|
||||||
|
- ODBC data storage support.
|
||||||
|
- Microsoft SQL Server support.
|
||||||
|
|
||||||
ejabberdctl help
|
- **Authentication**
|
||||||
man ejabberd.yml
|
- Internal authentication.
|
||||||
|
- PAM, LDAP and ODBC.
|
||||||
|
- External authentication script.
|
||||||
|
|
||||||
|
- **Others**
|
||||||
|
- Support for virtual hosting.
|
||||||
|
- Compressing XML streams with Stream Compression (XEP-0138).
|
||||||
|
- Statistics via Statistics Gathering (XEP-0039).
|
||||||
|
- IPv6 support both for c2s and s2s connections.
|
||||||
|
- Multi-User Chat module with support for clustering and HTML logging.
|
||||||
|
- Users Directory based on users vCards.
|
||||||
|
- Publish-Subscribe component with support for Personal Eventing.
|
||||||
|
- Support for web clients: HTTP Polling and HTTP Binding (BOSH).
|
||||||
|
- Component support: interface with networks such as AIM, ICQ and MSN.
|
||||||
|
|
||||||
|
|
||||||
|
Quickstart guide
|
||||||
|
----------------
|
||||||
|
|
||||||
|
### 0. Requirements
|
||||||
|
|
||||||
|
To compile ejabberd you need:
|
||||||
|
|
||||||
|
- GNU Make.
|
||||||
|
- GCC.
|
||||||
|
- Libexpat ≥ 1.95.
|
||||||
|
- Libyaml ≥ 0.1.4.
|
||||||
|
- Erlang/OTP ≥ 19.3.
|
||||||
|
- OpenSSL ≥ 1.0.0.
|
||||||
|
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138). Optional.
|
||||||
|
- PAM library. Optional. For Pluggable Authentication Modules (PAM).
|
||||||
|
- ImageMagick's Convert program and Ghostscript fonts. Optional. For CAPTCHA
|
||||||
|
challenges.
|
||||||
|
|
||||||
|
If your system splits packages in libraries and development headers, you must
|
||||||
|
install the development packages also.
|
||||||
|
|
||||||
|
### 1. Compile and install on *nix systems
|
||||||
|
|
||||||
|
To compile ejabberd, execute the following commands. The first one is only
|
||||||
|
necessary if your source tree didn't come with a `configure` script (In this
|
||||||
|
case you need autoconf installed).
|
||||||
|
|
||||||
|
./autogen.sh
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
|
||||||
|
To install ejabberd, run this command with system administrator rights (root
|
||||||
|
user):
|
||||||
|
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
These commands will:
|
||||||
|
|
||||||
|
- Install the configuration files in `/etc/ejabberd/`
|
||||||
|
- Install ejabberd binary, header and runtime files in `/lib/ejabberd/`
|
||||||
|
- Install the administration script: `/sbin/ejabberdctl`
|
||||||
|
- Install ejabberd documentation in `/share/doc/ejabberd/`
|
||||||
|
- Create a spool directory: `/var/lib/ejabberd/`
|
||||||
|
- Create a directory for log files: `/var/log/ejabberd/`
|
||||||
|
|
||||||
|
|
||||||
|
### 2. Start ejabberd
|
||||||
|
|
||||||
|
You can use the `ejabberdctl` command line administration script to
|
||||||
|
start and stop ejabberd. For example:
|
||||||
|
|
||||||
|
ejabberdctl start
|
||||||
|
|
||||||
|
|
||||||
|
For detailed information please refer to the ejabberd Installation and
|
||||||
|
Operation Guide available online and in the `doc` directory of the source
|
||||||
|
tarball.
|
||||||
|
|
||||||
|
|
||||||
Development
|
Development
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Bug reports and features are tracked using [GitHub Issues][issues],
|
In order to assist in the development of ejabberd, and particularly the
|
||||||
please check [CONTRIBUTING](CONTRIBUTING.md) for details.
|
execution of the test suite, a Vagrant environment is available at
|
||||||
|
https://github.com/processone/ejabberd-vagrant-dev.
|
||||||
|
|
||||||
Translations can be improved online [using Weblate][weblate]
|
To start ejabberd in development mode from the repository directory, you can
|
||||||
or in your local machine as explained in [Localization][localization].
|
type a command like:
|
||||||
|
|
||||||
Documentation for developers is available in [ejabberd docs: Developers][docs-dev].
|
EJABBERD_CONFIG_PATH=ejabberd.yml erl -pa ebin -pa deps/*/ebin -pa test -pa deps/elixir/lib/*/ebin/ -s ejabberd
|
||||||
|
|
||||||
There are nightly builds of ejabberd, both for `master` branch and for Pull Requests:
|
Links
|
||||||
- Installers: go to [GitHub Actions: Installers](https://github.com/processone/ejabberd/actions/workflows/installers.yml), open the most recent commit, on the bottom of that commit page, download the `ejabberd-packages.zip` artifact.
|
-----
|
||||||
- `ejabberd` container image: go to [ejabberd Github Packages][packages]
|
|
||||||
|
|
||||||
Security reports or concerns should preferably be reported privately,
|
|
||||||
please send an email to the address: contact at process-one dot net
|
|
||||||
or some other method from [ProcessOne Contact][p1contact].
|
|
||||||
|
|
||||||
For commercial offering and support, including [ejabberd Business Edition][p1home]
|
|
||||||
and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home].
|
|
||||||
|
|
||||||
|
|
||||||
Community
|
|
||||||
---------
|
|
||||||
|
|
||||||
There are several places to get in touch with other ejabberd developers and administrators:
|
|
||||||
|
|
||||||
- ejabberd XMPP chatroom: [ejabberd@conference.process-one.net][muc]
|
|
||||||
- [GitHub Discussions][discussions]
|
|
||||||
- [Stack Overflow][stackoverflow]
|
|
||||||
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING)),
|
|
||||||
and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MIT License.
|
|
||||||
|
|
||||||
|
|
||||||
[discussions]: https://github.com/processone/ejabberd/discussions
|
|
||||||
[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme
|
|
||||||
[docs-dev]: https://docs.ejabberd.im/developer/
|
|
||||||
[docs]: https://docs.ejabberd.im
|
|
||||||
[erlang]: https://www.erlang.org/
|
|
||||||
[features]: https://docs.ejabberd.im/admin/introduction/
|
|
||||||
[fluux]: https://fluux.io/
|
|
||||||
[homebrew]: https://docs.ejabberd.im/admin/install/homebrew/
|
|
||||||
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
|
|
||||||
[im]: https://ejabberd.im/
|
|
||||||
[issues]: https://github.com/processone/ejabberd/issues
|
|
||||||
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
|
||||||
[mqtt]: https://mqtt.org/
|
|
||||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
|
||||||
[osp]: https://docs.ejabberd.im/admin/install/os-package/
|
|
||||||
[p1contact]: https://www.process-one.net/en/company/contact/
|
|
||||||
[p1download]: https://www.process-one.net/en/ejabberd/downloads/
|
|
||||||
[p1home]: https://www.process-one.net/en/ejabberd/
|
|
||||||
[packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd
|
|
||||||
[packagesecs]: https://github.com/processone/docker-ejabberd/pkgs/container/ecs
|
|
||||||
[releases]: https://github.com/processone/ejabberd/releases
|
|
||||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
|
||||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
|
||||||
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
|
||||||
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
|
|
||||||
[xmpp]: https://xmpp.org/
|
|
||||||
[xmppej]: https://xmpp.org/software/servers/ejabberd/
|
|
||||||
|
|
||||||
|
- Documentation: https://docs.ejabberd.im
|
||||||
|
- Community site: https://www.ejabberd.im
|
||||||
|
- ejabberd commercial offering and support: https://www.process-one.net/en/ejabberd
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
{erl_opts, [debug_info]}.
|
|
||||||
{deps, []}.
|
|
@ -1,9 +0,0 @@
|
|||||||
{application, configure_deps,
|
|
||||||
[{description, "A rebar3 plugin to explicitly run configure on dependencies"},
|
|
||||||
{vsn, "0.0.1"},
|
|
||||||
{registered, []},
|
|
||||||
{applications, [kernel, stdlib]},
|
|
||||||
{env,[]},
|
|
||||||
{modules, []},
|
|
||||||
{links, []}
|
|
||||||
]}.
|
|
@ -1,8 +0,0 @@
|
|||||||
-module(configure_deps).
|
|
||||||
|
|
||||||
-export([init/1]).
|
|
||||||
|
|
||||||
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
|
|
||||||
init(State) ->
|
|
||||||
{ok, State1} = configure_deps_prv:init(State),
|
|
||||||
{ok, State1}.
|
|
@ -1,54 +0,0 @@
|
|||||||
-module(configure_deps_prv).
|
|
||||||
|
|
||||||
-export([init/1, do/1, format_error/1]).
|
|
||||||
|
|
||||||
-define(PROVIDER, 'configure-deps').
|
|
||||||
-define(DEPS, [install_deps]).
|
|
||||||
|
|
||||||
%% ===================================================================
|
|
||||||
%% Public API
|
|
||||||
%% ===================================================================
|
|
||||||
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
|
|
||||||
init(State) ->
|
|
||||||
Provider = providers:create([
|
|
||||||
{namespace, default},
|
|
||||||
{name, ?PROVIDER}, % The 'user friendly' name of the task
|
|
||||||
{module, ?MODULE}, % The module implementation of the task
|
|
||||||
{bare, true}, % The task can be run by the user, always true
|
|
||||||
{deps, ?DEPS}, % The list of dependencies
|
|
||||||
{example, "rebar3 configure-deps"}, % How to use the plugin
|
|
||||||
{opts, []}, % list of options understood by the plugin
|
|
||||||
{short_desc, "Explicitly run ./configure for dependencies"},
|
|
||||||
{desc, "A rebar plugin to allow explicitly running ./configure on dependencies. Useful if dependencies might change prior to compilation when configure is run."}
|
|
||||||
]),
|
|
||||||
{ok, rebar_state:add_provider(State, Provider)}.
|
|
||||||
|
|
||||||
|
|
||||||
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
|
|
||||||
do(State) ->
|
|
||||||
Apps = rebar_state:project_apps(State) ++ lists:usort(rebar_state:all_deps(State)),
|
|
||||||
lists:foreach(fun do_app/1, Apps),
|
|
||||||
{ok, State}.
|
|
||||||
|
|
||||||
exec_configure({'configure-deps', Cmd}, Dir) ->
|
|
||||||
rebar_utils:sh(Cmd, [{cd, Dir}, {use_stdout, true}]);
|
|
||||||
exec_configure(_, Acc) -> Acc.
|
|
||||||
|
|
||||||
parse_pre_hooks({pre_hooks, PreHooks}, Acc) ->
|
|
||||||
lists:foldl(fun exec_configure/2, Acc, PreHooks);
|
|
||||||
parse_pre_hooks(_, Acc) -> Acc.
|
|
||||||
|
|
||||||
parse_additions({add, App, Additions}, {MyApp, Dir}) when App == MyApp ->
|
|
||||||
lists:foldl(fun parse_pre_hooks/2, Dir, Additions),
|
|
||||||
{MyApp, Dir};
|
|
||||||
parse_additions(_, Acc) -> Acc.
|
|
||||||
|
|
||||||
do_app(App) ->
|
|
||||||
Dir = rebar_app_info:dir(App),
|
|
||||||
Opts = rebar_app_info:opts(App),
|
|
||||||
Overrides = rebar_opts:get(Opts, overrides),
|
|
||||||
lists:foldl(fun parse_additions/2, {binary_to_atom(rebar_app_info:name(App), utf8), Dir}, Overrides).
|
|
||||||
|
|
||||||
-spec format_error(any()) -> iolist().
|
|
||||||
format_error(Reason) ->
|
|
||||||
io_lib:format("~p", [Reason]).
|
|
10
config/config.exs
Normal file
10
config/config.exs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
use Mix.Config
|
||||||
|
|
||||||
|
# This is standard path in the context of ejabberd release
|
||||||
|
config :ejabberd,
|
||||||
|
file: "config/ejabberd.yml",
|
||||||
|
log_path: 'log/ejabberd.log'
|
||||||
|
|
||||||
|
# Customize Mnesia directory:
|
||||||
|
config :mnesia,
|
||||||
|
dir: 'database/'
|
@ -4,7 +4,9 @@ defmodule Ejabberd.ConfigFile do
|
|||||||
def start do
|
def start do
|
||||||
[loglevel: 4,
|
[loglevel: 4,
|
||||||
log_rotate_size: 10485760,
|
log_rotate_size: 10485760,
|
||||||
|
log_rotate_date: "",
|
||||||
log_rotate_count: 1,
|
log_rotate_count: 1,
|
||||||
|
log_rate_limit: 100,
|
||||||
auth_method: :internal,
|
auth_method: :internal,
|
||||||
max_fsm_queue: 1000,
|
max_fsm_queue: 1000,
|
||||||
language: "en",
|
language: "en",
|
||||||
@ -129,7 +131,7 @@ defmodule Ejabberd.ConfigFile do
|
|||||||
module :mod_register do
|
module :mod_register do
|
||||||
@opts [welcome_message: [
|
@opts [welcome_message: [
|
||||||
subject: "Welcome!",
|
subject: "Welcome!",
|
||||||
body: "Hi.\nWelcome to this XMPP server"
|
body: "Hi.\nWelcome to this XMPP Server"
|
||||||
],
|
],
|
||||||
ip_access: :trusted_network,
|
ip_access: :trusted_network,
|
||||||
access: :register]
|
access: :register]
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
import Config
|
|
||||||
|
|
||||||
rootdefault = case System.get_env("RELIVE", "false") do
|
|
||||||
"true" -> "_build/relive"
|
|
||||||
"false" -> ""
|
|
||||||
end
|
|
||||||
|
|
||||||
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
|
|
||||||
config :ejabberd,
|
|
||||||
file: Path.join(rootpath, "conf/ejabberd.yml"),
|
|
||||||
log_path: Path.join(rootpath, "logs/ejabberd.log")
|
|
||||||
config :mnesia,
|
|
||||||
dir: Path.join(rootpath, "database/")
|
|
||||||
config :exsync,
|
|
||||||
reload_callback: {:ejabberd_admin, :update, []}
|
|
179
configure.ac
179
configure.ac
@ -1,18 +1,16 @@
|
|||||||
# -*- Autoconf -*-
|
# -*- Autoconf -*-
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.59)
|
AC_PREREQ(2.53)
|
||||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 24.10` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 0.0` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||||
REQUIRE_ERLANG_MIN="9.0.5 (Erlang/OTP 20.0)"
|
REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)"
|
||||||
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_AWK
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_MKDIR_P
|
|
||||||
AC_PROG_SED
|
AC_PROG_SED
|
||||||
|
|
||||||
if test "x$GCC" = "xyes"; then
|
if test "x$GCC" = "xyes"; then
|
||||||
@ -21,7 +19,8 @@ fi
|
|||||||
|
|
||||||
# Checks Erlang runtime and compiler
|
# Checks Erlang runtime and compiler
|
||||||
AC_ARG_WITH(erlang,
|
AC_ARG_WITH(erlang,
|
||||||
AS_HELP_STRING([--with-erlang=dir],[search for erlang in dir]),
|
AC_HELP_STRING([--with-erlang=dir],
|
||||||
|
[search for erlang in dir]),
|
||||||
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_erlang" = "X"; then
|
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_erlang" = "X"; then
|
||||||
extra_erl_path=""
|
extra_erl_path=""
|
||||||
else
|
else
|
||||||
@ -29,43 +28,10 @@ else
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_ARG_WITH(rebar,
|
|
||||||
AS_HELP_STRING([--with-rebar=bin],[use as build tool the rebar/rebar3/mix binary specified]),
|
|
||||||
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then
|
|
||||||
rebar="rebar3"
|
|
||||||
else
|
|
||||||
rebar="$with_rebar"
|
|
||||||
fi
|
|
||||||
], [rebar="unconfigured"])
|
|
||||||
|
|
||||||
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
|
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
|
||||||
AC_PATH_TOOL(ERLC, erlc, , [${extra_erl_path}$PATH])
|
AC_PATH_TOOL(ERLC, erlc, , [${extra_erl_path}$PATH])
|
||||||
AC_PATH_TOOL(EPMD, epmd, , [${extra_erl_path}$PATH])
|
AC_PATH_TOOL(EPMD, epmd, , [${extra_erl_path}$PATH])
|
||||||
|
|
||||||
AC_PATH_TOOL(REBAR, rebar, , [${extra_erl_path}$PATH])
|
|
||||||
AC_PATH_TOOL(REBAR3, rebar3, , [${extra_erl_path}$PATH])
|
|
||||||
AC_PATH_TOOL(ELIXIR, elixir, , [${extra_erl_path}$PATH])
|
|
||||||
AC_PATH_TOOL(IEX, iex, , [${extra_erl_path}$PATH])
|
|
||||||
AC_PATH_TOOL(MIX, mix, , [${extra_erl_path}$PATH])
|
|
||||||
|
|
||||||
if test "$rebar" = unconfigured; then
|
|
||||||
if test "x$ELIXIR" = "x" -o "x$IEX" = "x" -o "x$MIX" = "x"; then
|
|
||||||
if test "x$REBAR3" = "x"; then
|
|
||||||
rebar="rebar3"
|
|
||||||
else
|
|
||||||
rebar=$REBAR3
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
rebar=$MIX
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "x$rebar" = "xrebar" -a "x$REBAR" = "x" ; then
|
|
||||||
rebar="./rebar"
|
|
||||||
fi
|
|
||||||
if test "x$rebar" = "xrebar3" -a "x$REBAR3" = "x" ; then
|
|
||||||
rebar="./rebar3"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ERLANG_NEED_ERL
|
AC_ERLANG_NEED_ERL
|
||||||
AC_ERLANG_NEED_ERLC
|
AC_ERLANG_NEED_ERLC
|
||||||
|
|
||||||
@ -91,18 +57,19 @@ fi
|
|||||||
AC_PREFIX_DEFAULT(/usr/local)
|
AC_PREFIX_DEFAULT(/usr/local)
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
vars.config])
|
vars.config
|
||||||
|
src/ejabberd.app.src])
|
||||||
|
|
||||||
AC_ARG_ENABLE(all,
|
AC_ARG_ENABLE(all,
|
||||||
[AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mssql --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])],
|
[AC_HELP_STRING([--enable-all], [same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-tools (useful for Dialyzer checks, default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) odbc=true mssql=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;;
|
yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true tools=true ;;
|
||||||
no) odbc=false mssql=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;;
|
no) odbc=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false tools=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;;
|
||||||
esac],[])
|
esac],[])
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[AS_HELP_STRING([--enable-debug],[enable debug information (default: yes)])],
|
[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) debug=true ;;
|
yes) debug=true ;;
|
||||||
no) debug=false ;;
|
no) debug=false ;;
|
||||||
@ -110,7 +77,7 @@ AC_ARG_ENABLE(debug,
|
|||||||
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(elixir,
|
AC_ARG_ENABLE(elixir,
|
||||||
[AS_HELP_STRING([--enable-elixir],[enable Elixir support in Rebar3 (default: no)])],
|
[AC_HELP_STRING([--enable-elixir], [enable Elixir support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) elixir=true ;;
|
yes) elixir=true ;;
|
||||||
no) elixir=false ;;
|
no) elixir=false ;;
|
||||||
@ -118,7 +85,8 @@ AC_ARG_ENABLE(elixir,
|
|||||||
esac],[if test "x$elixir" = "x"; then elixir=false; fi])
|
esac],[if test "x$elixir" = "x"; then elixir=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(erlang-version-check,
|
AC_ARG_ENABLE(erlang-version-check,
|
||||||
[AS_HELP_STRING([--enable-erlang-version-check],[Check Erlang/OTP version (default: yes)])])
|
[AC_HELP_STRING([--enable-erlang-version-check],
|
||||||
|
[Check Erlang/OTP version (default: yes)])])
|
||||||
case "$enable_erlang_version_check" in
|
case "$enable_erlang_version_check" in
|
||||||
yes|'')
|
yes|'')
|
||||||
ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX])
|
ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX])
|
||||||
@ -129,7 +97,7 @@ case "$enable_erlang_version_check" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
AC_ARG_ENABLE(full_xml,
|
AC_ARG_ENABLE(full_xml,
|
||||||
[AS_HELP_STRING([--enable-full-xml],[use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
|
[AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) full_xml=true ;;
|
yes) full_xml=true ;;
|
||||||
no) full_xml=false ;;
|
no) full_xml=false ;;
|
||||||
@ -138,7 +106,7 @@ esac],[full_xml=false])
|
|||||||
|
|
||||||
ENABLEGROUP=""
|
ENABLEGROUP=""
|
||||||
AC_ARG_ENABLE(group,
|
AC_ARG_ENABLE(group,
|
||||||
[AS_HELP_STRING([--enable-group[[=GROUP]]], [specify the group of the account defined in --enable-user (default: no)])],
|
[AS_HELP_STRING([--enable-group[[[[=GROUP]]]]], [allow this system group to start ejabberd (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) ENABLEGROUP=`groups |head -n 1` ;;
|
yes) ENABLEGROUP=`groups |head -n 1` ;;
|
||||||
no) ENABLEGROUP="" ;;
|
no) ENABLEGROUP="" ;;
|
||||||
@ -150,32 +118,32 @@ if test "$ENABLEGROUP" != ""; then
|
|||||||
AC_SUBST([INSTALLGROUP], [$ENABLEGROUP])
|
AC_SUBST([INSTALLGROUP], [$ENABLEGROUP])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(hipe,
|
||||||
|
[AC_HELP_STRING([--enable-hipe], [compile natively with HiPE, not recommended (default: no)])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) hipe=true ;;
|
||||||
|
no) hipe=false ;;
|
||||||
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-hipe) ;;
|
||||||
|
esac],[hipe=false])
|
||||||
|
|
||||||
AC_ARG_ENABLE(latest_deps,
|
AC_ARG_ENABLE(latest_deps,
|
||||||
[AS_HELP_STRING([--enable-latest-deps],[makes rebar use latest commits for dependencies instead of tagged versions (default: no)])],
|
[AC_HELP_STRING([--enable-latest-deps], [makes rebar use latest commits for dependencies instead of tagged versions (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) latest_deps=true ;;
|
yes) latest_deps=true ;;
|
||||||
no) latest_deps=false ;;
|
no) latest_deps=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-latest-deps) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-latest-deps) ;;
|
||||||
esac],[if test "x$latest_deps" = "x"; then latest_deps=false; fi])
|
esac],[if test "x$latest_deps" = "x"; then latest_deps=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(lua,
|
|
||||||
[AS_HELP_STRING([--enable-lua],[enable Lua support, to import from Prosody (default: no)])],
|
|
||||||
[case "${enableval}" in
|
|
||||||
yes) lua=true ;;
|
|
||||||
no) lua=false ;;
|
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-lua) ;;
|
|
||||||
esac],[if test "x$lua" = "x"; then lua=false; fi])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(mssql,
|
AC_ARG_ENABLE(mssql,
|
||||||
[AS_HELP_STRING([--enable-mssql],[use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
|
[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) mssql=true ;;
|
yes) db_type=mssql; mssql=true ;;
|
||||||
no) mssql=false ;;
|
no) db_type=generic; mssql=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;;
|
||||||
esac],[if test "x$mssql" = "x"; then mssql=false; fi])
|
esac],[db_type=generic])
|
||||||
|
|
||||||
AC_ARG_ENABLE(mysql,
|
AC_ARG_ENABLE(mysql,
|
||||||
[AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])],
|
[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) mysql=true ;;
|
yes) mysql=true ;;
|
||||||
no) mysql=false ;;
|
no) mysql=false ;;
|
||||||
@ -183,7 +151,7 @@ AC_ARG_ENABLE(mysql,
|
|||||||
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
|
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(new_sql_schema,
|
AC_ARG_ENABLE(new_sql_schema,
|
||||||
[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema by default (default: no)])],
|
[AC_HELP_STRING([--enable-new-sql-schema], [use new SQL schema (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) new_sql_schema=true ;;
|
yes) new_sql_schema=true ;;
|
||||||
no) new_sql_schema=false ;;
|
no) new_sql_schema=false ;;
|
||||||
@ -191,7 +159,7 @@ AC_ARG_ENABLE(new_sql_schema,
|
|||||||
esac],[new_sql_schema=false])
|
esac],[new_sql_schema=false])
|
||||||
|
|
||||||
AC_ARG_ENABLE(odbc,
|
AC_ARG_ENABLE(odbc,
|
||||||
[AS_HELP_STRING([--enable-odbc],[enable pure ODBC support (default: no)])],
|
[AC_HELP_STRING([--enable-odbc], [enable pure ODBC support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) odbc=true ;;
|
yes) odbc=true ;;
|
||||||
no) odbc=false ;;
|
no) odbc=false ;;
|
||||||
@ -199,7 +167,7 @@ AC_ARG_ENABLE(odbc,
|
|||||||
esac],[if test "x$odbc" = "x"; then odbc=false; fi])
|
esac],[if test "x$odbc" = "x"; then odbc=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(pam,
|
AC_ARG_ENABLE(pam,
|
||||||
[AS_HELP_STRING([--enable-pam],[enable PAM support (default: no)])],
|
[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) pam=true ;;
|
yes) pam=true ;;
|
||||||
no) pam=false ;;
|
no) pam=false ;;
|
||||||
@ -207,7 +175,7 @@ AC_ARG_ENABLE(pam,
|
|||||||
esac],[if test "x$pam" = "x"; then pam=false; fi])
|
esac],[if test "x$pam" = "x"; then pam=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(pgsql,
|
AC_ARG_ENABLE(pgsql,
|
||||||
[AS_HELP_STRING([--enable-pgsql],[enable PostgreSQL support (default: no)])],
|
[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) pgsql=true ;;
|
yes) pgsql=true ;;
|
||||||
no) pgsql=false ;;
|
no) pgsql=false ;;
|
||||||
@ -215,7 +183,7 @@ AC_ARG_ENABLE(pgsql,
|
|||||||
esac],[if test "x$pgsql" = "x"; then pgsql=false; fi])
|
esac],[if test "x$pgsql" = "x"; then pgsql=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(redis,
|
AC_ARG_ENABLE(redis,
|
||||||
[AS_HELP_STRING([--enable-redis],[enable Redis support (default: no)])],
|
[AC_HELP_STRING([--enable-redis], [enable Redis support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) redis=true ;;
|
yes) redis=true ;;
|
||||||
no) redis=false ;;
|
no) redis=false ;;
|
||||||
@ -223,7 +191,7 @@ AC_ARG_ENABLE(redis,
|
|||||||
esac],[if test "x$redis" = "x"; then redis=false; fi])
|
esac],[if test "x$redis" = "x"; then redis=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(roster_gateway_workaround,
|
AC_ARG_ENABLE(roster_gateway_workaround,
|
||||||
[AS_HELP_STRING([--enable-roster-gateway-workaround],[turn on workaround for processing gateway subscriptions (default: no)])],
|
[AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) roster_gateway_workaround=true ;;
|
yes) roster_gateway_workaround=true ;;
|
||||||
no) roster_gateway_workaround=false ;;
|
no) roster_gateway_workaround=false ;;
|
||||||
@ -231,7 +199,7 @@ AC_ARG_ENABLE(roster_gateway_workaround,
|
|||||||
esac],[roster_gateway_workaround=false])
|
esac],[roster_gateway_workaround=false])
|
||||||
|
|
||||||
AC_ARG_ENABLE(sip,
|
AC_ARG_ENABLE(sip,
|
||||||
[AS_HELP_STRING([--enable-sip],[enable SIP support (default: no)])],
|
[AC_HELP_STRING([--enable-sip], [enable SIP support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) sip=true ;;
|
yes) sip=true ;;
|
||||||
no) sip=false ;;
|
no) sip=false ;;
|
||||||
@ -239,7 +207,7 @@ AC_ARG_ENABLE(sip,
|
|||||||
esac],[if test "x$sip" = "x"; then sip=false; fi])
|
esac],[if test "x$sip" = "x"; then sip=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(sqlite,
|
AC_ARG_ENABLE(sqlite,
|
||||||
[AS_HELP_STRING([--enable-sqlite],[enable SQLite support (default: no)])],
|
[AC_HELP_STRING([--enable-sqlite], [enable SQLite support (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) sqlite=true ;;
|
yes) sqlite=true ;;
|
||||||
no) sqlite=false ;;
|
no) sqlite=false ;;
|
||||||
@ -247,7 +215,7 @@ AC_ARG_ENABLE(sqlite,
|
|||||||
esac],[if test "x$sqlite" = "x"; then sqlite=false; fi])
|
esac],[if test "x$sqlite" = "x"; then sqlite=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(stun,
|
AC_ARG_ENABLE(stun,
|
||||||
[AS_HELP_STRING([--enable-stun],[enable STUN/TURN support (default: yes)])],
|
[AC_HELP_STRING([--enable-stun], [enable STUN/TURN support (default: yes)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) stun=true ;;
|
yes) stun=true ;;
|
||||||
no) stun=false ;;
|
no) stun=false ;;
|
||||||
@ -255,7 +223,7 @@ AC_ARG_ENABLE(stun,
|
|||||||
esac],[if test "x$stun" = "x"; then stun=true; fi])
|
esac],[if test "x$stun" = "x"; then stun=true; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(system_deps,
|
AC_ARG_ENABLE(system_deps,
|
||||||
[AS_HELP_STRING([--enable-system-deps],[makes rebar use locally installed dependencies instead of downloading them (default: no)])],
|
[AC_HELP_STRING([--enable-system-deps], [makes rebar use locally installed dependencies instead of downloading them (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) system_deps=true ;;
|
yes) system_deps=true ;;
|
||||||
no) system_deps=false ;;
|
no) system_deps=false ;;
|
||||||
@ -263,7 +231,7 @@ AC_ARG_ENABLE(system_deps,
|
|||||||
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(tools,
|
AC_ARG_ENABLE(tools,
|
||||||
[AS_HELP_STRING([--enable-tools],[include debugging/development tools (default: no)])],
|
[AC_HELP_STRING([--enable-tools], [build development tools (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) tools=true ;;
|
yes) tools=true ;;
|
||||||
no) tools=false ;;
|
no) tools=false ;;
|
||||||
@ -272,7 +240,7 @@ esac],[if test "x$tools" = "x"; then tools=false; fi])
|
|||||||
|
|
||||||
ENABLEUSER=""
|
ENABLEUSER=""
|
||||||
AC_ARG_ENABLE(user,
|
AC_ARG_ENABLE(user,
|
||||||
[AS_HELP_STRING([--enable-user[[=USER]]], [allow this system user to start ejabberd (default: no)])],
|
[AS_HELP_STRING([--enable-user[[[[=USER]]]]], [allow this system user to start ejabberd (default: no)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) ENABLEUSER=`whoami` ;;
|
yes) ENABLEUSER=`whoami` ;;
|
||||||
no) ENABLEUSER="" ;;
|
no) ENABLEUSER="" ;;
|
||||||
@ -285,76 +253,53 @@ if test "$ENABLEUSER" != ""; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(zlib,
|
AC_ARG_ENABLE(zlib,
|
||||||
[AS_HELP_STRING([--enable-zlib],[enable Stream Compression (XEP-0138) using zlib (default: yes)])],
|
[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
yes) zlib=true ;;
|
yes) zlib=true ;;
|
||||||
no) zlib=false ;;
|
no) zlib=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;;
|
||||||
esac],[if test "x$zlib" = "x"; then zlib=true; fi])
|
esac],[if test "x$zlib" = "x"; then zlib=true; fi])
|
||||||
|
|
||||||
case "`uname`" in
|
if test "$sqlite" = "true"; then
|
||||||
"Darwin")
|
AX_LIB_SQLITE3([3.6.19])
|
||||||
# Darwin (macos) erlang-sqlite is built using amalgamated lib, so no external dependency
|
if test "x$SQLITE3_VERSION" = "x"; then
|
||||||
;;
|
AC_MSG_ERROR(SQLite3 library >= 3.6.19 was not found)
|
||||||
*)
|
fi
|
||||||
if test "$sqlite" = "true"; then
|
fi
|
||||||
AX_LIB_SQLITE3([3.6.19])
|
|
||||||
if test "x$SQLITE3_VERSION" = "x"; then
|
enabled_backends=""
|
||||||
AC_MSG_ERROR(SQLite3 library >= 3.6.19 was not found)
|
for backend in odbc mysql pgsql sqlite redis mssql; do
|
||||||
fi
|
if eval test x\${$backend} = xtrue; then
|
||||||
|
if test "x$enabled_backends" = "x"; then
|
||||||
|
enabled_backends=$backend
|
||||||
|
else
|
||||||
|
enabled_backends="$enabled_backends, $backend"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
done
|
||||||
esac
|
|
||||||
|
|
||||||
AC_MSG_RESULT([build tool to use (change using --with-rebar): $rebar])
|
|
||||||
|
|
||||||
|
AC_SUBST(hipe)
|
||||||
AC_SUBST(roster_gateway_workaround)
|
AC_SUBST(roster_gateway_workaround)
|
||||||
AC_SUBST(new_sql_schema)
|
AC_SUBST(new_sql_schema)
|
||||||
AC_SUBST(full_xml)
|
AC_SUBST(full_xml)
|
||||||
|
AC_SUBST(db_type)
|
||||||
AC_SUBST(odbc)
|
AC_SUBST(odbc)
|
||||||
AC_SUBST(mssql)
|
|
||||||
AC_SUBST(mysql)
|
AC_SUBST(mysql)
|
||||||
AC_SUBST(pgsql)
|
AC_SUBST(pgsql)
|
||||||
AC_SUBST(sqlite)
|
AC_SUBST(sqlite)
|
||||||
AC_SUBST(pam)
|
AC_SUBST(pam)
|
||||||
AC_SUBST(zlib)
|
AC_SUBST(zlib)
|
||||||
AC_SUBST(rebar)
|
|
||||||
AC_SUBST(redis)
|
AC_SUBST(redis)
|
||||||
AC_SUBST(elixir)
|
AC_SUBST(elixir)
|
||||||
AC_SUBST(stun)
|
AC_SUBST(stun)
|
||||||
AC_SUBST(sip)
|
AC_SUBST(sip)
|
||||||
AC_SUBST(debug)
|
AC_SUBST(debug)
|
||||||
AC_SUBST(lua)
|
|
||||||
AC_SUBST(tools)
|
AC_SUBST(tools)
|
||||||
AC_SUBST(latest_deps)
|
AC_SUBST(latest_deps)
|
||||||
AC_SUBST(system_deps)
|
AC_SUBST(system_deps)
|
||||||
AC_SUBST(CFLAGS)
|
AC_SUBST(CFLAGS)
|
||||||
AC_SUBST(CPPFLAGS)
|
AC_SUBST(CPPFLAGS)
|
||||||
AC_SUBST(LDFLAGS)
|
AC_SUBST(LDFLAGS)
|
||||||
|
AC_SUBST(enabled_backends)
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
AS_CASE([$rebar],
|
|
||||||
[*rebar3], [
|
|
||||||
deps=""
|
|
||||||
AS_IF([test "x$stun" = "xfalse"], [deps="stun,$deps"])
|
|
||||||
AS_IF([test "x$sqlite" = "xfalse"], [deps="sqlite3,$deps"])
|
|
||||||
AS_IF([test "x$pgsql" = "xfalse"], [deps="p1_pgsql,$deps"])
|
|
||||||
AS_IF([test "x$mysql" = "xfalse"], [deps="p1_mysql,$deps"])
|
|
||||||
AS_IF([test "x$zlib" = "xfalse"], [deps="ezlib,$deps"])
|
|
||||||
AS_IF([test "x$sip" = "xfalse"], [deps="esip,$deps"])
|
|
||||||
AS_IF([test "x$redis" = "xfalse"], [deps="eredis,$deps"])
|
|
||||||
AS_IF([test "x$pam" = "xfalse"], [deps="epam,$deps"])
|
|
||||||
AS_IF([test "x$deps" = "x"], [],
|
|
||||||
[AC_MSG_NOTICE([unlocking disabled rebar3 dependencies: $deps])
|
|
||||||
$rebar unlock "$deps"])
|
|
||||||
deps=""
|
|
||||||
ERLANG_VERSION=m4_esyscmd([erl -noinput -noshell -eval 'erlang:display(list_to_integer(erlang:system_info(otp_release))), halt().'])
|
|
||||||
AS_IF([test "$ERLANG_VERSION" -lt "21"], [deps="luerl,$deps"])
|
|
||||||
AS_IF([test "$ERLANG_VERSION" -lt "22"], [deps="lager,$deps"])
|
|
||||||
AS_IF([test "$ERLANG_VERSION" -le "23"], [deps="jose,$deps"])
|
|
||||||
AS_IF([test "$ERLANG_VERSION" -ge "27"], [deps="jiffy,$deps"])
|
|
||||||
AS_IF([test "x$deps" = "x"], [],
|
|
||||||
[AC_MSG_NOTICE([unlocking rebar3 dependencies for old Erlang/OTP: $deps])
|
|
||||||
$rebar unlock "$deps"])
|
|
||||||
])
|
|
||||||
|
822
ejabberd.doap
822
ejabberd.doap
@ -1,822 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns="http://usefulinc.com/ns/doap#"
|
|
||||||
xmlns:xmpp="https://linkmauve.fr/ns/xmpp-doap#"
|
|
||||||
xmlns:schema="https://schema.org/">
|
|
||||||
<Project>
|
|
||||||
<name>ejabberd</name>
|
|
||||||
<shortdesc>XMPP Server with MQTT Broker and SIP Service</shortdesc>
|
|
||||||
<description>Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP Server, MQTT Broker, SIP Service)</description>
|
|
||||||
<created>2002-11-16</created>
|
|
||||||
<os>BSD</os>
|
|
||||||
<os>Linux</os>
|
|
||||||
<os>macOS</os>
|
|
||||||
<os>Windows</os>
|
|
||||||
<programming-langauge>Erlang</programming-langauge>
|
|
||||||
<programming-langauge>C</programming-langauge>
|
|
||||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-jabber"/>
|
|
||||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-server"/>
|
|
||||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-xmpp"/>
|
|
||||||
|
|
||||||
<homepage rdf:resource="https://www.ejabberd.im"/>
|
|
||||||
<download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/>
|
|
||||||
<download-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/>
|
|
||||||
<license rdf:resource="https://raw.githubusercontent.com/processone/ejabberd/master/COPYING"/>
|
|
||||||
<schema:logo rdf:resource="https://docs.ejabberd.im/assets/img/footer_logo_e@2x.png"/>
|
|
||||||
<bug-database rdf:resource="https://github.com/processone/ejabberd/issues"/>
|
|
||||||
<support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/>
|
|
||||||
<repository>
|
|
||||||
<GitRepository>
|
|
||||||
<location rdf:resource="https://github.com/processone/ejabberd.git"/>
|
|
||||||
<browse rdf:resource="https://github.com/processone/ejabberd"/>
|
|
||||||
</GitRepository>
|
|
||||||
</repository>
|
|
||||||
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3261"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3920"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3921"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc5766"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc5802"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6120"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6121"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6122"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6455"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc7395"/>
|
|
||||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc7590"/>
|
|
||||||
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
|
|
||||||
<xmpp:version>2.9</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0012.html"/>
|
|
||||||
<xmpp:version>2.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_last</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0013.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since>16.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0016.html"/>
|
|
||||||
<xmpp:version>1.6</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_privacy</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0022.html"/>
|
|
||||||
<xmpp:version>1.4</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0023.html"/>
|
|
||||||
<xmpp:version>1.3</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
|
|
||||||
<xmpp:version>2.4</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_disco</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0033.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since>15.04</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_multicast</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0039.html"/>
|
|
||||||
<xmpp:version>0.6.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_stats</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0045.html"/>
|
|
||||||
<xmpp:version>1.25</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_muc</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0049.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_private</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0050.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_adhoc</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0054.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_vcard</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0055.html"/>
|
|
||||||
<xmpp:version>1.3</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_vcard</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0059.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0060.html"/>
|
|
||||||
<xmpp:version>1.14</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_pubsub</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0065.html"/>
|
|
||||||
<xmpp:version>1.8</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_proxy65</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0077.html"/>
|
|
||||||
<xmpp:version>2.4</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_register</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0078.html"/>
|
|
||||||
<xmpp:version>2.5</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_legacy_auth</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0085.html"/>
|
|
||||||
<xmpp:version>2.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_client_state</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0086.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0092.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_version</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0106.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0114.html"/>
|
|
||||||
<xmpp:version>1.6</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_service</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0115.html"/>
|
|
||||||
<xmpp:version>1.5</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_caps</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0124.html"/>
|
|
||||||
<xmpp:version>1.11</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_bosh</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0133.html"/>
|
|
||||||
<xmpp:version>1.3.0</xmpp:version>
|
|
||||||
<xmpp:since>13.10</xmpp:since>
|
|
||||||
<xmpp:status>complete</xmpp:status>
|
|
||||||
<xmpp:note>mod_configure</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0138.html"/>
|
|
||||||
<xmpp:version>2.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_c2s</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0153.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_vcard</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0156.html"/>
|
|
||||||
<xmpp:version>1.4.0</xmpp:version>
|
|
||||||
<xmpp:since>22.05</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_host_meta</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0157.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_disco</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0160.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0163.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_pubsub</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0170.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0175.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_auth_anonymous</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0176.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_stun</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0185.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_s2s_dialback</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0191.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_blocking</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0198.html"/>
|
|
||||||
<xmpp:version>1.5.2</xmpp:version>
|
|
||||||
<xmpp:since>14.05</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_stream_mgmt</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0199.html"/>
|
|
||||||
<xmpp:version>2.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_ping</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0202.html"/>
|
|
||||||
<xmpp:version>2.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_time</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0203.html"/>
|
|
||||||
<xmpp:version>2.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0205.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0206.html"/>
|
|
||||||
<xmpp:version>1.4</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_bosh</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0212.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0215.html"/>
|
|
||||||
<xmpp:version>0.7</xmpp:version>
|
|
||||||
<xmpp:since>20.04</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_stun_disco</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0216.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0220.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_s2s, mod_s2s_dialback</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0227.html"/>
|
|
||||||
<xmpp:version>1.1</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_piefxis</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0237.html"/>
|
|
||||||
<xmpp:version>1.3</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_roster</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0243.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0248.html"/>
|
|
||||||
<xmpp:version>0.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_pubsub</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0249.html"/>
|
|
||||||
<xmpp:version>1.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_muc</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0270.html"/>
|
|
||||||
<xmpp:version>1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0279.html"/>
|
|
||||||
<xmpp:version>0.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_sic</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
|
|
||||||
<xmpp:version>0.13.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_carboncopy</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0288.html"/>
|
|
||||||
<xmpp:version>1.0.1</xmpp:version>
|
|
||||||
<xmpp:since>24.10</xmpp:since>
|
|
||||||
<xmpp:status>complete</xmpp:status>
|
|
||||||
<xmpp:note>mod_s2s_bidi</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0313.html"/>
|
|
||||||
<xmpp:version>0.6.1</xmpp:version>
|
|
||||||
<xmpp:since>15.06</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mam</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0317.html"/>
|
|
||||||
<xmpp:version>0.1</xmpp:version>
|
|
||||||
<xmpp:since>21.12</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_muc_room, conversejs/prosody compatible</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0328.html"/>
|
|
||||||
<xmpp:version>0.1</xmpp:version>
|
|
||||||
<xmpp:since>19.09</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_jidprep</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0334.html"/>
|
|
||||||
<xmpp:version>0.2</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mam, mod_muc_log, mod_offline</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0352.html"/>
|
|
||||||
<xmpp:version>0.1</xmpp:version>
|
|
||||||
<xmpp:since>14.12</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_client_state</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0355.html"/>
|
|
||||||
<xmpp:version>0.4.1</xmpp:version>
|
|
||||||
<xmpp:since>16.09</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_delegation</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0356.html"/>
|
|
||||||
<xmpp:version>0.4.1</xmpp:version>
|
|
||||||
<xmpp:since>24.10</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_privilege</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0357.html"/>
|
|
||||||
<xmpp:version>0.2</xmpp:version>
|
|
||||||
<xmpp:since>17.08</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_push</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0359.html"/>
|
|
||||||
<xmpp:version>0.5.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mam</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0363.html"/>
|
|
||||||
<xmpp:version>0.2</xmpp:version>
|
|
||||||
<xmpp:since>15.10</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_http_upload</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0368.html"/>
|
|
||||||
<xmpp:version>1.1.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0369.html"/>
|
|
||||||
<xmpp:version>0.14.1</xmpp:version>
|
|
||||||
<xmpp:since>16.03</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mix</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0386.html"/>
|
|
||||||
<xmpp:version>0.3.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0388.html"/>
|
|
||||||
<xmpp:version>0.4.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
|
|
||||||
<xmpp:version>0.2.0</xmpp:version>
|
|
||||||
<xmpp:since>18.03</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_avatar</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0402.html"/>
|
|
||||||
<xmpp:version>1.1.3</xmpp:version>
|
|
||||||
<xmpp:since>23.10</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_private</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0405.html"/>
|
|
||||||
<xmpp:version>0.3.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mix_pam</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0410.html"/>
|
|
||||||
<xmpp:version>1.1.0</xmpp:version>
|
|
||||||
<xmpp:since>18.12</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_muc_room</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0411.html"/>
|
|
||||||
<xmpp:version>0.2.0</xmpp:version>
|
|
||||||
<xmpp:since>18.12</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_private</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0421.html"/>
|
|
||||||
<xmpp:version>0.1.0</xmpp:version>
|
|
||||||
<xmpp:since>23.10</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_muc_occupantid</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0424.html"/>
|
|
||||||
<xmpp:version>0.4.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0425.html"/>
|
|
||||||
<xmpp:version>0.3.0</xmpp:version>
|
|
||||||
<xmpp:since>24.06</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mam</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0440.html"/>
|
|
||||||
<xmpp:version>0.4.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0441.html"/>
|
|
||||||
<xmpp:version>0.2.0</xmpp:version>
|
|
||||||
<xmpp:since></xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>mod_mam</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0474.html"/>
|
|
||||||
<xmpp:version>0.3.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note></xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0480.html"/>
|
|
||||||
<xmpp:version>0.1</xmpp:version>
|
|
||||||
<xmpp:since>24.10</xmpp:since>
|
|
||||||
<xmpp:status>complete</xmpp:status>
|
|
||||||
<xmpp:note>mod_scram_upgrade</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
<implements>
|
|
||||||
<xmpp:SupportedXep>
|
|
||||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
|
|
||||||
<xmpp:version>0.2.0</xmpp:version>
|
|
||||||
<xmpp:since>24.02</xmpp:since>
|
|
||||||
<xmpp:status></xmpp:status>
|
|
||||||
<xmpp:note>, mod_pubsub_serverinfo in ejabberd-contrib.git</xmpp:note>
|
|
||||||
</xmpp:SupportedXep>
|
|
||||||
</implements>
|
|
||||||
</Project>
|
|
||||||
</rdf:RDF>
|
|
@ -6,8 +6,8 @@
|
|||||||
# Required-Stop: $remote_fs $network $named $time
|
# Required-Stop: $remote_fs $network $named $time
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
# Default-Stop: 0 1 6
|
# Default-Stop: 0 1 6
|
||||||
# Short-Description: Starts ejabberd XMPP server
|
# Short-Description: Starts ejabberd jabber server
|
||||||
# Description: Starts ejabberd XMPP server, an XMPP
|
# Description: Starts ejabberd jabber server, an XMPP
|
||||||
# compliant server written in Erlang.
|
# compliant server written in Erlang.
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
|
@ -3,19 +3,16 @@ Description=XMPP Server
|
|||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=notify
|
Type=forking
|
||||||
User=@installuser@
|
User=ejabberd
|
||||||
Group=@installuser@
|
Group=ejabberd
|
||||||
LimitNOFILE=65536
|
LimitNOFILE=65536
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
WatchdogSec=30
|
ExecStart=/bin/sh -c '@ctlscriptpath@/ejabberdctl start && @ctlscriptpath@/ejabberdctl started'
|
||||||
ExecStart=@ctlscriptpath@/ejabberdctl foreground
|
|
||||||
ExecStop=/bin/sh -c '@ctlscriptpath@/ejabberdctl stop && @ctlscriptpath@/ejabberdctl stopped'
|
ExecStop=/bin/sh -c '@ctlscriptpath@/ejabberdctl stop && @ctlscriptpath@/ejabberdctl stopped'
|
||||||
ExecReload=@ctlscriptpath@/ejabberdctl reload_config
|
ExecReload=@ctlscriptpath@/ejabberdctl reload_config
|
||||||
NotifyAccess=all
|
|
||||||
PrivateDevices=true
|
PrivateDevices=true
|
||||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
|
||||||
TimeoutSec=300
|
TimeoutSec=300
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
@ -33,20 +33,11 @@ listen:
|
|||||||
shaper: c2s_shaper
|
shaper: c2s_shaper
|
||||||
access: c2s
|
access: c2s
|
||||||
starttls_required: true
|
starttls_required: true
|
||||||
-
|
|
||||||
port: 5223
|
|
||||||
ip: "::"
|
|
||||||
module: ejabberd_c2s
|
|
||||||
max_stanza_size: 262144
|
|
||||||
shaper: c2s_shaper
|
|
||||||
access: c2s
|
|
||||||
tls: true
|
|
||||||
-
|
-
|
||||||
port: 5269
|
port: 5269
|
||||||
ip: "::"
|
ip: "::"
|
||||||
module: ejabberd_s2s_in
|
module: ejabberd_s2s_in
|
||||||
max_stanza_size: 524288
|
max_stanza_size: 524288
|
||||||
shaper: s2s_shaper
|
|
||||||
-
|
-
|
||||||
port: 5443
|
port: 5443
|
||||||
ip: "::"
|
ip: "::"
|
||||||
@ -111,13 +102,10 @@ access_rules:
|
|||||||
|
|
||||||
api_permissions:
|
api_permissions:
|
||||||
"console commands":
|
"console commands":
|
||||||
from: ejabberd_ctl
|
from:
|
||||||
|
- ejabberd_ctl
|
||||||
who: all
|
who: all
|
||||||
what: "*"
|
what: "*"
|
||||||
"webadmin commands":
|
|
||||||
from: ejabberd_web_admin
|
|
||||||
who: admin
|
|
||||||
what: "*"
|
|
||||||
"admin access":
|
"admin access":
|
||||||
who:
|
who:
|
||||||
access:
|
access:
|
||||||
@ -227,7 +215,6 @@ modules:
|
|||||||
ip_access: trusted_network
|
ip_access: trusted_network
|
||||||
mod_roster:
|
mod_roster:
|
||||||
versioning: true
|
versioning: true
|
||||||
mod_s2s_bidi: {}
|
|
||||||
mod_s2s_dialback: {}
|
mod_s2s_dialback: {}
|
||||||
mod_shared_roster: {}
|
mod_shared_roster: {}
|
||||||
mod_stream_mgmt:
|
mod_stream_mgmt:
|
||||||
|
@ -12,11 +12,25 @@
|
|||||||
#
|
#
|
||||||
#POLL=true
|
#POLL=true
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' SMP: SMP support ([enable|auto|disable])
|
||||||
|
#
|
||||||
|
# Explanation in Erlang/OTP documentation:
|
||||||
|
# enable: starts the Erlang runtime system with SMP support enabled.
|
||||||
|
# This may fail if no runtime system with SMP support is available.
|
||||||
|
# auto: starts the Erlang runtime system with SMP support enabled if it
|
||||||
|
# is available and more than one logical processor are detected.
|
||||||
|
# disable: starts a runtime system without SMP support.
|
||||||
|
#
|
||||||
|
# Default: auto
|
||||||
|
#
|
||||||
|
#SMP=auto
|
||||||
|
|
||||||
#.
|
#.
|
||||||
#' ERL_MAX_PORTS: Maximum number of simultaneously open Erlang ports
|
#' ERL_MAX_PORTS: Maximum number of simultaneously open Erlang ports
|
||||||
#
|
#
|
||||||
# ejabberd consumes two or three ports for every connection, either
|
# ejabberd consumes two or three ports for every connection, either
|
||||||
# from a client or from another XMPP server. So take this into
|
# from a client or from another Jabber server. So take this into
|
||||||
# account when setting this limit.
|
# account when setting this limit.
|
||||||
#
|
#
|
||||||
# Default: 65536 (or 8196 on Windows)
|
# Default: 65536 (or 8196 on Windows)
|
||||||
@ -27,7 +41,7 @@
|
|||||||
#.
|
#.
|
||||||
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
|
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
|
||||||
#
|
#
|
||||||
# If ejabberd is configured to run in cluster, and a firewall is blocking ports,
|
# If Ejabberd is configured to run in cluster, and a firewall is blocking ports,
|
||||||
# it's possible to make Erlang use a defined range of port (instead of dynamic
|
# it's possible to make Erlang use a defined range of port (instead of dynamic
|
||||||
# ports) for node communication.
|
# ports) for node communication.
|
||||||
#
|
#
|
||||||
@ -47,28 +61,10 @@
|
|||||||
#INET_DIST_INTERFACE=127.0.0.1
|
#INET_DIST_INTERFACE=127.0.0.1
|
||||||
|
|
||||||
#.
|
#.
|
||||||
#' ERL_DIST_PORT: Port number for Erlang distribution
|
#' ERL_EPMD_ADDRESS: IP addresses where epmd listens for connections
|
||||||
#
|
|
||||||
# For Erlang distribution, clustering and ejabberdctl usage, the
|
|
||||||
# Erlang VM listens in a random TCP port number, and the Erlang Port
|
|
||||||
# Mapper Daemon (EPMD) is spawned and used to determine this port
|
|
||||||
# number.
|
|
||||||
#
|
|
||||||
# ERL_DIST_PORT can define this port number. In that case, EPMD is
|
|
||||||
# not spawned during ejabberd startup, and ERL_EPMD_ADDRESS is
|
|
||||||
# ignored. ERL_DIST_PORT must be set to the same port number during
|
|
||||||
# ejabberd startup and when calling ejabberdctl. This feature
|
|
||||||
# requires at least Erlang/OTP 23.1.
|
|
||||||
#
|
|
||||||
# Default: not defined
|
|
||||||
#
|
|
||||||
#ERL_DIST_PORT=5210
|
|
||||||
|
|
||||||
#.
|
|
||||||
#' ERL_EPMD_ADDRESS: IP addresses where EPMD listens for connections
|
|
||||||
#
|
#
|
||||||
# This environment variable may be set to a comma-separated
|
# This environment variable may be set to a comma-separated
|
||||||
# list of IP addresses, in which case the EPMD daemon
|
# list of IP addresses, in which case the epmd daemon
|
||||||
# will listen only on the specified address(es) and on the
|
# will listen only on the specified address(es) and on the
|
||||||
# loopback address (which is implicitly added to the list if it
|
# loopback address (which is implicitly added to the list if it
|
||||||
# has not been specified). The default behaviour is to listen on
|
# has not been specified). The default behaviour is to listen on
|
||||||
@ -108,11 +104,10 @@
|
|||||||
#.
|
#.
|
||||||
#' ERL_OPTIONS: Additional Erlang options
|
#' ERL_OPTIONS: Additional Erlang options
|
||||||
#
|
#
|
||||||
# The next variable allows to specify additional options passed to
|
# The next variable allows to specify additional options passed to erlang while
|
||||||
# all commands using erlang interpreter. This applies to starting
|
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
|
||||||
# ejabberd server itself but also auxiliary commands like for example
|
# ejabberd is started from an init.d script options -noshell and -detached are
|
||||||
# starting debug shell. See erl(1) for list of commands that can be
|
# added implicitly. See erl(1) for more info.
|
||||||
# used here.
|
|
||||||
#
|
#
|
||||||
# It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
|
# It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
|
||||||
# want to add local modules in this path.
|
# want to add local modules in this path.
|
||||||
@ -121,20 +116,6 @@
|
|||||||
#
|
#
|
||||||
#ERL_OPTIONS=""
|
#ERL_OPTIONS=""
|
||||||
|
|
||||||
#.
|
|
||||||
#' EJABBERD_OPTS: Additional Erlang options to start ejabberd
|
|
||||||
#
|
|
||||||
# The next variable allows to specify additional options passed to erlang while
|
|
||||||
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
|
|
||||||
# ejabberd is started from an init.d script options -noshell and -detached are
|
|
||||||
# added implicitly. See erl(1) for more info.
|
|
||||||
#
|
|
||||||
# For example you can use value "-heart -env HEART_BEAT_TIMEOUT 120 -env ERL_CRASH_DUMP_SECONDS 60"
|
|
||||||
#
|
|
||||||
# Default: ""
|
|
||||||
#
|
|
||||||
#EJABBERD_OPTS=""
|
|
||||||
|
|
||||||
#.
|
#.
|
||||||
#' ERLANG_NODE: Erlang node name
|
#' ERLANG_NODE: Erlang node name
|
||||||
#
|
#
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
# define default configuration
|
# define default configuration
|
||||||
POLL=true
|
POLL=true
|
||||||
|
SMP=auto
|
||||||
ERL_MAX_PORTS=32000
|
ERL_MAX_PORTS=32000
|
||||||
ERL_PROCESSES=250000
|
ERL_PROCESSES=250000
|
||||||
ERL_MAX_ETS_TABLES=1400
|
ERL_MAX_ETS_TABLES=1400
|
||||||
@ -10,13 +11,10 @@ INET_DIST_INTERFACE=""
|
|||||||
ERLANG_NODE=ejabberd@localhost
|
ERLANG_NODE=ejabberd@localhost
|
||||||
|
|
||||||
# define default environment variables
|
# define default environment variables
|
||||||
[ -z "$SCRIPT" ] && SCRIPT=$0
|
SCRIPT_DIR=$(cd "${0%/*}" && pwd)
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
ERTS_VSN="{{erts_vsn}}"
|
|
||||||
ERL="{{erl}}"
|
ERL="{{erl}}"
|
||||||
|
IEX="{{bindir}}/iex"
|
||||||
EPMD="{{epmd}}"
|
EPMD="{{epmd}}"
|
||||||
IEX="{{iexpath}}"
|
|
||||||
INSTALLUSER="{{installuser}}"
|
INSTALLUSER="{{installuser}}"
|
||||||
|
|
||||||
# check the proper system user is used
|
# check the proper system user is used
|
||||||
@ -50,83 +48,71 @@ while [ $# -gt 0 ]; do
|
|||||||
-l|--logs) LOGS_DIR=$2; shift 2;;
|
-l|--logs) LOGS_DIR=$2; shift 2;;
|
||||||
-f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;;
|
-f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;;
|
||||||
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;;
|
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;;
|
||||||
-d|--config-dir) CONFIG_DIR=$2; shift 2;;
|
-d|--config-dir) ETC_DIR=$2; shift 2;;
|
||||||
-t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;;
|
-t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;;
|
||||||
*) break;;
|
*) break;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# define ejabberd variables if not already defined from the command line
|
# define ejabberd variables if not already defined from the command line
|
||||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
: "${ETC_DIR:="{{sysconfdir}}/ejabberd"}"
|
||||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
: "${LOGS_DIR:="{{localstatedir}}/log/ejabberd"}"
|
||||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
: "${SPOOL_DIR:="{{localstatedir}}/lib/ejabberd"}"
|
||||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
: "${EJABBERD_CONFIG_PATH:="$ETC_DIR/ejabberd.yml"}"
|
||||||
|
: "${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR/ejabberdctl.cfg"}"
|
||||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
# Allows passing extra Erlang command-line arguments in vm.args file
|
||||||
: "${VMARGS:="$CONFIG_DIR/vm.args"}"
|
: "${VMARGS:="$ETC_DIR/vm.args"}"
|
||||||
# shellcheck source=ejabberdctl.cfg.example
|
|
||||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%@*}" ] && ERLANG_NODE="$ERLANG_NODE@$(hostname -s)"
|
|
||||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
: "${EJABBERD_DOC_PATH:="{{docdir}}"}"
|
||||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||||
|
|
||||||
# define erl parameters
|
# define erl parameters
|
||||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||||
fi
|
fi
|
||||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
||||||
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||||
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
||||||
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
|
|
||||||
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
|
|
||||||
fi
|
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -erl_epmd_port $ERL_DIST_PORT -start_epmd false"
|
|
||||||
# if vm.args file exists in config directory, pass it to Erlang VM
|
# if vm.args file exists in config directory, pass it to Erlang VM
|
||||||
[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS"
|
[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS"
|
||||||
ERL_LIBS='{{libdir}}'
|
ERL_LIBS={{libdir}}
|
||||||
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
||||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
ERL_INETRC="$ETC_DIR"/inetrc
|
||||||
|
|
||||||
# define ejabberd parameters
|
# define ejabberd parameters
|
||||||
EJABBERD_OPTS="\
|
EJABBERD_OPTS="$EJABBERD_OPTS\
|
||||||
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
$(sed '/^log_rate_limit/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||||
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||||
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
$(sed '/^log_rotate_date/!d;s/:[ \t]*\(.[^ ]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
|
||||||
$EJABBERD_OPTS"
|
|
||||||
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||||
|
|
||||||
# export global variables
|
# export global variables
|
||||||
export EJABBERD_CONFIG_PATH
|
export EJABBERD_CONFIG_PATH
|
||||||
export EJABBERD_LOG_PATH
|
export EJABBERD_LOG_PATH
|
||||||
|
export EJABBERD_DOC_PATH
|
||||||
export EJABBERD_PID_PATH
|
export EJABBERD_PID_PATH
|
||||||
export ERL_CRASH_DUMP
|
export ERL_CRASH_DUMP
|
||||||
export ERL_EPMD_ADDRESS
|
export ERL_EPMD_ADDRESS
|
||||||
export ERL_DIST_PORT
|
|
||||||
export ERL_INETRC
|
export ERL_INETRC
|
||||||
export ERL_MAX_PORTS
|
export ERL_MAX_PORTS
|
||||||
export ERL_MAX_ETS_TABLES
|
export ERL_MAX_ETS_TABLES
|
||||||
export CONTRIB_MODULES_PATH
|
export CONTRIB_MODULES_PATH
|
||||||
export CONTRIB_MODULES_CONF_DIR
|
export CONTRIB_MODULES_CONF_DIR
|
||||||
export ERL_LIBS
|
export ERL_LIBS
|
||||||
export SCRIPT_DIR
|
|
||||||
|
|
||||||
set_dist_client()
|
|
||||||
{
|
|
||||||
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
|
|
||||||
}
|
|
||||||
|
|
||||||
# run command either directly or via su $INSTALLUSER
|
# run command either directly or via su $INSTALLUSER
|
||||||
exec_cmd()
|
exec_cmd()
|
||||||
{
|
{
|
||||||
case $EXEC_CMD in
|
case $EXEC_CMD in
|
||||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||||
as_current_user) "$@" ;;
|
as_current_user) "$@" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@ -144,6 +130,14 @@ exec_iex()
|
|||||||
# usage
|
# usage
|
||||||
debugwarning()
|
debugwarning()
|
||||||
{
|
{
|
||||||
|
if [ "$OSTYPE" != "cygwin" ] && [ "$OSTYPE" != "win32" ]; then
|
||||||
|
if [ "a$TERM" == "a" ] || [ "$TERM" == "dumb" ] ; then
|
||||||
|
echo "Terminal type not supported."
|
||||||
|
echo "You may have to set the TERM environnement variable to fix this."
|
||||||
|
exit 8
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo ""
|
echo ""
|
||||||
@ -154,16 +148,14 @@ debugwarning()
|
|||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To exit and detach this shell from ejabberd, press:"
|
echo "To detach this shell from ejabberd, press:"
|
||||||
echo " control+g and then q"
|
echo " control+c, control+c"
|
||||||
echo ""
|
echo ""
|
||||||
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
|
||||||
#vt100 echo ""
|
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||||
echo "Press return to continue"
|
echo "Press return to continue"
|
||||||
read -r _
|
read -r input
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -179,70 +171,31 @@ livewarning()
|
|||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To exit and detach this shell from ejabberd, press:"
|
echo "To exit this LIVE mode and stop ejabberd, press:"
|
||||||
echo " control+g and then q"
|
echo " q(). and press the Enter key"
|
||||||
echo ""
|
echo ""
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||||
echo "Press return to continue"
|
echo "Press return to continue"
|
||||||
read -r _
|
read -r input
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_etop_result()
|
|
||||||
{
|
|
||||||
result=$?
|
|
||||||
if [ $result -eq 1 ] ; then
|
|
||||||
echo ""
|
|
||||||
echo "It seems there was some problem running 'ejabberdctl etop'."
|
|
||||||
echo "Is the error message something like this?"
|
|
||||||
echo " Failed to load module 'etop' because it cannot be found..."
|
|
||||||
echo "Then probably ejabberd was compiled with development tools disabled."
|
|
||||||
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
|
|
||||||
echo ""
|
|
||||||
exit $result
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_iex_result()
|
|
||||||
{
|
|
||||||
result=$?
|
|
||||||
if [ $result -eq 127 ] ; then
|
|
||||||
echo ""
|
|
||||||
echo "It seems there was some problem finding 'iex' binary from Elixir."
|
|
||||||
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
|
|
||||||
echo " ./configure"
|
|
||||||
echo "which is equivalent to:"
|
|
||||||
echo " ./configure --with-rebar=rebar3 --disable-elixir"
|
|
||||||
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
|
|
||||||
echo " ./configure --enable-elixir"
|
|
||||||
echo " ./configure --with-rebar=mix"
|
|
||||||
echo ""
|
|
||||||
exit $result
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
help()
|
help()
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
echo "Commands to start an ejabberd node:"
|
echo "Commands to start an ejabberd node:"
|
||||||
echo " start Start in server mode"
|
echo " start Start an ejabberd node in server mode"
|
||||||
echo " foreground Start in server mode (attached)"
|
echo " debug Attach an interactive Erlang shell to a running ejabberd node"
|
||||||
echo " foreground-quiet Start in server mode (attached), show only critical messages"
|
echo " iexdebug Attach an interactive Elixir shell to a running ejabberd node"
|
||||||
echo " live Start in interactive mode, with Erlang shell"
|
echo " live Start an ejabberd node in live (interactive) mode"
|
||||||
echo " iexlive Start in interactive mode, with Elixir shell"
|
echo " iexlive Start an ejabberd node in live (interactive) mode, within an Elixir shell"
|
||||||
echo ""
|
echo " foreground Start an ejabberd node in server mode (attached)"
|
||||||
echo "Commands to interact with a running ejabberd node:"
|
|
||||||
echo " debug Attach an interactive Erlang shell to a running node"
|
|
||||||
echo " iexdebug Attach an interactive Elixir shell to a running node"
|
|
||||||
echo " etop Attach to a running node and start Erlang Top"
|
|
||||||
echo " ping Send ping to the node, returns pong or pang"
|
|
||||||
echo " started|stopped Wait for the node to fully start|stop"
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Optional parameters when starting an ejabberd node:"
|
echo "Optional parameters when starting an ejabberd node:"
|
||||||
echo " --config-dir dir Config ejabberd: $CONFIG_DIR"
|
echo " --config-dir dir Config ejabberd: $ETC_DIR"
|
||||||
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
||||||
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
||||||
echo " --logs dir Directory for logs: $LOGS_DIR"
|
echo " --logs dir Directory for logs: $LOGS_DIR"
|
||||||
@ -252,40 +205,20 @@ help()
|
|||||||
}
|
}
|
||||||
|
|
||||||
# dynamic node name helper
|
# dynamic node name helper
|
||||||
uid() {
|
uid()
|
||||||
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
|
{
|
||||||
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
uuid=$(uuidgen 2>/dev/null)
|
||||||
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||||
N=1
|
[ -z "$uuid" ] && uuid=$(printf "%X" "${RANDOM:-$$}$(date +%M%S)")
|
||||||
PF=$(( $$ % 97 ))
|
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
||||||
while
|
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
||||||
case $# in
|
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
||||||
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
||||||
;;
|
|
||||||
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
|
|
||||||
;;
|
|
||||||
2) NN="${PF}-${N}-${1}@${2}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
N=$(( N + 1 + ( $$ % 5 ) ))
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
|
|
||||||
do :; done
|
|
||||||
echo $NN
|
|
||||||
else
|
|
||||||
# Erlang/OTP 23 or higher: use native dynamic node code
|
|
||||||
# https://www.erlang.org/patches/otp-23.0#OTP-13812
|
|
||||||
if [ "$ERLANG_NODE" != "${ERLANG_NODE%.*}" ]; then
|
|
||||||
echo "undefined@${ERLANG_NODE#*@}"
|
|
||||||
else
|
|
||||||
echo "undefined"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# stop epmd if there is no other running node
|
# stop epmd if there is no other running node
|
||||||
stop_epmd()
|
stop_epmd()
|
||||||
{
|
{
|
||||||
[ -n "$ERL_DIST_PORT" ] && return
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
|
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +226,6 @@ stop_epmd()
|
|||||||
# if all ok, ensure runtime directory exists and make it current directory
|
# if all ok, ensure runtime directory exists and make it current directory
|
||||||
check_start()
|
check_start()
|
||||||
{
|
{
|
||||||
[ -n "$ERL_DIST_PORT" ] && return
|
|
||||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
||||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
||||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
||||||
@ -322,9 +254,7 @@ wait_status()
|
|||||||
if [ $timeout -eq 0 ] ; then
|
if [ $timeout -eq 0 ] ; then
|
||||||
status="$1"
|
status="$1"
|
||||||
else
|
else
|
||||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
|
||||||
-s ejabberd_ctl \
|
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||||
status="$?"
|
status="$?"
|
||||||
fi
|
fi
|
||||||
@ -349,10 +279,6 @@ case $1 in
|
|||||||
check_start
|
check_start
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput
|
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput
|
||||||
;;
|
;;
|
||||||
foreground-quiet)
|
|
||||||
check_start
|
|
||||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput -ejabberd quiet true
|
|
||||||
;;
|
|
||||||
live)
|
live)
|
||||||
livewarning
|
livewarning
|
||||||
check_start
|
check_start
|
||||||
@ -360,49 +286,35 @@ case $1 in
|
|||||||
;;
|
;;
|
||||||
debug)
|
debug)
|
||||||
debugwarning
|
debugwarning
|
||||||
set_dist_client
|
|
||||||
exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE"
|
exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE"
|
||||||
;;
|
;;
|
||||||
etop)
|
etop)
|
||||||
set_dist_client
|
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
||||||
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" -s etop \
|
-s erlang halt -output text
|
||||||
-output text
|
|
||||||
check_etop_result
|
|
||||||
;;
|
;;
|
||||||
iexdebug)
|
iexdebug)
|
||||||
debugwarning
|
debugwarning
|
||||||
set_dist_client
|
|
||||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||||
check_iex_result
|
|
||||||
;;
|
;;
|
||||||
iexlive)
|
iexlive)
|
||||||
livewarning
|
livewarning
|
||||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
||||||
check_iex_result
|
|
||||||
;;
|
;;
|
||||||
ping)
|
ping)
|
||||||
PEER=${2:-$ERLANG_NODE}
|
PEER=${2:-$ERLANG_NODE}
|
||||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||||
set_dist_client
|
|
||||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
||||||
-noinput -hidden \
|
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
|
||||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
|
||||||
-s erlang halt -output text
|
-s erlang halt -output text
|
||||||
;;
|
;;
|
||||||
started)
|
started)
|
||||||
set_dist_client
|
|
||||||
wait_status 0 30 2 # wait 30x2s before timeout
|
wait_status 0 30 2 # wait 30x2s before timeout
|
||||||
;;
|
;;
|
||||||
stopped)
|
stopped)
|
||||||
set_dist_client
|
|
||||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
set_dist_client
|
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
|
||||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
|
||||||
-s ejabberd_ctl \
|
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||||
result=$?
|
result=$?
|
||||||
case $result in
|
case $result in
|
||||||
|
58
elvis.config
58
elvis.config
@ -1,58 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
elvis,
|
|
||||||
[
|
|
||||||
{config,
|
|
||||||
[#{dirs => ["src"],
|
|
||||||
filter => "*.erl",
|
|
||||||
ignore => ['ELDAPv3', eldap_filter_yecc],
|
|
||||||
ruleset => erl_files,
|
|
||||||
rules => [{elvis_text_style, line_length, #{limit => 1000, skip_comments => false}},
|
|
||||||
{elvis_text_style, no_tabs, disable},
|
|
||||||
{elvis_style, atom_naming_convention, disable},
|
|
||||||
{elvis_style, consistent_variable_casing, disable},
|
|
||||||
{elvis_style, dont_repeat_yourself, #{min_complexity => 70}},
|
|
||||||
{elvis_style, export_used_types, disable},
|
|
||||||
{elvis_style, function_naming_convention, disable},
|
|
||||||
{elvis_style, god_modules, #{limit => 300}},
|
|
||||||
{elvis_style, invalid_dynamic_call, disable},
|
|
||||||
{elvis_style, macro_module_names, disable},
|
|
||||||
{elvis_style, macro_names, disable},
|
|
||||||
{elvis_style, max_function_arity, disable}, % #{max_arity => 15}},
|
|
||||||
{elvis_style, nesting_level, disable},
|
|
||||||
{elvis_style, no_author, disable},
|
|
||||||
{elvis_style, no_catch_expressions, disable},
|
|
||||||
{elvis_style, no_debug_call, disable},
|
|
||||||
{elvis_style, no_if_expression, disable},
|
|
||||||
{elvis_style, no_import, disable},
|
|
||||||
{elvis_style, no_match_in_condition, disable},
|
|
||||||
{elvis_style, no_nested_try_catch, disable},
|
|
||||||
{elvis_style, no_single_clause_case, disable},
|
|
||||||
{elvis_style, no_spec_with_records, disable},
|
|
||||||
{elvis_style, no_throw, disable},
|
|
||||||
{elvis_style, operator_spaces, disable},
|
|
||||||
{elvis_style, param_pattern_matching, disable},
|
|
||||||
{elvis_style, private_data_types, disable},
|
|
||||||
{elvis_style, variable_naming_convention, disable}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
%#{dirs => ["include"],
|
|
||||||
% filter => "*.hrl",
|
|
||||||
% ruleset => hrl_files},
|
|
||||||
|
|
||||||
#{dirs => ["."],
|
|
||||||
filter => "Makefile.in",
|
|
||||||
ruleset => makefiles,
|
|
||||||
rules => [{elvis_text_style, line_length, #{limit => 400,
|
|
||||||
skip_comments => false}},
|
|
||||||
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
].
|
|
||||||
|
|
||||||
%% vim: set filetype=erlang tabstop=8:
|
|
@ -1,32 +0,0 @@
|
|||||||
#otp_path: "/usr/lib/erlang"
|
|
||||||
#plt_path: "_build/default/rebar3_24.3.3_plt"
|
|
||||||
#code_reload:
|
|
||||||
# node: ejabberd@localhost
|
|
||||||
apps_dirs:
|
|
||||||
- "_build/default/lib/*"
|
|
||||||
deps_dirs:
|
|
||||||
- "_build/default/lib/*"
|
|
||||||
include_dirs:
|
|
||||||
- "_build/default/lib"
|
|
||||||
- "_build/default/lib/*/include"
|
|
||||||
- "include"
|
|
||||||
macros:
|
|
||||||
- name: DEPRECATED_GET_STACKTRACE
|
|
||||||
- name: HAVE_ERL_ERROR
|
|
||||||
- name: HAVE_URI_STRING
|
|
||||||
- name: OTP_BELOW_27
|
|
||||||
- name: SIP
|
|
||||||
- name: STUN
|
|
||||||
diagnostics:
|
|
||||||
enabled:
|
|
||||||
- crossref
|
|
||||||
disabled:
|
|
||||||
# - dialyzer
|
|
||||||
- unused_includes # Otherwise it complains about unused logger.hrl
|
|
||||||
lenses:
|
|
||||||
disabled:
|
|
||||||
- ct-run-test
|
|
||||||
- function-references
|
|
||||||
- server-info
|
|
||||||
- show-behaviour-usages
|
|
||||||
- suggest-spec
|
|
66
examples/extauth/check_pass_null.pl
Executable file
66
examples/extauth/check_pass_null.pl
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Unix::Syslog qw(:macros :subs);
|
||||||
|
|
||||||
|
my $domain = $ARGV[0] || "example.com";
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
# my $rin = '',$rout;
|
||||||
|
# vec($rin,fileno(STDIN),1) = 1;
|
||||||
|
# $ein = $rin;
|
||||||
|
# my $nfound = select($rout=$rin,undef,undef,undef);
|
||||||
|
|
||||||
|
my $buf = "";
|
||||||
|
syslog LOG_INFO,"waiting for packet";
|
||||||
|
my $nread = sysread STDIN,$buf,2;
|
||||||
|
do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;
|
||||||
|
my $len = unpack "n",$buf;
|
||||||
|
my $nread = sysread STDIN,$buf,$len;
|
||||||
|
|
||||||
|
my ($op,$user,$host,$password) = split /:/,$buf;
|
||||||
|
#$user =~ s/\./\//og;
|
||||||
|
my $jid = "$user\@$domain";
|
||||||
|
my $result;
|
||||||
|
|
||||||
|
syslog(LOG_INFO,"request (%s)", $op);
|
||||||
|
|
||||||
|
SWITCH:
|
||||||
|
{
|
||||||
|
$op eq 'auth' and do
|
||||||
|
{
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
|
||||||
|
$op eq 'setpass' and do
|
||||||
|
{
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
|
||||||
|
$op eq 'isuser' and do
|
||||||
|
{
|
||||||
|
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
|
||||||
|
$op eq 'tryregister' and do
|
||||||
|
{
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
|
||||||
|
$op eq 'removeuser' and do
|
||||||
|
{
|
||||||
|
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
|
||||||
|
$op eq 'removeuser3' and do
|
||||||
|
{
|
||||||
|
$result = 1;
|
||||||
|
},last SWITCH;
|
||||||
|
};
|
||||||
|
my $out = pack "nn",2,$result ? 1 : 0;
|
||||||
|
syswrite STDOUT,$out;
|
||||||
|
}
|
||||||
|
|
||||||
|
closelog;
|
75
examples/mtr/ejabberd
Normal file
75
examples/mtr/ejabberd
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# PROVIDE: ejabberd
|
||||||
|
# REQUIRE: DAEMON
|
||||||
|
# KEYWORD: shutdown
|
||||||
|
#
|
||||||
|
|
||||||
|
HOME=/usr/pkg/jabber D=/usr/pkg/jabber/ejabberd export HOME
|
||||||
|
|
||||||
|
name="ejabberd"
|
||||||
|
rcvar=$name
|
||||||
|
|
||||||
|
if [ -r /etc/rc.conf ]
|
||||||
|
then
|
||||||
|
. /etc/rc.conf
|
||||||
|
else
|
||||||
|
eval ${rcvar}=YES
|
||||||
|
fi
|
||||||
|
|
||||||
|
# $flags from environment overrides ${rcvar}_flags
|
||||||
|
if [ -n "${flags}" ]
|
||||||
|
then
|
||||||
|
eval ${rcvar}_flags="${flags}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
checkyesno()
|
||||||
|
{
|
||||||
|
eval _value=\$${1}
|
||||||
|
case $_value in
|
||||||
|
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) return 0 ;;
|
||||||
|
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1 ;;
|
||||||
|
*)
|
||||||
|
echo "\$${1} is not set properly."
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd=${1:-start}
|
||||||
|
case ${cmd} in
|
||||||
|
force*)
|
||||||
|
cmd=${cmd#force}
|
||||||
|
eval ${rcvar}=YES
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if checkyesno ${rcvar}
|
||||||
|
then
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
case ${cmd} in
|
||||||
|
start)
|
||||||
|
if [ -x $D/src ]; then
|
||||||
|
echo "Starting ${name}."
|
||||||
|
cd $D/src
|
||||||
|
ERL_MAX_PORTS=32000 export ERL_MAX_PORTS
|
||||||
|
ulimit -n $ERL_MAX_PORTS
|
||||||
|
su jabber -c "/usr/pkg/bin/erl -sname ejabberd -s ejabberd -heart -detached -sasl sasl_error_logger '{file, \"ejabberd-sasl.log\"}' &" \
|
||||||
|
1>/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "rpc:call('ejabberd@`hostname -s`', init, stop, [])." | \
|
||||||
|
su jabber -c "/usr/pkg/bin/erl -sname ejabberdstop"
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
echo "rpc:call('ejabberd@`hostname -s`', init, restart, [])." | \
|
||||||
|
su jabber -c "/usr/pkg/bin/erl -sname ejabberdrestart"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
81
examples/mtr/ejabberd-netbsd.sh
Normal file
81
examples/mtr/ejabberd-netbsd.sh
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo '1. fetch, compile, and install erlang'
|
||||||
|
|
||||||
|
if [ ! pkg_info erlang 1>/dev/null 2>&1 ]; then
|
||||||
|
cd /usr/pkgsrc/lang/erlang
|
||||||
|
make fetch-list|sh
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
fi
|
||||||
|
if pkg_info erlang | grep -q erlang-9.1nb1; then
|
||||||
|
else
|
||||||
|
echo "erlang-9.1nb1 not installed" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo '2. install crypt_drv.so'
|
||||||
|
|
||||||
|
if [ ! -d /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib ] ; then
|
||||||
|
mkdir -p /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||||
|
fi
|
||||||
|
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/crypto_drv.so ]; then
|
||||||
|
cp work/otp*/lib/crypto/priv/*/*/crypto_drv.so \
|
||||||
|
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo '3. compile and install elibcrypto.so'
|
||||||
|
|
||||||
|
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/elibcrypto.so ]; then
|
||||||
|
cd /usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/crypto/c_src
|
||||||
|
ld -r -u CRYPTO_set_mem_functions -u MD5 -u MD5_Init -u MD5_Update \
|
||||||
|
-u MD5_Final -u SHA1 -u SHA1_Init -u SHA1_Update -u SHA1_Final \
|
||||||
|
-u des_set_key -u des_ncbc_encrypt -u des_ede3_cbc_encrypt \
|
||||||
|
-L/usr/lib -lcrypto -o ../priv/obj/i386--netbsdelf/elibcrypto.o
|
||||||
|
cc -shared \
|
||||||
|
-L/usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/erl_interface/obj/i386--netbsdelf \
|
||||||
|
-o ../priv/obj/i386--netbsdelf/elibcrypto.so \
|
||||||
|
../priv/obj/i386--netbsdelf/elibcrypto.o -L/usr/lib -lcrypto
|
||||||
|
cp ../priv/obj/i386--netbsdelf/elibcrypto.so \
|
||||||
|
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo '4. compile and install ssl_esock'
|
||||||
|
|
||||||
|
if [ ! -f /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/bin/ssl_esock ]; then
|
||||||
|
cd /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/obj/
|
||||||
|
make
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo '5. initial ejabberd configuration'
|
||||||
|
|
||||||
|
cd /usr/pkg/jabber/ejabberd/src
|
||||||
|
./configure
|
||||||
|
|
||||||
|
|
||||||
|
echo '6. edit ejabberd Makefiles'
|
||||||
|
|
||||||
|
for M in Makefile mod_*/Makefile; do
|
||||||
|
if [ ! -f $M.orig ]; then
|
||||||
|
mv $M $M.orig
|
||||||
|
sed -e s%/usr/local%/usr/pkg%g < $M.orig > $M
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
echo '7. compile ejabberd'
|
||||||
|
|
||||||
|
gmake
|
||||||
|
for A in mod_muc mod_pubsub; do
|
||||||
|
(cd $A; gmake)
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
echo ''
|
||||||
|
echo 'now edit ejabberd.cfg'
|
||||||
|
echo ''
|
||||||
|
echo 'to start ejabberd: erl -sname ejabberd -s ejabberd'
|
65
examples/mtr/ejabberd.cfg
Normal file
65
examples/mtr/ejabberd.cfg
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
% jabber.dbc.mtview.ca.us
|
||||||
|
|
||||||
|
override_acls.
|
||||||
|
|
||||||
|
{acl, admin, {user, "mrose", "jabber.dbc.mtview.ca.us"}}.
|
||||||
|
|
||||||
|
|
||||||
|
{access, announce, [{allow, admin},
|
||||||
|
{deny, all}]}.
|
||||||
|
{access, c2s, [{deny, blocked},
|
||||||
|
{allow, all}]}.
|
||||||
|
{access, c2s_shaper, [{none, admin},
|
||||||
|
{normal, all}]}.
|
||||||
|
{access, configure, [{allow, admin},
|
||||||
|
{deny, all}]}.
|
||||||
|
{access, disco_admin, [{allow, admin},
|
||||||
|
{deny, all}]}.
|
||||||
|
{access, muc_admin, [{allow, admin},
|
||||||
|
{deny, all}]}.
|
||||||
|
{access, register, [{deny, all}]}.
|
||||||
|
{access, s2s_shaper, [{fast, all}]}.
|
||||||
|
|
||||||
|
|
||||||
|
{auth_method, internal}.
|
||||||
|
{host, "jabber.dbc.mtview.ca.us"}.
|
||||||
|
{outgoing_s2s_port, 5269}.
|
||||||
|
{shaper, normal, {maxrate, 1000}}.
|
||||||
|
{shaper, fast, {maxrate, 50000}}.
|
||||||
|
{welcome_message, none}.
|
||||||
|
|
||||||
|
|
||||||
|
{listen, [{5222, ejabberd_c2s,
|
||||||
|
[{access, c2s},
|
||||||
|
{shaper, c2s_shaper}]},
|
||||||
|
{5223, ejabberd_c2s,
|
||||||
|
[{access, c2s},
|
||||||
|
{shaper, c2s_shaper},
|
||||||
|
{ssl, [{certfile, "/etc/openssl/certs/ejabberd.pem"}]}]},
|
||||||
|
{5269, ejabberd_s2s_in,
|
||||||
|
[{shaper, s2s_shaper}]}]}.
|
||||||
|
|
||||||
|
|
||||||
|
{modules, [
|
||||||
|
{mod_register, []},
|
||||||
|
{mod_roster, []},
|
||||||
|
{mod_privacy, []},
|
||||||
|
{mod_configure, []},
|
||||||
|
{mod_disco, []},
|
||||||
|
{mod_stats, []},
|
||||||
|
{mod_vcard, []},
|
||||||
|
{mod_offline, []},
|
||||||
|
{mod_echo, [{host, "echo.jabber.dbc.mtview.ca.us"}]},
|
||||||
|
{mod_private, []},
|
||||||
|
{mod_muc, []},
|
||||||
|
{mod_pubsub, []},
|
||||||
|
{mod_time, []},
|
||||||
|
{mod_last, []},
|
||||||
|
{mod_version, []}
|
||||||
|
]}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% Local Variables:
|
||||||
|
% mode: erlang
|
||||||
|
% End:
|
77
examples/transport-configs/configs/aim-transport.xml
Normal file
77
examples/transport-configs/configs/aim-transport.xml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<!-- aim-transport.xml -->
|
||||||
|
|
||||||
|
<jabber>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
You need to add elogger and rlogger entries when using ejabberd.
|
||||||
|
In this case the transport will do the logging.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<log id='elogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype/>
|
||||||
|
<format>%d: [%t] (%h): %s</format>
|
||||||
|
<file>/var/log/jabber/aim-transport-error.log</file>
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<log id='rlogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype>record</logtype>
|
||||||
|
<format>%d %h %s</format>
|
||||||
|
<file>/var/log/jabber/aim-transport-record.log</file>
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ejabberd do not provide XDB services.
|
||||||
|
xdb_file.so is loaded in to handle all XDB requests.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<xdb id="xdb">
|
||||||
|
<host/>
|
||||||
|
<load>
|
||||||
|
<xdb_file>/usr/local/lib/jabber/libjabberdxdbfile.so</xdb_file> <!-- This file is part of jabberd-1.4.x. -->
|
||||||
|
</load>
|
||||||
|
<xdb_file xmlns="jabber:config:xdb_file">
|
||||||
|
<spool><jabberd:cmdline flag='s'>/var/spool/jabber</jabberd:cmdline></spool>
|
||||||
|
</xdb_file>
|
||||||
|
</xdb>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Make sure that all host names here are resolveable via DNS if you
|
||||||
|
want the transport to be available to the public.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id='aim.SERVER.COM'>
|
||||||
|
<!-- aim-transport configuration. -->
|
||||||
|
<aimtrans xmlns='jabber:config:aimtrans'>
|
||||||
|
<vCard>
|
||||||
|
<FN>AIM/ICQ Transport</FN>
|
||||||
|
<DESC>This is the AIM/ICQ Transport.</DESC>
|
||||||
|
<MAIL>EMAIL@ADDRESS.COM</MAIL>
|
||||||
|
<URL>http://aim-transport.jabberstudio.org/</URL>
|
||||||
|
</vCard>
|
||||||
|
<charset>cp1252</charset>
|
||||||
|
</aimtrans>
|
||||||
|
<!-- aim-transport module. -->
|
||||||
|
<load>
|
||||||
|
<aim_transport>/usr/local/lib/jabber/aim-transport.so</aim_transport>
|
||||||
|
</load>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The settings below have to match the settings you made
|
||||||
|
in your ejabberd.cfg configuration file.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="icq-linker">
|
||||||
|
<uplink/>
|
||||||
|
<connect>
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>5233</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
</connect>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<pidfile>/var/run/jabber/aim-transport.pid</pidfile>
|
||||||
|
|
||||||
|
</jabber>
|
136
examples/transport-configs/configs/ile.xml
Normal file
136
examples/transport-configs/configs/ile.xml
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
<!-- ile.xml -->
|
||||||
|
|
||||||
|
<config>
|
||||||
|
<jabber>
|
||||||
|
<server>127.0.0.1</server>
|
||||||
|
<port>5238</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
<service>ile.SERVER.COM</service>
|
||||||
|
<connectsleep>7</connectsleep> <!-- seconds to wait if we get disconnected -->
|
||||||
|
<language>en</language>
|
||||||
|
<vCard>
|
||||||
|
<FN>I Love Email</FN>
|
||||||
|
<DESC>With this service you can receive email notifications.
|
||||||
|
|
||||||
|
Security warning: Be careful when using this. Your password will travel in clear from your client to your jabber server if you don't use SSL and it will probably travel in clear from the jabber server to your email server. Use with care. This shouldn't be an issue in your Intranet, but it is if you use an ILE installed in a foreign jabber server.</DESC>
|
||||||
|
<MAIL>EMAIL@ADDRESS.COM</MAIL>
|
||||||
|
<URL>http://ile.jabberstudio.org/</URL>
|
||||||
|
</vCard>
|
||||||
|
</jabber>
|
||||||
|
|
||||||
|
<debug>
|
||||||
|
<file>/var/log/jabber/ile.log</file>
|
||||||
|
<level>1</level> <!-- man Net::Jabber::Debug -->
|
||||||
|
</debug>
|
||||||
|
|
||||||
|
<mail>
|
||||||
|
<checkinterval>10</checkinterval> <!-- in minutes -->
|
||||||
|
<timeout>20</timeout> <!-- timeout for IMAP/POP connection, in seconds -->
|
||||||
|
</mail>
|
||||||
|
|
||||||
|
<files>
|
||||||
|
<users>/var/spool/jabber/ile.SERVER.COM/users.db</users>
|
||||||
|
<passwords>/var/spool/jabber/ile.SERVER.COM/passwords.db</passwords>
|
||||||
|
<hosts>/var/spool/jabber/ile.SERVER.COM/hosts.db</hosts>
|
||||||
|
<types>/var/spool/jabber/ile.SERVER.COM/types.db</types>
|
||||||
|
<notifyxa>/var/spool/jabber/ile.SERVER.COM/notifyxa.db</notifyxa>
|
||||||
|
<notifydnd>/var/spool/jabber/ile.SERVER.COM/notifydnd.db</notifydnd>
|
||||||
|
<urls>/var/spool/jabber/ile.SERVER.COM/urls.db</urls>
|
||||||
|
</files>
|
||||||
|
|
||||||
|
<form>
|
||||||
|
<en>
|
||||||
|
<instructions>Please fill in the fields,according to your email account settings and notification preferences</instructions>
|
||||||
|
<title>ILE: Email notification service</title>
|
||||||
|
<email_options>Email account settings</email_options>
|
||||||
|
<user>Username</user>
|
||||||
|
<pass>Password</pass>
|
||||||
|
<host>Hostname</host>
|
||||||
|
<type>Type</type>
|
||||||
|
<newmail>You have received NUM email messages since last time I checked, which was CHECKINTERVAL minutes ago.</newmail>
|
||||||
|
<errorcheck>There was an error while trying to check mail for ACCOUNT.</errorcheck>
|
||||||
|
<notify_options>Notification Options</notify_options>
|
||||||
|
<notifyxa>Notify even when Xtended Away (XA)</notifyxa>
|
||||||
|
<notifydnd>Notify even when Do Not Disturb (DND)</notifydnd>
|
||||||
|
<webmail_url>Webmail URL</webmail_url>
|
||||||
|
<webmail_login>Login to ACCOUNT</webmail_login>
|
||||||
|
<iledesc>ILE: an email notifier component: http://ile.jabberstudio.org</iledesc>
|
||||||
|
</en>
|
||||||
|
|
||||||
|
<es>
|
||||||
|
<instructions>Por favor, rellene los campos del formulario.</instructions>
|
||||||
|
<title>ILE: Servicio de notificación de correo</title>
|
||||||
|
<email_options>Configuración de la cuenta de correo</email_options>
|
||||||
|
<user>Usuario</user>
|
||||||
|
<pass>Clave</pass>
|
||||||
|
<host>Host</host>
|
||||||
|
<type>Tipo</type>
|
||||||
|
<newmail>Ha recibido NUM email(s) desde la última comprobación que fue hace CHECKINTERVAL minutos</newmail>
|
||||||
|
<errorcheck>Ha habido un error en la comprobación del correo para la cuenta ACCOUNT.</errorcheck>
|
||||||
|
<notify_options>Opciones de notificación</notify_options>
|
||||||
|
<notifyxa>Notificar incluso si muy ausente (XA)</notifyxa>
|
||||||
|
<notifydnd>Notificar incluso si no molestar (DND)</notifydnd>
|
||||||
|
<webmail_url>Webmail URL</webmail_url>
|
||||||
|
<webmail_login>Leer correo de ACCOUNT</webmail_login>
|
||||||
|
<iledesc>ILE: un notificador de nuevo email - http://ile.jabberstudio.org</iledesc>
|
||||||
|
</es>
|
||||||
|
|
||||||
|
<ca>
|
||||||
|
<instructions>Ompli els camps del formulari.</instructions>
|
||||||
|
<title>ILE: Servei de notificació de nou email</title>
|
||||||
|
<email_options>Dades del compte de mail</email_options>
|
||||||
|
<user>Usuari</user>
|
||||||
|
<pass>Clau</pass>
|
||||||
|
<host>Host</host>
|
||||||
|
<type>Tipus</type>
|
||||||
|
<newmail>Ha rebut NUM email(s) des de la última comprobació que va ser fa CHECKINTERVAL minuts.</newmail>
|
||||||
|
<errorcheck>S'ha produit un error en la comprobació del correu per al compte ACCOUNT.</errorcheck>
|
||||||
|
<notify_options>Opcions de notificació</notify_options>
|
||||||
|
<notifyxa>Notificar si molt absent (XA)</notifyxa>
|
||||||
|
<notifydnd>Notificar si no molestar (DND)</notifydnd>
|
||||||
|
<webmail_url>Webmail URL</webmail_url>
|
||||||
|
<webmail_login>Llegir correu de ACCOUNT</webmail_login>
|
||||||
|
<iledesc>ILE: un notificador de nou email - http://ile.jabberstudio.org</iledesc>
|
||||||
|
</ca>
|
||||||
|
|
||||||
|
<ro>
|
||||||
|
<!-- Contributed by Adrian Rappa -->
|
||||||
|
<instructions>Va rog completati urmatoarele campuri</instructions>
|
||||||
|
<title>I Love Email: new email notification service</title>
|
||||||
|
<email_options>Email account settings</email_options>
|
||||||
|
<user>Nume utilizator</user>
|
||||||
|
<pass>Parola</pass>
|
||||||
|
<host>Nume gazda</host>
|
||||||
|
<type>Tip</type>
|
||||||
|
<newmail>Ati primit NUM mesaj(e) de la ultima verificare, care a fost acum CHECKINTERVAL minute.</newmail>
|
||||||
|
<errorcheck>A fost eroare in timp ce incercam sa verific posta pentru ACCOUNT.</errorcheck>
|
||||||
|
<notify_options>Notification Options</notify_options>
|
||||||
|
<notifyxa>Notify even when Xtended Away (XA)</notifyxa>
|
||||||
|
<notifydnd>Notify even when Do Not Disturb (DND)</notifydnd>
|
||||||
|
<webmail_url>Webmail URL</webmail_url>
|
||||||
|
<webmail_login>Login to ACCOUNT</webmail_login>
|
||||||
|
<iledesc>ILE: an email notifier component: http://ile.jabberstudio.org</iledesc>
|
||||||
|
</ro>
|
||||||
|
|
||||||
|
<nl>
|
||||||
|
<!-- Contributed by Sander Devrieze -->
|
||||||
|
<instructions>Vul volgende velden in.</instructions>
|
||||||
|
<title>ILE: Dienst voor e-mailnotificaties</title>
|
||||||
|
<email_options>Instellingen van e-mailaccount</email_options>
|
||||||
|
<user>Gebruikersnaam</user>
|
||||||
|
<pass>Wachtwoord</pass>
|
||||||
|
<host>Inkomende mailserver</host>
|
||||||
|
<type>Type verbinding</type>
|
||||||
|
<newmail>U hebt NUM berichten ontvangen sinds CHECKINTERVAL minuten geleden.</newmail>
|
||||||
|
<errorcheck>Fout tijdens controle op nieuwe e-mails bij ACCOUNT. ILE zal deze account niet meer opnieuw controleren tot u uw registratiegegevens wijzigt of opnieuw aanmeldt.</errorcheck>
|
||||||
|
<notify_options>Notificatie-instellingen</notify_options>
|
||||||
|
<notifyxa>Notificeer ook in de status Niet Beschikbaar (XA)</notifyxa>
|
||||||
|
<notifydnd>Notificeer ook in de status Niet Storen (DND)</notifydnd>
|
||||||
|
<webmail_url>URL van webmail</webmail_url>
|
||||||
|
<webmail_login>Aanmelden op ACCOUNT</webmail_login>
|
||||||
|
<iledesc>ILE: een dienst om e-mailnotificaties te ontvangen: http://ile.jabberstudio.org</iledesc>
|
||||||
|
</nl>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</config>
|
149
examples/transport-configs/configs/jabber-gg-transport.xml
Normal file
149
examples/transport-configs/configs/jabber-gg-transport.xml
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
<jggtrans>
|
||||||
|
|
||||||
|
<service jid="gg.SERVER.COM"/>
|
||||||
|
|
||||||
|
<!-- This connects the jabber-gg-transport process to ejabberd. -->
|
||||||
|
<connect id="gglinker">
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>5237</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
</connect>
|
||||||
|
|
||||||
|
<register>
|
||||||
|
<!-- This tag contains the message displayed to users at registration time.
|
||||||
|
You can use <p/> and/or <br/> to break lines. Multiple spaces and newlines
|
||||||
|
are converted to just one, so formatting of config file doesn't really matter. -->
|
||||||
|
<instructions>
|
||||||
|
Fill in your GG number (after "username")
|
||||||
|
and password to register on the transport.
|
||||||
|
<p/>To change your information in the GaduGadu directory you need to fill in the other fields.
|
||||||
|
<p/>To remove registration you need to leave the form blank.
|
||||||
|
</instructions>
|
||||||
|
</register>
|
||||||
|
|
||||||
|
<search>
|
||||||
|
<!-- This tag contains the message displayed to users at search time. -->
|
||||||
|
<instructions>
|
||||||
|
To search people:<br/>
|
||||||
|
First fill in surname or family name, nickname, city, birthyear or range of birthyears (eg. 1950-1960)
|
||||||
|
and gender (you may fill in more fields at once).<br/>
|
||||||
|
or<br/>
|
||||||
|
Fill in phone number<br/>
|
||||||
|
or<br/>
|
||||||
|
Fill in the GG number of the person you are searching.
|
||||||
|
</instructions>
|
||||||
|
</search>
|
||||||
|
|
||||||
|
<gateway>
|
||||||
|
<!-- This is message, that may be displayed to user when adding gg contact. -->
|
||||||
|
<desc>Please fill in the GaduGadu number of the person you want to add.</desc>
|
||||||
|
<!-- And this is the prompt for GG number. -->
|
||||||
|
<prompt>GG Nummer</prompt>
|
||||||
|
</gateway>
|
||||||
|
|
||||||
|
<vCard>
|
||||||
|
<FN>Gadu-Gadu Transport</FN>
|
||||||
|
<DESC>This is the Gadu-Gadu Transport.</DESC>
|
||||||
|
<EMAIL>EMAIL@ADDRESS.COM</EMAIL>
|
||||||
|
<URL>http://www.jabberstudio.org/projects/jabber-gg-transport/</URL>
|
||||||
|
</vCard>
|
||||||
|
|
||||||
|
<!-- Default user locale (language).
|
||||||
|
Empty means system locale setting,
|
||||||
|
no (or commented-out) <default_locale> tag means no translations. -->
|
||||||
|
<!-- <default_locale>pl_PL</default_locale> -->
|
||||||
|
|
||||||
|
<!-- Logger configuration.
|
||||||
|
You may configure one logger of type "syslog" and/or one of type "file".
|
||||||
|
You may also not configure logging at all. -->
|
||||||
|
<log type="syslog" facility="local0"/>
|
||||||
|
<log type="file">/var/log/jabber/jabber-gg-transport.log</log>
|
||||||
|
|
||||||
|
<!-- Uncomment this, if you want proxy to be used for Gadu-Gadu connection. -->
|
||||||
|
<!--
|
||||||
|
<proxy>
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>8080</port>
|
||||||
|
</proxy>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- You can change these values according to your needs. -->
|
||||||
|
<conn_timeout>60</conn_timeout>
|
||||||
|
<ping_interval>10</ping_interval>
|
||||||
|
|
||||||
|
<!-- Gadu-Gadu server doesn't seem to answer pings anymore :-(
|
||||||
|
So let's give it 10 year :-) -->
|
||||||
|
<pong_timeout>315360000</pong_timeout>
|
||||||
|
|
||||||
|
<!-- This time after disconnection from Gadu-Gadu server the transport
|
||||||
|
will try to connect again. -->
|
||||||
|
<reconnect>300</reconnect>
|
||||||
|
|
||||||
|
<!-- How long to wait before restart, after jabber server connection is broken
|
||||||
|
negative value means, that jggtrans should terminate. -->
|
||||||
|
<restart_timeout>60</restart_timeout>
|
||||||
|
|
||||||
|
<!-- Delay between the unavailable presence is received from user and loggin out
|
||||||
|
from Gadu-Gadu - for nice <presence type="invisible"/> support. -->
|
||||||
|
<disconnect_delay>5</disconnect_delay>
|
||||||
|
|
||||||
|
<!-- list of Gadu-Gadu servers to use.
|
||||||
|
<hub/> means "use GG hub to find server"
|
||||||
|
<server/> tag should contain server address and may contain "port"
|
||||||
|
attribute with port number. When TLS is available (supported by libgadu)
|
||||||
|
it will be used unless "tls" attribute is set to "no". Please notice,
|
||||||
|
that not all servers will accept TLS connections.
|
||||||
|
Servers (including hub) are tried in order as they appear in <servers/>
|
||||||
|
element.
|
||||||
|
A reasonable default server list is hardcoded in jggtrans.
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
<servers>
|
||||||
|
<hub/>
|
||||||
|
<server port="443">217.17.41.90</server>
|
||||||
|
<server tls="no">217.17.41.85</server>
|
||||||
|
<server tls="no">217.17.41.88</server>
|
||||||
|
</servers>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Spool directory. This is the place, where user info will be stored. -->
|
||||||
|
<!-- Be careful about permissions - users' Gadu-Gadu passwords are stored there. -->
|
||||||
|
<spool>/var/spool/jabber/gg.SERVER.COM/</spool>
|
||||||
|
|
||||||
|
<!-- Where to store pid file. This tag is optional. -->
|
||||||
|
<pidfile>/var/run/jabber/jabber-gg-transport.pid</pidfile>
|
||||||
|
|
||||||
|
<!-- jid allowed to do some administrative task (eg. discovering online users).
|
||||||
|
May be used multiple times. -->
|
||||||
|
<admin>GG_TRANSPORT_ADMIN@SERVER.COM</admin>
|
||||||
|
|
||||||
|
<!-- ACL gives detailed access control to the transport. -->
|
||||||
|
<acl>
|
||||||
|
<!-- Example entries: -->
|
||||||
|
|
||||||
|
<allow who="admin@SERVER.COM" what="iq/query?xmlns=http://jabber.org/protocol/stats"/>
|
||||||
|
<!-- will allow statistics gathering to admin@SERVER.COM -->
|
||||||
|
|
||||||
|
<deny who="*" what="iq/query?xmlns=http://jabber.org/protocol/stats"/>
|
||||||
|
<!-- will deny statistics gathering for anybody else -->
|
||||||
|
|
||||||
|
<!-- <allow who="*@SERVER.COM"/> -->
|
||||||
|
<!-- will allow anything else to users from "SERVER.COM" -->
|
||||||
|
|
||||||
|
<!-- <deny what="iq/query?xmlns=jabber:x:register"/> -->
|
||||||
|
<!-- will deny registration for all other users -->
|
||||||
|
|
||||||
|
<!-- <allow what="presence"/> -->
|
||||||
|
<!-- allow presence from anybody -->
|
||||||
|
|
||||||
|
<!-- <allow what="iq"/> -->
|
||||||
|
<!-- allow iq from anybody -->
|
||||||
|
|
||||||
|
<!-- <allow what="message"/> -->
|
||||||
|
<!-- allow message from anybody -->
|
||||||
|
|
||||||
|
<!-- <deny/> -->
|
||||||
|
<!-- will deny anything else -->
|
||||||
|
</acl>
|
||||||
|
|
||||||
|
</jggtrans>
|
128
examples/transport-configs/configs/jit.xml
Normal file
128
examples/transport-configs/configs/jit.xml
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<!-- jit.xml -->
|
||||||
|
|
||||||
|
<jabber>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
You need to add elogger and rlogger entries here when using ejabberd.
|
||||||
|
In this case the transport will do the logging.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<log id='elogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype/>
|
||||||
|
<file>/var/log/jabber/jit-error</file> <!-- WPJabber logs with date. -->
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<log id='rlogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype>record</logtype>
|
||||||
|
<file>/var/log/jabber/jit-record</file> <!-- WPJabber logs with date. -->
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ejabberd do not provide XDB services.
|
||||||
|
xdb_file-jit.so (the renamed xdb_file.so from WPJabber) is
|
||||||
|
loaded in to handle all XDB requests.
|
||||||
|
Read also the documentation in xdb_file/README from the JIT package.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<xdb id="xdb">
|
||||||
|
<host/>
|
||||||
|
<load>
|
||||||
|
<xdb_file>/usr/local/lib/jabber/xdb_file.so</xdb_file> <!-- The xdb_file.so from WPJabber/JIT. -->
|
||||||
|
</load>
|
||||||
|
<xdb_file xmlns="jabber:config:xdb_file">
|
||||||
|
<spool><jabberd:cmdline flag='s'>/var/spool/jabber</jabberd:cmdline></spool>
|
||||||
|
</xdb_file>
|
||||||
|
</xdb>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Make sure that all host names here are resolveable via DNS if you
|
||||||
|
want the transport to be available to the public.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="icq.SERVER.COM">
|
||||||
|
<!--
|
||||||
|
Replace SERVER.COM with the same as above to enable sms.
|
||||||
|
-->
|
||||||
|
<host>sms.icq.SERVER.COM</host>
|
||||||
|
<!-- JIT configuration. -->
|
||||||
|
<icqtrans xmlns="jabber:config:icqtrans">
|
||||||
|
<sms>
|
||||||
|
<host>sms.icq.SERVER.COM</host>
|
||||||
|
<!-- Status of virtual "sms-contacts". -->
|
||||||
|
<show>away</show>
|
||||||
|
<status/>
|
||||||
|
</sms>
|
||||||
|
<instructions>Fill in your UIN and password.</instructions>
|
||||||
|
<search>Search ICQ users.</search>
|
||||||
|
<vCard>
|
||||||
|
<FN>ICQ Transport (JIT)</FN>
|
||||||
|
<DESC>This is the Jabber ICQ Transport.</DESC>
|
||||||
|
<MAIL>EMAIL@ADDRESS.COM</MAIL>
|
||||||
|
<URL>http://jit.jabberstudio.org/</URL>
|
||||||
|
</vCard>
|
||||||
|
<!-- Hashtable for users. -->
|
||||||
|
<prime>3907</prime>
|
||||||
|
<!-- Send messages from ICQ as chat to Jabber clients. -->
|
||||||
|
<chat/>
|
||||||
|
<!-- Enable this for ICQ web presence. -->
|
||||||
|
<web/>
|
||||||
|
<!--
|
||||||
|
If you don't want jabber:x:data forms
|
||||||
|
in reg and search uncomment this tag
|
||||||
|
(Not recomended).
|
||||||
|
-->
|
||||||
|
<no_xdata/>
|
||||||
|
<!--
|
||||||
|
This tag is necessary when using ejabberd.
|
||||||
|
In this way JIT will have its own contact list.
|
||||||
|
-->
|
||||||
|
<own_roster/>
|
||||||
|
<!--
|
||||||
|
When present, this tag will tell JIT not to try to
|
||||||
|
get the user's roster (which will take a bit of time
|
||||||
|
to fail in scenarios described above).
|
||||||
|
-->
|
||||||
|
<no_jabber_roster/>
|
||||||
|
<!-- File with stats. -->
|
||||||
|
<user_count_file>/var/spool/jabber/jit-count</user_count_file>
|
||||||
|
<!--
|
||||||
|
Interval beetween checking sessions: ping, messages, acks.
|
||||||
|
-->
|
||||||
|
<session_check>5</session_check>
|
||||||
|
<!-- Reconnect retries. -->
|
||||||
|
<reconnects>5</reconnects>
|
||||||
|
<!--
|
||||||
|
Time in sec when session can be inactive, 0=disabled.
|
||||||
|
-->
|
||||||
|
<session_timeout>18000</session_timeout>
|
||||||
|
<charset>windows-1252</charset>
|
||||||
|
<server>
|
||||||
|
<host port="5190">login.icq.com</host>
|
||||||
|
</server>
|
||||||
|
</icqtrans>
|
||||||
|
<!-- JIT module. -->
|
||||||
|
<load>
|
||||||
|
<icqtrans>/usr/local/lib/jabber/jit.so</icqtrans>
|
||||||
|
</load>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The settings below have to match the settings you made
|
||||||
|
in your ejabberd.cfg configuration file.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="icq-linker">
|
||||||
|
<host>SERVER.COM</host>
|
||||||
|
<uplink/>
|
||||||
|
<connect>
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>5234</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
</connect>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<pidfile>/var/run/jabber/jit.pid</pidfile>
|
||||||
|
|
||||||
|
</jabber>
|
118
examples/transport-configs/configs/msn-transport.xml
Normal file
118
examples/transport-configs/configs/msn-transport.xml
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<!-- msn-transport.xml -->
|
||||||
|
|
||||||
|
<jabber>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
You need to add elogger and rlogger entries here when using ejabberd.
|
||||||
|
In this case the transport will do the logging.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<log id='elogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype/>
|
||||||
|
<format>%d: [%t] (%h): %s</format>
|
||||||
|
<file>/var/log/jabber/msn-transport-error.log</file>
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<log id='rlogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype>record</logtype>
|
||||||
|
<format>%d %h %s</format>
|
||||||
|
<file>/var/log/jabber/msn-transport-record.log</file>
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ejabberd do not provide XDB services.
|
||||||
|
xdb_file.so is loaded in to handle all XDB requests.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<xdb id="xdb">
|
||||||
|
<host/>
|
||||||
|
<load>
|
||||||
|
<xdb_file>/usr/local/lib/jabber/libjabberdxdbfile.so</xdb_file>
|
||||||
|
</load>
|
||||||
|
<xdb_file xmlns="jabber:config:xdb_file">
|
||||||
|
<spool><jabberd:cmdline flag='s'>/var/spool/jabber</jabberd:cmdline></spool>
|
||||||
|
</xdb_file>
|
||||||
|
</xdb>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Make sure that all host names here are resolveable via DNS if you
|
||||||
|
want the transport to be available to the public.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="msn.SERVER.COM">
|
||||||
|
<!-- msn-transport configuration. -->
|
||||||
|
<msntrans xmlns="jabber:config:msntrans">
|
||||||
|
<instructions>Fill in your MSN account and password (eg: user1@hotmail.com). A nickname is optional.</instructions>
|
||||||
|
<vCard>
|
||||||
|
<FN>MSN Transport</FN>
|
||||||
|
<DESC>This is the MSN Transport.</DESC>
|
||||||
|
<EMAIL>EMAIL@ADDRESS.COM</EMAIL>
|
||||||
|
<URL>http://msn-transport.jabberstudio.org/</URL>
|
||||||
|
</vCard>
|
||||||
|
<!--
|
||||||
|
Conference support allows you to create groupchat rooms on the
|
||||||
|
msn-transport and invite MSN users to join.
|
||||||
|
-->
|
||||||
|
<conference id="conference.msn.SERVER.COM">
|
||||||
|
<!--
|
||||||
|
This will make MSN transport invite you to a special groupchat
|
||||||
|
room when more then one user joins a normal one-on-one session.
|
||||||
|
Joining this room will make MSN transport "switch" the session
|
||||||
|
into groupchat mode. If you ignore it, MSN transport will
|
||||||
|
continue to send the messages as one-on-one chats.
|
||||||
|
-->
|
||||||
|
<invite>More than one user entered this chat session. Enter this room to switch to groupchat modus.</invite>
|
||||||
|
<notice>
|
||||||
|
<join> is available</join>
|
||||||
|
<leave> has leaved the room</leave>
|
||||||
|
</notice>
|
||||||
|
</conference>
|
||||||
|
<!-- Enable Hotmail inbox notification. -->
|
||||||
|
<headlines/>
|
||||||
|
<!--
|
||||||
|
Enable fancy friendly names
|
||||||
|
If the user enters a nickname upon registration, and the user has
|
||||||
|
a status message, their MSN friendly name will be "nickname - status message".
|
||||||
|
|
||||||
|
If the user does not enter a nickname on registration, but they do have
|
||||||
|
a status message, their friendly name will just be their status message.
|
||||||
|
|
||||||
|
If the user did enter a nickname on registration, but they have a blank status message,
|
||||||
|
then their friendly name will just be the registered nickname.
|
||||||
|
|
||||||
|
If the user did not enter a nickname on registration, and they have a blank status message,
|
||||||
|
their nickname will just be the username portion of their JID.
|
||||||
|
|
||||||
|
If the above chosen friendly name is too long, then it will be truncated and "..." placed
|
||||||
|
at the end. MSN only supports friendly names of 128 characters, so this is unavoidable.
|
||||||
|
|
||||||
|
If this is disabled, then the registered nick is always sent as the MSN friendly name,
|
||||||
|
or if that is blank, the username portion of their JID is sent instead.
|
||||||
|
-->
|
||||||
|
<fancy_friendly/>
|
||||||
|
</msntrans>
|
||||||
|
<!-- msn-transport module. -->
|
||||||
|
<load>
|
||||||
|
<msntrans>/usr/local/lib/jabber/msn-transport.so</msntrans>
|
||||||
|
</load>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The settings below have to match the settings you made
|
||||||
|
in your ejabberd.cfg configuration file.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="msn-linker">
|
||||||
|
<uplink/>
|
||||||
|
<connect>
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>5235</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
</connect>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<pidfile>/var/run/jabber/msn-transport.pid</pidfile>
|
||||||
|
|
||||||
|
</jabber>
|
86
examples/transport-configs/configs/yahoo-transport-2.xml
Normal file
86
examples/transport-configs/configs/yahoo-transport-2.xml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<!-- yahoo-transport-2.xml -->
|
||||||
|
|
||||||
|
<jabber>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
You need to add the elogger entry here when using ejabberd.
|
||||||
|
In this case the transport will do the logging.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<log id='elogger'>
|
||||||
|
<host/>
|
||||||
|
<logtype/>
|
||||||
|
<format>%d: [%t] (%h): %s</format>
|
||||||
|
<file>/var/log/jabber/yahoo-transport-2-error.log</file>
|
||||||
|
<stderr/>
|
||||||
|
</log>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ejabberd do not provide XDB services.
|
||||||
|
xdb_file.so is loaded in to handle all XDB requests.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<xdb id="xdb">
|
||||||
|
<host/>
|
||||||
|
<load>
|
||||||
|
<xdb_file>/usr/local/lib/jabber/libjabberdxdbfile.so</xdb_file>
|
||||||
|
</load>
|
||||||
|
<xdb_file xmlns="jabber:config:xdb_file">
|
||||||
|
<spool><jabberd:cmdline flag='s'>/var/spool/jabber</jabberd:cmdline></spool>
|
||||||
|
</xdb_file>
|
||||||
|
</xdb>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Make sure that all host names here are resolveable via DNS if you
|
||||||
|
want the transport to be available to the public.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="yahoo.SERVER.COM">
|
||||||
|
<!-- yahoo-transport-2 configuration. -->
|
||||||
|
<config xmlns="jabber:config:yahoo">
|
||||||
|
<vCard>
|
||||||
|
<NAME>Yahoo! Transport</NAME>
|
||||||
|
<FN>vCard not implemented in current version</FN>
|
||||||
|
<DESC>This is the Yahoo! transport.</DESC>
|
||||||
|
<MAIL>EMAIL@ADDRESS.COM</MAIL>
|
||||||
|
<URL>http://yahoo-transport-2.jabberstudio.org/</URL>
|
||||||
|
</vCard>
|
||||||
|
<instructions>Fill in your YAHOO! Messenger username and password to register on this transport.</instructions>
|
||||||
|
<server>scs.msg.yahoo.com</server>
|
||||||
|
<port>5050</port>
|
||||||
|
<!--
|
||||||
|
The character map. This provides character set translation from UTF-8
|
||||||
|
to the indicated character map. See the man page for 'iconv' for available
|
||||||
|
character maps on your platform. CP1252 is the standard Windows character
|
||||||
|
set.
|
||||||
|
-->
|
||||||
|
<charmap>CP1252</charmap>
|
||||||
|
<!--
|
||||||
|
When this element exists, the transport will send new mail notifications as
|
||||||
|
well as a count of unread messages when the user initially logs in.
|
||||||
|
-->
|
||||||
|
<newmail/>
|
||||||
|
</config>
|
||||||
|
<!-- yahoo-transport-2 module. -->
|
||||||
|
<load>
|
||||||
|
<yahoo_transport>/usr/local/lib/jabber/yahoo-transport-2.so</yahoo_transport>
|
||||||
|
</load>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The settings below have to match the settings you made
|
||||||
|
in your ejabberd.cfg configuration file.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<service id="yahoo-linker">
|
||||||
|
<uplink/>
|
||||||
|
<connect>
|
||||||
|
<ip>127.0.0.1</ip>
|
||||||
|
<port>5236</port>
|
||||||
|
<secret>SECRET</secret>
|
||||||
|
</connect>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<pidfile>/var/run/jabber/yahoo-transport-2.pid</pidfile>
|
||||||
|
|
||||||
|
</jabber>
|
45
examples/transport-configs/init-scripts/aim-transport
Executable file
45
examples/transport-configs/init-scripts/aim-transport
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#########################################################
|
||||||
|
#
|
||||||
|
# aim-transport -- script to start aim-transport.
|
||||||
|
#
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/jabberd-aim-transport
|
||||||
|
CONF=/etc/jabber/aim-transport.xml
|
||||||
|
NAME=jabberd-aim-transport
|
||||||
|
HOME=/etc/jabber/
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
debug)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in debugging mode."
|
||||||
|
$DAEMON -D -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
;;
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
43
examples/transport-configs/init-scripts/ile
Executable file
43
examples/transport-configs/init-scripts/ile
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#########################################################
|
||||||
|
#
|
||||||
|
# ile -- script to start ILE.
|
||||||
|
#
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/ile.pl
|
||||||
|
NAME=ile.pl
|
||||||
|
CONF=/etc/jabber/ile.xml
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
debug)
|
||||||
|
echo "Not implemented yet. Starting in normal mode"
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
;;
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|status|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
47
examples/transport-configs/init-scripts/jabber-gg-transport
Executable file
47
examples/transport-configs/init-scripts/jabber-gg-transport
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#########################################################
|
||||||
|
#
|
||||||
|
# jabber-gg-transport -- script to start jabber-gg-transport.
|
||||||
|
#
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/jggtrans
|
||||||
|
CONF=/etc/jabber/jabber-gg-transport.xml
|
||||||
|
NAME=jggtrans
|
||||||
|
HOME=/etc/jabber/
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
debug)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in debugging mode."
|
||||||
|
$DAEMON -D -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
rm /var/run/jabber/jabber-gg-transport.pid
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
45
examples/transport-configs/init-scripts/jit
Executable file
45
examples/transport-configs/init-scripts/jit
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#########################################################
|
||||||
|
#
|
||||||
|
# jit -- script to start JIT.
|
||||||
|
#
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/wpjabber-jit
|
||||||
|
CONF=/etc/jabber/jit.xml
|
||||||
|
NAME=wpjabber-jit
|
||||||
|
HOME=/etc/jabber/
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
debug)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in debugging mode."
|
||||||
|
$DAEMON -D -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
;;
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
50
examples/transport-configs/init-scripts/msn-transport
Executable file
50
examples/transport-configs/init-scripts/msn-transport
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#########################################################
|
||||||
|
#
|
||||||
|
# msn-transport -- script to start MSN Transport.
|
||||||
|
#
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/jabberd-msn-transport
|
||||||
|
CONF=/etc/jabber/msn-transport.xml
|
||||||
|
NAME=jabberd-msn-transport
|
||||||
|
HOME=/etc/jabber/
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
strace)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in strace mode."
|
||||||
|
strace -o /opt/ejabberd/var/log/jabber/strace.log $DAEMON -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
debug)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in debugging mode."
|
||||||
|
$DAEMON -D -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
;;
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
45
examples/transport-configs/init-scripts/yahoo-transport-2
Executable file
45
examples/transport-configs/init-scripts/yahoo-transport-2
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
##############################################################
|
||||||
|
#
|
||||||
|
# yahoo-transport-2 -- script to start Yahoo-transport-2.
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
DAEMON=/usr/local/sbin/jabberd-yahoo-transport-2
|
||||||
|
CONF=/etc/jabber/yahoo-transport-2.xml
|
||||||
|
NAME=jabberd-yahoo-transport-2
|
||||||
|
HOME=/etc/jabber/
|
||||||
|
USER=ejabberd
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
if [ "`/usr/bin/whoami`" != "$USER" ]; then
|
||||||
|
|
||||||
|
echo "You need to be" $USER "user to run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
debug)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME in debugging mode."
|
||||||
|
$DAEMON -D -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
test -f $DAEMON -a -f $CONF || exit 0
|
||||||
|
echo "Starting $NAME."
|
||||||
|
$DAEMON -H $HOME -c $CONF &
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping $NAME."
|
||||||
|
killall $NAME &
|
||||||
|
;;
|
||||||
|
restart|reload)
|
||||||
|
$0 stop
|
||||||
|
sleep 3
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {debug|start|stop|restart}"
|
||||||
|
exit 1
|
||||||
|
esac
|
44
include/adhoc.hrl
Normal file
44
include/adhoc.hrl
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% 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.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-record(adhoc_request,
|
||||||
|
{
|
||||||
|
lang = <<"">> :: binary(),
|
||||||
|
node = <<"">> :: binary(),
|
||||||
|
sessionid = <<"">> :: binary(),
|
||||||
|
action = <<"">> :: binary(),
|
||||||
|
xdata = false :: false | xmlel(),
|
||||||
|
others = [] :: [xmlel()]
|
||||||
|
}).
|
||||||
|
|
||||||
|
-record(adhoc_response,
|
||||||
|
{
|
||||||
|
lang = <<"">> :: binary(),
|
||||||
|
node = <<"">> :: binary(),
|
||||||
|
sessionid = <<"">> :: binary(),
|
||||||
|
status :: atom(),
|
||||||
|
defaultaction = <<"">> :: binary(),
|
||||||
|
actions = [] :: [binary()],
|
||||||
|
notes = [] :: [{binary(), binary()}],
|
||||||
|
elements = [] :: [xmlel()]
|
||||||
|
}).
|
||||||
|
|
||||||
|
-type adhoc_request() :: #adhoc_request{}.
|
||||||
|
-type adhoc_response() :: #adhoc_response{}.
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -19,30 +19,13 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
-type aterm() :: {atom(), atype()}.
|
-type aterm() :: {atom(), atype()}.
|
||||||
-type atype() :: integer | string | binary | any | atom |
|
-type atype() :: integer | string | binary |
|
||||||
{tuple, [aterm()]} | {list, aterm()}.
|
{tuple, [aterm()]} | {list, aterm()}.
|
||||||
-type rterm() :: {atom(), rtype()}.
|
-type rterm() :: {atom(), rtype()}.
|
||||||
-type rtype() :: integer | string | atom | any |
|
-type rtype() :: integer | string | atom |
|
||||||
{tuple, [rterm()]} | {list, rterm()} |
|
{tuple, [rterm()]} | {list, rterm()} |
|
||||||
rescode | restuple.
|
rescode | restuple.
|
||||||
|
|
||||||
%% The 'any' and 'atom' argument types and 'any' result type
|
|
||||||
%% should only be used %% by commands with tag 'internal',
|
|
||||||
%% which are meant to be used only internally in ejabberd,
|
|
||||||
%% and not called using external frontends.
|
|
||||||
|
|
||||||
%% The purpose of a command can either be:
|
|
||||||
%% - informative: its purpose is to obtain information
|
|
||||||
%% - modifier: its purpose is to produce some change in the server
|
|
||||||
%%
|
|
||||||
%% A modifier command should be designed just to produce its desired side-effect,
|
|
||||||
%% and its result term should just be success or failure: rescode or restuple.
|
|
||||||
%%
|
|
||||||
%% ejabberd_web_admin:make_command/2 considers that commands
|
|
||||||
%% with result type different than rescode or restuple
|
|
||||||
%% are commands that can be safely executed automatically
|
|
||||||
%% to get information and build the web page.
|
|
||||||
|
|
||||||
-type oauth_scope() :: atom().
|
-type oauth_scope() :: atom().
|
||||||
|
|
||||||
%% ejabberd_commands OAuth ReST ACL definition:
|
%% ejabberd_commands OAuth ReST ACL definition:
|
||||||
@ -68,7 +51,6 @@
|
|||||||
desc = "" :: string() | '_' | '$3',
|
desc = "" :: string() | '_' | '$3',
|
||||||
longdesc = "" :: string() | '_',
|
longdesc = "" :: string() | '_',
|
||||||
version = 0 :: integer(),
|
version = 0 :: integer(),
|
||||||
note = "" :: string(),
|
|
||||||
weight = 1 :: integer(),
|
weight = 1 :: integer(),
|
||||||
module :: atom() | '_',
|
module :: atom() | '_',
|
||||||
function :: atom() | '_',
|
function :: atom() | '_',
|
||||||
@ -76,7 +58,6 @@
|
|||||||
policy = restricted :: open | restricted | admin | user,
|
policy = restricted :: open | restricted | admin | user,
|
||||||
%% access is: [accessRuleName] or [{Module, AccessOption, DefaultAccessRuleName}]
|
%% access is: [accessRuleName] or [{Module, AccessOption, DefaultAccessRuleName}]
|
||||||
access = [] :: [{atom(),atom(),atom()}|atom()],
|
access = [] :: [{atom(),atom(),atom()}|atom()],
|
||||||
definer = unknown :: atom(),
|
|
||||||
result = {res, rescode} :: rterm() | '_' | '$2',
|
result = {res, rescode} :: rterm() | '_' | '$2',
|
||||||
args_rename = [] :: [{atom(),atom()}],
|
args_rename = [] :: [{atom(),atom()}],
|
||||||
args_desc = none :: none | [string()] | '_',
|
args_desc = none :: none | [string()] | '_',
|
||||||
@ -84,24 +65,42 @@
|
|||||||
args_example = none :: none | [any()] | '_',
|
args_example = none :: none | [any()] | '_',
|
||||||
result_example = none :: any()}).
|
result_example = none :: any()}).
|
||||||
|
|
||||||
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
%% TODO Fix me: Type is not up to date
|
||||||
tags :: [atom()],
|
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
||||||
desc :: string(),
|
tags :: [atom()],
|
||||||
longdesc :: string(),
|
desc :: string(),
|
||||||
version :: integer(),
|
longdesc :: string(),
|
||||||
note :: string(),
|
version :: integer(),
|
||||||
weight :: integer(),
|
module :: atom(),
|
||||||
module :: atom(),
|
function :: atom(),
|
||||||
function :: atom(),
|
args :: [aterm()],
|
||||||
args :: [aterm()],
|
policy :: open | restricted | admin | user,
|
||||||
policy :: open | restricted | admin | user,
|
access :: [{atom(),atom(),atom()}|atom()],
|
||||||
access :: [{atom(),atom(),atom()}|atom()],
|
result :: rterm()}.
|
||||||
definer :: atom(),
|
|
||||||
result :: rterm(),
|
|
||||||
args_rename :: [{atom(),atom()}],
|
|
||||||
args_desc :: none | [string()] | '_',
|
|
||||||
result_desc :: none | string() | '_',
|
|
||||||
args_example :: none | [any()] | '_',
|
|
||||||
result_example :: any()
|
|
||||||
}.
|
|
||||||
|
|
||||||
|
%% @type ejabberd_commands() = #ejabberd_commands{
|
||||||
|
%% name = atom(),
|
||||||
|
%% tags = [atom()],
|
||||||
|
%% desc = string(),
|
||||||
|
%% longdesc = string(),
|
||||||
|
%% module = atom(),
|
||||||
|
%% function = atom(),
|
||||||
|
%% args = [aterm()],
|
||||||
|
%% result = rterm()
|
||||||
|
%% }.
|
||||||
|
%% desc: Description of the command
|
||||||
|
%% args: Describe the accepted arguments.
|
||||||
|
%% This way the function that calls the command can format the
|
||||||
|
%% arguments before calling.
|
||||||
|
|
||||||
|
%% @type atype() = integer | string | {tuple, [aterm()]} | {list, aterm()}.
|
||||||
|
%% Allowed types for arguments are integer, string, tuple and list.
|
||||||
|
|
||||||
|
%% @type rtype() = integer | string | atom | {tuple, [rterm()]} | {list, rterm()} | rescode | restuple.
|
||||||
|
%% A rtype is either an atom or a tuple with two elements.
|
||||||
|
|
||||||
|
%% @type aterm() = {Name::atom(), Type::atype()}.
|
||||||
|
%% An argument term is a tuple with the term name and the term type.
|
||||||
|
|
||||||
|
%% @type rterm() = {Name::atom(), Type::rtype()}.
|
||||||
|
%% A result term is a tuple with the term name and the term type.
|
||||||
|
30
include/ejabberd_config.hrl
Normal file
30
include/ejabberd_config.hrl
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% 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.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-record(local_config, {key :: any(), value :: any()}).
|
||||||
|
|
||||||
|
-type local_config() :: #local_config{}.
|
||||||
|
|
||||||
|
-record(state,
|
||||||
|
{opts = [] :: [acl:acl() | local_config()],
|
||||||
|
hosts = [] :: [binary()],
|
||||||
|
override_local = false :: boolean(),
|
||||||
|
override_global = false :: boolean(),
|
||||||
|
override_acls = false :: boolean()}).
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -29,47 +29,14 @@
|
|||||||
-define(SQL_INSERT_MARK, sql_insert__mark_).
|
-define(SQL_INSERT_MARK, sql_insert__mark_).
|
||||||
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
|
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
|
||||||
|
|
||||||
-ifdef(COMPILER_REPORTS_ONLY_LINES).
|
|
||||||
-record(sql_query, {hash :: binary(),
|
-record(sql_query, {hash :: binary(),
|
||||||
format_query :: fun(),
|
format_query :: fun(),
|
||||||
format_res :: fun(),
|
format_res :: fun(),
|
||||||
args :: fun(),
|
args :: fun(),
|
||||||
flags :: non_neg_integer(),
|
|
||||||
loc :: {module(), pos_integer()}}).
|
loc :: {module(), pos_integer()}}).
|
||||||
-else.
|
|
||||||
-record(sql_query, {hash :: binary(),
|
|
||||||
format_query :: fun(),
|
|
||||||
format_res :: fun(),
|
|
||||||
args :: fun(),
|
|
||||||
flags :: non_neg_integer(),
|
|
||||||
loc :: {module(), {pos_integer(), pos_integer()}}}).
|
|
||||||
-endif.
|
|
||||||
|
|
||||||
-record(sql_escape, {string :: fun((binary()) -> binary()),
|
-record(sql_escape, {string :: fun((binary()) -> binary()),
|
||||||
integer :: fun((integer()) -> binary()),
|
integer :: fun((integer()) -> binary()),
|
||||||
boolean :: fun((boolean()) -> binary()),
|
boolean :: fun((boolean()) -> binary()),
|
||||||
in_array_string :: fun((binary()) -> binary()),
|
in_array_string :: fun((binary()) -> binary()),
|
||||||
like_escape :: fun(() -> binary())}).
|
like_escape :: fun(() -> binary())}).
|
||||||
|
|
||||||
|
|
||||||
-record(sql_index, {columns,
|
|
||||||
unique = false :: boolean(),
|
|
||||||
meta = #{}}).
|
|
||||||
-record(sql_column, {name :: binary(),
|
|
||||||
type,
|
|
||||||
default = false,
|
|
||||||
opts = []}).
|
|
||||||
-record(sql_table, {name :: binary(),
|
|
||||||
columns :: [#sql_column{}],
|
|
||||||
indices = [] :: [#sql_index{}],
|
|
||||||
post_create}).
|
|
||||||
-record(sql_schema, {version :: integer(),
|
|
||||||
tables :: [#sql_table{}],
|
|
||||||
update = []}).
|
|
||||||
-record(sql_references, {table :: binary(),
|
|
||||||
column :: binary()}).
|
|
||||||
|
|
||||||
-record(sql_schema_info,
|
|
||||||
{db_type :: pgsql | mysql | sqlite,
|
|
||||||
db_version :: any(),
|
|
||||||
new_schema = true :: boolean()}).
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -62,22 +62,9 @@
|
|||||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||||
{<<"value">>, Value}])).
|
{<<"value">>, Value}])).
|
||||||
|
|
||||||
-define(INPUTPH(Type, Name, Value, PlaceHolder),
|
|
||||||
?XA(<<"input">>,
|
|
||||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
|
||||||
{<<"value">>, Value}, {<<"placeholder">>, PlaceHolder}])).
|
|
||||||
|
|
||||||
-define(INPUTT(Type, Name, Value),
|
-define(INPUTT(Type, Name, Value),
|
||||||
?INPUT(Type, Name, (translate:translate(Lang, Value)))).
|
?INPUT(Type, Name, (translate:translate(Lang, Value)))).
|
||||||
|
|
||||||
-define(INPUTD(Type, Name, Value),
|
|
||||||
?XA(<<"input">>,
|
|
||||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
|
||||||
{<<"class">>, <<"btn-danger">>}, {<<"value">>, Value}])).
|
|
||||||
|
|
||||||
-define(INPUTTD(Type, Name, Value),
|
|
||||||
?INPUTD(Type, Name, (translate:translate(Lang, Value)))).
|
|
||||||
|
|
||||||
-define(INPUTS(Type, Name, Value, Size),
|
-define(INPUTS(Type, Name, Value, Size),
|
||||||
?XA(<<"input">>,
|
?XA(<<"input">>,
|
||||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||||
@ -100,27 +87,16 @@
|
|||||||
-define(XRES(Text),
|
-define(XRES(Text),
|
||||||
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
|
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
|
||||||
|
|
||||||
-define(DIVRES(Elements),
|
|
||||||
?XAE(<<"div">>, [{<<"class">>, <<"result">>}], Elements)).
|
|
||||||
|
|
||||||
%% Guide Link
|
%% Guide Link
|
||||||
-define(XREST(Text), ?XRES((translate:translate(Lang, Text)))).
|
-define(XREST(Text), ?XRES((translate:translate(Lang, Text)))).
|
||||||
|
|
||||||
-define(GL(Ref, Title),
|
-define(GL(Ref, Title),
|
||||||
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
|
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
|
||||||
[?XAE(<<"a">>,
|
[?XAE(<<"a">>,
|
||||||
[{<<"href">>, <<"https://docs.ejabberd.im/", Ref/binary>>},
|
[{<<"href">>, <<"https://docs.ejabberd.im/admin/configuration/", Ref/binary>>},
|
||||||
{<<"target">>, <<"_blank">>}],
|
{<<"target">>, <<"_blank">>}],
|
||||||
[?C(<<"docs: ", Title/binary>>)])])).
|
[?C(<<"docs: ", Title/binary>>)])])).
|
||||||
|
|
||||||
%% h1 with a Guide Link
|
%% h1 with a Guide Link
|
||||||
-define(H1GLraw(Name, Ref, Title),
|
-define(H1GL(Name, Ref, Title),
|
||||||
[?XC(<<"h1">>, Name), ?GL(Ref, Title), ?BR, ?BR]).
|
[?XC(<<"h1">>, Name), ?GL(Ref, Title)]).
|
||||||
-define(H1GL(Name, RefConf, Title),
|
|
||||||
?H1GLraw(Name, <<"admin/configuration/", RefConf/binary>>, Title)).
|
|
||||||
|
|
||||||
-define(ANCHORL(Ref),
|
|
||||||
?XAE(<<"div">>, [{<<"class">>, <<"anchorlink">>}],
|
|
||||||
[?XAE(<<"a">>,
|
|
||||||
[{<<"href">>, <<"#", Ref/binary>>}],
|
|
||||||
[?C(unicode:characters_to_binary("¶"))])])).
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -26,8 +26,7 @@
|
|||||||
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
|
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
|
||||||
packet = #xmlel{} :: xmlel() | message(),
|
packet = #xmlel{} :: xmlel() | message(),
|
||||||
nick = <<"">> :: binary(),
|
nick = <<"">> :: binary(),
|
||||||
type = chat :: chat | groupchat,
|
type = chat :: chat | groupchat}).
|
||||||
origin_id = <<"">> :: binary()}).
|
|
||||||
|
|
||||||
-record(archive_prefs,
|
-record(archive_prefs,
|
||||||
{us = {<<"">>, <<"">>} :: {binary(), binary()},
|
{us = {<<"">>, <<"">>} :: {binary(), binary()},
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -38,13 +38,13 @@
|
|||||||
description = <<"">> :: binary(),
|
description = <<"">> :: binary(),
|
||||||
allow_change_subj = true :: boolean(),
|
allow_change_subj = true :: boolean(),
|
||||||
allow_query_users = true :: boolean(),
|
allow_query_users = true :: boolean(),
|
||||||
allowpm = anyone :: anyone | participants | moderators | none,
|
allow_private_messages = true :: boolean(),
|
||||||
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
|
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
|
||||||
allow_visitor_status = true :: boolean(),
|
allow_visitor_status = true :: boolean(),
|
||||||
allow_visitor_nickchange = true :: boolean(),
|
allow_visitor_nickchange = true :: boolean(),
|
||||||
public = true :: boolean(),
|
public = true :: boolean(),
|
||||||
public_list = true :: boolean(),
|
public_list = true :: boolean(),
|
||||||
persistent = false :: boolean() | {destroying, boolean()},
|
persistent = false :: boolean(),
|
||||||
moderated = true :: boolean(),
|
moderated = true :: boolean(),
|
||||||
captcha_protected = false :: boolean(),
|
captcha_protected = false :: boolean(),
|
||||||
members_by_default = true :: boolean(),
|
members_by_default = true :: boolean(),
|
||||||
@ -65,7 +65,6 @@
|
|||||||
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
|
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
|
||||||
mam = false :: boolean(),
|
mam = false :: boolean(),
|
||||||
pubsub = <<"">> :: binary(),
|
pubsub = <<"">> :: binary(),
|
||||||
enable_hats = false :: boolean(),
|
|
||||||
lang = ejabberd_option:language() :: binary()
|
lang = ejabberd_option:language() :: binary()
|
||||||
}).
|
}).
|
||||||
|
|
||||||
@ -88,16 +87,6 @@
|
|||||||
nick = <<>> :: binary(),
|
nick = <<>> :: binary(),
|
||||||
nodes = [] :: [binary()]}).
|
nodes = [] :: [binary()]}).
|
||||||
|
|
||||||
-record(muc_subscribers,
|
|
||||||
{subscribers = #{} :: subscribers(),
|
|
||||||
subscriber_nicks = #{} :: subscriber_nicks(),
|
|
||||||
subscriber_nodes = #{} :: subscriber_nodes()
|
|
||||||
}).
|
|
||||||
|
|
||||||
-type subscribers() :: #{ljid() => #subscriber{}}.
|
|
||||||
-type subscriber_nicks() :: #{binary() => [ljid()]}.
|
|
||||||
-type subscriber_nodes() :: #{binary() => subscribers()}.
|
|
||||||
|
|
||||||
-record(activity,
|
-record(activity,
|
||||||
{
|
{
|
||||||
message_time = 0 :: integer(),
|
message_time = 0 :: integer(),
|
||||||
@ -117,16 +106,15 @@
|
|||||||
jid = #jid{} :: jid(),
|
jid = #jid{} :: jid(),
|
||||||
config = #config{} :: config(),
|
config = #config{} :: config(),
|
||||||
users = #{} :: users(),
|
users = #{} :: users(),
|
||||||
muc_subscribers = #muc_subscribers{} :: #muc_subscribers{},
|
subscribers = #{} :: subscribers(),
|
||||||
|
subscriber_nicks = #{} :: subscriber_nicks(),
|
||||||
last_voice_request_time = treap:empty() :: treap:treap(),
|
last_voice_request_time = treap:empty() :: treap:treap(),
|
||||||
robots = #{} :: robots(),
|
robots = #{} :: robots(),
|
||||||
nicks = #{} :: nicks(),
|
nicks = #{} :: nicks(),
|
||||||
affiliations = #{} :: affiliations(),
|
affiliations = #{} :: affiliations(),
|
||||||
roles = #{} :: roles(),
|
|
||||||
history = #lqueue{} :: lqueue(),
|
history = #lqueue{} :: lqueue(),
|
||||||
subject = [] :: [text()],
|
subject = [] :: [text()],
|
||||||
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
|
subject_author = <<"">> :: binary(),
|
||||||
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
|
|
||||||
just_created = erlang:system_time(microsecond) :: true | integer(),
|
just_created = erlang:system_time(microsecond) :: true | integer(),
|
||||||
activity = treap:empty() :: treap:treap(),
|
activity = treap:empty() :: treap:treap(),
|
||||||
room_shaper = none :: ejabberd_shaper:shaper(),
|
room_shaper = none :: ejabberd_shaper:shaper(),
|
||||||
@ -138,4 +126,5 @@
|
|||||||
-type robots() :: #{jid() => {binary(), stanza()}}.
|
-type robots() :: #{jid() => {binary(), stanza()}}.
|
||||||
-type nicks() :: #{binary() => [ljid()]}.
|
-type nicks() :: #{binary() => [ljid()]}.
|
||||||
-type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}.
|
-type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}.
|
||||||
-type roles() :: #{ljid() => role() | {role(), binary()}}.
|
-type subscribers() :: #{ljid() => #subscriber{}}.
|
||||||
|
-type subscriber_nicks() :: #{binary() => [ljid()]}.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
%%% RFC 1928 constants.
|
%%% RFC 1928 constants.
|
||||||
%%%
|
%%%
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% ejabberd, Copyright (C) 2017-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2017-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -18,11 +18,5 @@
|
|||||||
%%%
|
%%%
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
-record(room_version,
|
-record(vcard_xupdate, {us = {<<>>, <<>>} :: {binary(), binary()},
|
||||||
{id :: binary(),
|
hash = <<>> :: binary()}).
|
||||||
%% use the same field names as in Synapse
|
|
||||||
knock_restricted_join_rule :: boolean(),
|
|
||||||
enforce_int_power_levels :: boolean(),
|
|
||||||
implicit_room_creator :: boolean(),
|
|
||||||
updated_redaction_rules :: boolean()
|
|
||||||
}).
|
|
@ -1,6 +1,6 @@
|
|||||||
%%%-------------------------------------------------------------------
|
%%%-------------------------------------------------------------------
|
||||||
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
%%% @copyright (C) 2002-2024 ProcessOne, SARL. All Rights Reserved.
|
%%% @copyright (C) 2002-2020 ProcessOne, SARL. 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.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
@ -23,7 +23,7 @@
|
|||||||
-define(ERR_EXTENDED(E, C), mod_pubsub:extended_error(E, C)).
|
-define(ERR_EXTENDED(E, C), mod_pubsub:extended_error(E, C)).
|
||||||
|
|
||||||
%% The actual limit can be configured with mod_pubsub's option max_items_node
|
%% The actual limit can be configured with mod_pubsub's option max_items_node
|
||||||
-define(MAXITEMS, 1000).
|
-define(MAXITEMS, 10).
|
||||||
|
|
||||||
%% this is currently a hard limit.
|
%% this is currently a hard limit.
|
||||||
%% Would be nice to have it configurable.
|
%% Would be nice to have it configurable.
|
||||||
|
0
install-sh
Executable file → Normal file
0
install-sh
Executable file → Normal file
@ -41,7 +41,7 @@ defmodule Ejabberd.Config.Attr do
|
|||||||
"""
|
"""
|
||||||
@spec validate([attr]) :: [{:ok, attr}] | [{:error, attr, atom()}]
|
@spec validate([attr]) :: [{:ok, attr}] | [{:error, attr, atom()}]
|
||||||
def validate(attrs) when is_list(attrs), do: Enum.map(attrs, &valid_attr?/1)
|
def validate(attrs) when is_list(attrs), do: Enum.map(attrs, &valid_attr?/1)
|
||||||
def validate(attr), do: validate([attr])
|
def validate(attr), do: validate([attr]) |> List.first
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the type of an attribute, given its name.
|
Returns the type of an attribute, given its name.
|
||||||
|
@ -36,8 +36,8 @@ defmodule Ejabberd.Config do
|
|||||||
|
|
||||||
case force do
|
case force do
|
||||||
true ->
|
true ->
|
||||||
Ejabberd.Config.Store.stop()
|
Ejabberd.Config.Store.stop
|
||||||
Ejabberd.Config.Store.start_link()
|
Ejabberd.Config.Store.start_link
|
||||||
do_init(file_path)
|
do_init(file_path)
|
||||||
false ->
|
false ->
|
||||||
if not init_already_executed, do: do_init(file_path)
|
if not init_already_executed, do: do_init(file_path)
|
||||||
@ -105,8 +105,11 @@ defmodule Ejabberd.Config do
|
|||||||
Code.eval_file(file_path) |> extract_and_store_module_name()
|
Code.eval_file(file_path) |> extract_and_store_module_name()
|
||||||
|
|
||||||
# Getting start/0 config
|
# Getting start/0 config
|
||||||
[module] = Ejabberd.Config.Store.get(:module_name)
|
Ejabberd.Config.Store.get(:module_name)
|
||||||
call_start_func_and_store_data(module)
|
|> case do
|
||||||
|
nil -> IO.puts "[ ERR ] Configuration module not found."
|
||||||
|
[module] -> call_start_func_and_store_data(module)
|
||||||
|
end
|
||||||
|
|
||||||
# Fetching git modules and install them
|
# Fetching git modules and install them
|
||||||
get_modules_parsed_in_order()
|
get_modules_parsed_in_order()
|
||||||
|
@ -13,6 +13,7 @@ defmodule Ejabberd.Config.EjabberdHook do
|
|||||||
@doc """
|
@doc """
|
||||||
Register a hook to ejabberd.
|
Register a hook to ejabberd.
|
||||||
"""
|
"""
|
||||||
|
@spec start(EjabberdHook.t) :: none
|
||||||
def start(%EjabberdHook{hook: hook, opts: opts, fun: fun}) do
|
def start(%EjabberdHook{hook: hook, opts: opts, fun: fun}) do
|
||||||
host = Keyword.get(opts, :host, :global)
|
host = Keyword.get(opts, :host, :global)
|
||||||
priority = Keyword.get(opts, :priority, 50)
|
priority = Keyword.get(opts, :priority, 50)
|
||||||
|
@ -7,14 +7,13 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||||||
the already existing Elixir.Module.
|
the already existing Elixir.Module.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
alias Ejabberd.Config.EjabberdModule
|
@type t :: %{module: atom, attrs: [Attr.t]}
|
||||||
alias Ejabberd.Config.Validation
|
|
||||||
alias Ejabberd.Config.Attr
|
|
||||||
|
|
||||||
@type t :: %{module: atom, attrs: [Attr.attr]}
|
|
||||||
|
|
||||||
defstruct [:module, :attrs]
|
defstruct [:module, :attrs]
|
||||||
|
|
||||||
|
alias Ejabberd.Config.EjabberdModule
|
||||||
|
alias Ejabberd.Config.Validation
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Given a list of modules / single module
|
Given a list of modules / single module
|
||||||
it runs different validators on them.
|
it runs different validators on them.
|
||||||
@ -30,6 +29,7 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||||||
a git attribute and tries to fetch the repo,
|
a git attribute and tries to fetch the repo,
|
||||||
then, it install them through :ext_mod.install/1
|
then, it install them through :ext_mod.install/1
|
||||||
"""
|
"""
|
||||||
|
@spec fetch_git_repos([EjabberdModule.t]) :: none()
|
||||||
def fetch_git_repos(modules) do
|
def fetch_git_repos(modules) do
|
||||||
modules
|
modules
|
||||||
|> Enum.filter(&is_git_module?/1)
|
|> Enum.filter(&is_git_module?/1)
|
||||||
@ -60,7 +60,7 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||||||
defp fetch_and_store_repo_source_if_not_exists(path, repo) do
|
defp fetch_and_store_repo_source_if_not_exists(path, repo) do
|
||||||
unless File.exists?(path) do
|
unless File.exists?(path) do
|
||||||
IO.puts "[info] Fetching: #{repo}"
|
IO.puts "[info] Fetching: #{repo}"
|
||||||
:os.cmd(~c"git clone #{repo} #{path}")
|
:os.cmd('git clone #{repo} #{path}')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -17,9 +17,9 @@ defmodule Ejabberd.Config.EjabberdLogger do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp do_log_errors({:ok, _mod}), do: nil
|
defp do_log_errors({:ok, _mod}), do: nil
|
||||||
defp do_log_errors({:error, _mod, errors}), do: (Enum.each errors, &do_log_errors/1)
|
defp do_log_errors({:error, _mod, errors}), do: Enum.each errors, &do_log_errors/1
|
||||||
defp do_log_errors({:attribute, errors}), do: (Enum.each errors, &log_attribute_error/1)
|
defp do_log_errors({:attribute, errors}), do: Enum.each errors, &log_attribute_error/1
|
||||||
defp do_log_errors({:dependency, errors}), do: (Enum.each errors, &log_dependency_error/1)
|
defp do_log_errors({:dependency, errors}), do: Enum.each errors, &log_dependency_error/1
|
||||||
|
|
||||||
defp log_attribute_error({{attr_name, _val}, :attr_not_supported}), do:
|
defp log_attribute_error({{attr_name, _val}, :attr_not_supported}), do:
|
||||||
IO.puts "[ WARN ] Annotation @#{attr_name} is not supported."
|
IO.puts "[ WARN ] Annotation @#{attr_name} is not supported."
|
||||||
|
@ -14,12 +14,15 @@ defmodule Ejabberd.Config.OptsFormatter do
|
|||||||
Look at how Config.get_ejabberd_opts/0 is constructed for
|
Look at how Config.get_ejabberd_opts/0 is constructed for
|
||||||
more informations.
|
more informations.
|
||||||
"""
|
"""
|
||||||
@spec format_opts_for_ejabberd(map) :: list()
|
@spec format_opts_for_ejabberd([{atom(), any()}]) :: list()
|
||||||
def format_opts_for_ejabberd(opts) do
|
def format_opts_for_ejabberd(opts) do
|
||||||
opts
|
opts
|
||||||
|> format_attrs_for_ejabberd
|
|> format_attrs_for_ejabberd
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp format_attrs_for_ejabberd(opts) when is_list(opts),
|
||||||
|
do: Enum.map opts, &format_attrs_for_ejabberd/1
|
||||||
|
|
||||||
defp format_attrs_for_ejabberd({:listeners, mods}),
|
defp format_attrs_for_ejabberd({:listeners, mods}),
|
||||||
do: {:listen, format_listeners_for_ejabberd(mods)}
|
do: {:listen, format_listeners_for_ejabberd(mods)}
|
||||||
|
|
||||||
@ -29,9 +32,6 @@ defmodule Ejabberd.Config.OptsFormatter do
|
|||||||
defp format_attrs_for_ejabberd({key, opts}) when is_atom(key),
|
defp format_attrs_for_ejabberd({key, opts}) when is_atom(key),
|
||||||
do: {key, opts}
|
do: {key, opts}
|
||||||
|
|
||||||
defp format_attrs_for_ejabberd(opts),
|
|
||||||
do: (Enum.map opts, &format_attrs_for_ejabberd/1)
|
|
||||||
|
|
||||||
defp format_mods_for_ejabberd(mods) do
|
defp format_mods_for_ejabberd(mods) do
|
||||||
Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
|
Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
|
||||||
{mod, attrs[:opts]}
|
{mod, attrs[:opts]}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user