diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..a5d14d340 --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +use flake +dotenv_if_exists .develop.env diff --git a/.gitignore b/.gitignore index cb73be599..225eeb4dc 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,6 @@ tunnel.log /sessions /changelog.json /.current-version -/.current-changelog.md \ No newline at end of file +/.current-changelog.md +**/.direnv +.develop.env \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..b486ac53f --- /dev/null +++ b/flake.lock @@ -0,0 +1,44 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1619345332, + "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", + "type": "github" + }, + "original": { + "owner": "numtide", + "ref": "master", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1620323686, + "narHash": "sha256-+gfcE3YTGl+Osc8HzOUXSFO8/0PAK4J8ZxCXZ4hjXHI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "dfacb8329b2236688b9a1e705116203a213b283a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..b19677831 --- /dev/null +++ b/flake.nix @@ -0,0 +1,27 @@ +{ + inputs = { + nixpkgs = { + type = "github"; + owner = "NixOS"; + repo = "nixpkgs"; + ref = "master"; + }; + flake-utils = { + type = "github"; + owner = "numtide"; + repo = "flake-utils"; + ref = "master"; + }; + }; + + outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem + (system: + let pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in { + devShell = import ./shell.nix { inherit pkgs; }; + } + ); +} diff --git a/shell.nix b/shell.nix index de09bff73..8ff87a860 100644 --- a/shell.nix +++ b/shell.nix @@ -1,12 +1,8 @@ -{ nixpkgs ? import ./nixpkgs.nix {} }: +{ pkgs ? (import ./nixpkgs.nix {}).pkgs }: let - inherit (nixpkgs {}) pkgs; - # haskellPackages = import ./stackage.nix { inherit nixpkgs; }; haskellPackages = pkgs.haskellPackages; - drv = haskellPackages.callPackage ./uniworx.nix {}; - postgresSchema = pkgs.writeText "schema.sql" '' CREATE USER uniworx WITH SUPERUSER; CREATE DATABASE uniworx_test; @@ -19,129 +15,144 @@ let local all all trust ''; - override = oldAttrs: { - nativeBuildInputs = oldAttrs.nativeBuildInputs ++ (with pkgs; [ nodejs-14_x postgresql_12 openldap google-chrome exiftool memcached minio minio-client ]) ++ (with pkgs.haskellPackages; [ stack yesod-bin hlint cabal-install weeder profiteur ]); - shellHook = '' - export PROMPT_INFO="${oldAttrs.name}" + develop = pkgs.writeScriptBin "develop" '' + #!${pkgs.zsh}/bin/zsh - export PORT_OFFSET=$(((16#$(whoami | sha256sum | head -c 16)) % 1000)) + cleanup() { + set +e -x + type cleanup_postgres &>/dev/null && cleanup_postgres + type cleanup_widget_memcached &>/dev/null && cleanup_widget_memcached + type cleanup_session_memcached &>/dev/null && cleanup_session_memcached + type cleanup_cache_memcached &>/dev/null && cleanup_cache_memcached + type cleanup_minio &>/dev/null && cleanup_minio - cleanup() { - set +e -x - type cleanup_postgres &>/dev/null && cleanup_postgres - type cleanup_widget_memcached &>/dev/null && cleanup_widget_memcached - type cleanup_session_memcached &>/dev/null && cleanup_session_memcached - type cleanup_cache_memcached &>/dev/null && cleanup_cache_memcached - type cleanup_minio &>/dev/null && cleanup_minio - set +x + [ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env" + set +x + } + + trap cleanup EXIT + + basePath=$(pwd) + + echo "" > ''${basePath}/.develop.env + + PORT_OFFSET=$(((16#$(whoami | sha256sum | head -c 16)) % 1000)) + echo "PORT_OFFSET=''${PORT_OFFSET}" >> ''${basePath}/.develop.env + + if [[ -z "$PGHOST" ]]; then + set -xe + + pgDir=$(mktemp -d) + pgSockDir=$(mktemp -d) + pgLogFile=$(mktemp) + initdb --no-locale -D ''${pgDir} + pg_ctl start -D ''${pgDir} -l ''${pgLogFile} -w -o "-k ''${pgSockDir} -c listen_addresses=''' -c hba_file='${postgresHba}' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c auto_explain.log_min_duration=100ms" + psql -h ''${pgSockDir} -f ${postgresSchema} postgres + printf "Postgres logfile is %s\nPostgres socket directory is %s\n" ''${pgLogFile} ''${pgSockDir} + + cleanup_postgres() { + set +e -x + pg_ctl stop -D ''${pgDir} + rm -rvf ''${pgDir} ''${pgSockDir} ''${pgLogFile} + set +x } - trap cleanup EXIT + set +xe + fi - if [[ -z "$PGHOST" ]]; then - set -xe + echo "PGHOST=''${pgSockDir}" >> ''${basePath}/.develop.env + echo "PGLOG=''${pgLogFile}" >> ''${basePath}/.develop.env - pgDir=$(mktemp -d) - pgSockDir=$(mktemp -d) - pgLogFile=$(mktemp) - initdb --no-locale -D ''${pgDir} - pg_ctl start -D ''${pgDir} -l ''${pgLogFile} -w -o "-k ''${pgSockDir} -c listen_addresses=''' -c hba_file='${postgresHba}' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c auto_explain.log_min_duration=100ms" - export PGHOST=''${pgSockDir} PGLOG=''${pgLogFile} - psql -f ${postgresSchema} postgres - printf "Postgres logfile is %s\nPostgres socket directory is %s\n" ''${pgLogFile} ''${pgSockDir} + if [[ -z "$WIDGET_MEMCACHED_HOST" ]]; then + set -xe - cleanup_postgres() { - set +e -x - pg_ctl stop -D ''${pgDir} - rm -rvf ''${pgDir} ''${pgSockDir} ''${pgLogFile} - set +x - } + memcached -l localhost -p $(($PORT_OFFSET + 11211)) &>/dev/null & + widget_memcached_pid=$! - set +xe - fi + cleanup_widget_memcached() { + [[ -n "$widget_memcached_pid" ]] && kill $widget_memcached_pid + } - if [[ -z "$WIDGET_MEMCACHED_HOST" ]]; then - set -xe + set +xe + fi - memcached -l localhost -p $(($PORT_OFFSET + 11211)) &>/dev/null & - widget_memcached_pid=$? + echo "WIDGET_MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env + echo "WIDGET_MEMCACHED_PORT=$(($PORT_OFFSET + 11211))" >> ''${basePath}/.develop.env - cleanup_widget_memcached() { - [[ -n "$widget_memcached_pid" ]] && kill $widget_memcached_pid - } + echo "PGLOG=''${PGLOG}" >> ''${basePath}/.develop.env - export WIDGET_MEMCACHED_HOST=localhost WIDGET_MEMCACHED_PORT=$(($PORT_OFFSET + 11211)) + if [[ -z "$SESSION_MEMCACHED_HOST" ]]; then + set -xe - set +xe - fi + memcached -l localhost -p $(($PORT_OFFSET + 11212)) &>/dev/null & + session_memcached_pid=$! - if [[ -z "$SESSION_MEMCACHED_HOST" ]]; then - set -xe + cleanup_session_memcached() { + [[ -n "$session_memcached_pid" ]] && kill $session_memcached_pid + } - memcached -l localhost -p $(($PORT_OFFSET + 11212)) &>/dev/null & - session_memcached_pid=$? + set +xe + fi - cleanup_session_memcached() { - [[ -n "$session_memcached_pid" ]] && kill $session_memcached_pid - } + echo "SESSION_MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env + echo "SESSION_MEMCACHED_PORT=$(($PORT_OFFSET + 11212))" >> ''${basePath}/.develop.env - export SESSION_MEMCACHED_HOST=localhost SESSION_MEMCACHED_PORT=$(($PORT_OFFSET + 11212)) + if [[ -z "$MEMCACHED_HOST" ]]; then + set -xe - set +xe - fi + memcached -l localhost -p $(($PORT_OFFSET + 11213)) &>/dev/null & + memcached_pid=$! - if [[ -z "$MEMCACHED_HOST" ]]; then - set -xe + cleanup_session_memcached() { + [[ -n "$memcached_pid" ]] && kill $memcached_pid + } - memcached -l localhost -p $(($PORT_OFFSET + 11213)) &>/dev/null & - memcached_pid=$? + set +xe + fi - cleanup_session_memcached() { - [[ -n "$memcached_pid" ]] && kill $memcached_pid - } + echo "MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env + echo "MEMCACHED_PORT=$(($PORT_OFFSET + 11212))" >> ''${basePath}/.develop.env - export MEMCACHED_HOST=localhost MEMCACHED_PORT=$(($PORT_OFFSET + 11212)) + if [[ -z "$UPLOAD_S3_HOST" ]]; then + set -xe - set +xe - fi + cleanup_minio() { + [[ -n "$minio_pid" ]] && kill $minio_pid + [[ -n "$minio_dir" ]] && rm -rvf ''${minio_dir} + [[ -n "MINIO_LOGFILE" ]] && rm -rvf ''${MINIO_LOGFILE} + } - if [[ -z "$UPLOAD_S3_HOST" ]]; then - set -xe + MINIO_DIR=$(mktemp -d) + MINIO_LOGFILE=$(mktemp --tmpdir minio.XXXXXX.log) + MINIO_ACCESS_KEY=$(${pkgs.pwgen}/bin/pwgen -s 16 1) + MINIO_SECRET_KEY=$(${pkgs.pwgen}/bin/pwgen -s 32 1) - cleanup_minio() { - [[ -n "$minio_pid" ]] && kill $minio_pid - [[ -n "$minio_dir" ]] && rm -rvf ''${minio_dir} - [[ -n "MINIO_LOGFILE" ]] && rm -rvf ''${MINIO_LOGFILE} - } + minio server --address localhost:$(($PORT_OFFSET + 9000)) ''${MINIO_DIR} &>''${MINIO_LOGFILE} & + minio_pid=$! - export MINIO_DIR=$(mktemp -d) - export MINIO_LOGFILE=$(mktemp --tmpdir minio.XXXXXX.log) - export MINIO_ACCESS_KEY=$(${pkgs.pwgen}/bin/pwgen -s 16 1) - export MINIO_SECRET_KEY=$(${pkgs.pwgen}/bin/pwgen -s 32 1) + sleep 1 - minio server --address localhost:$(($PORT_OFFSET + 9000)) ''${MINIO_DIR} &>''${MINIO_LOGFILE} & - minio_pid=$? + set +xe + fi - sleep 1 + echo "MINIO_DIR=''${MINIO_DIR}" >> ''${basePath}/.develop.env + echo "MINIO_LOGFILE=''${MINIO_LOGFILE}" >> ''${basePath}/.develop.env + echo "UPLOAD_S3_HOST=localhost" >> ''${basePath}/.develop.env + echo "UPLOAD_S3_PORT=$(($PORT_OFFSET + 9000))" >> ''${basePath}/.develop.env + echo "UPLOAD_S3_SSL=false" >> ''${basePath}/.develop.env + echo "UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}" >> ''${basePath}/.develop.env + echo "UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}" >> ''${basePath}/.develop.env - export UPLOAD_S3_HOST=localhost UPLOAD_S3_PORT=$(($PORT_OFFSET + 9000)) UPLOAD_S3_SSL=false UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY} UPLOAD_S3_KEY=''${MINIO_SECRET_KEY} + if [ -n "$ZSH_VERSION" ]; then + autoload -U +X compinit && compinit + autoload -U +X bashcompinit && bashcompinit + fi + eval "$(stack --bash-completion-script stack)" - set +xe - fi - - if [ -n "$ZSH_VERSION" ]; then - autoload -U +X compinit && compinit - autoload -U +X bashcompinit && bashcompinit - fi - eval "$(stack --bash-completion-script stack)" - - ${oldAttrs.shellHook} - ''; - }; - - dummy = pkgs.stdenv.mkDerivation { - name = "interactive-uniworx-environment"; - shellHook = ""; - }; -in pkgs.stdenv.lib.overrideDerivation dummy override - #pkgs.stdenv.lib.overrideDerivation drv.env override + $(getent passwd $USER | cut -d: -f 7) + ''; +in pkgs.mkShell { + name = "uni2work"; + + nativeBuildInputs = [develop] ++ (with pkgs; [ nodejs-14_x postgresql_12 openldap google-chrome exiftool memcached minio minio-client ]) ++ (with pkgs.haskellPackages; [ stack yesod-bin hlint cabal-install weeder profiteur ]); +}