The content of this branch was automatically imported from Fedora ELN with the following as its source: https://src.fedoraproject.org/rpms/s390utils#1b3563184907d74fc54a3ae6c0393d330c2a79fa
		
			
				
	
	
		
			201 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#! /bin/sh
 | 
						|
 | 
						|
[ -z "$DEVPATH" ] && exit 0
 | 
						|
[ "$SUBSYSTEM" != "ccw" ] && exit 0
 | 
						|
 | 
						|
[ -e /etc/ccw.conf ] && MODE="dracut" || MODE="normal"
 | 
						|
OLD_IFS="$IFS"
 | 
						|
 | 
						|
get_config_line_by_subchannel()
 | 
						|
{
 | 
						|
    local CHANNEL
 | 
						|
    CHANNEL="$1"
 | 
						|
    while read line; do
 | 
						|
        IFS=","
 | 
						|
        set $line
 | 
						|
	IFS="$OLD_IFS"
 | 
						|
        for i in $@; do
 | 
						|
            if [ "$CHANNEL" = "$i" ]; then
 | 
						|
                echo $line
 | 
						|
                return 0
 | 
						|
             fi
 | 
						|
        done
 | 
						|
    done < /etc/ccw.conf
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
# borrowed from network-scrips, initscripts along with the get_config_by_subchannel
 | 
						|
[ -z "$__sed_discard_ignored_files" ] && __sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
 | 
						|
 | 
						|
get_config_by_subchannel ()
 | 
						|
{
 | 
						|
    LANG=C grep -E -i -l \
 | 
						|
        "^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){0,2}${1}(,[0-9]\.[0-9]\.[a-f0-9]+){0,2}['\"]?([[:space:]]+#|[[:space:]]*$)" \
 | 
						|
        /etc/sysconfig/network-scripts/ifcfg-* \
 | 
						|
        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
 | 
						|
}
 | 
						|
 | 
						|
get_config_by_subchannel_nm ()
 | 
						|
{
 | 
						|
    LANG=C grep -E -i -l \
 | 
						|
        "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}${1};([0-9]\.[0-9]\.[a-f0-9]+;){0,2}$" \
 | 
						|
        /etc/NetworkManager/system-connections/*.nmconnection \
 | 
						|
        | LC_ALL=C sed -e "$__sed_discard_ignored_files"
 | 
						|
}
 | 
						|
 | 
						|
CHANNEL=${DEVPATH##*/}
 | 
						|
 | 
						|
if [ $MODE = "dracut" ]; then
 | 
						|
    CONFIG_LINE=$(get_config_line_by_subchannel $CHANNEL)
 | 
						|
 | 
						|
    [ $? -ne 0 -o -z "$CONFIG_LINE" ] && break
 | 
						|
 | 
						|
    IFS=","
 | 
						|
    set $CONFIG_LINE
 | 
						|
    IFS="$OLD_IFS"
 | 
						|
    NETTYPE=$1
 | 
						|
    shift
 | 
						|
    SUBCHANNELS="$1"
 | 
						|
    OPTIONS=""
 | 
						|
    shift
 | 
						|
    while [ $# -gt 0 ]; do
 | 
						|
        case $1 in
 | 
						|
            *=*) OPTIONS="$OPTIONS $1";;
 | 
						|
            [0-9]*) SUBCHANNELS="$SUBCHANNELS,$1";;
 | 
						|
        esac
 | 
						|
        shift
 | 
						|
    done
 | 
						|
elif [ $MODE = "normal" ]; then
 | 
						|
    NOLOCALE="yes"
 | 
						|
 | 
						|
    CONFIG_FILE=$(get_config_by_subchannel $CHANNEL)
 | 
						|
 | 
						|
    if [ -n "$CONFIG_FILE" ]; then
 | 
						|
	. $CONFIG_FILE
 | 
						|
    else
 | 
						|
	CONFIG_FILE=$(get_config_by_subchannel_nm $CHANNEL)
 | 
						|
	if [ -n "$CONFIG_FILE" ]; then
 | 
						|
	    NETTYPE=$(sed -nr "/^\[ethernet\]/ { :l /^s390-nettype[ ]*=/ { s/.*=[ ]*//; p; q;}; n; b l;}" $CONFIG_FILE)
 | 
						|
	    SUBCHANNELS=$(sed -nr "/^\[ethernet\]/ { :l /^s390-subchannels[ ]*=/ { s/.*=[ ]*//; p; q;}; n; b l;}" $CONFIG_FILE | sed -e "s/;/,/g" -e "s/,$//")
 | 
						|
	    LAYER2=$(sed -nr "/^\[ethernet-s390-options\]/ { :l /^layer2[ ]*=/ { s/.*=[ ]*//; p; q;}; n; b l;}" $CONFIG_FILE)
 | 
						|
	else
 | 
						|
	    exit 1
 | 
						|
	fi
 | 
						|
    fi
 | 
						|
else
 | 
						|
    echo "Unknown mode=$MODE"
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
# now we have extracted these variables from the config files:
 | 
						|
# SUBCHANNELS
 | 
						|
# OPTIONS
 | 
						|
 | 
						|
# put LAYER2 option into its own variable
 | 
						|
set $OPTIONS
 | 
						|
OPTIONS=""
 | 
						|
while [ $# -gt 0 ]; do
 | 
						|
    case $1 in
 | 
						|
        layer2=*) LAYER2=${1##layer2=};;
 | 
						|
        *=*) OPTIONS="$OPTIONS $1";;
 | 
						|
    esac
 | 
						|
    shift
 | 
						|
done
 | 
						|
 | 
						|
# translate variables from the interface config files to OPTIONS
 | 
						|
if [ -n "$PORTNAME" ]; then
 | 
						|
        if [ "$NETTYPE" = "lcs" ]; then
 | 
						|
		OPTIONS="$OPTIONS portno=$PORTNAME"
 | 
						|
        else
 | 
						|
		OPTIONS="$OPTIONS portname=$PORTNAME"
 | 
						|
        fi
 | 
						|
fi
 | 
						|
if [ "$NETTYPE" = "ctc" -a -n "$CTCPROT" ]; then
 | 
						|
	OPTIONS="$OPTIONS protocol=$CTCPROT"
 | 
						|
fi
 | 
						|
 | 
						|
# SUBCHANNELS is only set on mainframe ccwgroup devices
 | 
						|
[ -z "$SUBCHANNELS" -o -z "$NETTYPE" ] && exit 0
 | 
						|
if [ "$NETTYPE" = "ctc" ]; then
 | 
						|
    DIR="/sys/bus/ccwgroup/drivers/ctcm"
 | 
						|
else
 | 
						|
    DIR="/sys/bus/ccwgroup/drivers/$NETTYPE"
 | 
						|
fi
 | 
						|
 | 
						|
i=0
 | 
						|
while [ $i -lt 20 ]; do
 | 
						|
    [ -e $DIR ] && break
 | 
						|
    sleep 0.1
 | 
						|
    i=$(($i+1))
 | 
						|
done
 | 
						|
 | 
						|
# driver missing or not loaded
 | 
						|
[ ! -e $DIR ] && exit 0
 | 
						|
 | 
						|
IFS=","
 | 
						|
set $SUBCHANNELS
 | 
						|
IFS="$OLD_IFS"
 | 
						|
CHANNEL1=$1
 | 
						|
CHANNEL2=$2
 | 
						|
SYSDIR="$DIR/$CHANNEL1"
 | 
						|
 | 
						|
[ -e $SYSDIR ] && exit 0
 | 
						|
 | 
						|
# check if the interface is already online
 | 
						|
if [ -e $SYSDIR/online ]; then
 | 
						|
    read on <$SYSDIR/online
 | 
						|
    [ "$on" = "1" ] && exit 0
 | 
						|
fi
 | 
						|
 | 
						|
DRIVER=$(readlink $DEVPATH/driver)
 | 
						|
DRIVER=${DRIVER##*/}
 | 
						|
if [ "$DRIVER" = "lcs" -a "$NETTYPE" = "ctc" ]; then
 | 
						|
    echo "$CHANNEL" > /sys/bus/ccw/drivers/lcs/unbind
 | 
						|
    echo "$CHANNEL" > /sys/bus/ccw/drivers/ctcm/bind
 | 
						|
    echo "$CHANNEL2" > /sys/bus/ccw/drivers/lcs/unbind
 | 
						|
    echo "$CHANNEL2" > /sys/bus/ccw/drivers/ctcm/bind
 | 
						|
fi
 | 
						|
if [ "$DRIVER" = "ctcm" -a "$NETTYPE" = "lcs" ]; then
 | 
						|
    echo "$CHANNEL" > /sys/bus/ccw/drivers/ctcm/unbind
 | 
						|
    echo "$CHANNEL" > /sys/bus/ccw/drivers/lcs/bind
 | 
						|
    echo "$CHANNEL2" > /sys/bus/ccw/drivers/ctcm/unbind
 | 
						|
    echo "$CHANNEL2" > /sys/bus/ccw/drivers/lcs/bind
 | 
						|
fi
 | 
						|
 | 
						|
if [ ! -e $SYSDIR ]; then
 | 
						|
    echo "$SUBCHANNELS" > $DIR/group
 | 
						|
    i=0
 | 
						|
    while [ $i -lt 20 ]; do
 | 
						|
        [ -e $SYSDIR ] && break
 | 
						|
        sleep 0.1
 | 
						|
        i=$(($i+1))
 | 
						|
    done
 | 
						|
 | 
						|
    [ ! -e $SYSDIR ] && exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# check if the interface is already online
 | 
						|
if [ -e $SYSDIR/online ]; then
 | 
						|
    read on <$SYSDIR/online
 | 
						|
    [ "$on" = "1" ] && exit 0
 | 
						|
fi
 | 
						|
 | 
						|
# first set layer2, other options may depend on it
 | 
						|
[ -n "$LAYER2" ] && echo $LAYER2 > $SYSDIR/layer2
 | 
						|
 | 
						|
if [ -n "$OPTIONS" ]; then
 | 
						|
    for i in $OPTIONS; do
 | 
						|
	OPT=${i%%=*}
 | 
						|
	VAL=${i##*=}
 | 
						|
	if [ -e "$SYSDIR/$OPT" ]; then
 | 
						|
    	    echo "$VAL" > "$SYSDIR/$OPT" || \
 | 
						|
            echo "Could not set value \"$VAL\" for OPTION \"$OPT\" with SUBCHANNELS \"$SUBCHANNELS\""
 | 
						|
        else
 | 
						|
    	    echo "OPTION \"$OPT\" does not exist for SUBCHANNELS \"$SUBCHANNELS\""
 | 
						|
        fi
 | 
						|
    done
 | 
						|
fi
 | 
						|
 | 
						|
[ -e $SYSDIR/online ] && echo 1 > $SYSDIR/online
 |