[Ovirt-devel] [PATCH node] Creates a standalone mode entry point script.

Bryan Kearney bkearney at redhat.com
Wed Nov 5 21:19:19 UTC 2008


Darryl L. Pierce wrote:
> NOTE: This is for feedback and testing, and requires the patch for 
> node-image to reintroduce hal-device.
> 
> The script will execute only when the node is booted without the support of
> a server suite. If it determines that the node is running in standalone mode,
> it will then kick over to a node setup script.
> 
> This iteration defines the general flow for the standalone mode's firstboot
> use case. When the node boots and determines it's in standalone mode, it
> goes through the following steps:
> 
> 1. Prompt for an administrator password
> 2. Prompt the user to configure disk storage
> 3. Prompt the user to configure networking
> 4. Prompt the user to configure logging
> 
> The node then continues to boot normally.
> ---
>  Makefile.am                     |   34 +++++----
>  ovirt-node.spec.in              |   15 ++++-
>  scripts/ovirt-config-logging    |    1 +
>  scripts/ovirt-config-networking |   98 ++++++++++++++++++++++++++
>  scripts/ovirt-config-password   |    1 +
>  scripts/ovirt-config-setup      |   43 +++++++++++
>  scripts/ovirt-config-storage    |  147 +++++++++++++++++++++++++++++++++++++++
>  scripts/ovirt-functions         |    5 ++
>  scripts/ovirt-standalone-mode   |   55 +++++++++++++++
>  9 files changed, 384 insertions(+), 15 deletions(-)
>  create mode 100755 scripts/ovirt-config-logging
>  create mode 100755 scripts/ovirt-config-networking
>  create mode 100755 scripts/ovirt-config-password
>  create mode 100755 scripts/ovirt-config-setup
>  create mode 100755 scripts/ovirt-config-storage
>  create mode 100755 scripts/ovirt-standalone-mode
> 
> diff --git a/Makefile.am b/Makefile.am
> index c55db13..3d824db 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -18,20 +18,26 @@
>  OVIRT_CACHE_DIR	?= $(HOME)/ovirt-cache
>  SUBDIRS = ovirt-identify-node ovirt-listen-awake
>  
> -EXTRA_DIST =			\
> -  .gitignore			\
> -  ovirt-node.spec		\
> -  ovirt-node.spec.in		\
> -  ovirt-node-selinux.te		\
> -  scripts/collectd		\
> -  scripts/collectd.conf.in	\
> -  scripts/ovirt			\
> -  scripts/ovirt-awake		\
> -  scripts/ovirt-early		\
> -  scripts/ovirt-functions	\
> -  scripts/ovirt-post		\
> -  scripts/ovirt-process-config  \
> -  logrotate/ovirt-logrotate	\
> +EXTRA_DIST =			  \
> +  .gitignore			  \
> +  ovirt-node.spec		  \
> +  ovirt-node.spec.in		  \
> +  ovirt-node-selinux.te		  \
> +  scripts/collectd		  \
> +  scripts/collectd.conf.in	  \
> +  scripts/ovirt			  \
> +  scripts/ovirt-awake		  \
> +  scripts/ovirt-config-logging    \
> +  scripts/ovirt-config-networking \
> +  scripts/ovirt-config-password   \
> +  scripts/ovirt-config-setup      \
> +  scripts/ovirt-config-storage    \
> +  scripts/ovirt-early		  \
> +  scripts/ovirt-functions	  \
> +  scripts/ovirt-post		  \
> +  scripts/ovirt-process-config    \
> +  scripts/ovirt-standalone-mode   \
> +  logrotate/ovirt-logrotate	  \
>    logrotate/ovirt-logrotate.conf
>  
>  # For Release: 0..., set _ovirt_dev=1 so that we get extra_release.GIT-
> diff --git a/ovirt-node.spec.in b/ovirt-node.spec.in
> index d029c57..10a544b 100644
> --- a/ovirt-node.spec.in
> +++ b/ovirt-node.spec.in
> @@ -88,17 +88,22 @@ cd -
>  
>  %{__install} -p -m0755 scripts/ovirt-awake %{buildroot}%{_sbindir}
>  %{__install} -p -m0755 scripts/ovirt-process-config %{buildroot}%{_sbindir}
> +%{__install} -p -m0755 scripts/ovirt-config-logging %{buildroot}%{_sbindir}
> +%{__install} -p -m0755 scripts/ovirt-config-networking %{buildroot}%{_sbindir}
> +%{__install} -p -m0755 scripts/ovirt-config-password %{buildroot}%{_sbindir}
> +%{__install} -p -m0755 scripts/ovirt-config-setup %{buildroot}%{_sbindir}
> +%{__install} -p -m0755 scripts/ovirt-config-storage %{buildroot}%{_sbindir}
>  %{__install} -p -m0755 ovirt-identify-node/ovirt-identify-node %{buildroot}%{_sbindir}
>  %{__install} -p -m0755 ovirt-listen-awake/ovirt-listen-awake %{buildroot}%{_sbindir}
>  %{__install} -Dp -m0755 ovirt-listen-awake/ovirt-listen-awake.init %{buildroot}%{_initrddir}/ovirt-listen-awake
>  %{__install} -Dp -m0755 ovirt-listen-awake/ovirt-install-node %{buildroot}%{_sbindir}
>  %{__install} -Dp -m0755 ovirt-listen-awake/ovirt-uninstall-node %{buildroot}%{_sbindir}
>  
> -
>  %{__install} -p -m0644 scripts/ovirt-functions %{buildroot}%{_initrddir}
>  %{__install} -p -m0755 scripts/ovirt-early %{buildroot}%{_initrddir}
>  %{__install} -p -m0755 scripts/ovirt %{buildroot}%{_initrddir}
>  %{__install} -p -m0755 scripts/ovirt-post %{buildroot}%{_initrddir}
> +%{__install} -p -m0755 scripts/ovirt-standalone-mode %{buildroot}%{_initrddir}
>  
>  %{__install} -p -m0644 scripts/collectd %{buildroot}%{_sysconfdir}/chkconfig.d
>  %{__install} -p -m0644 scripts/collectd.conf.in %{buildroot}%{_sysconfdir}
> @@ -125,6 +130,7 @@ cd -
>  /sbin/chkconfig --add ovirt-early
>  /sbin/chkconfig --add ovirt
>  /sbin/chkconfig --add ovirt-post
> +/sbin/chkconfig --add ovirt-standalone-mode
>  # this is ugly; we need collectd to start *after* libvirtd, so we own the
>  # /etc/chkconfig.d/collectd file, and then have to re-define collectd here
>  /sbin/chkconfig --add collectd
> @@ -136,6 +142,7 @@ if [ "$1" = 0 ] ; then
>    /sbin/chkconfig --del ovirt
>    /sbin/chkconfig --del ovirt-post
>    /sbin/chkconfig --del ovirt-listen-awake
> +  /sbin/chkconfig --del ovirt-standalone-mode
>  fi
>  
>  %post selinux
> @@ -159,6 +166,11 @@ fi
>  %files
>  %defattr(-,root,root,0755)
>  %{_sbindir}/ovirt-awake
> +%{_sbindir}/ovirt-config-logging
> +%{_sbindir}/ovirt-config-networking
> +%{_sbindir}/ovirt-config-password
> +%{_sbindir}/ovirt-config-setup
> +%{_sbindir}/ovirt-config-storage
>  %{_sbindir}/ovirt-process-config
>  %{_sbindir}/ovirt-identify-node
>  %{_sbindir}/ovirt-listen-awake
> @@ -168,6 +180,7 @@ fi
>  %{_initrddir}/ovirt
>  %{_initrddir}/ovirt-post
>  %{_initrddir}/ovirt-listen-awake
> +%{_initrddir}/ovirt-standalone-mode
>  %config %{_sysconfdir}/logrotate.d/ovirt-logrotate.conf
>  %config %{_sysconfdir}/cron.hourly/ovirt-logrotate
>  %defattr(-,root,root,0644)
> diff --git a/scripts/ovirt-config-logging b/scripts/ovirt-config-logging
> new file mode 100755
> index 0000000..8b13789
> --- /dev/null
> +++ b/scripts/ovirt-config-logging
> @@ -0,0 +1 @@
> +
> diff --git a/scripts/ovirt-config-networking b/scripts/ovirt-config-networking
> new file mode 100755
> index 0000000..705521b
> --- /dev/null
> +++ b/scripts/ovirt-config-networking
> @@ -0,0 +1,98 @@
> +#!/bin/bash
> +#
> +# Iterates over the list of network devices on the node and prompts the user
> +# to configure each.
> +
> +CONFIG_FILE_ROOT="/file/etc/sysconfig/network-scripts/ifcfg"
> +
> +function configure_interface
> +{
> +    NIC=$1
> +    FILENAME="/var/tmp/augtool-$NIC"
> +
> +    printf "\nCONFIGURE INTERFACE: $NIC\n\n"
> +
> +    THIS_ROOT="$CONFIG_FILE_ROOT-$NIC"
> +    CONFIG="rm $THIS_ROOT\nset $THIS_ROOT/DEVICE $NIC"
> +
> +    # Is this NIC shared?
> +    while true; do
> +        printf "Is $NIC a shared interface? (Y/N) "
> +        read
> +        case $REPLY in
> +            Y|y) CONFIG="$CONFIG\nset $THIS_ROOT/TYPE bridge"; break ;;
> +            N|n) bridge="N"; break ;;
> +        esac
> +    done
> +
> +    # how do you want to configure this device? (dhcp, static IP)
> +    while true; do
> +        printf "Does $NIC use dynamic addressing? (Y/N) "
> +        read
> +        case $REPLY in
> +            Y|y) CONFIG="$CONFIG\nset $THIS_ROOT/BOOTPROTO dhcp"; break ;;
> +            N|n)
> +                printf "\tIP Address: "; read; IPADDR=$REPLY
> +                printf "\t   Netmask: "; read; NETMASK=$REPLY
> +                printf "\t Broadcast: "; read; BROADCAST=$REPLY
> +                printf "\t   Gateway: "; read; GATEWAY=$REPLY
> +
> +                printf "\nIP Address: $IPADDR\nNetmask: $NETMASK\nBroadcast: $BROADCAST\nGateway: $GATEWAY\n"
> +                printf "Is this correct? (Y/N) "
> +                read
> +                case $REPLY in
> +                    Y|y)
> +                        CONFIG="$CONFIG\nset $THIS_ROOT/IPADDR $IPADDR"
> +                        CONFIG="$CONFIG\nset $THIS_ROOT/BROADCAST $BROADCAST"
> +                        CONFIG="$CONFIG\nset $THIS_ROOT/NETMASK $NETMASK"
> +                        break
> +                        ;;
> +                esac
> +                ;;
> +        esac
> +    done
> +
> +    if [ "$bridge" == "N" ]; then
> +        printf "Is $NIC bridged? (Y/N) "
> +        read
> +        case $REPLY in
> +            Y|y)
> +                printf "What is the bridge name? "
> +                read
> +                CONFIG="$CONFIG\n set $THIS_ROOT/BRIDGE $REPLY"
> +                ;;
> +        esac
> +    fi
> +
> +    CONFIG="$CONFIG\nset $THIS_ROOT/ONBOOT yes"
> +    printf "$CONFIG\n" > $FILENAME
> +
> +    echo
> +}
> +
> +# TODO the menu doesn't redisplay unless you hit enter -- needs fixing
> +# get the list of network cards on this machine
> +NICS=$(hal-device | awk '/net.interface/ {
> +    match($0, "= '"'"'(.*)'"'"' ", nic); printf("%s ", nic[1]); }')
> +
> +# Append a quit option
> +NICS="$NICS Quit"
> +
> +PS3="Please select a network interface to configure:"
> +select NIC in $NICS
> +do
> +    case "$NIC" in
> +        "Quit")
> +            break
> +            ;;
> +
> +        *)
> +            configure_interface $NIC
> +            ;;
> +    esac
> +done
> +
> +# Merge together all generated files and run augtool
> +
> +cat /var/tmp/augtool-* > /var/tmp/config-augtool
> +augtool < /var/tmp/config-augtool
> diff --git a/scripts/ovirt-config-password b/scripts/ovirt-config-password
> new file mode 100755
> index 0000000..8b13789
> --- /dev/null
> +++ b/scripts/ovirt-config-password
> @@ -0,0 +1 @@
> +
> diff --git a/scripts/ovirt-config-setup b/scripts/ovirt-config-setup
> new file mode 100755
> index 0000000..a8bdc5d
> --- /dev/null
> +++ b/scripts/ovirt-config-setup
> @@ -0,0 +1,43 @@
> +#!/bin/bash
> +#
> +# Entry point for configuring an oVirt node when running in standalone mode.
> +
> +PS3="Please select an option: "
> +
> +# TODO should we make this optional, based on whether the password was already set?
> +PASSWORD_OPTION="Password"
> +
> +LIST="Networking Storage Logging ${PASSWORD_OPTION} Quit"
> +
> +select OPT in $LIST
> +do
> +    printf "\n"
> +
> +    case "$OPT" in
> +        "Networking")
> +            ovirt-config-networking
> +            ;;
> +
> +        "Storage")
> +            ovirt-config-storage
> +            ;;
> +
> +        "Logging")
> +            ovirt-config-logging
> +            ;;
> +
> +        "Password")
> +            # TODO only do this if we allow it
> +            ovirt-config-password
> +            ;;
> +
> +        "Quit")
> +            printf "Finished.\n"
> +            exit 0
> +            ;;
> +
> +        "*")
> +            printf "Invalid option \"${OPT}\".\n"
> +            ;;
> +    esac
> +done
> diff --git a/scripts/ovirt-config-storage b/scripts/ovirt-config-storage
> new file mode 100755
> index 0000000..3a16411
> --- /dev/null
> +++ b/scripts/ovirt-config-storage
> @@ -0,0 +1,147 @@
> +#!/bin/bash
> +#
> +
> +function show_logical_volumes
> +{
> +    OUTPUT=$(lvdisplay | awk '/LV Name/ { print "  "$3 }')
> +
> +    printf "Current Logical Volumes:\n"
> +    printf "========================\n"
> +    printf "$OUTPUT\n"
> +}
> +
> +function create_partition
> +{
> +    PHYVOLS=$(pvdisplay | awk '/VG Name/ { print $3" " }')
> +    PHYVOLS="$PHYVOLS Quit"
> +    printf "\n"
> +
> +    PS3="Please select a physical volume: "
> +    select PHYVOL in $PHYVOLS
> +    do
> +        case "$PHYVOL" in
> +            "Quit")
> +                return
> +                ;;
> +
> +            *)
> +                if [ "" != "$PHYVOL" ]
> +                then
> +                    PVOLUME="$PHYVOL"
> +                    break
> +                fi
> +                ;;
> +        esac
> +        printf "\n"
> +    done
> +
> +    printf "\nWhat is the name for the new logical volume? "
> +    read
> +    if [[ "$REPLY" =~ '^\w+$' ]]; then
> +        LVOLUME="$REPLY"
> +
> +        printf "\nWhat size (in Gigabytes) is this new logical volume? "
> +        read
> +        if [[ "$REPLY" =~ '^[0-9.]+$' ]]; then
> +            LVSIZE="$REPLY"
> +
> +            printf "\nMount point for this new file system? "
> +            read
> +            if [[ "$REPLY" =~ '^\/(\w|\/)*$' ]]; then
> +                MOUNTPT="$REPLY"
> +
> +                printf "\nCreating /dev/${PHYVOL}/${LVOLUME} (${LVSIZE} GB), mounted at ${MOUNTPT} :\n\n"
> +                printf "    Is that correct? (Y/N) "
> +                read
> +                case $REPLY in
> +                    Y|y)
> +                        lvdevice="/dev/${PHYVOL}/${LVOLUME}"
> +                        lvcreate --size ${LVSIZE}G /dev/${PHYVOL} --name $LVOLUME;
> +                        printf "${lvdevice}\t${MOUNTPT}\text3\tdefaults\t1 2\n" >> /etc/fstab
> +                        ;;
> +
> +                    N|n) printf "Logical volume creation aborted.\n"; break ;;
> +                esac
> +            else
> +                printf "\nInvalid mount point.\n"
> +            fi
> +        else
> +            printf "\nLogical volume size must be a numeric value.\n"
> +        fi
> +    else
> +        printf "\n'$REPLY' is an invalid logical volume name.\n"
> +    fi
> +
> +    printf "\n"
> +}
> +
> +function format_partition
> +{
> +    LVOLUMES=$(lvdisplay | awk '/LV Name/ { print $3" " }')
> +    LVOLUMES="${LVOLUMES} Quit"
> +    PS3="Select a volume to format: "
> +
> +    select LVM in $LVOLUMES
> +    do
> +        case "$LVM" in
> +            "Quit")
> +                return
> +                ;;
> +
> +            *)
> +                if [ "" != "$LVM" ]; then
> +                    break
> +                fi
> +                ;;
> +        esac
> +        printf "\n"
> +    done
> +
> +    printf "Formatting ${LVM} with EXT3..."
> +
> +    mkfs -t ext3 ${LVM}
> +}
> +
> +function delete_partition
> +{
> +    echo "Delete"
> +}
> +
> +
> +declare -a OPTIONS
> +OPTIONS[${#OPTIONS[*]}]="Create Partition"
> +OPTIONS[${#OPTIONS[*]}]="Format Partition"
> +OPTIONS[${#OPTIONS[*]}]="Remove Partition"
> +OPTIONS[${#OPTIONS[*]}]="Quit"
> +eval set $OPTIONS
> +
> +show_logical_volumes
> +
> +PS3="Please select a storage operation to perform: "
> +printf "\n"
> +
> +eval set $OPTIONS
> +select OPTION in "${OPTIONS[@]}"
> +do
> +    case "$OPTION" in
> +        "Create Partition")
> +            create_partition
> +            ;;
> +
> +        "Format Partition")
> +            format_partition
> +            ;;
> +
> +        "Delete Partition")
> +            delete_partition
> +            ;;
> +
> +        "Quit")
> +            break
> +            ;;
> +    esac
> +
> +    printf "\n"
> +    show_logical_volumes
> +    PS3="Please select a storage operation to perform: "
> +done
> diff --git a/scripts/ovirt-functions b/scripts/ovirt-functions
> index e251eac..53e9f62 100644
> --- a/scripts/ovirt-functions
> +++ b/scripts/ovirt-functions
> @@ -7,6 +7,11 @@ OVIRT_LABEL=OVIRT
>  
>  OVIRT_BACKUP_DIR=/var/lib/ovirt-backup
>  
> +is_standalone()
> +{
> +    return 0
> +}
> +
>  find_srv()
>  {
>      local dnsreply
> diff --git a/scripts/ovirt-standalone-mode b/scripts/ovirt-standalone-mode
> new file mode 100755
> index 0000000..e503917
> --- /dev/null
> +++ b/scripts/ovirt-standalone-mode
> @@ -0,0 +1,55 @@
> +#!/bin/bash
> +#
> +# ovirt-standalone-mode Starts the node in standalone mode.
> +#
> +# chkconfig: 2345 01 99
> +# description: ovirt-early services
> +#
> +# Copyright (C) 2008 Red Hat, Inc.
> +# Written by Darryl L. Pierce <dpierce at redhat.com>
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; version 2 of the License.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
> +# MA  02110-1301, USA.  A copy of the GNU General Public License is
> +# also available at http://www.gnu.org/copyleft/gpl.html.
> +
> +## Source functions library
> +. /etc/init.d/functions
> +. /etc/init.d/ovirt-functions
> +
> +start ()
> +{
> +    ovirt-config-setup
> +}
> +
> +case "$1" in
> +    start)
> +        #is_standalone
> +        #if [ $? -ne 0 ]; then
> +        #    exit 0
> +        #fi
> +
> +        printf "Starting ovirt-standalone-mode: "
> +
> +        {
> +            start
> +        } 
> +
> +        test $? == 0 && success || failure
> +        echo
> +        ;;
> +
> +    *)
> +        echo "Usage: ovirt-early {start}"
> +        exit 2
> +esac


I get this error when trying to run this:

http://bkearney.fedorapeople.org/dbus_error.png

-- bk




More information about the ovirt-devel mailing list