|
@@ -11,6 +11,14 @@ NC='\033[0m'
|
|
|
scriptLocation=$(dirname -- "$(readlink -fn -- "$0"; echo x)")
|
|
|
cd "${scriptLocation%x}" || exit
|
|
|
|
|
|
+if [[ -f .env ]]; then
|
|
|
+
|
|
|
+ source .env
|
|
|
+else
|
|
|
+ echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ exit 2
|
|
|
+fi
|
|
|
+
|
|
|
handleServices()
|
|
|
{
|
|
|
validServices=(backend frontend mongo redis)
|
|
@@ -49,17 +57,22 @@ dockerCommand()
|
|
|
else
|
|
|
servicesString=${servicesString:2}
|
|
|
fi
|
|
|
+ if [[ ${CONTAINER_MODE} == "dev" ]]; then
|
|
|
+ composeFiles="-f docker-compose.yml -f docker-compose.dev.yml"
|
|
|
+ else
|
|
|
+ composeFiles="-f docker-compose.yml"
|
|
|
+ fi
|
|
|
if [[ ${2} == "stop" || ${2} == "restart" ]]; then
|
|
|
|
|
|
- docker-compose stop ${servicesString}
|
|
|
+ docker-compose ${composeFiles} stop ${servicesString}
|
|
|
fi
|
|
|
if [[ ${2} == "start" || ${2} == "restart" ]]; then
|
|
|
|
|
|
- docker-compose up -d ${servicesString}
|
|
|
+ docker-compose ${composeFiles} up -d ${servicesString}
|
|
|
fi
|
|
|
if [[ ${2} == "pull" || ${2} == "build" || ${2} == "ps" ]]; then
|
|
|
|
|
|
- docker-compose "${2}" ${servicesString}
|
|
|
+ docker-compose ${composeFiles} "${2}" ${servicesString}
|
|
|
fi
|
|
|
else
|
|
|
echo -e "${RED}${servicesString:2}\n${YELLOW}Usage: ${1} restart [backend, frontend, mongo, redis]${NC}"
|
|
@@ -105,95 +118,83 @@ if [[ -x "$(command -v docker)" && -x "$(command -v docker-compose)" ]]; then
|
|
|
|
|
|
reset)
|
|
|
echo -e "${CYAN}Musare | Reset Services${NC}"
|
|
|
- if [[ -f .env ]]; then
|
|
|
-
|
|
|
- source .env
|
|
|
- servicesString=$(handleServices "${@:2}")
|
|
|
- if [[ ${servicesString:0:1} == 1 && ${servicesString:2:4} == "all" ]]; then
|
|
|
- echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} and ${MONGO_DATA_LOCATION} directories.${NC}"
|
|
|
- echo -e "${GREEN}Are you sure you want to reset all data? ${YELLOW}[y,n]: ${NC}"
|
|
|
- read -r confirm
|
|
|
- if [[ "${confirm}" == y* ]]; then
|
|
|
- docker-compose stop
|
|
|
- docker-compose rm -v --force
|
|
|
- if [[ -d $REDIS_DATA_LOCATION ]]; then
|
|
|
- rm -rf $REDIS_DATA_LOCATION
|
|
|
- fi
|
|
|
- if [[ -d $MONGO_DATA_LOCATION ]]; then
|
|
|
- rm -rf $MONGO_DATA_LOCATION
|
|
|
- fi
|
|
|
- else
|
|
|
- echo -e "${RED}Cancelled reset${NC}"
|
|
|
+ servicesString=$(handleServices "${@:2}")
|
|
|
+ if [[ ${servicesString:0:1} == 1 && ${servicesString:2:4} == "all" ]]; then
|
|
|
+ echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} and ${MONGO_DATA_LOCATION} directories.${NC}"
|
|
|
+ echo -e "${GREEN}Are you sure you want to reset all data? ${YELLOW}[y,n]: ${NC}"
|
|
|
+ read -r confirm
|
|
|
+ if [[ "${confirm}" == y* ]]; then
|
|
|
+ docker-compose stop
|
|
|
+ docker-compose rm -v --force
|
|
|
+ if [[ -d $REDIS_DATA_LOCATION ]]; then
|
|
|
+ rm -rf "${REDIS_DATA_LOCATION}"
|
|
|
fi
|
|
|
- elif [[ ${servicesString:0:1} == 1 ]]; then
|
|
|
- if [[ "${servicesString:2}" == *redis* && "${servicesString:2}" == *mongo* ]]; then
|
|
|
- echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} and ${MONGO_DATA_LOCATION} directories.${NC}"
|
|
|
- elif [[ "${servicesString:2}" == *redis* ]]; then
|
|
|
- echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} directory.${NC}"
|
|
|
- elif [[ "${servicesString:2}" == *mongo* ]]; then
|
|
|
- echo -e "${RED}Resetting will remove the ${MONGO_DATA_LOCATION} directory.${NC}"
|
|
|
+ if [[ -d $MONGO_DATA_LOCATION ]]; then
|
|
|
+ rm -rf "${MONGO_DATA_LOCATION}"
|
|
|
fi
|
|
|
- echo -e "${GREEN}Are you sure you want to reset all data for $(echo "${servicesString:2}" | tr ' ' ',')? ${YELLOW}[y,n]: ${NC}"
|
|
|
- read -r confirm
|
|
|
- if [[ "${confirm}" == y* ]]; then
|
|
|
-
|
|
|
- docker-compose stop ${servicesString:2}
|
|
|
-
|
|
|
- docker-compose rm -v --force ${servicesString:2}
|
|
|
- if [[ "${servicesString:2}" == *redis* && -d $REDIS_DATA_LOCATION ]]; then
|
|
|
- rm -rf $REDIS_DATA_LOCATION
|
|
|
- fi
|
|
|
- if [[ "${servicesString:2}" == *mongo* && -d $MONGO_DATA_LOCATION ]]; then
|
|
|
- rm -rf $MONGO_DATA_LOCATION
|
|
|
- fi
|
|
|
- else
|
|
|
- echo -e "${RED}Cancelled reset${NC}"
|
|
|
+ else
|
|
|
+ echo -e "${RED}Cancelled reset${NC}"
|
|
|
+ fi
|
|
|
+ elif [[ ${servicesString:0:1} == 1 ]]; then
|
|
|
+ if [[ "${servicesString:2}" == *redis* && "${servicesString:2}" == *mongo* ]]; then
|
|
|
+ echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} and ${MONGO_DATA_LOCATION} directories.${NC}"
|
|
|
+ elif [[ "${servicesString:2}" == *redis* ]]; then
|
|
|
+ echo -e "${RED}Resetting will remove the ${REDIS_DATA_LOCATION} directory.${NC}"
|
|
|
+ elif [[ "${servicesString:2}" == *mongo* ]]; then
|
|
|
+ echo -e "${RED}Resetting will remove the ${MONGO_DATA_LOCATION} directory.${NC}"
|
|
|
+ fi
|
|
|
+ echo -e "${GREEN}Are you sure you want to reset all data for $(echo "${servicesString:2}" | tr ' ' ',')? ${YELLOW}[y,n]: ${NC}"
|
|
|
+ read -r confirm
|
|
|
+ if [[ "${confirm}" == y* ]]; then
|
|
|
+
|
|
|
+ docker-compose stop ${servicesString:2}
|
|
|
+
|
|
|
+ docker-compose rm -v --force ${servicesString:2}
|
|
|
+ if [[ "${servicesString:2}" == *redis* && -d $REDIS_DATA_LOCATION ]]; then
|
|
|
+ rm -rf "${REDIS_DATA_LOCATION}"
|
|
|
+ fi
|
|
|
+ if [[ "${servicesString:2}" == *mongo* && -d $MONGO_DATA_LOCATION ]]; then
|
|
|
+ rm -rf "${MONGO_DATA_LOCATION}"
|
|
|
fi
|
|
|
else
|
|
|
- echo -e "${RED}${servicesString:2}\n${YELLOW}Usage: $(basename "$0") build [backend, frontend, mongo, redis]${NC}"
|
|
|
+ echo -e "${RED}Cancelled reset${NC}"
|
|
|
fi
|
|
|
else
|
|
|
- echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ echo -e "${RED}${servicesString:2}\n${YELLOW}Usage: $(basename "$0") build [backend, frontend, mongo, redis]${NC}"
|
|
|
fi
|
|
|
;;
|
|
|
|
|
|
attach)
|
|
|
echo -e "${CYAN}Musare | Attach${NC}"
|
|
|
- if [[ -f .env ]]; then
|
|
|
-
|
|
|
- source .env
|
|
|
- if [[ $2 == "backend" ]]; then
|
|
|
- containerId=$(docker-compose ps -q backend)
|
|
|
- if [[ -z $containerId ]]; then
|
|
|
- echo -e "${RED}Error: Backend offline, please start to attach.${NC}"
|
|
|
- else
|
|
|
- echo -e "${YELLOW}Detach with CTRL+P+Q${NC}"
|
|
|
- docker attach "$containerId"
|
|
|
- fi
|
|
|
- elif [[ $2 == "mongo" ]]; then
|
|
|
- MONGO_VERSION_INT=${MONGO_VERSION:0:1}
|
|
|
- if [[ -z $(docker-compose ps -q mongo) ]]; then
|
|
|
- echo -e "${RED}Error: Mongo offline, please start to attach.${NC}"
|
|
|
- else
|
|
|
- echo -e "${YELLOW}Detach with CTRL+D${NC}"
|
|
|
- if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
- docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry()" --shell
|
|
|
- else
|
|
|
- docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}"
|
|
|
- fi
|
|
|
- fi
|
|
|
- elif [[ $2 == "redis" ]]; then
|
|
|
- if [[ -z $(docker-compose ps -q redis) ]]; then
|
|
|
- echo -e "${RED}Error: Redis offline, please start to attach.${NC}"
|
|
|
+ if [[ $2 == "backend" ]]; then
|
|
|
+ containerId=$(docker-compose ps -q backend)
|
|
|
+ if [[ -z $containerId ]]; then
|
|
|
+ echo -e "${RED}Error: Backend offline, please start to attach.${NC}"
|
|
|
+ else
|
|
|
+ echo -e "${YELLOW}Detach with CTRL+P+Q${NC}"
|
|
|
+ docker attach "$containerId"
|
|
|
+ fi
|
|
|
+ elif [[ $2 == "mongo" ]]; then
|
|
|
+ MONGO_VERSION_INT=${MONGO_VERSION:0:1}
|
|
|
+ if [[ -z $(docker-compose ps -q mongo) ]]; then
|
|
|
+ echo -e "${RED}Error: Mongo offline, please start to attach.${NC}"
|
|
|
+ else
|
|
|
+ echo -e "${YELLOW}Detach with CTRL+D${NC}"
|
|
|
+ if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
+ docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry()" --shell
|
|
|
else
|
|
|
- echo -e "${YELLOW}Detach with CTRL+C${NC}"
|
|
|
- docker-compose exec redis redis-cli -a "${REDIS_PASSWORD}"
|
|
|
+ docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}"
|
|
|
fi
|
|
|
+ fi
|
|
|
+ elif [[ $2 == "redis" ]]; then
|
|
|
+ if [[ -z $(docker-compose ps -q redis) ]]; then
|
|
|
+ echo -e "${RED}Error: Redis offline, please start to attach.${NC}"
|
|
|
else
|
|
|
- echo -e "${RED}Invalid service $2\n${YELLOW}Usage: $(basename "$0") attach [backend,mongo,redis]${NC}"
|
|
|
+ echo -e "${YELLOW}Detach with CTRL+C${NC}"
|
|
|
+ docker-compose exec redis redis-cli -a "${REDIS_PASSWORD}"
|
|
|
fi
|
|
|
else
|
|
|
- echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ echo -e "${RED}Invalid service $2\n${YELLOW}Usage: $(basename "$0") attach [backend,mongo,redis]${NC}"
|
|
|
fi
|
|
|
;;
|
|
|
|
|
@@ -206,14 +207,14 @@ if [[ -x "$(command -v docker)" && -x "$(command -v docker-compose)" ]]; then
|
|
|
fi
|
|
|
case $2 in
|
|
|
frontend)
|
|
|
- docker-compose exec frontend npx eslint app/src --ext .js,.vue $fix
|
|
|
+ docker-compose exec frontend npx eslint src --ext .js,.vue $fix
|
|
|
;;
|
|
|
backend)
|
|
|
docker-compose exec backend npx eslint app/logic $fix
|
|
|
;;
|
|
|
""|fix|--fix)
|
|
|
- docker-compose exec frontend npx eslint app/src --ext .js,.vue $fix
|
|
|
- docker-compose exec backend npx eslint app/logic $fix
|
|
|
+ docker-compose exec frontend npx eslint src --ext .js,.vue $fix
|
|
|
+ docker-compose exec backend npx eslint logic $fix
|
|
|
;;
|
|
|
*)
|
|
|
echo -e "${RED}Invalid service $2\n${YELLOW}Usage: $(basename "$0") eslint [backend, frontend] [fix]${NC}"
|
|
@@ -259,98 +260,80 @@ if [[ -x "$(command -v docker)" && -x "$(command -v docker-compose)" ]]; then
|
|
|
|
|
|
backup)
|
|
|
echo -e "${CYAN}Musare | Backup${NC}"
|
|
|
- if [[ -f .env ]]; then
|
|
|
-
|
|
|
- source .env
|
|
|
- if [[ -z "${BACKUP_LOCATION}" ]]; then
|
|
|
- backupLocation="${scriptLocation%x}/backups"
|
|
|
- else
|
|
|
- backupLocation="${BACKUP_LOCATION%/}"
|
|
|
- fi
|
|
|
- if [[ ! -d "${backupLocation}" ]]; then
|
|
|
- echo -e "${YELLOW}Creating backup directory at ${backupLocation}${NC}"
|
|
|
- mkdir "${backupLocation}"
|
|
|
- fi
|
|
|
- if [[ -z "${BACKUP_NAME}" ]]; then
|
|
|
- backupLocation="${backupLocation}/musare-$(date +"%Y-%m-%d-%s").dump"
|
|
|
- else
|
|
|
- backupLocation="${backupLocation}/${BACKUP_NAME}"
|
|
|
- fi
|
|
|
- echo -e "${YELLOW}Creating backup at ${backupLocation}${NC}"
|
|
|
- docker-compose exec -T mongo sh -c "mongodump --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} -d musare --archive" > "${backupLocation}"
|
|
|
+ if [[ -z "${BACKUP_LOCATION}" ]]; then
|
|
|
+ backupLocation="${scriptLocation%x}/backups"
|
|
|
+ else
|
|
|
+ backupLocation="${BACKUP_LOCATION%/}"
|
|
|
+ fi
|
|
|
+ if [[ ! -d "${backupLocation}" ]]; then
|
|
|
+ echo -e "${YELLOW}Creating backup directory at ${backupLocation}${NC}"
|
|
|
+ mkdir "${backupLocation}"
|
|
|
+ fi
|
|
|
+ if [[ -z "${BACKUP_NAME}" ]]; then
|
|
|
+ backupLocation="${backupLocation}/musare-$(date +"%Y-%m-%d-%s").dump"
|
|
|
else
|
|
|
- echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ backupLocation="${backupLocation}/${BACKUP_NAME}"
|
|
|
fi
|
|
|
+ echo -e "${YELLOW}Creating backup at ${backupLocation}${NC}"
|
|
|
+ docker-compose exec -T mongo sh -c "mongodump --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} -d musare --archive" > "${backupLocation}"
|
|
|
;;
|
|
|
|
|
|
restore)
|
|
|
echo -e "${CYAN}Musare | Restore${NC}"
|
|
|
- if [[ -f .env ]]; then
|
|
|
-
|
|
|
- source .env
|
|
|
- if [[ -z $2 ]]; then
|
|
|
- echo -e "${GREEN}Please enter the full path of the dump you wish to restore: ${NC}"
|
|
|
- read -r restoreFile
|
|
|
- else
|
|
|
- restoreFile=$2
|
|
|
- fi
|
|
|
- if [[ -z ${restoreFile} ]]; then
|
|
|
- echo -e "${RED}Error: no restore path given, cancelled restoration.${NC}"
|
|
|
- elif [[ -d ${restoreFile} ]]; then
|
|
|
- echo -e "${RED}Error: restore path given is a directory, cancelled restoration.${NC}"
|
|
|
- elif [[ ! -f ${restoreFile} ]]; then
|
|
|
- echo -e "${RED}Error: no file at restore path given, cancelled restoration.${NC}"
|
|
|
- else
|
|
|
- docker-compose exec -T mongo sh -c "mongorestore --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} --archive" < "${restoreFile}"
|
|
|
- fi
|
|
|
+ if [[ -z $2 ]]; then
|
|
|
+ echo -e "${GREEN}Please enter the full path of the dump you wish to restore: ${NC}"
|
|
|
+ read -r restoreFile
|
|
|
+ else
|
|
|
+ restoreFile=$2
|
|
|
+ fi
|
|
|
+ if [[ -z ${restoreFile} ]]; then
|
|
|
+ echo -e "${RED}Error: no restore path given, cancelled restoration.${NC}"
|
|
|
+ elif [[ -d ${restoreFile} ]]; then
|
|
|
+ echo -e "${RED}Error: restore path given is a directory, cancelled restoration.${NC}"
|
|
|
+ elif [[ ! -f ${restoreFile} ]]; then
|
|
|
+ echo -e "${RED}Error: no file at restore path given, cancelled restoration.${NC}"
|
|
|
else
|
|
|
- echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ docker-compose exec -T mongo sh -c "mongorestore --authenticationDatabase musare -u ${MONGO_USER_USERNAME} -p ${MONGO_USER_PASSWORD} --archive" < "${restoreFile}"
|
|
|
fi
|
|
|
;;
|
|
|
|
|
|
admin)
|
|
|
echo -e "${CYAN}Musare | Add Admin${NC}"
|
|
|
- if [[ -f .env ]]; then
|
|
|
-
|
|
|
- source .env
|
|
|
- MONGO_VERSION_INT=${MONGO_VERSION:0:1}
|
|
|
- if [[ $2 == "add" ]]; then
|
|
|
- if [[ -z $3 ]]; then
|
|
|
- echo -e "${GREEN}Please enter the username of the user you wish to make an admin: ${NC}"
|
|
|
- read -r adminUser
|
|
|
- else
|
|
|
- adminUser=$3
|
|
|
- fi
|
|
|
- if [[ -z $adminUser ]]; then
|
|
|
- echo -e "${RED}Error: Username for new admin not provided.${NC}"
|
|
|
- else
|
|
|
- if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
- docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry(); db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'admin'}})"
|
|
|
- else
|
|
|
- docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'admin'}})"
|
|
|
- fi
|
|
|
- fi
|
|
|
- elif [[ $2 == "remove" ]]; then
|
|
|
- if [[ -z $3 ]]; then
|
|
|
- echo -e "${GREEN}Please enter the username of the user you wish to remove as admin: ${NC}"
|
|
|
- read -r adminUser
|
|
|
+ MONGO_VERSION_INT=${MONGO_VERSION:0:1}
|
|
|
+ if [[ $2 == "add" ]]; then
|
|
|
+ if [[ -z $3 ]]; then
|
|
|
+ echo -e "${GREEN}Please enter the username of the user you wish to make an admin: ${NC}"
|
|
|
+ read -r adminUser
|
|
|
+ else
|
|
|
+ adminUser=$3
|
|
|
+ fi
|
|
|
+ if [[ -z $adminUser ]]; then
|
|
|
+ echo -e "${RED}Error: Username for new admin not provided.${NC}"
|
|
|
+ else
|
|
|
+ if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
+ docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry(); db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'admin'}})"
|
|
|
else
|
|
|
- adminUser=$3
|
|
|
+ docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'admin'}})"
|
|
|
fi
|
|
|
- if [[ -z $adminUser ]]; then
|
|
|
- echo -e "${RED}Error: Username for new admin not provided.${NC}"
|
|
|
+ fi
|
|
|
+ elif [[ $2 == "remove" ]]; then
|
|
|
+ if [[ -z $3 ]]; then
|
|
|
+ echo -e "${GREEN}Please enter the username of the user you wish to remove as admin: ${NC}"
|
|
|
+ read -r adminUser
|
|
|
+ else
|
|
|
+ adminUser=$3
|
|
|
+ fi
|
|
|
+ if [[ -z $adminUser ]]; then
|
|
|
+ echo -e "${RED}Error: Username for new admin not provided.${NC}"
|
|
|
+ else
|
|
|
+ if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
+ docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry(); db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'default'}})"
|
|
|
else
|
|
|
- if [[ $MONGO_VERSION_INT -ge 5 ]]; then
|
|
|
- docker-compose exec mongo mongosh musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "disableTelemetry(); db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'default'}})"
|
|
|
- else
|
|
|
- docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'default'}})"
|
|
|
- fi
|
|
|
+ docker-compose exec mongo mongo musare -u "${MONGO_USER_USERNAME}" -p "${MONGO_USER_PASSWORD}" --eval "db.users.updateOne({username: '${adminUser}'}, {\$set: {role: 'default'}})"
|
|
|
fi
|
|
|
- else
|
|
|
- echo -e "${RED}Invalid command $2\n${YELLOW}Usage: $(basename "$0") admin [add,remove] username${NC}"
|
|
|
fi
|
|
|
else
|
|
|
- echo -e "${RED}Error: .env does not exist${NC}"
|
|
|
+ echo -e "${RED}Invalid command $2\n${YELLOW}Usage: $(basename "$0") admin [add,remove] username${NC}"
|
|
|
fi
|
|
|
;;
|
|
|
|