aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2022-01-17 11:49:16 +0100
committerBadlop <badlop@process-one.net>2022-02-03 18:21:47 +0100
commitadbccbe852e3d9980e531ff206bebd6b2c983fba (patch)
tree04d4b8ae5447fc1f41e87d1f152fd79b70b8e855
parentmod_pubsub: Unsubscribe JID on whitelist removal (diff)
New "make relive" similar to "ejabberdctl live" without installing
Prepare with: ./autogen.sh && ./configure --with-rebar=./rebar3 && make Or use this if you installed Elixir: ./autogen.sh && ./configure --with-rebar=mix && make Start without installing (it recompiles when necessary): make relive It stores config, database and logs in _build/relive/ There's available the well-known script: _build/relive/ejabberdctl Please note this fails immediately: r3:do(compile). This crashes a few seconds later: rebar3:run(["compile"]). Workaround that works correctly: ejabberd_admin:update().
-rw-r--r--Makefile.in41
-rw-r--r--config/runtime.exs26
-rw-r--r--rebar.config6
-rw-r--r--rel/relive.config3
-rw-r--r--rel/relive.escript26
-rwxr-xr-xrel/setup-relive.sh30
-rw-r--r--src/ejabberd_admin.erl11
7 files changed, 125 insertions, 18 deletions
diff --git a/Makefile.in b/Makefile.in
index 3066488f0..fa7fcd0a1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -113,6 +113,7 @@ ifeq "$(REBAR_VER)" "6"
EBINDIR=$(DEPSDIR)/ejabberd/ebin
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
else
ifeq "$(REBAR_VER)" "3"
SKIPDEPS=
@@ -130,6 +131,7 @@ endif
EBINDIR=$(DEPSDIR)/ejabberd/ebin
REBARREL=$(REBAR) as prod tar
REBARDEV=REBAR_PROFILE=dev $(REBAR) release
+ RELIVECMD=$(REBAR) relive
else
SKIPDEPS=skip_deps=true
LISTDEPS=-q list-deps
@@ -142,6 +144,8 @@ else
EBINDIR=ebin
REBARREL=$(REBAR) generate
REBARDEV=
+ RELIVECMD=@echo "Rebar2 detected... relive not supported.\
+ \nTry: ./configure --with-rebar=./rebar3 ; make relive"
endif
endif
@@ -268,13 +272,27 @@ copy-files:
copy-files-sub: copy-files-sub2
-install: copy-files
- #
- # Configuration files
- $(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
+relive:
+ $(RELIVECMD)
+
+relivedir=$(shell pwd)/_build/relive
+iexpath=$(shell which iex)
+
+ejabberdctl.relive:
+ $(SED) -e "s*{{rootdir}}*@prefix@*g" \
+ -e "s*{{installuser}}*@INSTALLUSER@*g" \
+ -e "s*{{bindir}}/iex*$(iexpath)*g" \
+ -e "s*{{bindir}}*@bindir@*g" \
+ -e "s*{{libdir}}*@libdir@*g" \
+ -e "s*{{sysconfdir}}/ejabberd*$(relivedir)/conf*g" \
+ -e "s*{{localstatedir}}/log/ejabberd*$(relivedir)/logs*g" \
+ -e "s*{{localstatedir}}/lib/ejabberd*$(relivedir)/database*g" \
+ -e "s*{{docdir}}*@docdir@*g" \
+ -e "s*{{erl}}*@ERL@*g" \
+ -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
+ > ejabberdctl.relive
+
+ejabberdctl.example:
$(SED) -e "s*{{rootdir}}*@prefix@*g" \
-e "s*{{installuser}}*@INSTALLUSER@*g" \
-e "s*{{bindir}}*@bindir@*g" \
@@ -285,6 +303,14 @@ install: copy-files
-e "s*{{erl}}*@ERL@*g" \
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
> ejabberdctl.example
+
+install: copy-files ejabberdctl.example
+ #
+ # Configuration files
+ $(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
[ -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
@@ -470,6 +496,7 @@ help:
@echo ""
@echo " rel Build a production release"
@echo " dev Build a development release"
+ @echo " relive Start a live ejabberd in _build/relive/"
@echo ""
@echo " edoc Generate edoc documentation (unused)"
@echo " options Generate ejabberd_option.erl"
diff --git a/config/runtime.exs b/config/runtime.exs
index 050eae8b0..ad8c6bdc9 100644
--- a/config/runtime.exs
+++ b/config/runtime.exs
@@ -1,12 +1,18 @@
import Config
-rootpath = System.get_env("RELEASE_ROOT", "")
-
-# This is standard path in the context of ejabberd release
-config :ejabberd,
- file: Path.join(rootpath, "etc/ejabberd/ejabberd.yml"),
- log_path: Path.join(rootpath, 'var/log/ejabberd/ejabberd.log')
-
-# Customize Mnesia directory:
-config :mnesia,
- dir: Path.join(rootpath, 'var/lib/ejabberd/')
+case System.get_env("RELIVE", "false") do
+ "true" ->
+ rootpath = System.get_env("RELEASE_ROOT", "_build/relive")
+ config :ejabberd,
+ file: Path.join(rootpath, "conf/ejabberd.yml"),
+ log_path: Path.join(rootpath, 'logs/ejabberd.log')
+ config :mnesia,
+ dir: Path.join(rootpath, 'database/')
+ "false" ->
+ rootpath = System.get_env("RELEASE_ROOT", "")
+ config :ejabberd,
+ file: Path.join(rootpath, "etc/ejabberd/ejabberd.yml"),
+ log_path: Path.join(rootpath, 'var/log/ejabberd/ejabberd.log')
+ config :mnesia,
+ dir: Path.join(rootpath, 'var/lib/ejabberd/')
+end
diff --git a/rebar.config b/rebar.config
index 0c18d9e7d..c21c5a792 100644
--- a/rebar.config
+++ b/rebar.config
@@ -215,6 +215,12 @@
{copy, "test/ejabberd_SUITE_data/cert.pem", "etc/ejabberd/"}]}]}]},
{test, [{erl_opts, [nowarn_export_all]}]}]}.
+{alias, [{relive, [{shell, "--apps ejabberd \
+ --config rel/relive.config \
+ --script rel/relive.escript \
+ --name ejabberd@localhost"}]}
+]}.
+
%% Local Variables:
%% mode: erlang
%% End:
diff --git a/rel/relive.config b/rel/relive.config
new file mode 100644
index 000000000..7e3901fd4
--- /dev/null
+++ b/rel/relive.config
@@ -0,0 +1,3 @@
+[{mnesia, [{dir, "_build/relive/database"}]},
+ {ejabberd, [{config, "_build/relive/conf/ejabberd.yml"},
+ {log_path, "_build/relive/logs/ejabberd.log"}]}].
diff --git a/rel/relive.escript b/rel/relive.escript
new file mode 100644
index 000000000..3ee2de0f3
--- /dev/null
+++ b/rel/relive.escript
@@ -0,0 +1,26 @@
+#!/usr/bin/env escript
+
+main(_) ->
+ Base = "_build/relive",
+ prepare(Base, "", none),
+ prepare(Base, "conf", {os, cmd, "rel/setup-relive.sh"}),
+ prepare(Base, "database", none),
+ prepare(Base, "logs", none),
+ c:erlangrc([os:cmd("echo -n $HOME")]),
+ ok.
+
+prepare(BaseDir, SuffixDir, MFA) ->
+ Dir = filename:join(BaseDir, SuffixDir),
+ case file:make_dir(Dir) of
+ ok ->
+ io:format("Preparing relive dir ~s...~n", [Dir]),
+ case MFA of
+ none -> ok;
+ {M, F, A} -> M:F(A)
+ end;
+ {error, eexist} ->
+ ok;
+ {error, LogsError} ->
+ io:format("Error creating dir ~s: ~p~n", [Dir, LogsError]),
+ halt(1)
+ end.
diff --git a/rel/setup-relive.sh b/rel/setup-relive.sh
new file mode 100755
index 000000000..4e726be88
--- /dev/null
+++ b/rel/setup-relive.sh
@@ -0,0 +1,30 @@
+PWD_DIR=`pwd`
+REL_DIR=$PWD_DIR/_build/relive/
+CON_DIR=$REL_DIR/conf/
+
+[ -z "$REL_DIR_TEMP" ] && REL_DIR_TEMP=$REL_DIR
+CON_DIR_TEMP=$REL_DIR_TEMP/conf/
+
+make ejabberdctl.relive
+chmod +x ejabberdctl.relive
+mv ejabberdctl.relive $REL_DIR/ejabberdctl
+
+cp inetrc $CON_DIR/
+cp ejabberdctl.cfg.example $CON_DIR/ejabberdctl.cfg.example
+cp ejabberd.yml.example $CON_DIR/ejabberd.yml.example
+cp test/ejabberd_SUITE_data/ca.pem $CON_DIR
+cp test/ejabberd_SUITE_data/cert.pem $CON_DIR
+
+cd $CON_DIR_TEMP
+
+sed -i "s|# certfiles:|certfiles:\n - $CON_DIR/cert.pem|g" ejabberd.yml.example
+sed -i "s|certfiles:|ca_file: $CON_DIR/ca.pem\ncertfiles:|g" ejabberd.yml.example
+sed -i 's|^acl:$|acl:\n admin: [user: admin]|g' ejabberd.yml.example
+[ ! -f "$CON_DIR/ejabberd.yml" ] \
+ && echo -n "ejabberd.yml " \
+ && mv ejabberd.yml.example ejabberd.yml
+
+sed -i "s|#' POLL|EJABBERD_BYPASS_WARNINGS=true\n\n#' POLL|g" ejabberdctl.cfg.example
+[ ! -f "$CON_DIR/ejabberdctl.cfg" ] \
+ && echo -n "ejabberdctl.cfg " \
+ && mv ejabberdctl.cfg.example ejabberdctl.cfg
diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl
index 9e72c7b36..cbf372654 100644
--- a/src/ejabberd_admin.erl
+++ b/src/ejabberd_admin.erl
@@ -40,7 +40,7 @@
%% Cluster
join_cluster/1, leave_cluster/1, list_cluster/0,
%% Erlang
- update_list/0, update/1,
+ update_list/0, update/1, update/0,
%% Accounts
register/3, unregister/2,
registered_users/1,
@@ -540,6 +540,15 @@ update_module(ModuleNameString) ->
{error, Reason} -> {error, Reason}
end.
+update() ->
+ io:format("Compiling ejabberd...~n", []),
+ os:cmd("make"),
+ Mods = ejabberd_admin:update_list(),
+ io:format("Updating modules: ~p~n", [Mods]),
+ ejabberd_admin:update("all"),
+ io:format("Updated modules: ", []),
+ Mods -- ejabberd_admin:update_list().
+
%%%
%%% Account management
%%%