-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnmcli-cli-bond-add
More file actions
executable file
·150 lines (126 loc) · 3.42 KB
/
Copy pathnmcli-cli-bond-add
File metadata and controls
executable file
·150 lines (126 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/bin/bash
#
# nmcli-cli-bond-add
#
# Copyright (c) 2019-2026 Jun Futagawa (jfut)
#
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
VERSION="1.2.1"
ECHO_OR_EXECUTE="echo"
print_command() {
# Print the nmcli command in a reusable shell-quoted form.
printf '%q' "$1"
shift
printf ' %q' "$@"
printf '\n'
}
echo_or_execute() {
local RET
if [[ -z "${ECHO_OR_EXECUTE}" ]]; then
printf 'Applying: '
print_command "$@"
"$@"
RET=$?
if [[ ${RET} -ne 0 ]]; then
echo "Error: command failed (${RET})." >&2
exit "${RET}"
fi
else
print_command "$@"
fi
}
usage() {
local COMMAND_NAME
COMMAND_NAME="$(basename "${0}")"
cat << _EOF_
${COMMAND_NAME} ${VERSION}
Usage:
${COMMAND_NAME} [-n] [-x] NEW_BOND_IF_NAME BOND_OPTIONS IF_SLAVE1 IF_SLAVE2 [IF_SLAVE3...]
Options:
-n No interface check (Default: check interface)
-x Run command (Default: echo only)
Examples:
${COMMAND_NAME} bond1 mode=active-backup eno1 ens2f0
${COMMAND_NAME} bond1 mode=802.3ad,miimon=100,updelay=500,xmit_hash_policy=layer2+3 eno1 eno3 ens2f0
_EOF_
}
check() {
local BOND_IF_NAME=${1:-}
# Check new bond interface
nmcli connection show "${BOND_IF_NAME}" > /dev/null 2>&1
RET=$?
if [[ ${RET} -eq 0 ]]; then
echo "Error: Target bond interface \"${BOND_IF_NAME}\" already exists."
exit 1
fi
# Check slave interfaces
shift 2
for IF_SLAVE in "${@}"; do
nmcli connection show "${IF_SLAVE}" > /dev/null 2>&1
RET=$?
if [[ ${RET} -ne 0 ]]; then
echo "Error: Slave interface \"${IF_SLAVE}\" not found."
exit 1
fi
done
}
bond_add() {
local BOND_IF_NAME=${1:-}
local BOND_OPTIONS=${2:-}
# Bonding
echo_or_execute nmcli connection add type bond \
bond.options "${BOND_OPTIONS}" \
autoconnect yes ipv4.method disabled ipv6.method ignore \
con-name "${BOND_IF_NAME}" ifname "${BOND_IF_NAME}"
# Add slave interfaces
shift 2
for IF_SLAVE in "${@}"; do
echo_or_execute nmcli connection modify "${IF_SLAVE}" connection.autoconnect no
echo_or_execute nmcli connection add type bond-slave autoconnect yes ifname "${IF_SLAVE}" master "${BOND_IF_NAME}"
done
cat << _EOF_
# Next steps:
# -> Check bond status
# cat /proc/net/bonding/${BOND_IF_NAME}
#
# -> Set IP address
# nmcli-cli-ipv4 "${BOND_IF_NAME}" ...
# nmcli-cli-ipv6 "${BOND_IF_NAME}" ...
#
# -> Create a vlan interface:
# nmcli-cli-vlan-add "${BOND_IF_NAME}.100" 100 "${BOND_IF_NAME}"
# -> Create a bridge interface:
# nmcli-cli-bridge-add br1 "${BOND_IF_NAME}"
_EOF_
}
# Main
main() {
local NO_CHECK="no"
while getopts nxh OPT; do
case "${OPT}" in
"n" )
NO_CHECK="yes" ;;
"x" )
ECHO_OR_EXECUTE="" ;;
"h" )
usage
exit 0
;;
* )
usage
exit 1
;;
esac
done
shift $((OPTIND - 1))
[[ $# -lt 4 ]] && usage && exit 1
if [[ "${NO_CHECK}" = "no" ]]; then
check "${@}"
fi
if [[ "${ECHO_OR_EXECUTE}" = "echo" ]]; then
echo "# ${ECHO_OR_EXECUTE} only."
fi
bond_add "${@}"
}
[[ "${BASH_SOURCE[0]}" == "$0" ]] && main "$@"