dw 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #!/bin/bash
  2. #
  3. # Dune Weaver CLI
  4. #
  5. # Usage: dw <command>
  6. #
  7. # Commands:
  8. # install Run initial setup (Docker + WiFi fix)
  9. # start Start Dune Weaver
  10. # stop Stop Dune Weaver
  11. # restart Restart Dune Weaver
  12. # update Pull latest changes and restart
  13. # logs View live logs (Ctrl+C to exit)
  14. # status Show container status
  15. # shell Open a shell in the container
  16. # help Show this help message
  17. #
  18. set -e
  19. # Colors
  20. RED='\033[0;31m'
  21. GREEN='\033[0;32m'
  22. YELLOW='\033[1;33m'
  23. BLUE='\033[0;34m'
  24. NC='\033[0m'
  25. # Find dune-weaver directory
  26. find_install_dir() {
  27. # Check common locations
  28. if [[ -f "$HOME/dune-weaver/main.py" ]]; then
  29. echo "$HOME/dune-weaver"
  30. elif [[ -f "/home/pi/dune-weaver/main.py" ]]; then
  31. echo "/home/pi/dune-weaver"
  32. elif [[ -f "./main.py" ]]; then
  33. pwd
  34. else
  35. echo ""
  36. fi
  37. }
  38. # Check if using Docker or systemd
  39. is_docker_mode() {
  40. # Docker mode if docker-compose.yml exists and docker is available
  41. [[ -f "$INSTALL_DIR/docker-compose.yml" ]] && command -v docker &> /dev/null
  42. }
  43. INSTALL_DIR=$(find_install_dir)
  44. # Check if installed
  45. check_installed() {
  46. if [[ -z "$INSTALL_DIR" ]]; then
  47. echo -e "${RED}Error: Dune Weaver not found${NC}"
  48. echo ""
  49. echo "Please install first:"
  50. echo " git clone https://github.com/tuanchris/dune-weaver --single-branch"
  51. echo " cd dune-weaver"
  52. echo " dw install"
  53. exit 1
  54. fi
  55. }
  56. # Commands
  57. cmd_install() {
  58. if [[ -z "$INSTALL_DIR" ]]; then
  59. # Not installed, check if we're in the right directory
  60. if [[ -f "./docker-compose.yml" ]] && [[ -f "./main.py" ]]; then
  61. INSTALL_DIR=$(pwd)
  62. else
  63. echo -e "${RED}Error: Run this from the dune-weaver directory${NC}"
  64. echo ""
  65. echo " git clone https://github.com/tuanchris/dune-weaver --single-branch"
  66. echo " cd dune-weaver"
  67. echo " dw install"
  68. exit 1
  69. fi
  70. fi
  71. cd "$INSTALL_DIR"
  72. bash setup-pi.sh "$@"
  73. }
  74. cmd_start() {
  75. check_installed
  76. echo -e "${BLUE}Starting Dune Weaver...${NC}"
  77. cd "$INSTALL_DIR"
  78. if is_docker_mode; then
  79. sudo docker compose up -d
  80. else
  81. sudo systemctl start dune-weaver
  82. fi
  83. echo -e "${GREEN}Started!${NC} Access at http://$(hostname -I | awk '{print $1}'):8080"
  84. }
  85. cmd_stop() {
  86. check_installed
  87. echo -e "${BLUE}Stopping Dune Weaver...${NC}"
  88. cd "$INSTALL_DIR"
  89. if is_docker_mode; then
  90. sudo docker compose down
  91. else
  92. sudo systemctl stop dune-weaver
  93. fi
  94. echo -e "${GREEN}Stopped${NC}"
  95. }
  96. cmd_restart() {
  97. check_installed
  98. echo -e "${BLUE}Restarting Dune Weaver...${NC}"
  99. cd "$INSTALL_DIR"
  100. if is_docker_mode; then
  101. sudo docker compose restart
  102. else
  103. sudo systemctl restart dune-weaver
  104. fi
  105. echo -e "${GREEN}Restarted${NC}"
  106. }
  107. cmd_update() {
  108. check_installed
  109. echo -e "${BLUE}Updating Dune Weaver...${NC}"
  110. cd "$INSTALL_DIR"
  111. echo "Pulling latest code..."
  112. git pull
  113. if is_docker_mode; then
  114. echo "Pulling latest Docker image..."
  115. sudo docker compose pull
  116. echo "Restarting with new version..."
  117. sudo docker compose up -d
  118. else
  119. echo "Updating Python dependencies..."
  120. source .venv/bin/activate
  121. pip install -r requirements.txt
  122. echo "Restarting service..."
  123. sudo systemctl restart dune-weaver
  124. fi
  125. echo -e "${GREEN}Updated!${NC}"
  126. }
  127. cmd_logs() {
  128. check_installed
  129. cd "$INSTALL_DIR"
  130. # Parse optional line count (e.g., dw logs 100)
  131. local lines="${1:-}"
  132. local follow="-f"
  133. if [[ -n "$lines" ]]; then
  134. follow="--tail $lines"
  135. fi
  136. if is_docker_mode; then
  137. sudo docker compose logs $follow
  138. else
  139. if [[ -n "$lines" ]]; then
  140. sudo journalctl -u dune-weaver -n "$lines"
  141. else
  142. sudo journalctl -u dune-weaver -f
  143. fi
  144. fi
  145. }
  146. cmd_status() {
  147. check_installed
  148. cd "$INSTALL_DIR"
  149. if is_docker_mode; then
  150. sudo docker compose ps
  151. else
  152. sudo systemctl status dune-weaver
  153. fi
  154. }
  155. cmd_shell() {
  156. check_installed
  157. cd "$INSTALL_DIR"
  158. if is_docker_mode; then
  159. sudo docker compose exec dune-weaver /bin/bash
  160. else
  161. echo -e "${YELLOW}Shell not available in systemd mode${NC}"
  162. echo "Use: cd $INSTALL_DIR && source .venv/bin/activate"
  163. fi
  164. }
  165. cmd_help() {
  166. echo -e "${GREEN}Dune Weaver CLI${NC}"
  167. echo ""
  168. echo "Usage: dw <command>"
  169. echo ""
  170. echo "Commands:"
  171. echo " install Run initial setup (Docker + WiFi fix)"
  172. echo " start Start Dune Weaver"
  173. echo " stop Stop Dune Weaver"
  174. echo " restart Restart Dune Weaver"
  175. echo " update Pull latest changes and restart"
  176. echo " logs [N] View logs (N=number of lines, or follow if omitted)"
  177. echo " status Show container status"
  178. echo " shell Open a shell in the container"
  179. echo " help Show this help message"
  180. echo ""
  181. if [[ -n "$INSTALL_DIR" ]]; then
  182. echo -e "Install directory: ${BLUE}$INSTALL_DIR${NC}"
  183. fi
  184. }
  185. # Main
  186. case "${1:-help}" in
  187. install)
  188. shift
  189. cmd_install "$@"
  190. ;;
  191. start)
  192. cmd_start
  193. ;;
  194. stop)
  195. cmd_stop
  196. ;;
  197. restart)
  198. cmd_restart
  199. ;;
  200. update)
  201. cmd_update
  202. ;;
  203. logs)
  204. cmd_logs "$2"
  205. ;;
  206. status)
  207. cmd_status
  208. ;;
  209. shell)
  210. cmd_shell
  211. ;;
  212. help|--help|-h)
  213. cmd_help
  214. ;;
  215. *)
  216. echo -e "${RED}Unknown command: $1${NC}"
  217. echo ""
  218. cmd_help
  219. exit 1
  220. ;;
  221. esac