-
Notifications
You must be signed in to change notification settings - Fork 0
/
nmcli-cli-ipv4-copy
executable file
·129 lines (106 loc) · 3.17 KB
/
nmcli-cli-ipv4-copy
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
#!/bin/bash
#
# nmcli-cli-ipv4-copy
#
# Copyright (c) 2019 Jun Futagawa (jfut)
#
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
ECHO_OR_EXECUTE="echo"
echo_or_execute() {
if [[ -z "${ECHO_OR_EXECUTE}" ]]; then
echo "Applying: ${@}"
eval ${@}
else
${ECHO_OR_EXECUTE} ${@}
fi
}
usage() {
cat << _EOF_
Usage:
$0 [-n] [-x] SRC_IF_NAME DEST_IF_NAME
Options:
-n No interface check (Default: check interface)
-x Run command (Default: echo only)
Examples:
$0 eno1 bond1
$0 bond1 br1
$0 eno1 (show current configuration)
_EOF_
}
check() {
local SRC_IF_NAME=${1:-}
local DEST_IF_NAME=${2:-${SRC_IF_NAME}}
# Check interface: src
nmcli connection show "${SRC_IF_NAME}" > /dev/null 2>&1
RET=$?
if [[ ${RET} -ne 0 ]]; then
echo "Error: Source interface "${SRC_IF_NAME}" not found."
exit 1
fi
# Check interface: dest
nmcli connection show "${DEST_IF_NAME}" > /dev/null 2>&1
RET=$?
if [[ ${RET} -ne 0 ]]; then
echo "Error: Destination interface "${DEST_IF_NAME}" not found."
exit 1
fi
}
ipv4_copy() {
local SRC_IF_NAME=${1:-}
local DEST_IF_NAME=${2:-${SRC_IF_NAME}}
# IP + Method
SRC_IP_SUBNET=$(nmcli connection show "${SRC_IF_NAME}" | grep "^ipv4.addresses:" | awk '{ print $2 }' | tr -d '-')
SRC_METHOD=$(nmcli connection show "${SRC_IF_NAME}" | grep "^ipv4.method:" | awk '{ print $2 }' | tr -d '-')
echo_or_execute nmcli connection modify \"${DEST_IF_NAME}\" ipv4.addresses \"${SRC_IP_SUBNET}\" ipv4.method "${SRC_METHOD}"
# Gateway
SRC_GATEWAY=$(nmcli connection show "${SRC_IF_NAME}" | grep "^ipv4.gateway:" | awk '{ print $2 }' | tr -d '-')
echo_or_execute nmcli connection modify \"${DEST_IF_NAME}\" ipv4.gateway \"${SRC_GATEWAY}\"
# DNS
SRC_DNS=$(nmcli connection show "${SRC_IF_NAME}" | grep "^ipv4.dns:" | awk '{ print $2 }' | tr -d '-')
echo_or_execute nmcli connection modify \"${DEST_IF_NAME}\" ipv4.dns \"${SRC_DNS}\"
cat << _EOF_
# Next steps:
# -> Change IP address
# nmcli-cli-ipv4 "$DEST_IF_NAME{}" ...
# -> Restart the interface:
# nmcli-cli-restart "${DEST_IF_NAME}"
#
# -> Create a bond interface:
# nmcli-cli-bond-add bond1 mode=... "${DEST_IF_NAME}" "ens2f0"
# -> Create a vlan interface:
# nmcli-cli-vlan-add "${DEST_IF_NAME}.100" 100 "${DEST_IF_NAME}"
# -> Create a bridge interface:
# nmcli-cli-bridge-add br1 "${DEST_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 1 ]] && usage && exit 1
if [[ "${NO_CHECK}" = "no" ]]; then
check "${@}"
fi
if [[ "${ECHO_OR_EXECUTE}" = "echo" ]]; then
echo "# ${ECHO_OR_EXECUTE} only."
fi
ipv4_copy "${@}"
}
[[ ${#BASH_SOURCE[@]} = 1 ]] && main "${@}"