mann (7549B)
1 #!/bin/sh 2 3 # Zenflows is designed to implement the Valueflows vocabulary, 4 # written and maintained by srfsh <info@dyne.org>. 5 # Copyright (C) 2021-2023 Dyne.org foundation <foundation@dyne.org>. 6 # 7 # This program is free software: you can redistribute it and/or modify 8 # it under the terms of the GNU Affero General Public License as published by 9 # the Free Software Foundation, either version 3 of the License, or 10 # (at your option) any later version. 11 # 12 # This program is distributed in the hope that it will be useful, 13 # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 # GNU Affero General Public License for more details. 16 # 17 # You should have received a copy of the GNU Affero General Public License 18 # along with this program. If not, see <https://www.gnu.org/licenses/>. 19 20 set -e 21 22 progname=$(basename "$0") 23 24 export MIX_ENV="${MIX_ENV:-dev}" 25 26 main() { 27 while getopts xpdt opt 2>/dev/null; do 28 case $opt in 29 x) set -x ;; 30 p) export MIX_ENV=prod ;; 31 d) export MIX_ENV=dev ;; 32 t) export MIX_ENV=test ;; 33 \?) usage ;; 34 esac 35 done 36 shift "$((OPTIND-1))" 37 38 case $1 in 39 help) shift ; help "$@" ;; 40 mix) shift ; cmd_mix "$@" ;; 41 serve) shift ; cmd_serve "$@" ;; 42 clean) shift ; cmd_clean "$@" ;; 43 test) shift ; cmd_test "$@" ;; 44 cover) shift ; cmd_cover "$@" ;; 45 cover.clean) shift ; cmd_cover_clean "$@" ;; 46 env.setup) shift ; cmd_env_setup "$@" ;; 47 dep.setup) shift ; cmd_dep_setup "$@" ;; 48 dep.clean) shift ; cmd_dep_clean "$@" ;; 49 dep.copy) shift ; cmd_dep_copy "$@" ;; 50 db.setup) shift ; cmd_db_setup "$@" ;; 51 db.reset) shift ; cmd_db_reset "$@" ;; 52 db.create) shift ; cmd_db_create "$@" ;; 53 db.drop) shift ; cmd_db_drop "$@" ;; 54 db.migrate) shift ; cmd_db_migrate "$@" ;; 55 db.rollback) shift ; cmd_db_rollback "$@" ;; 56 db.remigrate) shift ; cmd_db_remigrate "$@" ;; 57 doc) shift ; cmd_doc "$@" ;; 58 doc.serve) shift ; cmd_doc_serve "$@" ;; 59 doc.clean) shift ; cmd_doc_clean "$@" ;; 60 devop.setup) shift ; cmd_devop_setup "$@" ;; 61 devop.serve) shift ; cmd_devop_serve "$@" ;; 62 devop.comp) shift ; cmd_devop_comp "$@" ;; 63 devop.build) shift ; cmd_devop_build "$@" ;; 64 devop.run) shift ; cmd_devop_run "$@" ;; 65 devop.exec) shift ; cmd_devop_exec "$@" ;; 66 devop.up) shift ; cmd_devop_up "$@" ;; 67 devop.down) shift ; cmd_devop_down "$@" ;; 68 devop.logs) shift ; cmd_devop_logs "$@" ;; 69 *) usage ;; 70 esac 71 } 72 73 die() { 74 printf '%s: %s\n' "$progname" "$*" >&2 75 exit 1 76 } 77 78 warn() { 79 printf '%s: %s\n' "$progname" "$*" >&2 80 } 81 82 usage() { 83 cat <<EOF >&2 84 usage: $progname [-x] [-p | -d | -t] cmd [args...] 85 86 quick overview: $progname help 87 EOF 88 exit 1 89 } 90 91 help() { 92 cat <<EOF 93 options: 94 -x Write a trace for each command. See sh(1) for details. 95 -p Set MIX_ENV=prod. 96 -d Set MIX_ENV=dev. 97 -t Set MIX_ENV=test. 98 99 commands: 100 help Print this text. 101 mix Run 'mix'. 102 serve Run the application using 'iex'. 103 clean Clean all unnecessary files. 104 test Run the tests using 'mix test'. 105 cover Run coverage on tests. 106 cover.clean Clean generated coverage files. 107 env.setup Setup configs. 108 dep.setup Setup dependencies. 109 dep.clean Clean dependencies. 110 dep.copy Copy deps to .deps. Should be used only by devs. 111 db.setup Create the database and run the migrations. 112 db.reset Drop the database, recrate and remigrate it. 113 db.create Create the database. 114 db.drop Drop the database. 115 db.migrate Run the migration scripts. 116 db.rollback Roll back migrations. 117 db.remigrate Unroll all the migrations and migrate them again. 118 doc Generate static docs. 119 doc.serve Serve the documantation with Erlang. 120 doc.clean Clean the generated docs. 121 devop.setup Generate the pre-filled docker-compose file. 122 devop.serve Build, setup, run everything, and attach to back-end shell. 123 devop.db.setup Create the database and run the migrations. 124 devop.comp Run 'docker-compose'. 125 devop.build Run 'docker-compose build. 126 devop.run Run 'docker-compose run'. 127 devop.exec Run 'docker-compose exec. 128 devop.up Run 'docker-compose up'. 129 devop.down Run 'docker-compose down'. 130 devop.logs Run 'docker-compose logs'. 131 EOF 132 } 133 134 setup() { 135 if ! test -e conf/env.sh ; then 136 warn "the file 'conf/env.sh' doesn't exist; running env.setup" 137 cmd_env_setup 138 fi 139 } 140 141 readenv() { 142 . conf/env.sh 143 } 144 145 # commands 146 cmd_mix() { 147 setup 148 readenv 149 mix "$@" 150 } 151 152 cmd_serve() { 153 setup 154 readenv 155 iex -S mix "$@" 156 } 157 158 cmd_clean() { 159 cmd_cover_clean 160 cmd_doc_clean 161 cmd_dep_clean 162 rm -rf _build 163 } 164 165 cmd_test() { 166 export MIX_ENV=test 167 cmd_mix test "$@" 168 } 169 170 cmd_cover() { 171 export MIX_ENV=test 172 cmd_mix test --cover "$@" 173 } 174 175 cmd_cover_clean() { 176 rm -rf cover 177 } 178 179 cmd_env_setup() { 180 if test -e conf/env.sh ; then 181 warn "the file 'conf/env.sh' already exists; skipping" 182 else 183 key=$(openssl rand -hex 64) 184 salt=$(openssl rand -hex 64) 185 sed 's,@ADMIN_KEY,'"$key"', ; s,@ROOM_SALT,'"$salt"',' conf/.env.templ >conf/env.sh 186 warn "the 'conf/env.sh' file is generated; please edit it to suit your needs" 187 fi 188 } 189 190 cmd_dep_setup() { 191 test -d deps || cp -rf .deps deps 192 } 193 194 cmd_dep_clean() { 195 rm -rf deps 196 } 197 198 cmd_dep_copy() { 199 ext=$(date +%Y%m%d%H%M%S) 200 mv .deps .deps."$ext" 201 cp -rf deps .deps 202 } 203 204 cmd_db_setup() { 205 cmd_db_create 206 cmd_db_migrate 207 } 208 209 cmd_db_reset() { 210 cmd_db_drop 211 cmd_db_setup 212 } 213 214 cmd_db_create() { 215 cmd_mix ecto.create "$@" 216 } 217 218 cmd_db_drop() { 219 cmd_mix ecto.drop "$@" 220 } 221 222 cmd_db_migrate() { 223 cmd_mix ecto.migrate "$@" 224 } 225 226 cmd_db_rollback() { 227 cmd_mix ecto.rollback "$@" 228 } 229 230 cmd_db_remigrate() { 231 cmd_db_rollback --all 232 cmd_db_migrate 233 } 234 235 cmd_doc() { 236 cmd_mix docs -f html 237 } 238 239 cmd_doc_serve() { 240 if ! test -e .docs/index.html ; then 241 warn "the docs hasn't been generated yet; running 'doc' to generate them" 242 cmd_doc 243 fi 244 245 erl -noshell -s inets -eval ' 246 {ok, _Pid} = inets:start(httpd, [ 247 {server_name, "zenflows document server"}, 248 {server_root, ".docs/"}, 249 {document_root, ".docs/"}, 250 {port, 8192}, 251 {directory_index, ["index.html"]}, 252 {mime_types, [ 253 {"html", "text/html"}, 254 {"js", "text/javascript"}, 255 {"css", "text/css"} 256 ]} 257 ]), 258 io:format("the docs are served at: http://localhost:8192/~nhit control-c twitce to exit~n"). 259 ' 260 } 261 262 cmd_doc_clean() { 263 rm -rf .docs 264 } 265 266 cmd_devop_setup() { 267 if test -e devop/docker-compose.yml ; then 268 warn "the file 'devop/docker-compose.yml' already exists; skipping" 269 else 270 admin_key=$(openssl rand -hex 64) 271 db_pass=$(openssl rand -hex 16) 272 room_salt=$(openssl rand -base64 64 | tr -d \\n) 273 sed 's,@ADMIN_KEY,'"$admin_key"', ; 274 s,@DB_PASS,'"$db_pass"', ; 275 s,@ROOM_SALT,'"$room_salt"',' devop/.docker-compose.templ >devop/docker-compose.yml 276 warn "the 'devop/docker-compose.yml' file is generated; please edit it to suit your needs" 277 fi 278 } 279 280 cmd_devop_serve() { 281 cmd_devop_comp run --service-ports --rm srv start_iex 282 } 283 284 cmd_devop_comp() { 285 cmd_devop_setup 286 docker-compose -p zenflows -f devop/docker-compose.yml "$@" 287 } 288 289 cmd_devop_build() { 290 cmd_devop_comp build "$@" 291 } 292 293 cmd_devop_run() { 294 cmd_devop_comp run "$@" 295 } 296 297 cmd_devop_exec() { 298 cmd_devop_comp exec "$@" 299 } 300 301 cmd_devop_up() { 302 cmd_devop_comp up "$@" 303 } 304 305 cmd_devop_down() { 306 cmd_devop_comp down "$@" 307 } 308 309 cmd_devop_logs() { 310 cmd_devop_comp logs "$@" 311 } 312 313 main "$@"