Files
tello-commander/manage.sh
2023-05-19 02:28:14 +03:00

224 lines
6.3 KiB
Bash
Executable File

#!/bin/bash
######################
## SCRIPT INIT
######################
DRONE_INTERFACE=$(yq '.drone_interface' < settings/admin.yml)
DRONE_WPA_SUPP_CONF=$(yq '.drone_wpa_supp' < settings/admin.yml)
NET_INTERFACE=$(yq '.net_interface' < settings/admin.yml)
NET_WPA_SUPP_CONF=$(yq '.net_wpa_supp' < settings/admin.yml)
#ENV_FOR_DYNACONF=$(yq '.env_for_dynaconf' < settings/admin.yml)
pids_dir='./pids'
if [[ ! -d "$pids_dir" ]]; then
mkdir $pids_dir
fi
######################
## COMMAND FUNCTIONS
######################
list_related_network_interface_status() {
networkctl list
}
list_wifi_ssid(){
echo "using drone interface: $DRONE_INTERFACE"
sudo iw dev $DRONE_INTERFACE scan | grep "SSID: "
}
connect_using_wpa_supp() {
echo "########## log start: $(date) ##########"
sudo wpa_supplicant -D nl80211 -i $DRONE_INTERFACE -c network/$DRONE_WPA_SUPP_CONF
}
get_dhcp_ip () {
echo "########## log start: $(date) ##########"
while true;
do
sudo dhclient $DRONE_INTERFACE
ip_address=$(ip addr show wlan1 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
if [[ -n $ip_address ]]; then
echo "Drone assigned IP to commander: $ip_address"
echo "ok"
break
else
echo "Drone is not assigned an IP yet. Waiting.."
sleep 2
fi
done
}
start_jupyter() {
echo "########## log start: $(date) ##########"
venv/bin/python -m jupyter lab --ip='0.0.0.0' --NotebookApp.token='' --NotebookApp.password='' --no-browser --port=8888
}
start_codeserver(){
echo "########## log start: $(date) ##########"
packages/code-server/code-server-4.12.0-linux-amd64/bin/code-server --config /home/uad/misc/tello-commander/packages/code-server/config.yaml --disable-getting-started-override --disable-workspace-trust --disable-telemetry ./
}
start_commander_service() {
echo "########## log start: $(date) ##########"
venv/bin/python commander/service.py $1
}
start_webui_service() {
echo "########## log start: $(date) ##########"
commander_host=$1
ENV_FOR_DYNACONF=$commander_host venv/bin/python brain/service.py
}
talk_to_drone_via_cli() {
commander_host=$1
ENV_FOR_DYNACONF=$commander_host python brain/cli.py
}
kill_everything() {
for p in $pids_dir/*.txt; do echo "killing $p"; sudo pkill -15 $(cat "$p"); done
}
remote_shutdown() {
echo "shutting down drone commander rpi in 3 secs"
sleep 3
ssh uad@10.8.0.9 "sudo shutdown now"
}
######################
## NETWORK
######################
if [ "$1" == "list-network" ]; then
list_related_network_interface_status
elif [ "$1" == "list-wifis" ]; then
list_wifi_ssid #connect $2 $3
elif [ "$1" == "connect-drone" ]; then
connect_using_wpa_supp > logs/wpa_supp.log 2>&1 &
wpa_supp_pid=$!
echo "started wpa supplicant to connect drone network with PID $wpa_supp_pid"
echo $wpa_supp_pid > $pids_dir/wpa_supp_pid.txt
elif [ "$1" == "disconnect-drone" ]; then
wpa_supp_pid_file="$pids_dir/wpa_supp_pid.txt"
if [ -f "$wpa_supp_pid_file" ]; then
sudo pkill -15 -P $(cat $wpa_supp_pid_file)
echo "stopped drone connection via wpa_supp"
fi
elif [ "$1" == "get-dhcp" ]; then
get_dhcp_ip > logs/dhcp_ip.log 2>&1 &
dhcp_ip_pid=$!
echo "requested ip address from drone router with PID $dhcp_ip_pid"
echo $dhcp_ip_pid > $pids_dir/dhcp_ip_pid.txt
elif [ "$1" == "kill-dhcp" ]; then
dhcp_ip_pid_file="$pids_dir/dhcp_ip_pid.txt"
if [ -f "$dhcp_ip_pid_file" ]; then
sudo pkill -15 -P $(cat $dhcp_ip_pid_file)
echo "killed dhcp client"
fi
######################
## DEV
######################
elif [ "$1" == "start-jupyter" ]; then
start_jupyter > logs/jupyter.log 2>&1 &
jupyter_pid=$!
echo "started jupyter with PID $jupyter_pid"
echo $jupyter_pid > $pids_dir/jupyter_pid.txt
elif [ "$1" == "stop-jupyter" ]; then
jupyter_pid_file="$pids_dir/jupyter_pid.txt"
if [ -f "$jupyter_pid_file" ]; then
pkill -15 -P $(cat $jupyter_pid_file)
echo "stopped jupyter"
fi
elif [ "$1" == "start-cs" ]; then
start_codeserver > logs/codeserver.log 2>&1 &
codeserver_pid=$!
echo "started code server with PID $codeserver_pid"
echo $codeserver_pid > $pids_dir/codeserver_pid.txt
elif [ "$1" == "stop-cs" ]; then
codeserver_pid_file="$pids_dir/codeserver_pid.txt"
if [ -f "$codeserver_pid_file" ]; then
sudo pkill -15 -P $(cat $codeserver_pid_file)
sudo killport 8888
echo "stopped code server"
fi
elif [ "$1" == "turn-off" ]; then
kill_everything
remote_shutdown
######################
## DRONE
######################
elif [ "$1" == "start-commander" ]; then
start_commander_service $2 > logs/commander.log 2>&1 &
commander_pid=$!
echo "started commander with PID $commander_pid"
echo $commander_pid > $pids_dir/commander_pid.txt
elif [ "$1" == "stop-commander" ]; then
commander_pid_file="$pids_dir/commander_pid.txt"
if [ -f "$commander_pid_file" ]; then
sudo pkill -15 -P $(cat $commander_pid_file)
sudo killport 8889
echo "stopped commander"
fi
elif [ "$1" == "start-webui" ]; then
start_webui_service $2 > logs/webui.log 2>&1 &
webui_pid=$!
echo "started webui service with PID $webui_pid"
echo webui_pid > $pids_dir/webui_pid.txt
elif [ "$1" == "stop-webui" ]; then
webui_pid_file="$pids_dir/webui_pid.txt"
if [ -f "webui_pid_file" ]; then
sudo pkill -15 -P $(cat webui_pid_file)
sudo killport 8890
echo "stopped webui service"
fi
elif [ "$1" == "prepare-flight" ]; then
./manage.sh connect-drone
./manage.sh get-dhcp
./manage.sh start-commander
echo "prepared to flight"
elif [ "$1" == "finish-flight" ]; then
./manage.sh disconnect-drone
./manage.sh kill-dhcp
./manage.sh stop-commander
kill_everything
echo "flight finished"
elif [ "$1" == "start-clitalk" ]; then
talk_to_drone_via_cli $2
######################
## INFO
######################
else
echo "Invalid command. Please use one of:
- list-network
- list-wifis
- connect-/ disconnect-drone
- get-/ kill-dhcp
- start-/ stop-jupyter (8888)
- start-/ stop-cs (8888)
- start-/ stop-commander (8889)
- start-/ stop-webui [commander_host (tuncel / commander)] (8890)
- start-/ stop-clitalk [commander_host (tuncel / commander_remote / commander_local)]
- turn-off
- prepare-/ finish-flight"
fi