You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
5.4 KiB
121 lines
5.4 KiB
3 weeks ago
|
#!/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
|
||
|
# See if we've gotten a format like <dev>,feature or <dev>,<dev>,<dev>
|
||
|
[[ "$DASD" =~ (\,*=[[:digit:]]) ]]
|
||
|
case $? in
|
||
|
# case of 0 is features, just turn the comma into a space
|
||
|
0) echo $DASD |sed 's/,/ /g';;
|
||
|
*) # We've got no features, do things normally
|
||
|
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" 1>&2
|
||
|
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%.*}" 1>&2
|
||
|
exit 1
|
||
|
fi
|
||
|
;;
|
||
|
1) # string did not match the pattern
|
||
|
echo $"Incorrect format for upper bound of DASD range $range: $hi" 1>&2
|
||
|
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" 1>&2
|
||
|
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" 1>&2
|
||
|
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
|
||
|
;;
|
||
|
esac
|