Mass Deface
Email Grabber
Add the following argument to the commands below to output the
files in teamd format (JSON) instead of the default ifcfg format.
--json
To convert the current "bond0" ifcfg configuration to team ifcfg:
# $0 --master bond0
To convert the current "bond0" ifcfg configuration out of the
standard ifcfg-:
# $0 --master bond0 --configdir
To convert the current "bond0" ifcfg configuration to team ifcfg
renaming the interface name to "team0". (carefull: firewall rules,
aliases interfaces, etc., will break after the renaming because the
tool will only change the ifcfg file, nothing else)
# $0 --master bond0 --rename team0
To convert given bonding parameters without any ifcfg:
# $0 --bonding_opts "mode=1 miimon=500"
To convert given bonding parameters without any ifcfg with ports:
# $0 --bonding_opts "mode=1 miimon=500 primary=eth1 primary_reselect-0" \\
--port eth1 --port eth2 --port eth3 --port eth4
EOF
}
usage()
{
cat << EOF
usage: $0 [options]
This tool translates bonding configuration to team.
See bond2team(1) for detailed information.
OPTIONS:
--master set the master interface name or ifcfg
--rename rename the master interface to
--ifcfg set the output format to ifcfg style
--json set the output format to teamd style
--bonding_opts pass the bonding options instead of reading
from the ifcfg- file
--port add the interface to the port's list
--configdir set where the ifcfg- files are
default: /etc/sysconfig/network-scripts
--outputdir set the output diretory
default: temporary diretory
--stdout print to stdout instead of
modify the system's files.
--debug increase debug level
--quiet no messages
--version show the tool version
--help this screen
--examples show command examples
EOF
}
# Output Functions
pr()
{
if [ $1 -le $PR_LVL ]; then
shift;
echo "$*" > /dev/stderr
fi
}
pr_error()
{
pr ${PR_ERR} "ERROR: " $*
}
pr_warn()
{
pr ${PR_WARN} "WARNING: " $*
}
pr_info()
{
pr ${PR_INFO} "INFO: " $*
}
pr_dbg()
{
pr ${PR_DBG} "DEBUG: " $*
}
to_stdout()
{
return ${STDOUT}
}
create_output_file()
{
local f=$1
if [ ! -d "${OUTPUT_TMP_DIR}" ]; then
OUTPUT_TMP_DIR=$(LANG=C mktemp -d /tmp/bond2team.XXXXXX)
fi
if [ ! -d "${OUTPUT_TMP_DIR}" ]; then
pr_error "${FUNCNAME} can't create dir ${OUTPUT_TMP_DIR}"
return 1
fi
local tmpfile=${OUTPUT_TMP_DIR}/${f}
touch ${tmpfile}
if [ ! -f ${tmpfile} ]; then
pr_error "${FUNCNAME} can't create file ${tmpfile}"
return 1
fi
local pos=${#TMP_FILES[*]}
TMP_FILES[${pos}]="${tmpfile}"
OUTPUT_FILE=${tmpfile}
}
show_output_files()
{
echo ""
echo "Resulted files:"
for tmpf in $(seq 0 $((${#TMP_FILES[@]} - 1)))
do
echo " ${TMP_FILES[$tmpf]}"
done
}
clean_up()
{
pr_dbg "${FUNCNAME} $*"
for tmpf in $(seq 0 $((${#TMP_FILES[@]} - 1)))
do
pr_dbg "rm -f ${TMP_FILES[$tmpf]}"
rm -f ${TMP_FILES[$tmpf]}
done
if [ -d "{OUTPUT_TMP_DIR}" ]; then
rmdir ${OUTPUT_TMP_DIR}
fi
}
ifcfg_get_device()
{
local ifcfg=$1
if [ ! -f ${ifcfg} ]; then
pr_error "file not found: ${ifcfg}"
return 1
fi
DEVICE=`LANG=C sed -n \
"s@^[[:space:]]*DEVICE=[\"]*\(.*\)\([[:space:]#]\|\"\|$\)@\1@p" \
$ifcfg`
if [ -z "${DEVICE}" ]; then
pr_error "ifcfg file not supported: ${ifcfg}"
return 1
fi
}
ifcfg_get_master_file()
{
local dev=${1}
MASTER="${dev}"
if [ "${MODE}" -eq "${MODE_NOIFCFG}" ]; then
return 0
fi
if [ ! -f ${MASTER} ]; then
MASTER="${CONFIGDIR}/ifcfg-${dev}"
if [ -f ${MASTER} ]; then
return 0
fi
if [ -n "${BONDING_OPTS}" ]; then
# options provided, set noifcfg
MODE=${MODE_NOIFCFG}
MASTER=${dev}
return 0
fi
pr_error "Can't find ifcfg file for ${dev}"
return 1
fi
return 0
}
ifcfg_overwrite_files()
{
pr_dbg "${FUNCNAME} $*"
/bin/cp -f ${OUTPUT_TMP_DIR}/ifcfg* ${OUTPUT_DIR}
}
ifcfg_get_bond_opts()
{
pr_dbg "${FUNCNAME} $*"
local ifcfg=$1
if [ -n "${BONDING_OPTS}" ]; then
pr_dbg "${FUNCNAME} bonding_opts=${BONDING_OPTS}"
return 0
fi
if [ ! -f ${ifcfg} ]; then
pr_error "File not found: ${ifcfg}"
return 1
fi
BONDING_OPTS=`LANG=C sed -n \
"s@^[[:space:]]*BONDING_OPTS=[\"]*\(.*\)\([[:space:]#]\|\"\|$\)@\1@p" \
$ifcfg`
if [ -z "${BONDING_OPTS}" ]; then
pr_error "ifcfg file not supported: ${MASTER}"
return 1
fi
pr_dbg "${FUNCNAME} bonding_opts=${BONDING_OPTS}"
return 0
}
vfile_reset()
{
VFILE=()
}
vfile_load_ifcfg()
{
pr_dbg "${FUNCNAME} $*"
local ifcfg=$1
vfile_reset
if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
return 0
fi
# filter out bonding and team options and
# don't break lines with spaces
oIFS="$IFS"
IFS=$'\n'
VFILE=( $(LANG=C \
grep -iv 'BONDING_OPTS\|SLAVE\|MASTER\|DEVICETYPE\|TEAM' \
$ifcfg ))
IFS="$oIFS"
}
vfile_write_to_file()
{
pr_dbg "${FUNCNAME} $*"
local output=$1
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
echo "${VFILE[$ln]}" >> $output
done
return 0
}
ifcfg_dump_stdout()
{
local dev="${1}"
local ifcfg="ifcfg-${dev}"
if [ -z "${dev}" ]; then
ifcfg="ifcfg-"
fi
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
[ $ln -eq 0 ] && echo "---8<--- ${ifcfg} ---8<---"
echo "${VFILE[$ln]}"
done
echo "---8<--- ${ifcfg} ---8<---"
echo ""
return 0
}
vfile_get_device()
{
pr_dbg "${FUNCNAME} $*"
if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
pr_dbg "${FUNCNAME} using DEVICE=${MASTER}"
DEVICE=${MASTER}
return 0
fi
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
local line=${VFILE[$ln]}
if [ "${line%%=*}" = "DEVICE" ]; then
local name_line="${line##*=}"
local name="${name_line%%[ # ]*}"
DEVICE=${name}
pr_dbg "${FUNCNAME} from file: DEVICE=${DEVICE}"
return 0
fi
done
pr_error "Failed to find the device's name"
return 1
}
vfile_get_ipaddr()
{
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
local line=${VFILE[$ln]}
if [ "${line%%=*}" = "IPADDR" ]; then
local ipaddr_line="${line##*=}"
local ipaddr="${ipaddr_line%%[ # ]*}"
echo "${ipaddr}"
fi
done
}
vfile_add_line()
{
pr_dbg "${FUNCNAME} $*"
local pos=${#VFILE[*]}
VFILE[${pos}]="$1"
}
ifcfg_device_rename()
{
local device=$1
local rename=$2
# neither device nor rename was provided
if [ -z "${rename}" ]; then
return 0
fi
# renaming with no ifcfg?
if [ ${MODE} -eq ${MODE_NOIFCFG} ]; then
return 0
fi
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
local line=${VFILE[$ln]}
if [ "${line%%=*}" = "DEVICE" ]; then
newdev="${line/${device}/${rename}}"
VFILE[$ln]="$newdev"
TEAM_MASTER=${rename}
return 0
fi
done
pr_error "Failed to rename $device to $rename"
return 1
}
team_port_set_devtype()
{
pr_dbg "${FUNCNAME} $*"
local master=$1
vfile_add_line "DEVICETYPE=\"TeamPort\""
vfile_add_line "TEAM_MASTER=\"$master\""
}
team_port_set_config()
{
pr_dbg "${FUNCNAME} $*"
local port=$1
local team_port_config=""
if [ "${PRIMARY}" == "$port" ]; then
team_port_config="'{ \"prio\" : -10"
else
team_port_config="'{ \"prio\" : -100"
fi
if [ -n "${PRIMARY_RESELECT}" ]; then
if [ "${PRIMARY}" == "$port" ]; then
if [ -z "${team_port_config}" ]; then
team_port_config="'{ \"sticky\" : true }'"
else
team_port_config="${team_port_config}, \"sticky\" : true }'"
fi
else
if [ -z "${team_port_config}" ]; then
team_port_config="{ \"sticky\" : false }'"
else
team_port_config="${team_port_config}, \"sticky\" : false }'"
fi
fi
else
if [ -n "${team_port_config}" ]; then
team_port_config="${team_port_config} }'"
fi
fi
if [ -n "$team_port_config" ]; then
vfile_add_line "TEAM_PORT_CONFIG=$team_port_config"
fi
}
team_port_ifcfg_create()
{
local dev=$1
vfile_load_ifcfg $dev
if ! vfile_get_device; then
return 1
fi
team_port_set_devtype ${TEAM_MASTER}
team_port_set_config ${DEVICE}
return 0
}
team_master_set_devtype()
{
pr_dbg "${FUNCNAME} $*"
vfile_add_line "DEVICETYPE=\"Team\""
}
team_master_set_config()
{
pr_dbg "${FUNCNAME} $*"
local team_config="'{ \"runner\" : { "
local nr_opt=0
nr_opt=${#RUNNER_OPTS[@]}
if [ $nr_opt -eq 0 ]; then
# default to miimon/ethtool
team_config="${team_config} \"name\" : \"roundrobin\" }"
else
# add runner options
for pos in $(seq 0 $((${#RUNNER_OPTS[@]} - 1)))
do
if [ $pos -ne 0 ]; then
team_config="${team_config}, "
fi
team_config="${team_config} ${RUNNER_OPTS[$pos]}"
done
team_config="${team_config} }"
fi
nr_opt=${#LWATCH_OPTS[@]}
if [ $nr_opt -eq 0 ]; then
# default to miimon/ethtool
team_config="${team_config}, \"link_watch\" : { \"name\" : \"ethtool\" }"
else
team_config="${team_config}, \"link_watch\" : { "
# add linkwatch options
for pos in $(seq 0 $(($nr_opt - 1)))
do
if [ $pos -ne 0 ]; then
team_config="${team_config}, "
fi
team_config="${team_config} ${LWATCH_OPTS[$pos]}"
done
team_config="${team_config} }"
fi
team_config="${team_config} }'"
pr_dbg "built team_config=${team_config}"
vfile_add_line "TEAM_CONFIG=${team_config}"
return 0
}
team_ifcfg_dump_stdout()
{
pr_dbg "${FUNCNAME} $*"
local dev=$1
if ! ifcfg_dump_stdout ${dev}; then
return 1
fi
return 0
}
team_ifcfg_write_file()
{
pr_dbg "${FUNCNAME} $*"
local dev=$1
OUTPUT_FILE=
local filenm="ifcfg-${dev}"
if [ -z "${dev}" ]; then
filenm="ifcfg"
fi
create_output_file ${filenm}
if [ ! -f "${OUTPUT_FILE}" ]; then
return 1
fi
if ! vfile_write_to_file ${OUTPUT_FILE}; then
return 1
fi
return 0
}
team_master_ifcfg_create()
{
pr_dbg "${FUNCNAME} $*"
if ! team_master_set_devtype; then
return 1
fi
if ! team_master_set_config; then
return 1
fi
return 0
}
team_ifcfg_write()
{
pr_dbg "${FUNCNAME} $*"
local dev=${1}
if to_stdout; then
team_ifcfg_dump_stdout ${dev} || return 1
else
team_ifcfg_write_file ${dev} || return 1
fi
return 0
}
team_ifcfg_deliver()
{
pr_dbg "${FUNCNAME} $*"
if ! to_stdout; then
return 0
fi
if [ -z "${OUTPUT_DIR}" ]; then
show_output_files
else
ifcfg_overwrite_files
clean_up
fi
return 0
}
teamd_config_create()
{
vfile_reset
vfile_add_line "{"
# add runner options
vfile_add_line " \"device\" : \"${DEVICE}\","
vfile_add_line " \"runner\" : {"
local runner_nr=${#RUNNER_OPTS[@]}
if [ ${runner_nr} -eq 0 ]; then
# default roundrobin
vfile_add_line " \"runner\" : \"roundrobin\" "
else
local last_pos=$((${runner_nr} - 1))
for pos in $(seq 0 ${last_pos})
do
if [ $pos -eq ${last_pos} ]; then
vfile_add_line " ${RUNNER_OPTS[$pos]}"
else
vfile_add_line " ${RUNNER_OPTS[$pos]},"
fi
done
fi
vfile_add_line " },"
vfile_add_line " \"link_watch\" : {"
local lwatch_nr=${#LWATCH_OPTS[@]}
if [ ${lwatch_nr} -eq 0 ]; then
# default to miimon
lwatch_add_opt "\"name\" : \"ethtool\""
else
for pos in $(seq 0 ${last_pos})
do
last_pos=$((${lwatch_nr} - 1))
if [ $pos -eq ${last_pos} ]; then
vfile_add_line " ${LWATCH_OPTS[$pos]}"
else
vfile_add_line " ${LWATCH_OPTS[$pos]},"
fi
done
fi
vfile_add_line " },"
return 0
}
teamd_config_close()
{
vfile_add_line "}"
return 0
}
teamd_dump_stdout()
{
for ln in $(seq 0 $((${#VFILE[@]} - 1)))
do
[ $ln -eq 0 ] && echo "---8<--- teamd.conf ---8<---"
echo "${VFILE[$ln]}"
done
echo "---8<--- teamd.conf ---8<---"
echo ""
return 0
}
teamd_write_file()
{
pr_dbg "${FUNCNAME} $*"
local dev=$1
OUTPUT_FILE=
create_output_file "teamd.conf"
if [ ! -f "${OUTPUT_FILE}" ]; then
return 1
fi
if ! vfile_write_to_file ${OUTPUT_FILE}; then
return 1
fi
return 0
}
teamd_config_write()
{
pr_dbg "${FUNCNAME} $*"
if to_stdout; then
teamd_dump_stdout || return 1
else
teamd_write_file ${dev} || return 1
show_output_files
fi
return 0
}
teamd_port_create()
{
vfile_add_line " \"ports\" : {"
return 0
}
teamd_port_close()
{
vfile_add_line " }"
return 0
}
teamd_port_add()
{
pr_dbg "${FUNCNAME} $*"
local dev=${1}
local lastone=${2}
if [ -n "${PORT_LIST}" ]; then
DEVICE=${dev}
else
if ! ifcfg_get_device ${dev}; then
return 1
fi
fi
vfile_add_line " \"${DEVICE}\" : {"
if [ "${PRIMARY}" == "${DEVICE}" ]; then
vfile_add_line " \"prio\" : -10,"
else
vfile_add_line " \"prio\" : -100,"
fi
if [ -n "${PRIMARY_RESELECT}" ]; then
if [ "${PRIMARY}" == "$port" ]; then
vfile_add_line " \"sticky\" : true "
else
vfile_add_line " \"sticky\" : false "
fi
else
vfile_add_line " \"sticky\" : false "
fi
if [ ${lastone} -eq 1 ]; then
vfile_add_line " }"
else
vfile_add_line " },"
fi
return 0
}
# Runner Functions
runner_add_opt()
{
pr_dbg "${FUNCNAME} $*"
local pos=${#RUNNER_OPTS[*]}
RUNNER_OPTS[${pos}]="$1"
}
runner_parse_adselect()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"0"|"stable")
runner_add_opt "\"agg_select_policy\" : \"bandwidth\"" || return 1
;;
"1"|"bandwidth")
runner_add_opt "\"agg_select_policy\" : \"bandwidth\"" || return 1
;;
"2"|"count")
runner_add_opt "\"agg_select_policy\" : \"count\"" || return 1
;;
*)
pr_error "parameter ad_select=$value is not supported"
return 1
esac
}
runner_parse_failovermac()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"0")
runner_add_opt "\"hwaddr_policy\" : \"same_all\"" || return 1
;;
"1"|"active")
runner_add_opt "\"hwaddr_policy\" : \"by_active\"" || return 1
;;
"2"|"follow")
runner_add_opt "\"hwaddr_policy\" : \"only_active\"" || return 1
;;
*)
pr_error "parameter fail_over_mac $value is not supported"
return 1
;;
esac
}
runner_parse_lacprate()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"slow"|"0")
runner_add_opt "\"fast_rate\" : 0" || return 1
;;
"fast"|"1")
runner_add_opt "\"fast_rate\" : 1" || return 1
;;
*)
pr_error "parameter lacp_rate=$value is not supported"
return 1
;;
esac
}
runner_parse_xmit_policy()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"layer2")
runner_add_opt "\"tx_hash\" : [ \"eth\" ]" || return 1
;;
"layer2+3")
runner_add_opt "\"tx_hash\" : [ \"eth\", \"l3\" ]" || return 1
;;
"layer3+4")
runner_add_opt "\"tx_hash\" : [ \"l3\", \"l4\" ]" || return 1
;;
*)
pr_error "parameter xmit_hash_policy=$value is not supported"
return 1
esac
}
runner_parse_mode()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"0"|"balance-rr")
runner_add_opt "\"name\" : \"roundrobin\"" || return 1
;;
"1"|"active-backup")
runner_add_opt "\"name\" : \"activebackup\"" || return 1
;;
"2"|"balance-xor")
# FIXME
runner_add_opt "\"name\" : \"loadbalance\"" || return 1
;;
"3"|"broadcast")
runner_add_opt "\"name\" : \"broadcast\"" || return 1
;;
"4"|"802.3ad")
runner_add_opt "\"name\" : \"lacp\"" || return 1
;;
"5"|"balance-tlb")
runner_add_opt "\"name\" : \"loadbalance\"" || return 1
;;
"6"|"balance-alb")
pr_error "parameter mode=$value is not supported"
return 1
;;
*)
pr_error "parameter mode=$value is not supported"
return 1
;;
esac
}
runner_parse_opt()
{
pr_dbg "${FUNCNAME} $*"
local param=$1
local value=$2
case $param in
"ad_select")
runner_parse_adselect $value || return 1
;;
"fail_over_mac")
runner_parse_failovermac $value || return 1
;;
"lacp_rate")
runner_parse_lacprate $value || return 1
;;
"min_links")
runner_add_opt "\"min_ports\" : $value" || return 1
;;
"mode")
runner_parse_mode $value || return 1
;;
"xmit_hash_policy")
runner_parse_xmit_policy $value || return 1
;;
esac
}
# Link Watch functions
lwatch_add_opt()
{
pr_dbg "${FUNCNAME} $*"
local pos=${#LWATCH_OPTS[*]}
LWATCH_OPTS[${pos}]="$1"
}
lwatch_parse_arp_validate()
{
pr_dbg "${FUNCNAME} $*"
local value=$1
case $value in
"0"|"none")
;;
"1"|"active")
lwatch_add_opt "\"validate_active\" : 1" || return 1
;;
"2"|"backup")
lwatch_add_opt "\"validate_inactive\" : 1" || return 1
;;
"3"|"all")
lwatch_add_opt "\"validate_active\" : 1" || return 1
lwatch_add_opt "\"validate_inactive\" : 1" || return 1
;;
*)
pr_error "parameter arp_validate=$value is not supported"
return 1
;;
esac
}
lwatch_parse_arpiptarget()
{
#FIXME: supports only one arp_ip_target address.
# otherwise a new linkwatch section must be create
pr_dbg "${FUNCNAME} $*"
local ip_addrs=$1
local ip_list=${ip_addrs//,/ }
local ip_array=($ip_list)
if [ ${#ip_array[*]} -ne 1 ]; then
pr_error "parameter arp_ip_target= with multiple IP addresses is not supported"
return 1
fi
for addr in ${ip_list}
do
lwatch_add_opt "\"target_host\" : \"$addr\""
done
}
lwatch_parse_opt()
{
pr_dbg "${FUNCNAME} $*"
local param=$1
local value=$2
case $param in
"arp_interval")
lwatch_add_opt "\"interval\" : $value"
;;
"arp_ip_target")
lwatch_add_opt "\"name\" : \"arp_ping\""
if ! lwatch_parse_arpiptarget $value; then
return 1
fi
;;
"arp_validate")
lwatch_parse_arp_validate $value
;;
"downdelay")
lwatch_add_opt "\"delay_down\" : $value"
;;
"miimon")
lwatch_add_opt "\"name\" : \"ethtool\""
;;
"updelay")
lwatch_add_opt "\"delay_up\" : $value"
;;
*)
pr_error "parameter $param=$value is not supported"
return 1
;;
esac
}
port_parse_opt()
{
pr_dbg "${FUNCNAME} $*"
local param=$1
local value=$2
case $param in
"primary")
PRIMARY="$value"
;;
"primary_reselect")
case $value in
"0"|"always")
PRIMARY_RESELECT=1
;;
"1"|"better")
;;
"2"|"failure")
;;
*)
pr_error "parameter $param=$value is not supported"
return 1
esac
;;
*)
pr_error "parameter $param=$value is not supported"
return 1
;;
esac
}
convert_bond_opts()
{
local bonding_opts=$1
pr_dbg "${FUNCNAME} $*"
for arg in $bonding_opts
do
key=${arg%%=*};
value=${arg##*=};
pr_dbg "parsing $key=$value"
case "$key" in
"active_slave"|"max_bonds"|"use_carrier")
pr_info "parameter $key not supported, ignoring"
continue
;;
"all_slaves_active"|"resend_igmp"|"num_grat_arp"|"num_unsol_na")
pr_error "parameter $key not supported, aborting"
return 1
;;
"ad_select"|"fail_over_mac"|"lacp_rate"|"min_links"|"mode"|"xmit_hash_policy")
runner_parse_opt $key $value || return 1
;;
"arp_interval"|"arp_ip_target"|"arp_validate"|"downdelay"|"miimon"|"updelay")
lwatch_parse_opt $key $value || return 1
;;
"primary"|"primary_reselect")
port_parse_opt $key $value || return 1
;;
*)
pr_error "unknown parameter $key=$value, aborting"
return 1
;;
esac
done
}
# Parse command line options
while :;
do
case "$1" in
"--master")
MASTER="$2"
shift 2
;;
"--bonding_opts")
BONDING_OPTS="$2"
shift 2
;;
"--ifcfg")
OUTPUT_FORMAT=${FORMAT_IFCFG}
shift
;;
"--json")
OUTPUT_FORMAT=${FORMAT_JANSSON}
shift
;;
"--quiet")
PR_LVL=${PR_QUIET}
shift
;;
"--debug")
PR_LVL=`expr ${PR_LVL} + 1`
shift
;;
"--outputdir")
OUTPUT_DIR="$2"
shift 2
;;
"--configdir")
CONFIGDIR="$2"
shift 2
;;
"--rename")
[ -n "${RENAME}" ] && usage && exit 1
RENAME="$2"
shift 2
;;
"--stdout")
STDOUT=0
shift
;;
"--port")
PORT_LIST="${PORT_LIST} $2"
shift 2
;;
"--version")
echo "$VERSION"
exit 0
;;
"--help")
usage
exit 0
;;
"--examples")
show_examples
exit 0
;;
*)
if [ -z "$1" ]; then
break
fi
pr_error "unknown parameter: $1"
usage
exit 1
;;
esac
done
if [ -n "${OUTPUT_DIR}" -a ! -d "${OUTPUT_DIR}" ]; then
pr_error "Invalid output diretory: ${OUTPUT_DIR}"
usage
exit 1
fi
if [ -z "${MASTER}" -a -z "${BONDING_OPTS}" ]; then
pr_error "No master interface or bonding options specified"
usage
exit 1
fi
# no master means no ifcfg to read
if [ -z "${MASTER}" ]; then
MODE=${MODE_NOIFCFG}
fi
if [ ${OUTPUT_FORMAT} -eq ${FORMAT_JANSSON} -a -z "${MASTER}" ]; then
MASTER="team0"
fi
if ! ifcfg_get_master_file ${MASTER}; then
exit 1
fi
# load the ifcfg file
if ! vfile_load_ifcfg ${MASTER}; then
exit 1
fi
# get the bonding options
if ! ifcfg_get_bond_opts ${MASTER}; then
exit 1
fi
if ! convert_bond_opts "${BONDING_OPTS}"; then
exit 1
fi
if ! vfile_get_device; then
exit 1
fi
TEAM_MASTER=${DEVICE}
if ! ifcfg_device_rename ${DEVICE} ${RENAME}; then
exit 1
fi
BOND_MASTER=${DEVICE}
if [ ${OUTPUT_FORMAT} -eq ${FORMAT_IFCFG} ]; then
if ! team_master_ifcfg_create; then
exit 1
fi
if ! team_ifcfg_write ${TEAM_MASTER}; then
clean_up
exit 1
fi
# process all ports
for portcfg in $(LANG=C grep -s -l "^[[:space:]]*MASTER=\"\?${BOND_MASTER}\"\?\([[:space:]#]\|$\)" ${CONFIGDIR}/ifcfg-*)
do
if ! team_port_ifcfg_create $portcfg; then
clean_up
exit 1
fi
if ! team_ifcfg_write ${DEVICE}; then
clean_up
exit 1
fi
done
team_ifcfg_deliver
else
if ! teamd_config_create; then
exit 1
fi
if ! teamd_port_create; then
exit 1
fi
if [ -n "${PORT_LIST}" ]; then
portcfg_list=${PORT_LIST}
else
portcfg_list=$(LANG=C grep -s -l "^[[:space:]]*MASTER=\"\?${BOND_MASTER}\"\?\([[:space:]#]\|$\)" ${CONFIGDIR}/ifcfg-*)
fi
# count number of ports
portcfg_total=0
for portcfg in ${portcfg_list}
do
portcfg_total=$((${portcfg_total} + 1))
done
# process all ports
portcfg_nr=0
lastone=0
for portcfg in ${portcfg_list}
do
portcfg_nr=$((${portcfg_nr} + 1))
if [ ${portcfg_nr} -eq ${portcfg_total} ]; then
lastone=1
fi
if ! teamd_port_add ${portcfg} ${lastone}; then
exit 1
fi
done
if ! teamd_port_close; then
exit 1
fi
if ! teamd_config_close; then
exit 1
fi
if ! teamd_config_write; then
exit 1
fi
fi