Merge branch 'guestfish'
[tridge/autocluster.git] / autocluster
index 025f92134672c41fb7b91ec57784351d9cf27625..b95d5073c6f7a29f1c35c725fb43aad7d7bcde9d 100755 (executable)
@@ -236,9 +236,9 @@ create_node_configure_image ()
     local disk="$1"
     local type="$2"
 
-    mount_disk "$disk"
+    diskimage_mount "$disk"
     setup_base "$type"
-    unmount_disk
+    diskimage_unmount
 }
 
 # Provides an easy way of removing nodes from $NODE.
@@ -579,9 +579,9 @@ boot_base() {
     IPNUM=$FIRSTIP
     CLUSTER="base"
 
-    mount_disk $DISK
+    diskimage_mount $DISK
     setup_base
-    unmount_disk
+    diskimage_unmount
 
     UUID=`uuidgen`
     
@@ -614,120 +614,23 @@ set_macaddrs () {
     MAC6="${mac_prefix}06"
 }
 
-# mount a qemu image via nbd
-connect_nbd() {    
-    echo "Connecting nbd to $1"
-    mkdir -p mnt
-    modprobe nbd
-    killall -9 -q $QEMU_NBD || true
-    $QEMU_NBD -p 1300 $1 &
-    sleep 1
-    [ -r $NBD_DEVICE ] || {
-       mknod $NBD_DEVICE b 43 0
-    }
-    umount mnt 2> /dev/null || true
-    nbd-client -d $NBD_DEVICE > /dev/null 2>&1 || true
-    killall -9 -q nbd-client || true
-    nbd-client localhost 1300 $NBD_DEVICE > /dev/null 2>&1 || true &
-    sleep 1
-}
-
-# disconnect nbd
-disconnect_nbd() {
-    echo "Disconnecting nbd"
-    sync; sync
-    nbd-client -d $NBD_DEVICE > /dev/null 2>&1 || true
-    killall -9 -q nbd-client || true
-    killall -q $QEMU_NBD || true
-}
-
-setup_image ()
-{
-    local disk="$1"
-
-    case "$SYSTEM_DISK_FORMAT" in
-       qcow2)
-           connect_nbd "$disk"
-           device=$NBD_DEVICE
-           extra_mount_options=""
-           ;;
-       raw|reflink)
-           device="$disk"
-           extra_mount_options=",loop"
-           ;;
-       *)
-           die "Error: unknown SYSTEM_DISK_FORMAT=${SYSTEM_DISK_FORMAT}."
-    esac
-}
+######################################################################
 
-cleanup_image ()
-{
-    case "$SYSTEM_DISK_FORMAT" in
-       qcow2)
-           disconnect_nbd
-           ;;
-       raw|reflink)
-           :
-           ;;
-       *)
-           die "Error: unknown SYSTEM_DISK_FORMAT=${SYSTEM_DISK_FORMAT}."
-    esac
-}
+# Updating a disk image...
 
-# mount a qemu image via nbd
-mount_disk()
+make_system_disk_access_function ()
 {
-    local disk="$1"
-
-    local device extra_mount_options
-
-    setup_image "$disk"
-
-    echo "Mounting disk ${disk}..."
-    local m o
-    for m in $SYSTEM_DISK_MOUNTS ; do
-       local mount_ok=0
-       o="${m#*:}" # Offset is after colon
-       m="${m%:*}" # Mountpoint is before colon
-       echo " mount ${m} from offset ${o}"
-       local i
-       for i in $(seq 1 5); do
-           mount -o offset=${o}${extra_mount_options} $device "mnt${m}" && {
-               mount_ok=1
-               break
-           }
-           umount mnt 2>/dev/null || true
-           sleep 1
-       done
-       [ $mount_ok = 1 ] || die "Failed to mount $disk"
-    done
-
-    [ -d mnt/root ] || {
-       echo "Mounted directory does not look like a root filesystem"
-       ls -latr mnt
-       exit 1
-    }
+    eval "$1 () { call_func $1 \"\$SYSTEM_DISK_ACCESS_METHOD\" \"\$@\" ; }"
 }
 
-# unmount a qemu image
-unmount_disk() {
-    echo "Unmounting disk"
-    sync; sync;
-
-    # umounts are done in reverse.  Be lazy and construct a reverse
-    # list, since the shell will handle any strange whitespace for
-    # us...  ;-)
-    local umounts=""
-    local m
-    for m in $SYSTEM_DISK_MOUNTS ; do
-       umounts="${m%:*}${umounts:+ }${umounts}"
-    done
-    for m in $umounts ; do
-       echo " umount ${m}"
-       umount "mnt${m}" || umount "mnt${m}" || true
-    done
-    cleanup_image
-}
+for i in \
+    mount unmount \
+    mkdir_p substitute_vars chmod chmod_reference \
+    is_directory is_file append_text_file append_text sed put ln_s grep \
+    command \
+    ; do
+    make_system_disk_access_function "diskimage_$i"
+done
 
 # setup the files from $BASE_TEMPLATES/, substituting any variables
 # based on the config
@@ -740,12 +643,17 @@ copy_base_dir_substitute_templates ()
 
     local f
     for f in $(cd "$d" && find . \! -name '*~') ; do
+       f="${f#./}" # remove leading "./" for clarity
        if [ -d "$d/$f" ]; then
-           mkdir -p mnt/"$f"
+           # Don't chmod existing directory
+           if diskimage_is_directory "/$f" ; then
+               continue
+           fi
+           diskimage_mkdir_p "/$f"
        else 
-           substitute_vars "$d/$f" "mnt/$f"
+           diskimage_substitute_vars "$d/$f" "/$f"
        fi
-       chmod --reference="$d/$f" "mnt/$f"
+       diskimage_chmod_reference "$d/$f" "/$f"
     done
 }
 
@@ -755,15 +663,16 @@ setup_base_ssh_keys ()
 {
     # this is needed as git doesn't store file permissions other
     # than execute
-    chmod 600 mnt/etc/ssh/*key mnt/root/.ssh/*
-    chmod 700 mnt/etc/ssh mnt/root/.ssh mnt/root
+    # Note that we protect the wildcards from the local shell.
+    diskimage_chmod 600 "/etc/ssh/*key" "/root/.ssh/*"
+    diskimage_chmod 700 "/etc/ssh" "/root/.ssh" "/root"
     if [ -r "$HOME/.ssh/id_rsa.pub" ]; then
        echo "Adding $HOME/.ssh/id_rsa.pub to ssh authorized_keys"
-       cat "$HOME/.ssh/id_rsa.pub" >> mnt/root/.ssh/authorized_keys
+       diskimage_append_text_file "$HOME/.ssh/id_rsa.pub" "/root/.ssh/authorized_keys"
     fi
     if [ -r "$HOME/.ssh/id_dsa.pub" ]; then
        echo "Adding $HOME/.ssh/id_dsa.pub to ssh authorized_keys"
-       cat "$HOME/.ssh/id_dsa.pub" >> mnt/root/.ssh/authorized_keys
+       diskimage_append_text_file "$HOME/.ssh/id_dsa.pub" "/root/.ssh/authorized_keys"
     fi
 }
 
@@ -773,9 +682,10 @@ setup_base_grub_conf ()
 {
     echo "Adjusting grub.conf"
     local o="$EXTRA_KERNEL_OPTIONS" # For readability.
-    sed -e "s/console=ttyS0,19200/console=ttyS0,115200/"  \
+    diskimage_sed "/boot/grub/grub.conf" \
+       -e "s/console=ttyS0,19200/console=ttyS0,115200/"  \
        -e "s/ nodmraid//" -e "s/ nompath//"  \
-       -e "s/quiet/noapic divider=10${o:+ }${o}/g" mnt/boot/grub/grub.conf -i.org
+       -e "s/quiet/noapic divider=10${o:+ }${o}/g"
 }
 
 register_hook setup_base_hooks setup_base_grub_conf
@@ -804,24 +714,24 @@ setup_network()
     fi
 
     echo "Setting up networks"
-    cat $hosts_file >>mnt/etc/hosts
+    diskimage_append_text_file "$hosts_file" "/etc/hosts"
 
     echo "Setting up /etc/ctdb/nodes"
-    mkdir -p mnt/etc/ctdb
-    cp $nodes_file mnt/etc/ctdb/nodes
+    diskimage_mkdir_p "/etc/ctdb"
+    diskimage_put "$nodes_file" "/etc/ctdb/nodes"
 
     [ "$WEBPROXY" = "" ] || {
-       echo "export http_proxy=$WEBPROXY" >> mnt/etc/bashrc
+       diskimage_append_text "export http_proxy=$WEBPROXY" "/etc/bashrc"
     }
 
     if [ -n "$NFSSHARE" -a -n "$NFS_MOUNTPOINT" ] ; then
        echo "Enabling nfs mount of $NFSSHARE"
-       mkdir -p "mnt$NFS_MOUNTPOINT"
-       echo "$NFSSHARE $NFS_MOUNTPOINT nfs intr" >> mnt/etc/fstab
+       diskimage_mkdir_p "$NFS_MOUNTPOINT"
+       diskimage_append_text "$NFSSHARE $NFS_MOUNTPOINT nfs intr" "/etc/fstab"
     fi
 
-    mkdir -p mnt/etc/yum.repos.d
-    echo '@@@YUM_TEMPLATE@@@' | substitute_vars - > mnt/etc/yum.repos.d/autocluster.repo
+    diskimage_mkdir_p "/etc/yum.repos.d"
+    echo '@@@YUM_TEMPLATE@@@' | diskimage_substitute_vars - "/etc/yum.repos.d/autocluster.repo"
 }
 
 register_hook setup_base_hooks setup_network
@@ -1311,11 +1221,11 @@ case $command in
        ;;
     mount)
        [ $# != 1 ] && usage
-       mount_disk "$1"
+       diskimage_mount "$1"
        ;;
     unmount)
        [ $# != 0 ] && usage
-       unmount_disk
+       diskimage_unmount
        ;;
     bootbase)
        boot_base;