summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Horák <dan@danny.cz>2012-05-23 08:15:40 +0200
committerDan Horák <dan@danny.cz>2012-05-23 08:15:40 +0200
commitff3f09c1d921e53465de490752981a1fcbed5f39 (patch)
treeb2f11df184ecd5f769cd76fbed2e544bcaacfe89
parentcf46647d0fbff9956399cc40bc254e2197f7c365 (diff)
downloadutils-ff3f09c1d921e53465de490752981a1fcbed5f39.tar.gz
utils-ff3f09c1d921e53465de490752981a1fcbed5f39.tar.xz
utils-ff3f09c1d921e53465de490752981a1fcbed5f39.zip
add script that normalizes DASD data into valid dasd.conf format (Jesse Keating)
-rw-r--r--normalize_dasd_arg112
1 files changed, 112 insertions, 0 deletions
diff --git a/normalize_dasd_arg b/normalize_dasd_arg
new file mode 100644
index 0000000..2f622e3
--- /dev/null
+++ b/normalize_dasd_arg
@@ -0,0 +1,112 @@
+#!/bin/sh
+#
+# Copyright 2012 Red Hat, Inc.
+# License: GPLv2
+# Author: Jesse Keating <jkeating@redhat.com>
+#
+# Normalize DASD data into valid dasd.conf format
+#
+# Standard input should be the DASD argument
+# Standard otuput is the properly formatted content
+#
+# it is used in
+# dracut generated initramfs
+#
+# Much of this code was salvaged from linuxrc.s390 from Anaconda:
+#
+# License GPLv2+
+#
+# Copyright (C) 2000-2004 by
+# Bernhard Rosenkraenzer <bero@redhat.com>
+# Oliver Paukstadt <opaukstadt@millenux.com>
+# Karsten Hopp <karsten@redhat.de>
+# Florian La Roche <laroche@redhat.com>
+# Nils Philippsen <nils@redhat.de>
+# Helge Deller <hdeller@redhat.de>
+# David Sainty <dsainty@redhat.com>
+# Copyright (C) IBM Corp. 2008,2009
+# Author: Steffen Maier <maier@de.ibm.com>
+
+
+function canonicalize_devno()
+{
+ case ${#1} in
+ 3) echo "0.0.0${1}" ;;
+ 4) echo "0.0.${1}" ;;
+ *) echo "${1}" ;;
+ esac
+ return 0
+}
+
+read DASD
+for dasditem in $(echo $DASD |sed 's/,/ /g')
+ do
+ unset range features lo hi attrs devno lodevno hidevno devbusid sys
+ case $dasditem in
+ autodetect|probeonly|nopav|nofcx|"") continue ;; # these don't gen a config
+ *)
+ IFS='('
+ read range features <<< "$dasditem"
+ unset IFS
+ lo=${range%%-*}
+ [[ "$lo" =~ (^[[:xdigit:]]+\.[0-3]\.[[:xdigit:]]{4}$)|(^[[:xdigit:]]{3,4}$) ]]
+ case $? in
+ 0) # string matched the pattern
+ lo=$(canonicalize_devno $lo) ;;
+ 1) # string did not match the pattern
+ echo $"Incorrect format for lower bound of DASD range $range: $lo"
+ exit 1
+ ;;
+ 2) echo "l.$LINENO: syntax error in regex of match operator =~, code needs to be fixed" 1>&2 ;;
+ *) echo "l.$LINENO: unexpected return code of regex match operator =~, code needs to be fixed" 1>&2 ;;
+ esac
+ if [ "${range//*-*/}" = "" ]; then
+ hi=${range##*-}
+ [[ "$hi" =~ (^[[:xdigit:]]+\.[0-3]\.[[:xdigit:]]{4}$)|(^[[:xdigit:]]{3,4}$) ]]
+ case $? in
+ 0) # string matched the pattern
+ hi=$(canonicalize_devno $hi)
+ if [ "${lo%.*}" != "${hi%.*}" ]; then
+ echo $"Prefixes of DASD range $range do not match: ${lo%.*} != ${hi%.*}"
+ exit 1
+ fi
+ ;;
+ 1) # string did not match the pattern
+ echo $"Incorrect format for upper bound of DASD range $range: $hi"
+ exit 1
+ ;;
+ 2) echo "l.$LINENO: syntax error in regex of match operator =~, code needs to be fixed" 1>&2 ;;
+ *) echo "l.$LINENO: unexpected return code of regex match operator =~, code needs to be fixed" 1>&2 ;;
+ esac
+ fi
+ if [ "${features//*)/}" != "" ]; then
+ echo $"Missing closing parenthesis at features of DASD range $range: ($features"
+ exit 1
+ fi
+ if [ -n "$features" ]; then
+ attrs=""
+ features="${features%)}"
+ for feature in $(echo $features |sed 's/:/\n/g'); do
+ case $feature in
+ ro) attrs=$attrs" readonly" ;;
+ diag) attrs=$attrs" use_diag" ;;
+ erplog|failfast) attrs=$attrs" "$feature ;;
+ *) echo $"Unknown DASD feature for device range $range: $feature"
+ exit 1
+ ;;
+ esac
+ done
+ fi
+ [ -z "$hi" ] && hi=$lo
+ lodevno=$((0x${lo##*.}))
+ hidevno=$((0x${hi##*.}))
+ for ((devno=$lodevno; $devno <= $hidevno; ++devno)); do
+ devbusid=$(printf "%s.%04x" ${lo%.*} $devno)
+ echo -n "$devbusid"
+ for attr in $attrs; do
+ echo -n " $attr=1"
+ done
+ echo
+ done
+ esac
+done