#!/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 $DRONE_INTERFACE | 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 killport 8889 sudo pkill -15 -P $(cat $commander_pid_file) 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 killport 8890 sudo pkill -15 -P $(cat $webui_pid_file) echo "stopped webui service" fi elif [ "$1" == "prepare-flight" ]; then echo "########## log start: $(date) ##########" ./manage.sh connect-drone ./manage.sh get-dhcp ./manage.sh start-commander ./manage.sh start-webui commander_local echo "prepared to flight" elif [ "$1" == "finish-flight" ]; then echo "########## log start: $(date) ##########" ./manage.sh disconnect-drone ./manage.sh kill-dhcp ./manage.sh stop-commander ./manage.sh start-webui 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_remote / commander_local)] (8890) - start-/ stop-clitalk [commander_host (tuncel / commander_remote / commander_local)] - turn-off - prepare-/ finish-flight" fi