ovirt-node 2.2.0 release
[ovirt-node.git] / scripts / ovirt-boot-functions
blob4c037be6d2776d3b01c3d39d722b3d1e5393985f
1 # -*-Shell-script-*-
3 LF=$'\n'
4 SEP=','
5 TAB=$'\t'
7 dirname() {
8     if [ -e /usr/bin/dirname ]; then
9         /usr/bin/dirname $@
10     else
11         echo $1 | sed 's/\/'$(basename $1)'$//'
12     fi
15 # compat function to handle different udev versions
16 udev_info() {
17     local name=$1
18     local query=$2
19     local options=$3
20     local out
22     out=$(udevadm info --name=$name --query=$query $options)
23     rc=$?
24     if [ $rc -eq 0 ]; then
25         echo $out
26     fi
27     return $rc
32 # $(get_live_disk)
33 # livecd boot disk
34 get_live_disk() {
35     local live_dev=/dev/live
36     if [ ! -e $live_dev ]; then
37       # PXE boot
38       live_dev=/dev/loop0
39       live_disk=
40     else
41       live_part=$(readlink -e $live_dev)
42       live_disk=$(basename $(dirname $(udev_info $live_part path)))
43       if [ "$live_disk" = "block" ]; then
44           live_disk=$(basename $(udev_info $live_part path))
45       fi
46     fi
47     echo $live_disk
50 # find_disk $bus $serial
51 find_disk() {
52     local bus=$1
53     local serial=$2
54     local live=$(get_live_disk)
55     local found=
56     # in initramfs, shell does not expand
57     # /dev/disk/by-id/{ata,cciss,scsi,usb}* correctly,
58     # so manually enumerate them
59     for d in $(ls /dev/disk/by-id/ata* /dev/disk/by-id/cciss* /dev/disk/by-id/scsi* /dev/disk/by-id/usb* 2>/dev/null); do
60         DEVTYPE=
61         eval $(udev_info $(readlink -f $d) property "--export")
62         # ID_FS_USAGE is set for partitions
63         if [ "$DEVTYPE" = "disk" -a "$ID_BUS" = "$bus" ]; then
64             if [ -z "$serial" -o "$serial" = "ALL" \
65                 -o "$ID_SERIAL" = "$serial" ]; then
66                 local dev="$(readlink -e $d)"
67                 if [ -n "$live" -a  "$dev" = "/dev/$live" ]; then
68                 # cannot install LiveOS over itself
69                     continue
70                 elif [ "$serial" = "ALL" ]; then
71                     if [ "$found" ]; then
72                         echo -n "${SEP}"
73                     fi
74                     echo -n "$dev"
75                     found="yes"
76                     continue
77                 else
78                     echo -n "$dev"
79                     found="yes"
80                     break
81                 fi
82             fi
83         fi
84     done
85     if [ "$found" ]; then
86       echo
87       return 0
88     else
89        return 1
90     fi
93 # parse_disk_id DISK_ID
94 #   DISK_ID=[ata|cciss|scsi|usb[:serial#]|/dev/...]
95 # ata|cciss|scsi|usb - select disk bus, as reported by udev ID_BUS
96 # serial# - select exact disk using serial number, as reported by
97 #           udev ID_SERIAL
98 # e.g. storage_init=usb:Generic_STORAGE_DEVICE_0000145418-0:0
99 #           ALL selects all the disks on the specified bus
100 # e.g. storage_init=ata:ALL
102 # /dev/... - use specified disk device
103 #            (for cases when HAL doesn't handle it)
104 parse_disk_id() {
105     local i="$1"
106     local disk=
107     local bus=
108     local serial=
109     case "$i" in
110         ata*)
111             bus=ata
112             i=${i#ata}
113             serial=${i#:}
114         ;;
115         scsi*)
116             bus=scsi
117             i=${i#scsi}
118             serial=${i#:}
119         ;;
120         usb*)
121             bus=usb
122             i=${i#usb}
123             serial=${i#:}
124         ;;
125         cciss*)
126             bus=cciss
127             i=${i#cciss}
128             serial=${i#:}
129         ;;
130         /dev/*)
131             disk="$(ls -1 $i 2>/dev/null | head -n1)"
132         ;;
133     esac
134     if [ -n "$bus" ]; then
135         disk=$(find_disk $bus $serial)
136     fi
137     echo "$disk"
141 # execute a function if called as a script, e.g.
142 #   ovirt-boot-functions ovirt_store_config /etc/hosts
144 if [ "$(basename -- "$0")" = "ovirt-boot-functions" ]; then
145     "$@"