X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=guest.init;h=309523e3371c23b7fa07cb6a5a0061330faccc71;hb=refs%2Fheads%2F4.2;hp=b287ef7bf3b0a2de05d5730fd6e92f151ef0bf3e;hpb=973576c01191b4c16b51d636378af9bfb3dab50b;p=myplc.git diff --git a/guest.init b/guest.init index b287ef7..309523e 100755 --- a/guest.init +++ b/guest.init @@ -6,7 +6,7 @@ # # description: Manages all PLC services on this machine # -# $Id: guest.init,v 1.17 2006/04/27 21:50:00 mlhuang Exp $ +# $Id$ # # Source function library and configuration @@ -20,11 +20,27 @@ verbose=0 # being run. The idea is that when the configuration changes, "service # plc restart" is called, all dependencies are fixed up, and # everything just works. + +### NOTE. +# we want the resulting myplc to be able to easily skip +# some steps. e.g. the packages step takes ages if you install +# all rpms under the repository. +# We skip steps whose name contains a dot (.) or a tilde (~) +# this way the operations would just rename a step name e.g. +# cd /etc/plc.d +# mv packages packages.hide +# +# The drawback is, this stuff does not survive an rpm update +# but that's maybe a good thing, that all is done at first start +### + steps=($( for step in /etc/plc.d/* ; do - if [ -f $step -a -x $step ] ; then + stepname=$(basename $step) + plainstepname=$(echo $stepname | sed -e 's,\.,,' -e 's,~,,') + if [ -f $step -a -x $step -a "$stepname" = "$plainstepname" ] ; then priority=$(sed -ne 's/# priority: \(.*\)/\1/p' $step) - echo $priority $(basename $step) + echo $priority $stepname fi done | sort -n | cut -d' ' -f2 )) @@ -33,81 +49,41 @@ nsteps=${#steps[@]} # Regenerate configuration files reload () { + force=$1 + # Regenerate the main configuration file from default values # overlaid with site-specific and current values. - tmp=$(mktemp /tmp/plc_config.xml.XXXXXX) - plc-config --xml \ - /etc/planetlab/default_config.xml \ - /etc/planetlab/configs/* \ - /etc/planetlab/plc_config.xml \ - >$tmp - if [ $? -eq 0 ] ; then - mv $tmp /etc/planetlab/plc_config.xml - chmod 644 /etc/planetlab/plc_config.xml - else - echo "PLC: Warning: Invalid configuration file(s) detected" - rm -f $tmp - fi - - # Shell constants - plc-config --shell >/etc/planetlab/plc_config - . /etc/planetlab/plc_config + # Thierry -- 2007-07-05 : values in plc_config.xml are *not* taken into account here + files=( + /etc/planetlab/default_config.xml + /etc/planetlab/configs/site.xml + ) + for file in "${files[@]}" ; do + if [ -n "$force" -o $file -nt /etc/planetlab/plc_config.xml ] ; then + tmp=$(mktemp /tmp/plc_config.xml.XXXXXX) + plc-config --xml "${files[@]}" >$tmp + if [ $? -eq 0 ] ; then + mv $tmp /etc/planetlab/plc_config.xml + chmod 444 /etc/planetlab/plc_config.xml + else + echo "PLC: Warning: Invalid configuration file(s) detected" + rm -f $tmp + fi + break + fi + done - # Generate various defaults - if [ -z "$PLC_DB_PASSWORD" ] ; then - PLC_DB_PASSWORD=$(uuidgen) - plc-config --category=plc_db --variable=password --value="$PLC_DB_PASSWORD" --save + # Convert configuration to various formats + if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/plc_config ] ; then + plc-config --shell >/etc/planetlab/plc_config fi - - if [ -z "$PLC_API_MAINTENANCE_PASSWORD" ] ; then - PLC_API_MAINTENANCE_PASSWORD=$(uuidgen) - plc-config --category=plc_api --variable=maintenance_password --value="$PLC_API_MAINTENANCE_PASSWORD" --save + if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/plc_config.py ] ; then + plc-config --python >/etc/planetlab/plc_config.py + fi + if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/php/plc_config.php ] ; then + mkdir -p /etc/planetlab/php + plc-config --php >/etc/planetlab/php/plc_config.php fi - - # Need to configure network before resolving hostnames - /etc/plc.d/network start 3>/dev/null 4>/dev/null - - PLC_API_MAINTENANCE_SOURCES=$( - for server in API BOOT WWW ; do - hostname=PLC_${server}_HOST - gethostbyname ${!hostname} - done | sort -u - ) - plc-config --category=plc_api --variable=maintenance_sources --value="$PLC_API_MAINTENANCE_SOURCES" --save - - # Save configuration - mkdir -p /etc/planetlab/php - plc-config --php >/etc/planetlab/php/plc_config.php - plc-config --shell >/etc/planetlab/plc_config - - # For backward compatibility, until we can convert all code to use - # the now standardized variable names. - - # DB constants are all named the same - ln -sf plc_config /etc/planetlab/plc_db - - # PHP constants - cat >/etc/planetlab/php/site_constants.php <<"EOF" -'); -define('PLANETLAB_SUPPORT_EMAIL_ONLY', PLC_MAIL_SUPPORT_ADDRESS); -?> -EOF - - # API constants are written in plc.d/api } usage() @@ -121,6 +97,9 @@ usage() echo " stop Stop all PLC subsystems" echo " reload Regenerate configuration files" echo " restart Restart all PLC subsystems" + echo " checkpoint filename : Checkpoint the current state of MyPLC to filename" + echo " restore filename : Restore MyPLC state from filename" + echo " steps Displays ordered list of subsystems" echo echo "Steps:" for step in "${steps[@]}" ; do @@ -162,7 +141,7 @@ command=$1 shift 1 if [ -z "$1" ] ; then # Start or stop everything. Regenerate configuration first. - reload + reload force else # Start or stop a particular step steps=("$@") @@ -176,6 +155,8 @@ start () for step in "${steps[@]}" ; do if [ -x /etc/plc.d/$step ] ; then /etc/plc.d/$step start + # Steps may alter the configuration, may need to regenerate + reload else echo "PLC: $step: unrecognized step" >&4 exit 1 @@ -189,6 +170,8 @@ stop () step=${steps[$(($nsteps - $i))]} if [ -x /etc/plc.d/$step ] ; then /etc/plc.d/$step stop + # Steps may alter the configuration, may need to regenerate + reload else echo "PLC: $step: unrecognized step" >&4 exit 1 @@ -207,6 +190,44 @@ case "$command" in ;; reload) + reload force + ;; + + checkpoint) + cpfile=$1 + if [ -z "$cpfile" ] ; then + echo "PLC: checkpoint requires a filename as an argument" + exit 1 + fi + cpdir=$(mktemp -d tmp.XXXXXX) + cd $cpdir + mkdir -p ./etc/planetlab/ + rsync -av /etc/planetlab/ ./etc/planetlab/ + /etc/plc.d/db checkpoint ./etc/planetlab/plc_db.checkpoint ./etc/planetlab/plc_drupal.checkpoint + tar cjf $cpfile etc + cd - + rm -rf $cpdir + ;; + + restore) + cpfile=$1 + cpdir=$(mktemp -d tmp.XXXXXX) + cd $cpdir + tar xjf $cpfile + /etc/plc.d/db restore ./etc/planetlab/plc_db.checkpoint ./etc/planetlab/plc_drupal.checkpoint + rm -f ./etc/planetlab/plc_db.checkpoint ./etc/planetlab/plc_drupal.checkpoint + rsync -av ./etc/planetlab/ /etc/planetlab/ + cd - + rm -rf $cpdir + ;; + + steps) + echo "${steps[@]}" >&4 + ;; + + # for backwards compatibility + mount|umount|mountstatus) + echo "${command} not used within native myplc environment" ;; *)