forked from NationTech/harmony
233 lines
4.5 KiB
Plaintext
Executable File
233 lines
4.5 KiB
Plaintext
Executable File
|
|
#! /bin/bash
|
|
# todo: allow wan to switch from ethernet to wifi
|
|
|
|
|
|
harmony-ve-network()(
|
|
|
|
set -eu
|
|
|
|
[ "${1:-}" != "-d" ] || { set -x ; shift ; }
|
|
trap '[ "$?" = "0" ] || >&2 echo ABNORMAL TERMINATION' EXIT
|
|
|
|
SCRIPTS_DIR=$(readlink -f "$(dirname "${BASH_SOURCE}")")
|
|
. "${SCRIPTS_DIR}/common"
|
|
. "${SCRIPTS_DIR}/default-env-var"
|
|
|
|
_short_help(){
|
|
|
|
cat <<-EOM
|
|
|
|
NAME
|
|
|
|
harmony-ve-network
|
|
|
|
DESCRIPTION
|
|
|
|
Modify localhost network for Harmony Virtual Execution Environment
|
|
SYNOPSYS
|
|
|
|
harmony-ve-network [GLOBAL_OPTIONS] COMMAND [OPTIONS]
|
|
|
|
harmony-ve-network check
|
|
harmony-ve-network setup
|
|
harmony-ve-network cleanup
|
|
|
|
EOM
|
|
|
|
}
|
|
|
|
_extra_help(){
|
|
|
|
cat <<-EOM
|
|
|
|
GLOBAL_OPTIONS
|
|
|
|
-d Debug mode.
|
|
|
|
WARNINGS
|
|
|
|
This script is experimetal. Use with caution.
|
|
|
|
|
|
IMPLEMENTATION NOTES
|
|
|
|
- use the network manager present to add 2 bridges (wan + lan)
|
|
|
|
|
|
EOM
|
|
|
|
}
|
|
|
|
# dependency management
|
|
|
|
_is_service_used(){
|
|
service=$1
|
|
sudo systemctl list-unit-files $service || return 1
|
|
sudo systemctl status --no-pager $service || return 1
|
|
}
|
|
|
|
|
|
|
|
# Implement functions
|
|
|
|
_list_bridges(){
|
|
|
|
ip -o link show type bridge | awk '{print $2}' | sed 's/://g'
|
|
}
|
|
|
|
_is_a_bridge(){
|
|
bridge=$1
|
|
matched=$(_list_bridges | grep "$bridge")
|
|
[ "$matched" = "$bridge" ] || return 1
|
|
}
|
|
|
|
_bridge_is_up(){
|
|
_fatal Not implemented
|
|
}
|
|
|
|
_rename_nmcli_profile(){
|
|
device=$1
|
|
profile=$(nmcli -t -f DEVICE,UUID c show --active | grep "^$device:" | cut -d':' -f2)
|
|
[ "$profile" != "" ] || _fatal Failed to find nmcli profile
|
|
|
|
sudo nmcli con mod "$profile" con-name "$device"
|
|
|
|
}
|
|
|
|
_create_a_bridge_using_networkmanager(){
|
|
bridge=$1
|
|
|
|
profile=$(nmcli -t -f DEVICE,UUID c show --active | grep "^$PRIMARY_INTERFACE:" | cut -d':' -f2)
|
|
|
|
nmcli conn delete "$profile"
|
|
|
|
nmcli conn add type bridge ifname $bridge con-name $bridge || _fatal Fail to create a bridge using nmcli
|
|
|
|
|
|
nmcli con add type bridge-slave ifname $PRIMARY_INTERFACE master $bridge || _fatal Fail to create a slave-interface using nmcli
|
|
|
|
nmcli con up $bridge || _fatal Fail to set interface up using nmcli
|
|
|
|
sudo systemctl restart NetworkManager.service
|
|
# todo: use a check loop until connection with a timeout
|
|
#sleep 10
|
|
#ping nationtech.io | _fatal Internet connection lost
|
|
|
|
}
|
|
|
|
_delete_a_bridge_using_networkmanager(){
|
|
device=$1
|
|
|
|
nmcli conn delete bridge-slave-$PRIMARY_INTERFACE
|
|
nmcli conn delete $device
|
|
|
|
nmcli con add type ethernet ifname $PRIMARY_INTERFACE con-name $PRIMARY_INTERFACE autoconnect yes ipv4.method auto ipv6.method ignore
|
|
|
|
nmcli conn up "$PRIMARY_INTERFACE"
|
|
sudo systemctl restart NetworkManager.service
|
|
|
|
# todo: use a check loop until connection with a timeout
|
|
#sleep 10
|
|
#ping nationtech.io | _fatal Internet connection lost
|
|
|
|
}
|
|
|
|
|
|
|
|
_create_a_bridge(){
|
|
|
|
bridge=$1
|
|
|
|
[ $USE_NETWORKMANAGER = 0 ] | _fatal "Only NetworkManager is implemented"
|
|
|
|
_create_a_bridge_using_networkmanager $bridge
|
|
|
|
}
|
|
|
|
_setup_a_bridge(){
|
|
|
|
$bridge
|
|
|
|
bridge_exist=1
|
|
bridge_is_up=1
|
|
bridge_has_ip=1
|
|
bridge_has_route=1
|
|
bridge_is_working=1
|
|
|
|
_is_a_bridge $bridge && bridge_exists=0 || _create_a_bridge $bridge || _fatal Fail to create a bridge
|
|
|
|
|
|
}
|
|
|
|
_get_networkmanager_profile_from_device(){
|
|
|
|
device=$1
|
|
|
|
profile=$(nmcli -t -f DEVICE,NAME c show --active | grep "^$device:" | cut -d':' -f2)
|
|
|
|
[ "$profile" != "" ] || _fatal Fail to retreive nmcli profile
|
|
|
|
echo "$profile"
|
|
|
|
}
|
|
|
|
_find_primary_interface(){
|
|
PRIMARY_INTERFACE=$(ip route | grep '^default' | sed 's/ dev /!/g' | cut -d'!' -f 2 | awk '{ print $1 }' )
|
|
[ "$PRIMARY_INTERFACE" != "" ] || _fatal Fail to find the primary interface
|
|
}
|
|
|
|
_find_used_network_manager(){
|
|
|
|
_is_service_used NetworkManager.service && USE_NETWORKMANAGER=0 || USE_NETWORKMANAGER=1
|
|
_is_service_used systemd-networkd.service && USE_SYSTEMD_NETWORKD=0 || USE_SYSTEMD_NETWORKD=1
|
|
_is_service_used dhcpd.service && USE_DHCPD=0 || USE_DHCPD=1
|
|
|
|
USE_MANUAL=0 && [ $USE_NETWORKMANAGER = 0 ] || [ $USE_SYSTEMD_NETWORKD = 0 ] || [ $USE_DHCPD = 0 ] || USE_MANUAL=0
|
|
|
|
}
|
|
|
|
_connect(){
|
|
|
|
_find_used_network_manager
|
|
_find_primary_interface
|
|
|
|
_setup_a_bridge $_HVE_WAN_BRIDGE
|
|
_setup_a_bridge $_HVE_LAN_BRIDGE
|
|
}
|
|
|
|
|
|
|
|
|
|
case "${1:-}" in
|
|
|
|
"")
|
|
_short_help
|
|
;;
|
|
-h|--help)
|
|
_short_help
|
|
_extra_help
|
|
;;
|
|
connect)
|
|
_connect "${@:2}"
|
|
;;
|
|
disconnect)
|
|
_disconnect "${@:2}"
|
|
;;
|
|
|
|
dev)
|
|
|
|
"${@:2}"
|
|
;;
|
|
*)
|
|
_warn "Unknown COMMAND '$1'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
)
|
|
|
|
|
|
[ "$0" != "${BASH_SOURCE}" ] || harmony-ve-network "${@}"
|
|
|