[Ovirt-devel] [PATCH node] Reworked logging for standalone mode

Perry Myers pmyers at redhat.com
Sun Jan 18 08:02:58 UTC 2009


Entire firstboot is logged to both console/logfile using tee.  Selected
sections of the code are set to only log stdout/stderr to logfile to prevent
data overload on console.  In these cases log() function is used to write
to the console.

Signed-off-by: Perry Myers <pmyers at redhat.com>
---
 scripts/ovirt                   |    2 +
 scripts/ovirt-config-boot       |   20 ++++++++++-------
 scripts/ovirt-config-collectd   |    5 ++++
 scripts/ovirt-config-hostname   |    7 ++++++
 scripts/ovirt-config-logging    |    5 ++++
 scripts/ovirt-config-networking |   28 +++++++++++++----------
 scripts/ovirt-config-password   |   15 +++++++++++-
 scripts/ovirt-config-setup      |    6 +++-
 scripts/ovirt-config-storage    |   45 +++++++++++++++++++++++++-------------
 scripts/ovirt-early             |    2 +
 scripts/ovirt-firstboot         |   11 ++++++---
 scripts/ovirt-functions         |   38 +++++++++++++++++++++++++++++++-
 scripts/ovirt-post              |    2 +
 13 files changed, 140 insertions(+), 46 deletions(-)

diff --git a/scripts/ovirt b/scripts/ovirt
index 6a48e47..f789d24 100755
--- a/scripts/ovirt
+++ b/scripts/ovirt
@@ -75,7 +75,9 @@ case "$1" in
         printf "Starting ovirt: "
 
         {
+            log "Starting ovirt"
             start
+            log "Completed ovirt"
         } >> $OVIRT_LOGFILE 2>&1
 
         test $? == 0 && success || failure
diff --git a/scripts/ovirt-config-boot b/scripts/ovirt-config-boot
index 69e02d9..8c25d47 100755
--- a/scripts/ovirt-config-boot
+++ b/scripts/ovirt-config-boot
@@ -22,19 +22,21 @@
 . /etc/init.d/functions
 . /etc/init.d/ovirt-functions
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
 
 ovirt_boot_setup() {
     local disk=$1
     local live=$2
     local bootparams=$3
-    printf "installing oVirt Node image ... "
+    log "installing oVirt Node image."
     mount_boot
     # check that /boot mounted ok and find partition number for GRUB
     BOOT=$(mount|awk '$3 == "/boot" {print $1}')
     BOOT=$(( ${BOOT#$disk} - 1 ))
     rc=$?
     if [ $rc -ne 0 -o $BOOT -lt 0 ]; then
-      printf "boot partition not available\n"
+      log "boot partition not available."
       return $rc
     fi
     mount_liveos
@@ -54,7 +56,7 @@ ovirt_boot_setup() {
     && cp -p $live/$syslinux/vmlinuz0 /boot
     rc=$?
     if [ $rc -ne 0 ]; then
-      printf "image copy failed\n"
+      log "image copy failed."
       return $rc
     fi
     # append LVM support to the livecd initramfs
@@ -113,7 +115,7 @@ setup --prefix=/grub (hd0)
 EOF
     rc=$?
     if [ $rc -ne 0 ]; then
-        printf "boot loader install failed\n"
+        log "boot loader install failed."
         return $rc
     fi
     umount /liveos
@@ -121,14 +123,14 @@ EOF
 
     # caller decides when to reboot
     rm -rf $tmpdir
-    printf "done.\n"
+    log "done."
     # avoid reboot loops using Cobbler PXE only once
     # Cobbler XMLRPC post-install trigger (XXX is there cobbler SRV record?):
     # wget "http://192.168.50.2/cblr/svc/op/trig/mode/post/system/$(hostname)"
     #   -O /dev/null
 }
 
-
+start_log
 disk=$1
 live=$2
 bootparams=$3
@@ -150,13 +152,15 @@ parted $disk -s "print all" > /dev/null
 if [ 0 -eq $? ]; then
     ovirt_boot_setup "$disk" "$live" "$bootparams"
 else
-    printf "Please configure $disk before attempting to install the node image.\n"
-    printf "Use the option 'Disk Partitioning' from the main menu.\n"
+    log "Please configure $disk before attempting to install the node image."
+    log "Use the option 'Disk Partitioning' from the main menu."
     doreboot="no"
 fi
 
 if [ -z "$doreboot" -o "$doreboot" = "yes" ]; then
     disable_firstboot
     ovirt_store_firstboot_config
+    stop_log
     reboot
 fi
+stop_log
diff --git a/scripts/ovirt-config-collectd b/scripts/ovirt-config-collectd
index 6ece6be..bbc5a89 100755
--- a/scripts/ovirt-config-collectd
+++ b/scripts/ovirt-config-collectd
@@ -5,6 +5,9 @@
 . /etc/init.d/functions
 . /etc/init.d/ovirt-functions
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
+
 collectd_conf="/etc/collectd.conf"
 
 # Creates the collectd file based on the following inputs
@@ -15,6 +18,7 @@ ovirt_collectd() {
     local collectd_server=$1
     local collectd_port=$2
 
+    start_log
     if [ -f $collectd_conf.in ]; then
         sed -e "s/@COLLECTD_SERVER@/$collectd_server/" \
             -e "s/@COLLECTD_PORT@/$collectd_port/" $collectd_conf.in \
@@ -26,6 +30,7 @@ ovirt_collectd() {
 
     chkconfig collectd on
     service collectd restart
+    stop_log
 }
 
 prompt_user() {
diff --git a/scripts/ovirt-config-hostname b/scripts/ovirt-config-hostname
index 2375675..bf60c70 100755
--- a/scripts/ovirt-config-hostname
+++ b/scripts/ovirt-config-hostname
@@ -5,18 +5,25 @@
 . /etc/init.d/functions
 . /etc/init.d/ovirt-functions
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
+
 HOSTNAME_FILE="/etc/sysconfig/network"
 
 function set_hostname {
+    start_log
     augtool <<EOF
 set /files$HOSTNAME_FILE/HOSTNAME "$1"
 EOF
+    stop_log
 }
 
 function remove_hostname {
+    start_log
     augtool <<EOF
 rm /files$HOSTNAME_FILE/HOSTNAME
 EOF
+    stop_log
 }
 
 function prompt_user {
diff --git a/scripts/ovirt-config-logging b/scripts/ovirt-config-logging
index d6826c6..ba91468 100755
--- a/scripts/ovirt-config-logging
+++ b/scripts/ovirt-config-logging
@@ -5,6 +5,9 @@
 . /etc/init.d/functions
 . /etc/init.d/ovirt-functions
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
+
 RSYSLOG_FILE="/etc/rsyslog.conf"
 
 # Creates the rsyslog file based on the following inputs
@@ -62,7 +65,9 @@ local7.*                                                /var/log/boot.log
 *.* $DELIM$1:$2
 EOF
 
+start_log
 /sbin/service rsyslog restart
+stop_log
 }
 
 function is_numeric {
diff --git a/scripts/ovirt-config-networking b/scripts/ovirt-config-networking
index 6d55816..4b4ff10 100755
--- a/scripts/ovirt-config-networking
+++ b/scripts/ovirt-config-networking
@@ -13,11 +13,10 @@ WORKDIR=$(mktemp -d) || exit 1
 
 # Remove $WORKDIR upon interrupt (and HUP, PIPE, TERM) and upon normal
 # termination, being careful not to change the exit status.
-trap '__st=$?; rm -rf "$WORKDIR"; exit $__st' 0
+trap '__st=$?; rm -rf "$WORKDIR"; stop_log; exit $__st' 0
 trap 'exit $?' 1 2 13 15
 
 CONFIG_FILE_ROOT="/files/etc/sysconfig/network-scripts/ifcfg"
-CONFIG_LOG_FILE="/var/log/ovirt-network-setup.log"
 
 function configure_interface
 {
@@ -220,7 +219,7 @@ else
     setup_menu
 
     while true; do
-        printf "\n\n oVirt Node Networking Configuration\n\n"
+        printf "\n\n oVirt Node Networking Configuration\n\n" >&2
 
         select NIC in $NICS
         do
@@ -234,13 +233,18 @@ else
     done
 fi
 
-{
-    printf "Configuring network.\n"
-    if ls "$WORKDIR"/augtool-* > /dev/null 2>&1 ; then
-        config="$WORKDIR"/config-augtool
-        cat "$WORKDIR"/augtool-* > $config \
-            && augtool $config  \
-            && service network restart
+start_log
+if ls "$WORKDIR"/augtool-* > /dev/null 2>&1 ; then
+    log "Configuring network"
+    config="$WORKDIR"/config-augtool
+    cat "$WORKDIR"/augtool-* > $config \
+        && augtool $config  \
+        && service network restart
+    if [ $? = 0 ]; then
+        log "Network configured successfully"
+    else
+        log "Error configuring network, see $OVIRT_LOGFILE"
     fi
-    ovirt_store_config /etc/sysconfig/network-scripts/ifcfg*
-} 2>&1 | tee $CONFIG_LOG_FILE
+fi
+ovirt_store_config /etc/sysconfig/network-scripts/ifcfg*
+stop_log
diff --git a/scripts/ovirt-config-password b/scripts/ovirt-config-password
index 47be3f7..89b91da 100755
--- a/scripts/ovirt-config-password
+++ b/scripts/ovirt-config-password
@@ -1,12 +1,22 @@
 #!/bin/bash
 #
 # Set the root password and others
+# Source functions library
+. /etc/init.d/functions
+. /etc/init.d/ovirt-functions
+
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
 
 function sasl_password {
     user=$1
     passwd=$2
-    printf "adding user $user to the sasl list for libvirt\n"
+
+    printf "\nadding user $user to the sasl list for libvirt\n"
+
+    start_log
     printf '%s\n' "$passwd" | saslpasswd2 -a libvirt -p "$user"
+    stop_log
 }
 
 # Usage: set_sasl_password USER
@@ -25,7 +35,9 @@ function set_sasl_password {
         local confirm=$REPLY
         if test "$passwd" = "$confirm"; then
             if [ "$user" = "root" ]; then
+                start_log
                 printf '%s\n' "$passwd" | passwd --stdin "$user"
+                stop_log
             fi
             sasl_password "$user" "$passwd"
             return 0
@@ -53,4 +65,3 @@ set_sasl_password root
 printf "\nAdding new SASL users for libvirt"
 # TODO list existing users in /etc/libvirt/passwd.db
 while prompt_sasl_user; do :; done
-
diff --git a/scripts/ovirt-config-setup b/scripts/ovirt-config-setup
index 380d79d..21e6b0e 100755
--- a/scripts/ovirt-config-setup
+++ b/scripts/ovirt-config-setup
@@ -2,6 +2,8 @@
 #
 # Entry point for configuring an oVirt node when running in standalone mode.
 
+. /etc/init.d/ovirt-functions
+
 # symlinked scripts for menu options, link name is menu label
 CONFIG_DIR=/etc/ovirt-config-setup.d
 
@@ -29,7 +31,7 @@ while true; do
     PS3="Please select an option: "
 
     while true ; do
-        printf "\n\n oVirt Node Standalone Configuration\n\n"
+        printf "\n\n oVirt Node Standalone Configuration\n\n" >&2
 
         select OPTION in "${OPTIONS[@]}"
         do
@@ -38,7 +40,7 @@ while true; do
                 "$CONTINUE") exit 0 ;;
                 *)
                     clear;
-                    $CONFIG_DIR/*"$OPTION";
+                    $CONFIG_DIR/*"$OPTION" 2>&1 | $TEE;
                     break ;;
             esac
         done
diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
index 9928920..7489c68 100755
--- a/scripts/ovirt-config-storage
+++ b/scripts/ovirt-config-storage
@@ -12,6 +12,9 @@ ME=$(basename "$0")
 warn() { printf '%s: %s\n' "$ME" "$*" >&2; }
 die() { warn "$*"; exit 1; }
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
+
 default_boot_size=50
 default_root_size=256
 default_config_size=5
@@ -178,24 +181,25 @@ perform_partitioning()
     DRIVE_FILE=$(echo $DRIVE | tr '/' '_')
     if [ -f /tmp/ovirt-config-storage-$DRIVE_FILE ]; then
         printf "\n\nERROR:\n"
-        printf "\nStorage Configuration has already been run for $DRIVE_FILE.\n"
-        printf "To run it again, please reboot the Node from\n USB/cdrom/PXE\n"
+        printf "Storage Configuration has already been run for $DRIVE.\n"
+        printf "To run it again, please reboot the Node from USB/cdrom/PXE\n"
         printf "in stand-alone mode.\n\n\n"
         return 1
     fi
 
     touch /tmp/ovirt-config-storage-$DRIVE_FILE
 
-    printf "Preparing local storage. Please wait..."
+    start_log
+    log "Starting partitioning of $DRIVE"
 
-    LOG=/var/log/ovirt-partition.log
-    {
+    log "Removing old LVM partitions"
     wipe_lvm_on_disk
 
     # Exit upon any failure.
     set -e
 
     # FIXME: save a backup copy, just in case?
+    log "Wiping old boot sector"
     dd if=/dev/zero of=$DRIVE bs=1024K count=1
     blockdev --rereadpt $DRIVE
     partprobe -s $DRIVE
@@ -204,6 +208,7 @@ perform_partitioning()
         # ensure minimal BOOT partition
         BOOT_SIZE=10
     fi
+    log "Creating boot partition"
     parted $DRIVE -s "mklabel ${LABEL_TYPE}"
     parted $DRIVE -s "mkpartfs primary ext2 0M ${BOOT_SIZE}M"
     parted $DRIVE -s "mkpart primary ext2 ${BOOT_SIZE}M ${SPACE}M"
@@ -214,57 +219,65 @@ perform_partitioning()
 
     # sync GPT to the legacy MBR partitions
     if [ "gpt" == "$LABEL_TYPE" ]; then
-	gptsync $DRIVE
+        log "Running gptsync to create legacy mbr"
+        gptsync $DRIVE
     fi
 
+    log "Creating physical volume"
     pvcreate "${DRIVE}2"
     pvck
+    log "Creating volume group"
     vgcreate /dev/HostVG "${DRIVE}2"
 
+    log "Creating boot filesystem"
     mke2fs -T ext3 "${DRIVE}1"         -L "BOOT"
     tune2fs -c 0 -i 0 "${DRIVE}1"
     mkdir -p /dev/disk/by-label
     ln -snf "${DRIVE}1" /dev/disk/by-label/BOOT
 
     if [ "$SWAP_SIZE" -gt 0 ]; then
+        log "Creating swap partition"
         lvcreate --name Swap    --size ${SWAP_SIZE}M    /dev/HostVG
         mkswap -L "SWAP" /dev/HostVG/Swap
         echo "/dev/HostVG/Swap swap swap defaults 0 0" >> /etc/fstab
     fi
     if [ "$ROOT_SIZE" -gt 0 ]; then
+        log "Creating root partition"
         lvcreate --name Root    --size ${ROOT_SIZE}M    /dev/HostVG
         mke2fs -T ext3 /dev/HostVG/Root    -L "ROOT"
         tune2fs -c 0 -i 0 /dev/HostVG/Root
     fi
     if [ "$CONFIG_SIZE" -gt 0 ]; then
+        log "Creating config partition"
         lvcreate --name Config  --size ${CONFIG_SIZE}M  /dev/HostVG
         mke2fs -T ext3 /dev/HostVG/Config  -L "CONFIG"
         tune2fs -c 0 -i 0 /dev/HostVG/Config
     fi
     if [ "$LOGGING_SIZE" -gt 0 ]; then
+        log "Creating log partition"
         lvcreate --name Logging --size ${LOGGING_SIZE}M /dev/HostVG
         mke2fs -T ext3 /dev/HostVG/Logging -L "LOGGING"
         tune2fs -c 0 -i 0 /dev/HostVG/Logging
         echo "/dev/HostVG/Logging /var/log ext3 defaults 0 0" >> /etc/fstab
-        mount_logging
     fi
+    log "Creating data partition"
     lvcreate --name Data    -l 100%FREE             /dev/HostVG
     mke2fs -T ext3 /dev/HostVG/Data    -L "DATA"
     tune2fs -c 0 -i 0 /dev/HostVG/Data
     echo "/dev/HostVG/Data /data ext3 defaults 0 0" >> /etc/fstab
     echo "/data/images /var/lib/libvirt/images bind bind 0 0" >> /etc/fstab
+    log "Mounting data partition"
     mount_data
 
+    log "Mounting config partition"
     if mount_config; then
         ovirt_store_config /etc/fstab
     fi
-    } 2>&1 | tee $LOG
 
-    if [ $? -eq 0 ]; then
-        printf "Completed!\n\n"
-    else
-        printf "FAILED! See $LOG\n\n"
-    fi
+    mount_logging
+    log "Completed!"
+
+    stop_log
 }
 
 do_confirm()
@@ -297,7 +310,7 @@ do_confirm()
             Y|y)
                 check_partition_sizes
                 perform_partitioning
-		exit 0
+		        exit 0
                 break
                 ;;
             N|n)  return ;;
@@ -357,7 +370,7 @@ else
     PS3="Choose an option: "
 
     while true; do
-        printf "\n\n oVirt Node Storage Configuration\n\n"
+        printf "\n\n oVirt Node Storage Configuration\n\n" >&2
 
         select OPTION in $OPTIONS
         do
@@ -365,7 +378,7 @@ else
                 "Configure") do_configure ; break ;;
                 "Review")    do_review    ; break ;;
                 "Partition") do_confirm   ; break ;;
-                "Quit")      exit ;;
+                "Quit") exit ;;
             esac
         done
     done
diff --git a/scripts/ovirt-early b/scripts/ovirt-early
index f31e977..6c7b29b 100755
--- a/scripts/ovirt-early
+++ b/scripts/ovirt-early
@@ -391,7 +391,9 @@ case "$1" in
         printf "Starting ovirt-early: "
 
         {
+            log "Starting ovirt-early"
             start
+            log "Completed ovirt-early"
         } >> $OVIRT_LOGFILE 2>&1
 
         test $? == 0 && success || failure
diff --git a/scripts/ovirt-firstboot b/scripts/ovirt-firstboot
index c7ddfe4..575fa89 100755
--- a/scripts/ovirt-firstboot
+++ b/scripts/ovirt-firstboot
@@ -27,6 +27,9 @@
 . /etc/init.d/functions
 . /etc/init.d/ovirt-functions
 
+trap '__st=$?; stop_log; exit $__st' 0
+trap 'exit $?' 1 2 13 15
+
 start ()
 {
     if ! is_firstboot && ! is_auto_install; then
@@ -57,7 +60,9 @@ start ()
     fi
     disable_firstboot
 
-    ovirt_store_firstboot_config >> $OVIRT_LOGFILE 2>&1
+    start_log
+    ovirt_store_firstboot_config
+    stop_log
 }
 
 case "$1" in
@@ -68,9 +73,7 @@ case "$1" in
 
         printf "Starting ovirt-firstboot: "
 
-        {
-            start
-        }
+        start
 
         test $? == 0 && success || failure
         echo
diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
index 814a8ae..13f9ad4 100644
--- a/scripts/ovirt-functions
+++ b/scripts/ovirt-functions
@@ -1,6 +1,8 @@
 # -*-Shell-script-*-
 
 OVIRT_LOGFILE=/var/log/ovirt.log
+TEE="tee -a $OVIRT_LOGFILE"
+LOG_STATUS=0
 
 # label of the oVirt partition
 OVIRT_LABEL=OVIRT
@@ -28,6 +30,37 @@ OVIRT_CONFIG_FILES="\
  /etc/collectd.conf
 "
 
+# Save stdout to fd 6 and stderr to fd 7.  Redirect normal stdout/stderr
+# to log file
+start_log() {
+    if [ $LOG_STATUS = 0 ]; then
+        exec 6>&1
+        exec 7>&2
+        exec 1>>$OVIRT_LOGFILE
+        exec 2>&1
+        LOG_STATUS=1
+    fi
+}
+
+# Restore stdout/stderr from fd 6 and 7, respectively.  Close fd 6 and 7
+stop_log() {
+    if [ $LOG_STATUS = 1 ]; then
+        exec 1>&6 6>&-
+        exec 2>&7 7>&-
+        LOG_STATUS=0
+    fi
+}
+
+log() {
+    printf "$(date +'%b %d %H:%M:%S') "
+
+    if [ $LOG_STATUS = 1 ]; then
+        echo $@ >&6
+    else
+        echo $@
+    fi
+}
+
 ovirt_store_firstboot_config() {
     # persist config for standalone
     ovirt_store_config $OVIRT_CONFIG_FILES
@@ -220,15 +253,16 @@ mount_logging() {
     fi
 
     if [ -e /dev/HostVG/Logging ] ; then
+        log "Mounting log partition"
         #  backup the logs
         if [ -e /var/log.bak ]; then
             rm -rf /var/log.bak
         fi
-        cp -a /var/log /var/log.bak
+        cp -av /var/log /var/log.bak
 
         mount /dev/HostVG/Logging /var/log
         restorecon -rv /var/log
-        mv /var/log.bak/* /var/log
+        cp -av /var/log.bak/* /var/log
         rm -Rf /var/log.bak
         service rsyslog restart
 
diff --git a/scripts/ovirt-post b/scripts/ovirt-post
index 5c06927..3861973 100755
--- a/scripts/ovirt-post
+++ b/scripts/ovirt-post
@@ -34,7 +34,9 @@ case "$1" in
         printf "Starting ovirt-post: "
 
         {
+            log "Starting ovirt-post"
             start
+            log "Completed ovirt-post"
         } >> $OVIRT_LOGFILE 2>&1
 
         test $? == 0 && success || failure
-- 
1.6.0.6




More information about the ovirt-devel mailing list