musare.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #!/bin/bash
  2. CYAN='\033[33;36m';
  3. RED='\033[0;31m'
  4. YELLOW='\033[0;93m'
  5. GREEN='\033[0;32m'
  6. NC='\033[0m'
  7. scriptLocation="$(dirname -- $(readlink -fn -- "$0"; echo x))"
  8. cd "${scriptLocation%x}"
  9. handleServices()
  10. {
  11. validServices=(backend frontend mongo redis)
  12. services=()
  13. invalidServices=false
  14. for x in $@; do
  15. if [[ ${validServices[@]} =~ (^|[[:space:]])"$x"($|[[:space:]]) ]]; then
  16. if ! [[ ${services[@]} =~ (^|[[:space:]])"$x"($|[[:space:]]) ]]; then
  17. services+=("${x}")
  18. fi
  19. else
  20. if [[ $invalidServices == false ]]; then
  21. invalidServices="${x}"
  22. else
  23. invalidServices="${invalidServices} ${x}"
  24. fi
  25. fi
  26. done
  27. if [[ $invalidServices == false && ${#services[@]} > 0 ]]; then
  28. echo "1|${services[@]}"
  29. elif [[ $invalidServices == false ]]; then
  30. echo "1|all"
  31. else
  32. echo "0|Invalid Service(s): ${invalidServices}"
  33. fi
  34. }
  35. if [[ -x "$(command -v docker)" && -x "$(command -v docker-compose)" ]]; then
  36. case $1 in
  37. start)
  38. echo -e "${CYAN}Musare | Start Services${NC}"
  39. services=$(handleServices "${@:2}")
  40. if [[ ${services:0:1} == 1 && ${services:2:4} == "all" ]]; then
  41. docker-compose up -d
  42. elif [[ ${services:0:1} == 1 ]]; then
  43. docker-compose up -d ${services:2}
  44. else
  45. echo -e "${RED}${services:2}\n${YELLOW}Usage: $(basename $0) start [backend, frontend, mongo, redis]${NC}"
  46. fi
  47. ;;
  48. stop)
  49. echo -e "${CYAN}Musare | Stop Services${NC}"
  50. services=$(handleServices "${@:2}")
  51. if [[ ${services:0:1} == 1 && ${services:2:4} == "all" ]]; then
  52. docker-compose stop
  53. elif [[ ${services:0:1} == 1 ]]; then
  54. docker-compose stop ${services:2}
  55. else
  56. echo -e "${RED}${services:2}\n${YELLOW}Usage: $(basename $0) stop [backend, frontend, mongo, redis]${NC}"
  57. fi
  58. ;;
  59. restart)
  60. echo -e "${CYAN}Musare | Restart Services${NC}"
  61. services=$(handleServices "${@:2}")
  62. if [[ ${services:0:1} == 1 && ${services:2:4} == "all" ]]; then
  63. docker-compose restart
  64. elif [[ ${services:0:1} == 1 ]]; then
  65. docker-compose restart ${services:2}
  66. else
  67. echo -e "${RED}${services:2}\n${YELLOW}Usage: $(basename $0) restart [backend, frontend, mongo, redis]${NC}"
  68. fi
  69. ;;
  70. build)
  71. echo -e "${CYAN}Musare | Build Services${NC}"
  72. services=$(handleServices "${@:2}")
  73. if [[ ${services:0:1} == 1 && ${services:2:4} == "all" ]]; then
  74. docker-compose build
  75. elif [[ ${services:0:1} == 1 ]]; then
  76. docker-compose build ${services:2}
  77. else
  78. echo -e "${RED}${services:2}\n${YELLOW}Usage: $(basename $0) build [backend, frontend, mongo, redis]${NC}"
  79. fi
  80. ;;
  81. reset)
  82. echo -e "${CYAN}Musare | Reset Services${NC}"
  83. services=$(handleServices "${@:2}")
  84. if [[ ${services:0:1} == 1 && ${services:2:4} == "all" ]]; then
  85. echo -e "${GREEN}Are you sure you want to reset all data? ${YELLOW}[y,n]: ${NC}"
  86. read confirm
  87. if [[ "${confirm}" == y* ]]; then
  88. docker-compose stop
  89. docker-compose rm -v --force
  90. if [[ -d ".redis" ]]; then
  91. rm -rf .redis
  92. fi
  93. if [[ -d ".db" ]]; then
  94. rm -rf .db
  95. fi
  96. else
  97. echo -e "${RED}Cancelled reset${NC}"
  98. fi
  99. elif [[ ${services:0:1} == 1 ]]; then
  100. echo -e "${GREEN}Are you sure you want to reset all data for $(echo ${services:2} | tr ' ' ',')? ${YELLOW}[y,n]: ${NC}"
  101. read confirm
  102. if [[ "${confirm}" == y* ]]; then
  103. docker-compose stop ${services:2}
  104. docker-compose rm -v --force ${services:2}
  105. if [[ "${services:2}" == *redis* && -d ".redis" ]]; then
  106. rm -rf .redis
  107. fi
  108. if [[ "${services:2}" == *mongo* && -d ".db" ]]; then
  109. rm -rf .db
  110. fi
  111. else
  112. echo -e "${RED}Cancelled reset${NC}"
  113. fi
  114. else
  115. echo -e "${RED}${services:2}\n${YELLOW}Usage: $(basename $0) build [backend, frontend, mongo, redis]${NC}"
  116. fi
  117. ;;
  118. attach)
  119. echo -e "${CYAN}Musare | Attach${NC}"
  120. if [[ $2 == "backend" ]]; then
  121. containerId=$(docker-compose ps -q backend)
  122. if [[ -z $containerId ]]; then
  123. echo -e "${RED}Error: Backend offline, please start to attach.${NC}"
  124. else
  125. docker attach $containerId
  126. fi
  127. else
  128. echo -e "${RED}Invalid service $2\n${YELLOW}Usage: $(basename $0) attach backend${NC}"
  129. fi
  130. ;;
  131. eslint)
  132. echo -e "${CYAN}Musare | ESLint${NC}"
  133. fix=""
  134. if [[ $2 == "fix" || $3 == "fix" || $2 == "--fix" || $3 == "--fix" ]]; then
  135. fix="--fix"
  136. echo -e "${GREEN}Auto-fix enabled${NC}"
  137. fi
  138. case $2 in
  139. frontend)
  140. docker-compose exec frontend npx eslint app/src --ext .js,.vue $fix
  141. ;;
  142. backend)
  143. docker-compose exec backend npx eslint app/logic $fix
  144. ;;
  145. ""|fix|--fix)
  146. docker-compose exec frontend npx eslint app/src --ext .js,.vue $fix
  147. docker-compose exec backend npx eslint app/logic $fix
  148. ;;
  149. *)
  150. echo -e "${RED}Invalid service $2\n${YELLOW}Usage: $(basename $0) eslint [backend, frontend] [fix]${NC}"
  151. ;;
  152. esac
  153. ;;
  154. update)
  155. echo -e "${CYAN}Musare | Update${NC}"
  156. git fetch
  157. if [[ $(git rev-parse HEAD) == $(git rev-parse @{u}) ]]; then
  158. echo -e "${GREEN}Already up to date${NC}"
  159. else
  160. git pull
  161. docker-compose build
  162. docker-compose up -d
  163. fi
  164. ;;
  165. logs)
  166. echo -e "${CYAN}Musare | Logs${NC}"
  167. docker-compose logs ${@:2}
  168. ;;
  169. backup)
  170. echo -e "${CYAN}Musare | Backup${NC}"
  171. if [[ -f .env ]]; then
  172. source .env
  173. echo -e "${YELLOW}Creating backup at ${PWD}/musare-$(date +"%Y-%m-%d-%s").dump${NC}"
  174. docker-compose exec -T mongo sh -c "mongodump --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} -d musare --archive" > musare-$(date +"%Y-%m-%d-%s").dump
  175. else
  176. echo -e "${RED}Error: .env does not exist${NC}"
  177. fi
  178. ;;
  179. restore)
  180. echo -e "${CYAN}Musare | Restore${NC}"
  181. if [[ -f .env ]]; then
  182. source .env
  183. if [[ -z $2 ]]; then
  184. echo -e "${GREEN}Please enter the full path of the dump you wish to restore: ${NC}"
  185. read restoreFile
  186. else
  187. restoreFile=$2
  188. fi
  189. if [[ -z ${restoreFile} ]]; then
  190. echo -e "${RED}Error: no restore path given, cancelled restoration.${NC}"
  191. elif [[ -d ${restoreFile} ]]; then
  192. echo -e "${RED}Error: restore path given is a directory, cancelled restoration.${NC}"
  193. elif [[ ! -f ${restoreFile} ]]; then
  194. echo -e "${RED}Error: no file at restore path given, cancelled restoration.${NC}"
  195. else
  196. docker-compose exec -T mongo sh -c "mongorestore --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} --archive" < ${restoreFile}
  197. fi
  198. else
  199. echo -e "${RED}Error: .env does not exist${NC}"
  200. fi
  201. ;;
  202. admin)
  203. echo -e "${CYAN}Musare | Add Admin${NC}"
  204. if [[ -f .env ]]; then
  205. source .env
  206. if [[ $2 == "add" ]]; then
  207. if [[ -z $3 ]]; then
  208. echo -e "${GREEN}Please enter the username of the user you wish to make an admin: ${NC}"
  209. read adminUser
  210. else
  211. adminUser=$3
  212. fi
  213. if [[ -z $adminUser ]]; then
  214. echo -e "${RED}Error: Username for new admin not provided.${NC}"
  215. else
  216. docker-compose exec mongo mongo musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} --eval "db.users.update({username: '${adminUser}'}, {\$set: {role: 'admin'}})"
  217. fi
  218. elif [[ $2 == "remove" ]]; then
  219. if [[ -z $3 ]]; then
  220. echo -e "${GREEN}Please enter the username of the user you wish to remove as admin: ${NC}"
  221. read adminUser
  222. else
  223. adminUser=$3
  224. fi
  225. if [[ -z $adminUser ]]; then
  226. echo -e "${RED}Error: Username for new admin not provided.${NC}"
  227. else
  228. docker-compose exec mongo mongo musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} --eval "db.users.update({username: '${adminUser}'}, {\$set: {role: 'default'}})"
  229. fi
  230. else
  231. echo -e "${RED}Invalid command $2\n${YELLOW}Usage: $(basename $0) admin [add,remove] username${NC}"
  232. fi
  233. else
  234. echo -e "${RED}Error: .env does not exist${NC}"
  235. fi
  236. ;;
  237. "")
  238. echo -e "${CYAN}Musare | Available Commands${NC}"
  239. echo -e "${YELLOW}start - Start services${NC}"
  240. echo -e "${YELLOW}stop - Stop services${NC}"
  241. echo -e "${YELLOW}restart - Restart services${NC}"
  242. echo -e "${YELLOW}logs - View logs for services${NC}"
  243. echo -e "${YELLOW}update - Update Musare${NC}"
  244. echo -e "${YELLOW}attach backend - Attach to backend service${NC}"
  245. echo -e "${YELLOW}build - Build services${NC}"
  246. echo -e "${YELLOW}eslint - Run eslint on frontend and/or backend${NC}"
  247. echo -e "${YELLOW}backup - Backup database data to file${NC}"
  248. echo -e "${YELLOW}restore - Restore database data from backup file${NC}"
  249. echo -e "${YELLOW}reset - Reset service data${NC}"
  250. echo -e "${YELLOW}admin [add,remove] - Assign/unassign admin role to/from a user${NC}"
  251. ;;
  252. *)
  253. echo -e "${CYAN}Musare${NC}"
  254. echo -e "${RED}Error: Invalid Command $1${NC}"
  255. echo -e "${CYAN}Available Commands:${NC}"
  256. echo -e "${YELLOW}start - Start services${NC}"
  257. echo -e "${YELLOW}stop - Stop services${NC}"
  258. echo -e "${YELLOW}restart - Restart services${NC}"
  259. echo -e "${YELLOW}logs - View logs for services${NC}"
  260. echo -e "${YELLOW}update - Update Musare${NC}"
  261. echo -e "${YELLOW}attach backend - Attach to backend service${NC}"
  262. echo -e "${YELLOW}build - Build services${NC}"
  263. echo -e "${YELLOW}eslint - Run eslint on frontend and/or backend${NC}"
  264. echo -e "${YELLOW}backup - Backup database data to file${NC}"
  265. echo -e "${YELLOW}restore - Restore database data from backup file${NC}"
  266. echo -e "${YELLOW}reset - Reset service data${NC}"
  267. echo -e "${YELLOW}admin [add,remove] - Assign/unassign admin role to/from a user${NC}"
  268. ;;
  269. esac
  270. elif [[ -x "$(command -v docker)" && ! -x "$(command -v docker-compose)" ]]; then
  271. echo -e "${RED}Error: docker-compose not installed.${NC}"
  272. elif [[ ! -x "$(command -v docker)" && -x "$(command -v docker-compose)" ]]; then
  273. echo -e "${RED}Error: docker not installed.${NC}"
  274. else
  275. echo -e "${RED}Error: docker and docker-compose not installed.${NC}"
  276. fi