From adbccbe852e3d9980e531ff206bebd6b2c983fba Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 17 Jan 2022 11:49:16 +0100 Subject: [PATCH] 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(). --- Makefile.in | 41 ++++++++++++++++++++++++++++++++++------- config/runtime.exs | 26 ++++++++++++++++---------- rebar.config | 6 ++++++ rel/relive.config | 3 +++ rel/relive.escript | 26 ++++++++++++++++++++++++++ rel/setup-relive.sh | 30 ++++++++++++++++++++++++++++++ src/ejabberd_admin.erl | 11 ++++++++++- 7 files changed, 125 insertions(+), 18 deletions(-) create mode 100644 rel/relive.config create mode 100644 rel/relive.escript create mode 100755 rel/setup-relive.sh 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 %%%