diff options
author | Dan Horák <dan@danny.cz> | 2012-05-23 08:15:40 +0200 |
---|---|---|
committer | Dan Horák <dan@danny.cz> | 2012-05-23 08:15:40 +0200 |
commit | ff3f09c1d921e53465de490752981a1fcbed5f39 (patch) | |
tree | b2f11df184ecd5f769cd76fbed2e544bcaacfe89 | |
parent | cf46647d0fbff9956399cc40bc254e2197f7c365 (diff) | |
download | utils-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_arg | 112 |
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 |