ipw 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. #!/bin/bash
  2. # Copyright (C) 2013 Artyom A Anikeev <anikeev@ut.mephi.ru> 0xB5385841,
  3. # Dmitry Yu Okunev <dyokunev@ut.mephi.ru> 0x8E30679C
  4. #
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. CMD="$1"; shift;
  18. DEFAULT_BONDING_MODE='balance-tlb'
  19. eerror() {
  20. echo "$@" >&2
  21. }
  22. newconfig_open() {
  23. echo -n > "$NEWCONFIG_TMPPATH"
  24. }
  25. newconfig_write() {
  26. LINE="$1"; shift;
  27. [[ "$NEWCONFIG" -eq 0 ]] && return
  28. echo "$LINE" >> "$NEWCONFIG_TMPPATH"
  29. }
  30. newconfig_commit() {
  31. rm -f "$CONFIG_PATH"
  32. mv "$NEWCONFIG_TMPPATH" "$CONFIG_PATH"
  33. }
  34. newconfig_push() {
  35. BUFNUM="$1"; shift;
  36. LINE="$1"; shift;
  37. BUF[$BUFNUM]="${BUF[$BUFNUM]}
  38. $LINE"
  39. }
  40. newconfig_pushpopall() {
  41. BUFNUMTO="$1"; shift;
  42. BUFNUMFROM="$1"; shift;
  43. newconfig_push "$BUFNUMTO" "${BUF[$BUFNUMFROM]}"
  44. newconfig_popall "$BUFNUMFROM"
  45. }
  46. newconfig_popall() {
  47. BUFNUM="$1"; shift;
  48. BUF[$BUFNUM]=""
  49. }
  50. newconfig_popallwrite() {
  51. BUFNUM="$1"; shift;
  52. newconfig_write "${BUF[$BUFNUM]}"
  53. BUF[$BUFNUM]=""
  54. }
  55. # INPUT: 10.2:thor.ext; OUTPUT: environments: VLAN, SUBVLAN, BRNAME
  56. parse_vlan_subvlan_bridge() {
  57. VLAN_N_BRIDGE="$1"; shift
  58. if [[ "${VLAN_N_BRIDGE:0:1}" = ":" ]]; then
  59. VLAN=""
  60. SUBVLAN=""
  61. VLANNAME=""
  62. BRNAME="${VLAN_N_BRIDGE:1}"
  63. else
  64. # Splitting by ":"
  65. WORDS=( ${VLAN_N_BRIDGE//[:]/ } )
  66. # The second word defines interface name. If it's empty, "vlan$VLAN.$SUBVLAN" is used.
  67. VLANNAME="${WORDS[0]}"
  68. BRNAME="${WORDS[1]}"
  69. # Splitting by "."
  70. WORDS=( ${VLANNAME//[.]/ } )
  71. # The second word defines subvlan (1q-in-1q) if it's used. It's empty if no subvlan is used.
  72. VLAN="${WORDS[0]}"
  73. SUBVLAN="${WORDS[1]}"
  74. fi
  75. # Checking if no "vlan(.subvlan)?" is set
  76. if ! [[ "${VLAN_N_BRIDGE: -1}" = ":" ]]; then
  77. # Setting default values
  78. [[ "$SUBVLAN" = "" ]] && BRNAME="${BRNAME:-vlan${VLAN}}" || BRNAME="${BRNAME:-vlan${VLAN}.${SUBVLAN}}"
  79. fi
  80. return;
  81. }
  82. declare -A get_brname_byslave_assoc
  83. for VLAN_N_BRIDGE in $(find /sys/devices/virtual/net -wholename '*/brif/*' | awk -F '/' '{print $8":"$6}'); do
  84. oldIFS="$IFS"; IFS=':'; words=($VLAN_N_BRIDGE); IFS="$oldIFS"
  85. get_brname_byslave_assoc[${words[0]}]=${words[1]}
  86. done
  87. get_brname_byslave() {
  88. SLAVE="$1"; shift
  89. echo ${get_brname_byslave_assoc[$SLAVE]}
  90. }
  91. get_vlan_n_bridges() {
  92. awk '{if(NR>2) if( system( "[ -d /sys/devices/virtual/net/*/brif/"$1" ] " ) != 0 ) print $1":"}' < /proc/1/net/vlan/config
  93. find /sys/devices/virtual/net -wholename '*/brif' -empty | awk -F '/' '{print ":"$6}'
  94. find /sys/devices/virtual/net -wholename '*/brif/*' | awk -F '/' '{print $8":"$6}'
  95. }
  96. iface_isexists() {
  97. IFACE="$1"; shift;
  98. [ -e /sys/devices/virtual/net/"$IFACE" ]
  99. return $?
  100. }
  101. case "$CMD" in
  102. down)
  103. IPW_CONFIG_PATH=/dev/null
  104. CMD='fix'
  105. ;;
  106. esac
  107. IPW_CONFIG_PATH="${IPW_CONFIG_PATH:-/etc/ipw.conf}"
  108. source "$IPW_CONFIG_PATH"
  109. NEWCONFIG_TMPPATH="/tmp/.~ipw"
  110. NEWCONFIG=0
  111. case "$CMD" in
  112. add1qif) #allow to add slave interface in bonding
  113. NEWCONFIG=1 # we need to update the config after the command
  114. NEW_D1Q_IFACE="$1"; shift
  115. NEW_SLAVE="$1"; shift
  116. # checking for duplicated slaves or d1q_ifaces
  117. D1Q_IFACE_USED=0
  118. for D1Q_IFACE in ${D1Q_IFACES[@]}; do
  119. if [[ "$D1Q_IFACE" = "$NEW_D1Q_IFACE" ]]; then
  120. D1Q_IFACE_USED=1
  121. fi
  122. SLAVES_VARIABLE="${D1Q_IFACE}_SLAVES"
  123. SLAVES_VARIABLE="${SLAVES_VARIABLE//[.]/_}[@]"
  124. for SLAVE in "${!SLAVES_VARIABLE}"; do
  125. if [[ "$SLAVE" = "$NEW_SLAVE" ]]; then
  126. eerror "This interface have already been enslaved"
  127. exit -1
  128. fi
  129. done
  130. done
  131. if [[ $D1Q_IFACE_USED -eq 0 ]]; then
  132. D1Q_IFACES[ ${#D1Q_IFACES} ]="$NEW_D1Q_IFACE"
  133. fi
  134. SLAVES_VARIABLE="${NEW_D1Q_IFACE}_SLAVES"
  135. SLAVES_VARIABLE="${SLAVES_VARIABLE//[.]/_}"
  136. eval "${SLAVES_VARIABLE}[\${#${SLAVES_VARIABLE}}]=\"$NEW_SLAVE\""
  137. ;;
  138. del1qif)
  139. ;;
  140. addbrif) #allow to add bridge/vlan in bonding
  141. NEWCONFIG=1 # we need to update the config after the command
  142. NEW_D1Q_IFACE="$1"; shift
  143. NEW_VLAN_SUBVLAN="$1"; shift
  144. NEW_BRIDGE="$1"; shift
  145. [[ -z $NEW_BRIDGE ]] && NEW_VLAN_N_BRIDGE="${NEW_VLAN_SUBVLAN}" || NEW_VLAN_N_BRIDGE="${NEW_VLAN_SUBVLAN}:${NEW_BRIDGE}"
  146. D1Q_IFACE_USED=0
  147. for D1Q_IFACE in ${D1Q_IFACES[@]}; do
  148. if [[ "$D1Q_IFACE" = "$NEW_D1Q_IFACE" ]]; then
  149. D1Q_IFACE_USED=1
  150. break;
  151. fi
  152. done
  153. parse_vlan_subvlan_bridge "${NEW_VLAN_N_BRIDGE}"
  154. NEW_VLAN=$VLAN
  155. NEW_SUBVLAN=$SUBVLAN
  156. if [[ $D1Q_IFACE_USED -eq 0 ]]; then
  157. eerror "There's no such interface: $NEW_D1Q_IFACE"
  158. exit -1
  159. fi
  160. VLAN_N_BRIDGE_VARIABLE="${NEW_D1Q_IFACE}_VLAN_N_BRIDGES"
  161. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}[@]"
  162. for VLAN_N_BRIDGE in "${!VLAN_N_BRIDGE_VARIABLE}"; do
  163. parse_vlan_subvlan_bridge "${VLAN_N_BRIDGE}"
  164. if [[ "$VLAN" = "$NEW_VLAN" && "$SUBVLAN" = "$NEW_SUBVLAN" ]]; then
  165. eerror "This vlan is alredy used"
  166. exit -1
  167. fi
  168. done
  169. VLAN_N_BRIDGE_VARIABLE="${NEW_D1Q_IFACE}_VLAN_N_BRIDGES"
  170. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}"
  171. eval "${VLAN_N_BRIDGE_VARIABLE}[\${#${VLAN_N_BRIDGE_VARIABLE}}]=\"$NEW_VLAN_N_BRIDGE\""
  172. #D1Q_IFACES[ ${#D1Q_IFACES}]
  173. ;;
  174. delbrif)
  175. ;;
  176. addbr) #allow to add bridge without interfaces
  177. NEWCONFIG=1 # we need to update the config after the command
  178. NEW_D1Q_IFACE="$1"; shift
  179. NEW_BRIDGE="$1"; shift
  180. VLAN_N_BRIDGE_VARIABLE="${NEW_D1Q_IFACE}_VLAN_N_BRIDGES"
  181. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}"
  182. eval "${VLAN_N_BRIDGE_VARIABLE}[\${#${VLAN_N_BRIDGE_VARIABLE}}]=\":${NEW_BRIDGE}\""
  183. ;;
  184. delbr)
  185. ;;
  186. addif) #allow to add interface without bridging
  187. ;;
  188. delif)
  189. ;;
  190. addipcmd) #allow to add ip commnds for bridges/vlans
  191. NEWCONFIG=1 # we need to update the config after the command
  192. NEW_BRIDGE="$1"; shift
  193. NEW_IP_CMD="$@"
  194. if [[ "${NEW_BRIDGE}" != "" ]]; then
  195. # Getting commands for "ip"
  196. IP_CMDS_VARIABLE="${NEW_BRIDGE//[.]/_}_IP"
  197. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}"
  198. eval "${IP_CMDS_VARIABLE}[\${#${IP_CMDS_VARIABLE}}]=\"$NEW_IP_CMD\""
  199. fi
  200. ;;
  201. delipcmd)
  202. NEWCONFIG=1 # we need to update the config after the command
  203. NEW_BRIDGE="$1"; shift
  204. NEW_IP_CMD="$@"
  205. if [[ "${NEW_BRIDGE}" != "" ]]; then
  206. IP_CMDS_VARIABLE="${NEW_BRIDGE//[.]/_}_IP"
  207. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}"
  208. i=0
  209. CMD_founded=0
  210. for IP_CMD in "${!IP_CMDS_VARIABLE}"; do
  211. if [[ "$IP_CMD" = "$NEW_IP_CMD" ]]; then
  212. CMD_founded=1
  213. else
  214. TMP[$i]=$IP_CMD
  215. (( i++ ))
  216. fi
  217. done
  218. if [[ $CMD_founded -eq 0 ]]; then
  219. eerror "There's no such command"
  220. exit -1
  221. fi
  222. i=0
  223. for IP_CMD in "${!TMP}"; do
  224. IP_CMDS_VARIABLE[$i]=$IP_CMD
  225. (( i++ ))
  226. done
  227. #eval "${IP_CMDS_VARIABLE}[\${#${IP_CMDS_VARIABLE}}]=\"$NEW_IP_CMD\""
  228. #echo $IP_CMDS_VARIABLE
  229. fi ;;
  230. fix) #fix all interfaces to config state
  231. #brctl addif bond0 eth2
  232. #GETTING INFORMATION ABOUT LXC INTERFACES IN BRIDGES
  233. if [[ "$LXC_DIR" != "" ]]; then
  234. LXC_BRIDGE_SLAVES=($(cat /srv/lxc/*/config | tr -d " \t" | awk -F '=' '{if($1=="lxc.network.link") {BRIDGE=$2}; if($1=="lxc.network.veth.pair") {if(BRIDGE!="") {print $2":"BRIDGE; BRIDGE=""}} }'))
  235. fi
  236. #REMOVING UNNECESSARY D1Q
  237. OLD_D1Q_IFACES="`cat /sys/class/net/bonding_masters`"
  238. for OLD_D1Q_IFACE in ${OLD_D1Q_IFACES[@]}; do
  239. D1Q_IS_USED=0
  240. OLD_SLAVES="`cat /sys/class/net/"$OLD_D1Q_IFACE"/bonding/slaves`"
  241. for D1Q_IFACE in ${D1Q_IFACES[@]}; do
  242. if [[ "$D1Q_IFACE" == "$OLD_D1Q_IFACE" ]]; then #let's kick out useless slaves
  243. SLAVES_VARIABLE="${D1Q_IFACE}_SLAVES"
  244. SLAVES_VARIABLE="${SLAVES_VARIABLE//[.]/_}[@]"
  245. for OLD_SLAVE in ${OLD_SLAVES[@]}; do
  246. SLAVE_IS_USED=0
  247. for SLAVE in "${!SLAVES_VARIABLE}"; do
  248. if [[ "$SLAVE" == "$OLD_SLAVE" ]]; then
  249. SLAVE_IS_USED=1
  250. break;
  251. fi
  252. done
  253. if [[ "$SLAVE_IS_USED" == 0 ]]; then
  254. #echo "ip link set dev $OLD_SLAVE down"
  255. #echo "echo '-$OLD_SLAVE' > /sys/class/net/"$OLD_D1Q_IFACE"/bonding/slaves"
  256. # [[ "$OLD_SLAVE" != "" ]] &&
  257. echo "-$OLD_SLAVE" > /sys/class/net/"$OLD_D1Q_IFACE"/bonding/slaves
  258. fi
  259. done
  260. D1Q_IS_USED=1
  261. break;
  262. fi
  263. done
  264. if [[ "$D1Q_IS_USED" == 0 ]]; then #let's kick out useless d1q
  265. #echo "ip link set dev $OLD_D1Q_IFACE down"
  266. #echo "echo '-$D1Q_IFACE' > /sys/class/net/bonding_masters"
  267. echo "-$OLD_D1Q_IFACE" > /sys/class/net/bonding_masters
  268. fi
  269. done
  270. #REMOVING UNNECESSARY BRIDGES AND VLANS
  271. declare -A REQUIRED_FULLNAME_HASH
  272. declare -A REQUIRED_BRNAME_HASH
  273. declare -A REQUIRED_IFACENAME_HASH
  274. for D1Q_IFACE_TMP in ${D1Q_IFACES[@]}; do #we should keep slave ifaces
  275. VLAN_N_BRIDGE_VARIABLE="${D1Q_IFACE_TMP}_VLAN_N_BRIDGES"
  276. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}[@]"
  277. for VLAN_N_BRIDGE in "${!VLAN_N_BRIDGE_VARIABLE}"; do
  278. parse_vlan_subvlan_bridge "${VLAN_N_BRIDGE}"
  279. REQUIRED_FULLNAME_HASH["$D1Q_IFACE_TMP"."$VLAN_N_BRIDGE"]="$D1Q_IFACE_TMP"."$VLAN_N_BRIDGE"
  280. if [[ "$BRNAME" != "" ]]; then
  281. REQUIRED_BRNAME_HASH["$BRNAME"]="$BRNAME"
  282. fi
  283. if [[ "$VLANNAME" != "" ]]; then
  284. REQUIRED_IFACENAME_HASH["$VLANNAME"]="$VLANNAME"
  285. REQUIRED_IFACENAME_HASH["$D1Q_IFACE_TMP"."$VLAN"]="$D1Q_IFACE_TMP"."$VLAN"
  286. fi
  287. done
  288. done
  289. for LXCIF_N_BRIDGE in ${LXC_BRIDGE_SLAVES[@]}; do
  290. REQUIRED_FULLNAME_HASH["$LXCIF_N_BRIDGE"]="$LXCIF_N_BRIDGE"
  291. done
  292. OLD_VLAN_N_BRIDGES=(`get_vlan_n_bridges`)
  293. for LINE in ${OLD_VLAN_N_BRIDGES[@]}; do
  294. #echo ITERATION
  295. parse_vlan_subvlan_bridge "$LINE"
  296. OLD_BRNAME="$BRNAME"
  297. OLD_VLANNAME="$VLANNAME"
  298. ##
  299. #echo "BRNAME $BRNAME"
  300. #echo "VLANNAME $VLANNAME"
  301. ##
  302. IS_SLAVE=0
  303. BRIDGE_IN_USE=0
  304. IFACE_IN_USE=0
  305. VLAN_N_BRIDGE_IN_USE=0
  306. if [[ "${REQUIRED_FULLNAME_HASH[$LINE]}" != "" ]]; then
  307. BRIDGE_IN_USE=1
  308. IFACE_IN_USE=1
  309. VLAN_N_BRIDGE_IN_USE=1
  310. else
  311. [[ "$OLD_BRNAME" != "" ]] &&
  312. if [[ "${REQUIRED_BRNAME_HASH[$OLD_BRNAME]}" != "" ]]; then
  313. BRIDGE_IN_USE=1
  314. fi
  315. [[ "$OLD_VLANNAME" != "" ]] &&
  316. if [[ "${REQUIRED_IFACENAME_HASH[$OLD_VLANNAME]}" != "" ]]; then
  317. IFACE_IN_USE=1
  318. fi
  319. fi
  320. if [[ "$BRIDGE_IN_USE" = 0 ]]; then
  321. [[ "$OLD_BRNAME" != '' ]] &&
  322. ip link delete "$OLD_BRNAME"
  323. fi
  324. if [[ "$IFACE_IN_USE" = 0 ]]; then
  325. if [[ "$OLD_VLANNAME" != '' ]]; then
  326. ip link set "$OLD_VLANNAME" nomaster
  327. ip link delete "$OLD_VLANNAME"
  328. fi
  329. fi
  330. done
  331. #CREATING OF NECESSARY D1Q
  332. for D1Q_IFACE in ${D1Q_IFACES[@]}; do
  333. # Fixing bond-ifaces if exists
  334. SLAVES_VARIABLE="${D1Q_IFACE}_SLAVES"
  335. SLAVES_VARIABLE="${SLAVES_VARIABLE//[.]/_}[@]"
  336. MODE_VARIABLE="${D1Q_IFACE}_MODE"
  337. MODE="${!MODE_VARIABLE}"; [[ "$MODE" = "" ]] && MODE="$DEFAULT_BONDING_MODE"
  338. D1Q_EXISTS=0
  339. for OLD_D1Q_IFACE in ${OLD_D1Q_IFACES[@]}; do
  340. if [[ "$D1Q_IFACE" == "$OLD_D1Q_IFACE" ]]; then #it's here. Let's fix it.
  341. OLD_SLAVES="`cat /sys/class/net/"$OLD_D1Q_IFACE"/bonding/slaves`"
  342. OLD_BONDING_MODE=(`cat /sys/class/net/"$OLD_D1Q_IFACE"/bonding/mode`)
  343. if [ "${OLD_BONDING_MODE[0]}" != "${MODE}" -a "${OLD_BONDING_MODE[1]}" != "${MODE}" ]; then
  344. for OLD_SLAVE in ${OLD_SLAVES[@]}; do
  345. echo "-$OLD_SLAVE" > /sys/class/net/"$OLD_D1Q_IFACE"/bonding/slaves
  346. done
  347. ip link set dev "$OLD_D1Q_IFACE" down
  348. echo "$MODE" > /sys/class/net/"$OLD_D1Q_IFACE"/bonding/mode
  349. OLD_SLAVES=()
  350. fi
  351. for SLAVE in "${!SLAVES_VARIABLE}"; do
  352. SLAVE_EXISTS=0
  353. for OLD_SLAVE in ${OLD_SLAVES[@]}; do
  354. if [[ "$SLAVE" == "$OLD_SLAVE" ]]; then
  355. SLAVE_EXISTS=1
  356. break;
  357. fi
  358. done
  359. if [[ "$SLAVE_EXISTS" == 0 ]]; then
  360. #echo "ip link set dev $SLAVE down" #enslaved int should be shutted down
  361. ip link set dev "$SLAVE" down #enslaved int should be shutted down
  362. #echo "echo '+$SLAVE' > /sys/class/net/"$D1Q_IFACE"/bonding/slaves"
  363. echo "+$SLAVE" > /sys/class/net/"$D1Q_IFACE"/bonding/slaves
  364. fi
  365. done
  366. D1Q_EXISTS=1
  367. break;
  368. fi
  369. done
  370. # Creating bond-ifaces
  371. if [[ "$D1Q_EXISTS" == 0 ]]; then #make all
  372. #echo "echo '+$D1Q_IFACE' > /sys/class/net/bonding_masters"
  373. echo "+$D1Q_IFACE" > /sys/class/net/bonding_masters
  374. echo "$MODE" > /sys/class/net/"$D1Q_IFACE"/bonding/mode
  375. for SLAVE in "${!SLAVES_VARIABLE}"; do
  376. #echo "ip link set dev $SLAVE down" #enslaved int should be shutted down
  377. ip link set dev "$SLAVE" down #enslaved int should be shutted down
  378. #echo "echo '+$SLAVE' > /sys/class/net/"$D1Q_IFACE"/bonding/slaves"
  379. echo "+$SLAVE" > /sys/class/net/"$D1Q_IFACE"/bonding/slaves
  380. done
  381. fi
  382. #echo "ip link set dev $D1Q_IFACE up"
  383. ip link set dev "$D1Q_IFACE" up
  384. for SLAVE in "${!SLAVES_VARIABLE}"; do #slave starts after bond
  385. #echo "ip link set dev $SLAVE up"
  386. ip link set dev "$SLAVE" up
  387. done
  388. VLAN_N_BRIDGE_VARIABLE="${D1Q_IFACE}_VLAN_N_BRIDGES"
  389. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}[@]"
  390. #CREATING NECESSARY BRIDGES AND VLANS
  391. for VLAN_N_BRIDGE in "${!VLAN_N_BRIDGE_VARIABLE}"; do
  392. ##
  393. #echo $VLAN_N_BRIDGE
  394. ##
  395. parse_vlan_subvlan_bridge "${VLAN_N_BRIDGE}"
  396. ##
  397. #echo BRNAME $BRNAME
  398. #echo VLANNAME $VLANNAME
  399. #echo VLAN $VLApN
  400. #echo SUBVLAN $SUBVLAN
  401. ##
  402. FULL_VLAN_NAME="$D1Q_IFACE"."$VLANNAME"
  403. ##
  404. #echo FULL_VLAN_NAME $FULL_VLAN_NAME
  405. ##
  406. #VLAN STUFF
  407. if [[ "$VLAN" != "" ]]; then
  408. if ! iface_isexists "$FULL_VLAN_NAME"; then #should we create a new vlan?
  409. #ip link show | grep -q "$FULL_VLAN_NAME"
  410. #if $?; then #should we create a new vlan?
  411. if [[ "$SUBVLAN" != "" ]]; then #is it subvlan?
  412. FULL_PARVLAN_NAME="$D1Q_IFACE"."$VLAN"
  413. ##
  414. #echo FULL_PARVLAN_NAME $FULL_PARVLAN_NAME
  415. #echo D1Q_IFACE $D1Q_IFACE
  416. ##
  417. if ! iface_isexists "$FULL_PARVLAN_NAME"; then #should we create a new parent vlan?
  418. #echo "ip link add link $D1Q_IFACE name $FULL_PARVLAN_NAME type vlan id $VLAN" #vlan in bond
  419. ip link add link "$D1Q_IFACE" name "$FULL_PARVLAN_NAME" type vlan id "$VLAN" #vlan in bond
  420. #echo "ip link set dev $FULL_PARVLAN_NAME up"
  421. ip link set dev "$FULL_PARVLAN_NAME" up
  422. fi
  423. #echo "ip link add link $FULL_PARVLAN_NAME name $FULL_VLAN_NAME type vlan id $SUBVLAN" #subvlan in vlan
  424. ip link add link "$FULL_PARVLAN_NAME" name "$FULL_VLAN_NAME" type vlan id "$SUBVLAN" #subvlan in vlan
  425. #echo "ip link set dev $FULL_VLAN_NAME up"
  426. ip link set dev "$FULL_VLAN_NAME" mtu 1496
  427. ip link set dev "$FULL_VLAN_NAME" up
  428. else
  429. #echo "ip link add link $D1Q_IFACE name $FULL_VLAN_NAME type vlan id $VLANNAME" #vlan in bond
  430. ip link add link "$D1Q_IFACE" name "$FULL_VLAN_NAME" type vlan id "$VLANNAME" #vlan in bond
  431. #echo "ip link set dev $FULL_VLAN_NAME up"
  432. ip link set dev "$FULL_VLAN_NAME" up
  433. fi
  434. fi
  435. ip addr flush dev "$FULL_VLAN_NAME"
  436. IP_CMDS_VARIABLE="vlan${VLANNAME//[.]/_}_IP"
  437. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}[@]"
  438. for IP_CMD in "${!IP_CMDS_VARIABLE}"; do
  439. ip $IP_CMD dev "$FULL_VLAN_NAME"
  440. done
  441. fi
  442. #BRIDGE STUFF
  443. ##
  444. #echo BRIDGE STUFF "$BRNAME"
  445. ##
  446. if [[ "$BRNAME" != "" ]]; then
  447. #if [[ "`brctl show | grep "$BRNAME"`" = "" ]]; then #do this bridge exists?
  448. if ! iface_isexists "$BRNAME"; then #do this bridge exists?
  449. #brctl addbr "$BRNAME"
  450. #echo "ip link add "$BRNAME" type bridge"
  451. ip link add "$BRNAME" type bridge
  452. fi
  453. if [[ "$VLAN" != "" ]]; then
  454. #OLD_BRNAME="`brctl show | grep "$FULL_VLANNAME" | awk '{print $1}'`"
  455. OLD_BRNAME="`get_brname_byslave "$FULL_VLAN_NAME"`"
  456. if [[ "$OLD_BRNAME" = "" ]]; then #is this vlan have been already enslaved?
  457. #brctl addif "$BRNAME" "$FULL_VLANNAME"
  458. #echo "ip link set "$FULL_VLAN_NAME" master "$BRNAME
  459. ip link set "$FULL_VLAN_NAME" master "$BRNAME"
  460. #echo "ip link set dev $BRNAME up"
  461. ip link set dev "$BRNAME" up
  462. else
  463. if [[ "$BRNAME" != "$OLD_BRNAME" ]]; then
  464. #brctl delif "$OLD_BRNAME" "FULL_VLANNAME"
  465. #echo "ip link set "$FULL_VLAN_NAME" nomaster"
  466. ip link set "$FULL_VLAN_NAME" nomaster
  467. #brctl addif "$BRNAME" "$FULL_VLANNAME"
  468. #echo "ip link set "$FULL_VLAN_NAME" master "$BRNAME
  469. ip link set "$FULL_VLAN_NAME" master "$BRNAME"
  470. #echo "ip link set dev $BRNAME up"
  471. ip link set dev "$BRNAME" up
  472. fi
  473. fi
  474. fi
  475. ip addr flush dev "$BRNAME"
  476. IP_CMDS_VARIABLE="${BRNAME//[.]/_}_IP"
  477. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}[@]"
  478. for IP_CMD in "${!IP_CMDS_VARIABLE}"; do
  479. [[ "$IP_CMD" != "" ]] &&
  480. ip $IP_CMD dev "$BRNAME"
  481. done
  482. fi
  483. done
  484. done
  485. # ADDING LXC IFACES TO BRIDGES IF REQUIRED
  486. # for LXCIF_N_BRIDGE in ${LXC_BRIDGE_SLAVES[@]}; do
  487. # parse_vlan_subvlan_bridge "$LINE"
  488. # brctl addif "$BRNAME" "$VLANNAME" 2>/dev/null
  489. # done
  490. ;;
  491. *)
  492. ;;
  493. esac
  494. newconfig_open
  495. newconfig_write "#"
  496. newconfig_write ""
  497. newconfig_write "D1Q_IFACES=("
  498. for D1Q_IFACE in ${D1Q_IFACES[@]}; do
  499. newconfig_write " $D1Q_IFACE"
  500. newconfig_push 128 "${D1Q_IFACE}_SLAVES=("
  501. haveaslave=0
  502. SLAVES_VARIABLE="${D1Q_IFACE}_SLAVES"
  503. SLAVES_VARIABLE="${SLAVES_VARIABLE//[.]/_}[@]"
  504. for SLAVE in "${!SLAVES_VARIABLE}"; do
  505. newconfig_push 128 " $SLAVE";
  506. haveaslave=1
  507. done
  508. newconfig_push 128 ")"
  509. # If there're no slaves then don't write anything about them
  510. [[ $haveaslave -ne 0 ]] && newconfig_pushpopall 1 128 || newconfig_popall 128
  511. VLAN_N_BRIDGE_VARIABLE="${D1Q_IFACE}_VLAN_N_BRIDGES"
  512. VLAN_N_BRIDGE_VARIABLE="${VLAN_N_BRIDGE_VARIABLE//[.]/_}[@]"
  513. newconfig_push 1 "${D1Q_IFACE}_VLAN_N_BRIGES=("
  514. for VLAN_N_BRIDGE in "${!VLAN_N_BRIDGE_VARIABLE}"; do
  515. newconfig_push 1 " ${VLAN_N_BRIDGE}"
  516. parse_vlan_subvlan_bridge "${VLAN_N_BRIDGE}"
  517. # Checking if no "vlan(.subvlan)?" is set
  518. if [[ "${BRNAME}" != "" ]]; then
  519. #echo $BRNAME
  520. # Getting commands for "ip"
  521. IP_CMDS_VARIABLE="${BRNAME//[.]/_}_IP"
  522. newconfig_push 128 "${IP_CMDS_VARIABLE}=("
  523. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}[@]"
  524. hasanIP_CMD=0
  525. for IP_CMD in "${!IP_CMDS_VARIABLE}"; do
  526. newconfig_push 128 " \"$IP_CMD\""
  527. #echo ip $IP_CMD dev $BRNAME
  528. hasanIP_CMD=1
  529. done
  530. newconfig_push 128 ")"
  531. newconfig_push 128 ""
  532. [[ $hasanIP_CMD -ne 0 ]] && newconfig_pushpopall 2 128 || newconfig_popall 128
  533. else
  534. # Getting commands for "ip"
  535. #echo OK
  536. IP_CMDS_VARIABLE="vlan${VLANNAME//[.]/_}_IP"
  537. newconfig_push 128 "${IP_CMDS_VARIABLE}=("
  538. IP_CMDS_VARIABLE="${IP_CMDS_VARIABLE}[@]"
  539. hasanIP_CMD=0
  540. for IP_CMD in "${!IP_CMDS_VARIABLE}"; do
  541. newconfig_push 128 " \"$IP_CMD\""
  542. #echo ip $IP_CMD dev $VLANNAME
  543. hasanIP_CMD=1
  544. done
  545. newconfig_push 128 ")"
  546. newconfig_push 128 ""
  547. [[ $hasanIP_CMD -ne 0 ]] && newconfig_pushpopall 2 128 || newconfig_popall 128
  548. fi
  549. printf "br: %-16s vlan:%5s subvlan:%5s\n" "$BRNAME" "$VLAN" "$SUBVLAN"
  550. done
  551. newconfig_push 1 ")"
  552. done
  553. newconfig_write ")"
  554. newconfig_popallwrite 1
  555. newconfig_popallwrite 2
  556. newconfig_popallwrite 3
  557. #[[ $NEWCONFIG -ne 0 ]] && newconfig_commit
  558. exit 0