Skip to content

Commit 56fe39b

Browse files
author
olevole
committed
vnet jails: allow non-epair based iface to pass as vnet=
1 parent 3886854 commit 56fe39b

File tree

2 files changed

+146
-65
lines changed

2 files changed

+146
-65
lines changed

sudoexec/jcreate

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -762,11 +762,24 @@ if [ -n "${jailnic_temp_sql}" ]; then
762762
else
763763
[ ! -r ${jailsysdir}/${jname}/local.sqlite ] && /usr/local/bin/cbsd ${miscdir}/updatesql ${jailsysdir}/${jname}/local.sqlite ${distdir}/share/local-jailnic.schema jailnic
764764
# create default record
765-
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "INSERT INTO jailnic ( name,nic_order,nic_slot,nic_parent ) VALUES ( \"epairb\",\"0\",\"0\",\"auto\" )"
765+
766+
tmp_type=${interface%%#*} # cut all after '#'
767+
tmp_iface=${interface##*#} # cut all before '#'
768+
769+
case "${tmp_type}" in
770+
ppt|epair|ovs)
771+
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "INSERT INTO jailnic ( name,nic_order,nic_slot,nic_parent ) VALUES ( '${tmp_iface}','0','0','auto' )"
772+
;;
773+
*)
774+
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "INSERT INTO jailnic ( name,nic_order,nic_slot,nic_parent ) VALUES ( 'epairb','0','0','auto' )"
775+
;;
776+
esac
777+
778+
unset tmp_iface= tmp_type=
766779

767780
if [ ${vnet} -eq 1 ]; then
768781
# created from cli? inherit nic_parent from interface
769-
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE jailnic SET nic_parent=\"${interface}\""
782+
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE jailnic SET nic_parent='${interface}'"
770783
fi
771784
fi
772785

sudoexec/jstart

Lines changed: 131 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ if [ "${vnet}" = "1" ]; then
535535
# for vnet we can make another action
536536
. ${subrdir}/vnet.subr
537537

538-
interfaces=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite SELECT name FROM jailnic | while read _int; do
538+
interfaces=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite "SELECT name FROM jailnic" | while read _int; do
539539
printf "${_int} "
540540
done ) || err 1 "${N1_COLOR}jstart: error get interfaces name for vnet nic map${N0_COLOR}"
541541

@@ -544,13 +544,38 @@ if [ "${vnet}" = "1" ]; then
544544

545545
for i in ${interfaces}; do
546546

547+
tmp_type=${i%%#*} # cut all after '#'
548+
tmp_iface=${i##*#} # cut all before '#'
549+
550+
case "${tmp_type}" in
551+
ppt|epair|ovs)
552+
nic_type="${tmp_type}"
553+
i="${tmp_iface}"
554+
;;
555+
*)
556+
nic_type="epair" # epair by default
557+
true
558+
;;
559+
esac
560+
561+
case "${tmp_iface}" in
562+
epair*)
563+
nic_type="epair"
564+
;;
565+
*)
566+
nic_type="ppt"
567+
;;
568+
esac
569+
570+
unset tmp_type tmp_type
571+
547572
nic_hwaddr=
548573
nic_parent=
549574
nic_address=
550575
_A=
551-
_A=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite SELECT nic_parent,nic_address,nic_hwaddr FROM jailnic WHERE name=\"${i}\" )
576+
_A=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite "SELECT nic_parent,nic_address,nic_hwaddr FROM jailnic WHERE name='${i}'" )
552577
sqllist "${_A}" nic_parent nic_address nic_hwaddr
553-
#nic_parent=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite SELECT nic_parent FROM jailnic WHERE name=\"${i}\" )
578+
#nic_parent=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite "SELECT nic_parent FROM jailnic WHERE name='${i}'" )
554579

555580
# when ip=0 and interface=auto we must use default interface for upstream
556581
[ "${nic_parent}" = "0" -o "${nic_parent}" = "auto" ] && nic_parent=$( getnics-by-ip ip=0.0.0.0 skip=bridge )
@@ -586,14 +611,23 @@ if [ "${vnet}" = "1" ]; then
586611
fi
587612
esac
588613

589-
myepair=$( get_my_epair ${mybridge} )
590-
[ $? -eq 1 ] && err 1 "${N1_COLOR}Error: Cant get_my_epair by: ${N2_COLOR}${mybridge}${N0_COLOR}"
591-
if [ -z "${epairb_list}" ]; then
592-
epaira_list="${myepair}a"
593-
epairb_list="${myepair}b"
614+
if [ "${nic_type}" = "ppt" ]; then
615+
myepair="${i}"
616+
if [ -z "${epairb_list}" ]; then
617+
epairb_list="${myepair}"
618+
else
619+
epairb_list="${epairb_list},${myepair}b"
620+
fi
594621
else
595-
epaira_list="${epaira_list},${myepair}a"
596-
epairb_list="${epairb_list},${myepair}b"
622+
myepair=$( get_my_epair ${mybridge} )
623+
[ $? -eq 1 ] && err 1 "${N1_COLOR}Error: Cant get_my_epair by: ${N2_COLOR}${mybridge}${N0_COLOR}"
624+
if [ -z "${epairb_list}" ]; then
625+
epaira_list="${myepair}a"
626+
epairb_list="${myepair}b"
627+
else
628+
epaira_list="${epaira_list},${myepair}a"
629+
epairb_list="${epairb_list},${myepair}b"
630+
fi
597631
fi
598632

599633
case "${nic_parent}" in
@@ -609,7 +643,7 @@ if [ "${vnet}" = "1" ]; then
609643
_vale_arg=$( substr --pos=0 --len=${_pos} --str="${nic_parent}" )
610644
_sw=$( substr --pos=$(( ${_pos} +2 )) --len=${_pref} --str="${nic_parent}" )
611645
fi
612-
valeid=$( cbsdsqlro local SELECT idx FROM vale WHERE name=\"${_sw}\" )
646+
valeid=$( cbsdsqlro local "SELECT idx FROM vale WHERE name='${_sw}'" )
613647
[ -z "${valeid}" ] && log_err 1 "${N1_COLOR}${CBSD_APP}: can't determine vale nic for: ${nic_parent}, sw: ${_sw}${N0_COLOR}"
614648
#mytap="vale${valeid}:${jname}"
615649
cbsdlogger NOTICE "${CBSD_APP}: vale switch id: ${valeid} (vale${valeid})"
@@ -618,24 +652,49 @@ if [ "${vnet}" = "1" ]; then
618652
esac
619653

620654
printf "${H3_COLOR}${myepair}:${N2_COLOR}${nic_parent} "
621-
${IFCONFIG_CMD} ${myepair}a description ${jname}-eth${eth_seq} up
655+
656+
case "${nic_type}" in
657+
ppt)
658+
#${IFCONFIG_CMD} ${myepair} description ${jname}-eth${eth_seq} up
659+
${IFCONFIG_CMD} ${myepair} description ${jname}-${myepair} up
660+
;;
661+
*)
662+
${IFCONFIG_CMD} ${myepair}a description ${jname}-eth${eth_seq} up
663+
;;
664+
esac
665+
622666
eth_seq=$(( eth_seq + 1 ))
623-
TRAP="${TRAP} ${IFCONFIG_CMD} ${myepair}a destroy;"
624-
trap "${TRAP}" HUP INT ABRT BUS TERM EXIT
625667

626-
#nic_hwaddr=$( cbsdsqlro ${jailsysdir}/${jname}/local.sqlite SELECT nic_hwaddr FROM jailnic WHERE name=\"${i}\" )
668+
case "${nic_type}" in
669+
ppt)
670+
true
671+
# TRAP="${TRAP} ${IFCONFIG_CMD} eth${eth_seq} name ${myepair};"
672+
# trap "${TRAP}" HUP INT ABRT BUS TERM EXIT
673+
;;
674+
*)
675+
TRAP="${TRAP} ${IFCONFIG_CMD} ${myepair}a destroy;"
676+
trap "${TRAP}" HUP INT ABRT BUS TERM EXIT
677+
;;
678+
esac
627679

628680
# MAC MGMT
629681
if [ "${nic_hwaddr}" = "0" ]; then
630682
nic_hwaddr=$( mac_gen 00:a0:98 )
631-
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE jailnic SET nic_hwaddr=\"${nic_hwaddr}\" WHERE name=\"${i}\""
683+
cbsdsqlrw ${jailsysdir}/${jname}/local.sqlite "UPDATE jailnic SET nic_hwaddr='${nic_hwaddr}' WHERE name='${i}'"
632684
fi
633685

634-
cbsdlogger NOTICE ${CBSD_APP}: jail ${jname}: set hwaddr for vnet interface ${myepair}b: ${nic_hwaddr}
635-
${IFCONFIG_CMD} ${myepair}b ether ${nic_hwaddr}
636-
if [ "${nic_address}" != "0" ]; then
637-
${IFCONFIG_CMD} ${myepair}a inet ${nic_address} up
638-
fi
686+
case "${nic_type}" in
687+
ppt)
688+
cbsdlogger NOTICE ${CBSD_APP}: jail ${jname}: set hwaddr for vnet interface ${myepair}: ${nic_hwaddr}
689+
${IFCONFIG_CMD} ${myepair} ether ${nic_hwaddr}
690+
;;
691+
*)
692+
cbsdlogger NOTICE ${CBSD_APP}: jail ${jname}: set hwaddr for vnet interface ${myepair}b: ${nic_hwaddr}
693+
${IFCONFIG_CMD} ${myepair}b ether ${nic_hwaddr}
694+
if [ "${nic_address}" != "0" ]; then
695+
${IFCONFIG_CMD} ${myepair}a inet ${nic_address} up
696+
fi
697+
esac
639698
done
640699

641700
[ ${quiet} -ne 1 ] && ${ECHO} "${N0_COLOR}"
@@ -824,6 +883,7 @@ case "${platform}" in
824883
;;
825884
*)
826885
cbsdlogger NOTICE ${CBSD_APP}: ${CPUSET} /usr/local/cbsd/misc/daemonize -p ${ftmpdir}/jstart.${jname}.$$ /usr/bin/nice -n ${nice} ${JAIL_CMD} -f ${ftmpdir}/${jname}.conf -c ${jname}
886+
echo "${JAIL_CMD} -f ${ftmpdir}/${jname}.conf -c ${jname}"
827887
case "${quiet}" in
828888
0)
829889
${CPUSET} /usr/local/cbsd/misc/daemonize -p ${ftmpdir}/jstart.${jname}.$$ /usr/bin/nice -n ${nice} ${JAIL_CMD} -f ${ftmpdir}/${jname}.conf -c ${jname}
@@ -861,45 +921,53 @@ if [ ${vnet} -eq 1 ]; then
861921
OIFS="${IFS}"
862922
IFS=","
863923
eth_seq=0
924+
int_iface=
864925
for i in ${epairb_list}; do
865926
[ -z "${i}" ] && continue
866927
IFS="${OIFS}"
867928
${IFCONFIG_CMD} ${i} up
868929
# we need setup lock here due to ethX name possible conflict with other jail
869930
_wait_count=0
870-
while [ -r ${tmpdir}/eth${eth_seq}.locked ]; do
871-
872-
_cur_time=$( ${DATE_CMD} +%s )
873-
eval $( ${STAT_CMD} -s ${tmpdir}/eth${eth_seq}.locked )
874-
_diff_time=$(( _cur_time - st_mtime ))
875-
876-
if [ ${_diff_time} -gt 8 ]; then
877-
${IFCONFIG_CMD} eth${eth_seq} > /dev/null 2>&1
878-
_ret=$?
879-
if [ ${_ret} -ne 0 ]; then
880-
# remove orphaned lock
881-
${RM_CMD} -f ${tmpdir}/eth${eth_seq}.locked
882-
break
931+
_iface_rename=0
932+
933+
if [ ${_iface_rename} -eq 1 ]; then
934+
while [ -r ${tmpdir}/eth${eth_seq}.locked ]; do
935+
_cur_time=$( ${DATE_CMD} +%s )
936+
eval $( ${STAT_CMD} -s ${tmpdir}/eth${eth_seq}.locked )
937+
_diff_time=$(( _cur_time - st_mtime ))
938+
939+
if [ ${_diff_time} -gt 8 ]; then
940+
${IFCONFIG_CMD} eth${eth_seq} > /dev/null 2>&1
941+
_ret=$?
942+
if [ ${_ret} -ne 0 ]; then
943+
# remove orphaned lock
944+
${RM_CMD} -f ${tmpdir}/eth${eth_seq}.locked
945+
break
946+
fi
883947
fi
884-
fi
885948

886-
[ ${quiet} -ne 1 ] && ${ECHO} "${N1_COLOR}jstart: eth${eth_seq} locked (${_diff_time}), waiting (${_wait_count}/12)..${N0_COLOR}"
949+
[ ${quiet} -ne 1 ] && ${ECHO} "${N1_COLOR}jstart: eth${eth_seq} locked (${_diff_time}), waiting (${_wait_count}/12)..${N0_COLOR}"
887950

888-
_wait_count=$(( _wait_count + 1 ))
951+
_wait_count=$(( _wait_count + 1 ))
889952

890-
if [ ${_wait_count} -gt 12 ]; then
891-
_res=$( ${CAT_CMD} ${tmpdir}/eth${eth_seq}.locked )
892-
jstop jname=${jname} fast=1
893-
${IFCONFIG_CMD} ${i} destroy
894-
log_err 1 "${N1_COLOR}${CBSD_APP}: waiting for unlock: still locked by [${_res}]: ${N2_COLOR}${tmpdir}/eth${eth_seq}.locked${N0_COLOR}"
895-
fi
953+
if [ ${_wait_count} -gt 12 ]; then
954+
_res=$( ${CAT_CMD} ${tmpdir}/eth${eth_seq}.locked )
955+
jstop jname=${jname} fast=1
956+
${IFCONFIG_CMD} ${i} destroy
957+
log_err 1 "${N1_COLOR}${CBSD_APP}: waiting for unlock: still locked by [${_res}]: ${N2_COLOR}${tmpdir}/eth${eth_seq}.locked${N0_COLOR}"
958+
fi
896959

897-
sleep 1
898-
done
960+
sleep 1
961+
done
899962

900-
# make lock
901-
echo "${jname}" > ${tmpdir}/eth${eth_seq}.locked
902-
${IFCONFIG_CMD} ${i} name eth${eth_seq} && ${IFCONFIG_CMD} eth${eth_seq} vnet ${jname}
963+
# make lock
964+
echo "${jname}" > ${tmpdir}/eth${eth_seq}.locked
965+
${IFCONFIG_CMD} ${i} name eth${eth_seq} && ${IFCONFIG_CMD} eth${eth_seq} vnet ${jname}
966+
int_iface="eth${eth_seq}"
967+
else
968+
${IFCONFIG_CMD} ${i} vnet ${jname}
969+
int_iface="${i}"
970+
fi
903971

904972
# more than one IPs in ip4_addr?
905973
multi_ip=0
@@ -926,14 +994,14 @@ if [ ${vnet} -eq 1 ]; then
926994
DHCLIENT_PROGRAM=${dhclient_program}
927995
fi
928996
# todo: FIB? NICE?
929-
${CPUSET} ${JEXEC_CMD} ${jname} ${DHCLIENT_PROGRAM} eth${eth_seq}
997+
${CPUSET} ${JEXEC_CMD} ${jname} ${DHCLIENT_PROGRAM} ${int_iface}
930998
;;
931999
0|[Dd][Hh][Cc][Pp])
9321000
# just skip
9331001
;;
9341002
*)
9351003
# alias ? mtu ?
936-
# we need to re-build ifconfig_eth0 vars if values already exist to merge new IP address and
1004+
# we need to re-build ifconfig_${int_iface} vars if values already exist to merge new IP address and
9371005
# and do not spoil the remaining data
9381006

9391007
# Whats about Linux jail?
@@ -942,32 +1010,32 @@ if [ ${vnet} -eq 1 ]; then
9421010
_osname=$( ${miscdir}/elf_tables --osname /bin/sh )
9431011
# warning relevant for FreeBSD-based env
9441012
if [ "${osname}" = "freebsd" ]; then
945-
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}no such /etc/rc.conf: ${N2_COLOR}${name}${N1_COLOR}, skip for config ifconfig_eth0${N0_COLOR}" 1>&2
1013+
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}no such /etc/rc.conf: ${N2_COLOR}${name}${N1_COLOR}, skip for config ifconfig_${int_iface}${N0_COLOR}" 1>&2
9461014
else
9471015
# Linux env?
9481016
if [ ! -r "${path}/etc/os-release" ]; then
949-
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}no such /etc/os-release: ${N2_COLOR}${name}${N1_COLOR}, skip for config ifconfig_eth0${N0_COLOR}" 1>&2
1017+
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}no such /etc/os-release: ${N2_COLOR}${name}${N1_COLOR}, skip for config ifconfig_${int_iface}${N0_COLOR}" 1>&2
9501018
else
9511019
. ${path}/etc/os-release
9521020
case "${ID}" in
9531021
debian)
954-
${ECHO} "${N1_COLOR}${CBSD_APP} use debian helper for config_eth0${N1_COLOR}"
1022+
${ECHO} "${N1_COLOR}${CBSD_APP} use debian helper for config_${int_iface}${N1_COLOR}"
9551023
# just test, netlink/BSD wIP
9561024
# mgmt for first boot only? ! -r ${data}/etc/network/interfaces.d/* ?
9571025
# ${CAT_CMD} > ${data}/etc/network/interfaces.d/lo <<EOF
9581026
#auto lo
9591027
#iface lo inet loopback
9601028
#EOF
961-
# ${CAT_CMD} > ${data}/etc/network/interfaces.d/eth0 <<EOF
962-
#auto eth0
963-
#iface eth0 inet static
1029+
# ${CAT_CMD} > ${data}/etc/network/interfaces.d/${int_iface} <<EOF
1030+
#auto ${int_iface}
1031+
#iface ${int_iface} inet static
9641032
# address ${ip4_addr}/24
9651033
# gateway 192.168.0.1
9661034
#
9671035
#EOF
9681036
;;
9691037
*)
970-
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}skip config for ifconfig_eth0: distri not supported yet: ${N2_COLOR}${ID}${N0_COLOR}" 1>&2
1038+
${ECHO} "${W1_COLOR}warning: ${N1_COLOR}skip config for ifconfig_${int_iface}: distri not supported yet: ${N2_COLOR}${ID}${N0_COLOR}" 1>&2
9711039
;;
9721040
esac
9731041
fi
@@ -1016,25 +1084,25 @@ if [ ${vnet} -eq 1 ]; then
10161084
case "${myip_type}" in
10171085
1)
10181086
if [ ${multi_ip4} -lt 2 ]; then
1019-
find_ifconfig="ifconfig_eth0"
1087+
find_ifconfig="ifconfig_${int_iface}"
10201088
else
10211089
alias_num=$(( multi_ip4 - 2 ))
1022-
find_ifconfig="ifconfig_eth0_alias${alias_num}"
1090+
find_ifconfig="ifconfig_${int_iface}_alias${alias_num}"
10231091
fi
10241092
;;
10251093
2)
10261094
if [ ${multi_ip6} -lt 2 ]; then
1027-
find_ifconfig="ifconfig_eth0_ipv6"
1095+
find_ifconfig="ifconfig_${int_iface}_ipv6"
10281096
else
10291097
alias_num=$(( multi_ip6 - 2 ))
1030-
find_ifconfig="ifconfig_eth0_ipv6_alias${alias_num}"
1098+
find_ifconfig="ifconfig_${int_iface}_ipv6_alias${alias_num}"
10311099
fi
10321100
;;
10331101
esac
10341102

10351103
eval $( ${GREP_CMD} ^${find_ifconfig}= ${data}/etc/rc.conf 2>/dev/null | ${HEAD_CMD} -n1 )
10361104
if [ -n "${ifconfig_eth0}" ]; then
1037-
${ECHO} "${N1_COLOR}adjust IP address for eth0: ${N2_COLOR}${ip4_addr}${N0_COLOR}" 1>&2
1105+
${ECHO} "${N1_COLOR}adjust IP address for ${int_iface}: ${N2_COLOR}${ip4_addr}${N0_COLOR}" 1>&2
10381106
for _part in ${ifconfig_eth0}; do
10391107
[ "${_part}" = "inet" ] && continue
10401108
[ "${_part}" = "inet6" ] && continue
@@ -1056,7 +1124,7 @@ if [ ${vnet} -eq 1 ]; then
10561124
done
10571125

10581126
# release lock
1059-
${RM_CMD} -f ${tmpdir}/eth${eth_seq}.locked
1127+
[ -r ${tmpdir}/eth${eth_seq}.locked ] && ${RM_CMD} -f ${tmpdir}/eth${eth_seq}.locked
10601128
eth_seq=$(( eth_seq + 1 ))
10611129
IFS=","
10621130
done

0 commit comments

Comments
 (0)