scripts/lib.sh
changeset 1 51b1db97f448
child 7 ab661ceed4dc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/lib.sh	Tue Dec 13 20:17:57 2011 +0200
@@ -0,0 +1,125 @@
+## library functions
+
+function die () {
+    echo "!!! $@" >&2
+
+    exit 1
+}
+
+# Execute command verbosely, and exit on failure
+function cmd () {
+    echo ">>> $@"
+
+    [ $_MOCK ] && return 0
+
+    eval "$@" # return $?
+}
+
+function expand_MB () {
+    local size=${1^}
+
+    case ${size: -1} in 
+        G)
+            size=$(( ${size%G} * 1024))
+
+            ;;
+    esac
+
+    echo $size
+}
+
+function extract_iso () {
+    iso=$1
+    dst=$2
+
+    [ ! -r "$iso" ] && die "Given .iso is not readable: $iso"
+    [ -z "$dst" ] && die "Must give destination: $dst"
+    [ -e "$dst" ] && die "Given destination already exists: $dst"
+
+    # temporary mount
+    mnt=$(mktemp -d mnt.XXXX)
+
+    # clean on exit
+    function cleanup () {
+        if mountpoint -q $mnt; then
+           sudo umount $mnt
+        fi
+
+        [ -d $mnt ] && rmdir $mnt
+
+        return $1
+    }
+
+    # loop-mount
+    cmd sudo mount -o loop $iso $mnt || cleanup 1
+
+    # copy
+    cmd cp -r $mnt $dst || cleanup 1
+
+    # done, cleanup
+    cleanup 0
+}
+
+function my_md5sum () {
+    /usr/bin/md5sum $1 | (
+        read md5sum path
+        echo $md5sum
+    )
+}
+
+function expand_template () {
+    local tpl=$1
+    local out=$2
+
+    local linecount=0
+
+    # read in each line at a time
+    while IFS='' read -r line; do
+        linecount=$((linecount + 1))
+
+        if [ "${line:0:1}" == "#" ]; then
+            # ignore comments; pass through as-is
+            echo "$line"
+        
+        else
+            # evaluate {...} expressions
+            # a slight hack, but it works \o/
+            # http://stackoverflow.com/questions/415677/how-to-replace-placeholders-in-a-text-file/7633579#7633579
+            line="${line//\\/\\\\}"
+            line="${line//\"/\\\"}"
+            line="${line//\`/\\\`}"
+            line="${line//\$/\\\$}"
+            line="${line//{/\${}"   # This is just for vim: } "
+
+            # echo "($line)" >&2
+            (eval "echo \"$line\"") || die "Error at $tpl:$linecount: $line"
+        fi
+ 
+    done < $tpl > $out
+}
+
+# Recursive expand_template files from src -> dst
+# XXX: not used
+function expand_tree () {
+    local src=$1
+    local dst=$2
+    local filter=${3:-'*'}
+
+    for path in ${src}/${filter}; do
+        local name=$(basename $path)
+        local target=$dst/$name
+
+        if [ -d $path ]; then
+            echo "expand_tree: $path -> $target"
+            echo "expand_tree $path $target $filter"
+
+        elif [ -f $path ]; then
+            echo "expand_file: $path -> $target"
+            echo "expand_file $path $target"
+
+        else
+            echo "XXX: ignore weird file: $path"
+
+        fi
+    done
+}