Return-Path: Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: (qmail 69366 invoked from network); 21 Apr 2009 15:03:39 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 21 Apr 2009 15:03:39 -0000 Received: (qmail 13276 invoked by uid 500); 21 Apr 2009 15:03:38 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 13209 invoked by uid 500); 21 Apr 2009 15:03:38 -0000 Mailing-List: contact dev-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list dev@couchdb.apache.org Received: (qmail 13199 invoked by uid 99); 21 Apr 2009 15:03:38 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Apr 2009 15:03:38 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: local policy) Received: from [80.68.94.123] (HELO tumbolia.org) (80.68.94.123) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Apr 2009 15:03:29 +0000 Received: from nslater by tumbolia.org with local (Exim 4.69) (envelope-from ) id 1LwHV6-00046E-Us for dev@couchdb.apache.org; Tue, 21 Apr 2009 16:03:08 +0100 Date: Tue, 21 Apr 2009 16:03:08 +0100 From: Noah Slater To: dev@couchdb.apache.org Subject: New configuration mechanism (Was: Re: svn commit: r767164 - in /couchdb/trunk: bin/couchdb.tpl.in etc/couchdb/Makefile.am etc/couchdb/default.d/ etc/couchdb/default.ini.tpl.in etc/couchdb/local.d/) Message-ID: <20090421150308.GB15587@tumbolia.org> Mail-Followup-To: dev@couchdb.apache.org References: <20090421145117.94D1723889FD@eris.apache.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090421145117.94D1723889FD@eris.apache.org> X-Noah: Awesome User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Checked: Checked by ClamAV on apache.org Hey, I have been talking to Robert Newson about CouchDB configuration extensibility. He wants to create a Debian package for Lucene that drops in some configuration snippets in a location they are picked up. Automatically editing the default.ini or local.ini files are out of the question for obvious reasons. In the spirit of doing now, and asking questions later, I have committed a changeset that adds a default.d and local.d directory to PREFIX/etc/couchdb. Any configuration files in these directories are picked up in this order: PREFIX/etc/couchdb/default.ini PREFIX/etc/couchdb/default.d/* PREFIX/etc/couchdb/local.ini PREFIX/etc/couchdb/local.d/* Along with this I have made a backwards incompatible change to the CLI options: > - -c FILE use configuration FILE (chainable, resets system default) > - -C FILE use configuration FILE (chainable, does not reset system > - -default) > + -a FILE add configuration FILE to chain > + -n reset configuration file chain (including system default) > + -c print configuration file chain and exit The same functionality is still there, but with a different way of using it. Please test this change, and let me know your thoughts. On Tue, Apr 21, 2009 at 02:51:17PM -0000, nslater@apache.org wrote: > Author: nslater > Date: Tue Apr 21 14:51:17 2009 > New Revision: 767164 > > URL: http://svn.apache.org/viewvc?rev=767164&view=rev > Log: > added new configuration system > > Added: > couchdb/trunk/etc/couchdb/default.d/ > couchdb/trunk/etc/couchdb/local.d/ > Modified: > couchdb/trunk/bin/couchdb.tpl.in > couchdb/trunk/etc/couchdb/Makefile.am > couchdb/trunk/etc/couchdb/default.ini.tpl.in > > Modified: couchdb/trunk/bin/couchdb.tpl.in > URL: http://svn.apache.org/viewvc/couchdb/trunk/bin/couchdb.tpl.in?rev=767164&r1=767163&r2=767164&view=diff > ============================================================================== > --- couchdb/trunk/bin/couchdb.tpl.in (original) > +++ couchdb/trunk/bin/couchdb.tpl.in Tue Apr 21 14:51:17 2009 > @@ -12,28 +12,28 @@ > # License for the specific language governing permissions and limitations under > # the License. > > -SCRIPT_OK=0 > -SCRIPT_ERROR=1 > - > -INTERACTIVE=false > BACKGROUND=false > +DEFAULT_CONFIG_DIR=%localconfdir%/default.d > +DEFAULT_CONFIG_FILE=%localconfdir%/default.ini > +HEART_BEAT_TIMEOUT=11 > +HEART_COMMAND="%bindir%/%couchdb_command_name% -k" > +INTERACTIVE=false > KILL=false > -SHUTDOWN=false > +LOCAL_CONFIG_DIR=%localconfdir%/local.d > +LOCAL_CONFIG_FILE=%localconfdir%/local.ini > +PID_FILE=%localstatedir%/run/couchdb/couchdb.pid > RECURSED=false > RESET_CONFIG=true > - > RESPAWN_TIMEOUT=0 > - > -DEFAULT_INI_FILE=%localconfdir%/%defaultini% > -LOCAL_INI_FILE=%localconfdir%/%localini% > - > -PID_FILE=%localstatedir%/run/couchdb/couchdb.pid > - > -STDOUT_FILE=couchdb.stdout > +SCRIPT_ERROR=1 > +SCRIPT_OK=0 > +SHUTDOWN=false > STDERR_FILE=couchdb.stderr > +STDOUT_FILE=couchdb.stdout > > -HEART_COMMAND="%bindir%/%couchdb_command_name% -k" > -HEART_BEAT_TIMEOUT=11 > +print_arguments="" > +start_arguments="" > +background_start_arguments="" > > basename=`basename $0` > > @@ -70,8 +70,9 @@ > > -h display a short help message and exit > -V display version information and exit > - -c FILE use configuration FILE (chainable, resets system default) > - -C FILE use configuration FILE (chainable, does not reset system default) > + -a FILE add configuration FILE to chain > + -n reset configuration file chain (including system default) > + -c print configuration file chain and exit > -i use the interactive Erlang shell > -b spawn as a background process > -p FILE set the background PID FILE (overrides system default) > @@ -92,7 +93,7 @@ > fi > echo >&2 > echo "Try \`"$basename" -h' for more information." >&2 > - exit $SCRIPT_ERROR > + false > } > > _get_pid () { > @@ -102,6 +103,48 @@ > echo $PID > } > > +_add_config_file () { > + if test -n "$start_arguments"; then > + start_arguments="$start_arguments, "; > + fi > + if test -z "$print_arguments"; then > + print_arguments="$1" > + else > + print_arguments="`cat < +$print_arguments > +$1 > +EOF > +`" > + fi > + start_arguments="$start_arguments \\\"$1\\\"" > + background_start_arguments="$background_start_arguments -c \\\"$1\\\"" > +} > + > +_add_config_dir () { > + for file in `find "$1" -mindepth 1`; do > + _add_config_file $file > + done > +} > + > +_load_config () { > + _add_config_file "$DEFAULT_CONFIG_FILE" > + _add_config_dir "$DEFAULT_CONFIG_DIR" > + _add_config_file "$LOCAL_CONFIG_FILE" > + _add_config_dir "$LOCAL_CONFIG_DIR" > +} > + > +_reset_config () { > + print_arguments="" > + start_arguments="" > + background_start_arguments="" > +} > + > +_print_config () { > + cat < +$print_arguments > +EOF > +} > + > check_status () { > PID=`_get_pid` > if test -n "$PID"; then > @@ -129,35 +172,35 @@ > message_prefix="Apache CouchDB needs write permission on the" > if test ! -w $PID_FILE; then > echo "$message_prefix PID file: $PID_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > if test ! -w $STDOUT_FILE; then > echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > if test ! -w $STDERR_FILE; then > echo "$message_prefix STDERR file: $STDERR_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > message_prefix="Apache CouchDB needs a regular" > if test `echo 2> /dev/null >> $PID_FILE; echo $?` -gt 0; then > echo "$message_prefix PID file: $PID_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > if test `echo 2> /dev/null >> $STDOUT_FILE; echo $?` -gt 0; then > echo "$message_prefix STDOUT file: $STDOUT_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > if test `echo 2> /dev/null >> $STDERR_FILE; echo $?` -gt 0; then > echo "$message_prefix STDERR file: $STDERR_FILE" >&2 > - exit $SCRIPT_ERROR > + false > fi > } > > start_couchdb () { > if test ! "$RECURSED" = "true"; then > if check_status 2> /dev/null; then > - exit $SCRIPT_OK > + exit > fi > check_environment > fi > @@ -169,22 +212,6 @@ > touch $PID_FILE > interactive_option="+Bd -noinput" > fi > - if test -n "$INI_FILES"; then > - if test "$RESET_CONFIG" = "true"; then > - ini_files="$INI_FILES" > - else > - ini_files="$DEFAULT_INI_FILE $INI_FILES" > - fi > - else > - ini_files="$DEFAULT_INI_FILE $LOCAL_INI_FILE" > - fi > - for file in $ini_files; do > - if test -n "$start_arguments"; then > - start_arguments="$start_arguments, "; > - fi > - start_arguments="$start_arguments \\\"$file\\\"" > - background_start_arguments="$background_start_arguments -c \\\"$file\\\"" > - done > command="`%ICU_CONFIG% --invoke` \ > %ERL% $interactive_option -smp auto -sasl errlog_type error +K true \ > -pa %localerlanglibdir%/%couchdbebindir% \ > @@ -196,8 +223,7 @@ > -eval \"crypto:start()\" \ > -eval \"ibrowse:start()\" \ > -eval \"couch_server:start([$start_arguments]), receive done -> done end.\" " > - if test "$BACKGROUND" = "true" \ > - -a "$RECURSED" = "false"; then > + if test "$BACKGROUND" = "true" -a "$RECURSED" = "false"; then > $0 $background_start_arguments -b -r $RESPAWN_TIMEOUT -p $PID_FILE \ > -o $STDOUT_FILE -e $STDERR_FILE -R & > echo "Apache CouchDB has started, time to relax." > @@ -263,8 +289,9 @@ > } > > parse_script_option_list () { > + _load_config > set +e > - options=`getopt hVc:C:ibp:r:Ro:e:skd $@` > + options=`getopt hVa:ncibp:r:Ro:e:skd $@` > if test ! $? -eq 0; then > display_error > fi > @@ -272,10 +299,11 @@ > eval set -- $options > while [ $# -gt 0 ]; do > case "$1" in > - -h) shift; display_help; exit $SCRIPT_OK;; > - -V) shift; display_version; exit $SCRIPT_OK;; > - -c) shift; INI_FILES="$INI_FILES $1"; shift;; > - -C) shift; RESET_CONFIG=false; INI_FILES="$INI_FILES $1"; shift;; > + -h) shift; display_help; exit;; > + -V) shift; display_version; exit;; > + -a) shift; _add_config_file "$1"; shift;; > + -n) shift; _reset_config;; > + -c) shift; _print_config; exit;; > -i) shift; INTERACTIVE=true;; > -b) shift; BACKGROUND=true;; > -r) shift; RESPAWN_TIMEOUT=$1; shift;; > @@ -283,7 +311,7 @@ > -p) shift; PID_FILE=$1; shift;; > -o) shift; STDOUT_FILE=$1; shift;; > -e) shift; STDERR_FILE=$1; shift;; > - -s) shift; check_status; exit $SCRIPT_OK;; > + -s) shift; check_status; exit;; > -k) shift; KILL=true;; > -d) shift; SHUTDOWN=true;; > --) shift; break;; > > Modified: couchdb/trunk/etc/couchdb/Makefile.am > URL: http://svn.apache.org/viewvc/couchdb/trunk/etc/couchdb/Makefile.am?rev=767164&r1=767163&r2=767164&view=diff > ============================================================================== > --- couchdb/trunk/etc/couchdb/Makefile.am (original) > +++ couchdb/trunk/etc/couchdb/Makefile.am Tue Apr 21 14:51:17 2009 > @@ -48,6 +48,14 @@ > if test ! -f "$(DESTDIR)/$(localconfdir)/local.ini"; then \ > cp $(srcdir)/local.ini "$(DESTDIR)/$(localconfdir)/local.ini"; \ > fi > + if test ! "$(mkdir_p)" = ""; then \ > + $(mkdir_p) "$(DESTDIR)/$(localconfdir)/default.d"; \ > + $(mkdir_p) "$(DESTDIR)/$(localconfdir)/local.d"; \ > + else \ > + echo "WARNING: You may have to create these directories by hand."; \ > + mkdir -p "$(DESTDIR)/$(localconfdir)/default.d"; \ > + mkdir -p "$(DESTDIR)/$(localconfdir)/local.d"; \ > + fi > > uninstall-local: > rm -f "$(DESTDIR)/$(localconfdir)/local.ini" > > Modified: couchdb/trunk/etc/couchdb/default.ini.tpl.in > URL: http://svn.apache.org/viewvc/couchdb/trunk/etc/couchdb/default.ini.tpl.in?rev=767164&r1=767163&r2=767164&view=diff > ============================================================================== > --- couchdb/trunk/etc/couchdb/default.ini.tpl.in (original) > +++ couchdb/trunk/etc/couchdb/default.ini.tpl.in Tue Apr 21 14:51:17 2009 > @@ -52,7 +52,6 @@ > _stats = {couch_httpd_stats_handlers, handle_stats_req} > > [httpd_db_handlers] > -_compact = {couch_httpd_db, handle_compact_req} > _design = {couch_httpd_db, handle_design_req} > _temp_view = {couch_httpd_view, handle_temp_view_req} > > > -- Noah Slater, http://tumbolia.org/nslater