zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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 "$@"