# Copyright (c) 2012 NTT DOCOMO, INC. # Copyright 2012 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. function configure_vmedia_dir() { VMEDIA_MOUNT_POINT="/vfloppy_mnt" VMEDIA_DIR="/vfloppy" VMEDIA_CONFIG_FILE="parameters.txt" VMEDIA_DEVICE_BY_LABEL="/dev/disk/by-label/ir-vfd-dev" # Wait for some seconds for kernel to finish initializing the # virtual media devices. wait_for 5 1 "ls $VMEDIA_DEVICE_BY_LABEL" if [[ $? != 0 ]]; then # TODO(rameshg87): This block of code is there only for backward # compatibility to older versions of Ironic. Remove this after 2 # releases. Ironic will now assign labels to Virtual Media devices. SYSFS_DEVICE_MODELS="/sys/class/block/*/device/model" SYSFS_VMEDIA_DEVICE_MODEL="virtual media" # Wait for some seconds for kernel to finish initializing the # virtual media devices. wait_for 5 1 "grep -q -i \"$SYSFS_VMEDIA_DEVICE_MODEL\" $SYSFS_DEVICE_MODELS" if [[ $? != 0 ]]; then echo "Error finding the virtual floppy device on the node." troubleshoot fi # Find the virtual media device from the kernel sysfs file system. VMEDIA_DEVICE=$(grep -l -i "$SYSFS_VMEDIA_DEVICE_MODEL" $SYSFS_DEVICE_MODELS | awk -F'/' '{print $5}') if [[ -z $VMEDIA_DEVICE ]]; then echo "Error finding the virtual floppy device on the node." troubleshoot fi VMEDIA_DEVICE_FILE="/dev/$VMEDIA_DEVICE" else VMEDIA_DEVICE_FILE="$VMEDIA_DEVICE_BY_LABEL" fi # Mount the virtual media device mkdir -p $VMEDIA_MOUNT_POINT mount $VMEDIA_DEVICE_FILE $VMEDIA_MOUNT_POINT if [[ $? != 0 ]]; then echo "Error mounting virtual media device $VMEDIA_DEVICE_FILE" troubleshoot fi # Copy the contents of the virtual media to a directory in root # filesystem so that we can unmount virtual media soon. cp -rf $VMEDIA_MOUNT_POINT $VMEDIA_DIR umount $VMEDIA_MOUNT_POINT } function get_kernel_parameter() { if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then echo $(find_parameter_from_file $1 "$VMEDIA_DIR/$VMEDIA_CONFIG_FILE") else echo $(find_parameter_from_file $1 "/proc/cmdline") fi } function find_parameter_from_file() { local paramname=$1 local filename=$2 for i in `cat $filename`; do case "$i" in ${paramname}=*) echo "${i#${paramname}=}" return 0 ;; ${paramname}) echo "" return 0 ;; *) ;; esac done echo "" return 1 } function string_contains() { local string=$1 local word=$2 if [ "$string" != "${string/$word/}" ]; then return 0 else return 1 fi } function load_modules_by_udev() { udevadm trigger --action=add udevadm settle } function strip_dev() { echo "$1" | sed -e 's:^/dev/::' } function prepend_dev() { case "$1" in /dev/*) echo "$1" ;; *) echo "/dev/$1" ;; esac } function whole_disk_name() { local dev=`prepend_dev "$1"` case "$dev" in /dev/sd*|/dev/hd*|/dev/vd*) echo "$dev" | sed -e 's/[0-9]*$//' ;; /dev/cciss/*) echo "$dev" | sed -e 's/p[0-9]*$//' ;; *) echo "" return 1 ;; esac } function partition_name() { local dev=`prepend_dev "$1"` local part=$2 case "$dev" in /dev/sd*|/dev/hd*|/dev/vd*) echo "${dev}${part}" ;; /dev/cciss/*) echo "${dev}p${part}" ;; *) echo "" return 1 ;; esac } function find_interface() { local mac=$1 eth=`ifconfig -a | grep -i "$mac" | awk {' print $1 '} | head -n 1` if [ -n "$eth" ]; then echo "$eth" return 0 else return 1 fi } function set_mac() { local dev=$1 local mac=$2 ip link set "$dev" address "$mac" } function swap_ifname() { local dev=$1 local dev2=$2 if [ "$dev" = "$dev2" ]; then return fi if ip link show "$dev2" >/dev/null; then # dev2 exists # swap device name ip link set "$dev" name "_$dev" ip link set "$dev2" name "$dev" ip link set "_$dev" name "$dev2" else ip link set "$dev" name "$dev2" fi } function partition_exists() { local dev=$1 dev=`strip_dev "$dev"` if tail -n +3 /proc/partitions | grep "$dev" >/dev/null; then return 0 else return 1 fi } function find_disk() { local disks=$1 local dev # find device local OLD_IFS=$IFS IFS=, for i in $disks; do dev=`whole_disk_name "$i"` if partition_exists "$dev"; then dev=`prepend_dev "$dev"` break fi dev="" done IFS=$OLD_IFS if [ -z "$dev" ]; then return 1 fi echo "$dev" return 0 } function check_tgtd_socket() { echo -n "waiting for tgtd socket..." if [ -e /var/run/tgtd.ipc_abstract_namespace.0 ]; then echo "found" return 0 else echo "not found" return 1 fi } wait_for(){ LOOPS=$1 SLEEPTIME=$2 shift ; shift i=0 while [ $i -lt $LOOPS ] ; do i=$((i + 1)) eval "$@" && return 0 || true sleep $SLEEPTIME done return 1 } function start_iscsi_target() { local iqn=$1 local dev=$2 local cli=$3 # used by tgtd mkdir -p /var/run tgtd wait_for 10 0.5 check_tgtd_socket tgtadm --lld iscsi --mode target --op new --tid 1 --targetname "$iqn" tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store "$dev" tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address "$cli" } function stop_iscsi_target() { tgtadm --lld iscsi --mode logicalunit --op delete --tid 1 --lun 1 tgtadm --lld iscsi --mode target --op delete --tid 1 killall tgtd } function troubleshoot() { if [ "$TROUBLESHOOT" != 1 ]; then _DO_TROUBLESHOOT="" _t=0 echo -n "Troubleshooting required, press t to launch shell." while [ $_t -lt 10 ]; do read -n 1 -t 1 _DO_TROUBLESHOOT _t=$(($_t + 1)) if [ "$_DO_TROUBLESHOOT" == "t" ]; then export TROUBLESHOOT=1 break fi echo -n "." done echo "" fi if [ "$TROUBLESHOOT" == 1 ]; then echo "Starting troubleshooting shell." bash fi } function safe_url_encode() { local str=$1 local out="" for (( i=0; i<${#str}; i++ )); do c=${str:$i:1} case $c in [a-zA-Z0-9.-_] ) out+="$c" ;; ' ' ) out+="+" ;; *) #skip it ;; esac done echo "$out" } function err_msg() { message=$1 if [ -z "$FIRST_ERR_MSG" ]; then FIRST_ERR_MSG=$(safe_url_encode "$message") fi echo "$message" }