Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F2845565
D4750.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Referenced Files
None
Subscribers
None
D4750.diff
View Options
diff --git a/nix/dev-shell.nix b/nix/dev-shell.nix
--- a/nix/dev-shell.nix
+++ b/nix/dev-shell.nix
@@ -19,6 +19,7 @@
, grpc
, libiconv
, libuv
+, mariadb
, nodejs-16_x
, olm
, openjdk8
@@ -42,6 +43,7 @@
shellcheck
# node development
+ mariadb
nodejs-16_x
yarn
watchman # react native
@@ -92,7 +94,7 @@
# shell commands to be ran upon entering shell
shellHook = let
- socket = "mysql-socket/mysql.sock";
+ socket = "mysql.sock";
in ''
if [[ "$OSTYPE" == 'linux'* ]]; then
export MYSQL_UNIX_PORT=''${XDG_RUNTIME_DIR:-/run/user/$UID}/${socket}
@@ -102,6 +104,8 @@
if [[ "$OSTYPE" == 'darwin'* ]]; then
# Many commands for cocoapods expect the native BSD versions of commands
export PATH=/usr/bin:$PATH
+ MARIADB_DIR=''${XDG_DATA_HOME:-$HOME/.local/share}/MariaDB
+ export MYSQL_UNIX_PORT="$MARIADB_DIR"/${socket}
export ANDROID_SDK_ROOT=''${ANDROID_SDK_ROOT:-$HOME/Library/Android/sdk}
fi
diff --git a/nix/mariadb-up-mac.nix b/nix/mariadb-up-mac.nix
new file mode 100644
--- /dev/null
+++ b/nix/mariadb-up-mac.nix
@@ -0,0 +1,130 @@
+{ lib
+, gnused
+, openssl
+, mariadb
+, writeShellApplication
+, writeTextFile
+}:
+
+let
+ # Use small script executed by bash to have a normal shell environment.
+ mariadb-entrypoint = writeShellApplication {
+ name = "mariadb-init";
+ text = ''
+ MARIADB_DIR=''${XDG_DATA_HOME:-$HOME/.local/share}/MariaDB
+ # 'exec' allows for us to replace bash process with MariaDB
+ exec ${mariadb}/bin/mariadbd \
+ --socket "$MARIADB_DIR"/mysql.sock \
+ --datadir "$MARIADB_DIR" \
+ &> "$MARIADB_DIR"/logs
+ '';
+ };
+
+ mariadb-version = let
+ versions = lib.versions;
+ in "${versions.major mariadb.version}.${versions.minor mariadb.version}";
+
+ # Small boiler-plate text file for us to write for keyserver
+ db_config_template = writeTextFile {
+ name = "db-config";
+ text = ''
+ {
+ "host": "localhost",
+ "user": "comm",
+ "password": "PASS",
+ "database": "comm",
+ "dbType": "mariadb${mariadb-version}"
+ }
+ '';
+ };
+
+# writeShellApplication is a "writer helper" which
+# will create a shellchecked executable shell script located in $out/bin/<name>
+# This shell script will be used to allow for impure+stateful actions
+in writeShellApplication {
+ name = "mariadb-up";
+ text = ''
+ # "$HOME/Library/Application Support/<app>" is the canonical path to use
+ # on darwin for storing user data for installed applications.
+ # However, mysql and mariadb don't quote paths in the mariadbd script,
+ # so use XDG conventions and hope $HOME doesn't have a space.
+ MARIADB_DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}/MariaDB"
+ MARIADB_PIDFILE="$MARIADB_DATA_HOME"/mariadb.pid
+ export MYSQL_UNIX_PORT="$MARIADB_DATA_HOME"/mysql.sock
+
+ if [[ ! -d "$MARIADB_DATA_HOME"/mysql ]]; then
+ # mysql directory should exist if MariaDB has been initialized
+ echo "Initializing MariaDB database at $MARIADB_DATA_HOME" >&2
+ "${lib.getBin mariadb}/bin/mariadb-install-db" \
+ --datadir="$MARIADB_DATA_HOME" \
+ --auth-root-authentication-method=socket
+ fi
+
+ # Check if MariaDB server was already started
+ set +e # allow for pgrep to not find matches
+ # BSD pgrep doesn't have a "count" feature, use wc then trim whitespace
+ mariadb_count=$(pgrep mariadbd | wc -l | xargs echo)
+ set -e
+
+ if [[ "$mariadb_count" -eq "0" ]]; then
+ echo "Starting MariaDB server"
+ # No MariaDB present, start our own
+ # Launch in subshell so if the original terminal is closed, the process
+ # will be inherited instead of also being forced closed
+ ("${mariadb-entrypoint}/bin/mariadb-init" &
+ echo "$!" > "$MARIADB_PIDFILE")
+
+ echo "Waiting for MariaDB to come up"
+ while [[ ! -S "$MYSQL_UNIX_PORT" ]]; do sleep 1; done
+
+ elif [[ "$mariadb_count" -eq "1" ]]; then
+
+ # Check if it was started by this script
+ running_pid="$(pgrep mariadbd)"
+ if [[ ! -f "$MARIADB_PIDFILE" ]] || \
+ [[ "$(cat "$MARIADB_PIDFILE")" != "$running_pid" ]]; then
+ echo "Existing MariaDB instance found outside of nix environment" >&2
+ echo "Please stop existing services and attempt 'mariadb-up' again" >&2
+ exit 1
+ fi
+
+ else
+ echo "Many MariaDB instances found outside of nix environment" >&2
+ echo "Please stop existing services and attempt 'mariadb-up' again" >&2
+ exit 1
+
+ fi
+
+ # Initialize comm user, database, and secrets file for MariaDB
+ # Connecting through socket doesn't require a password
+ userCount=$("${lib.getBin mariadb}/bin/mariadb" -u "$USER" \
+ -Bse "SELECT COUNT(1) FROM mysql.user WHERE user = 'comm';"
+ )
+ if [[ "$userCount" -eq 0 ]]; then
+ PASS=$("${lib.getBin openssl}/bin/openssl" rand -hex 6)
+
+ echo "Creating comm user and comm database" >&2
+ "${lib.getBin mariadb}/bin/mariadb" -u "$USER" \
+ -Bse "CREATE DATABASE comm;
+ CREATE USER comm@localhost IDENTIFIED BY '$PASS';
+ GRANT ALL ON "'comm.*'" TO comm@localhost;"
+ echo "Comm user and database has been created!" >&2
+
+ # Assume this was ran from git repository
+ PRJ_ROOT=$(git rev-parse --show-toplevel)
+ KEYSERVER_DB_CONFIG="$PRJ_ROOT"/keyserver/secrets/db_config.json
+
+ echo "Writing connection information to $KEYSERVER_DB_CONFIG" >&2
+ mkdir -p "$(dirname "$KEYSERVER_DB_CONFIG")"
+
+ # It's very difficult to write json from bash, just copy a nix
+ # file then use sed to subsitute
+ cp "${db_config_template}" "$KEYSERVER_DB_CONFIG"
+ chmod +w "$KEYSERVER_DB_CONFIG" # Nix files are read-only
+ "${gnused}/bin/sed" -i -e "s|PASS|$PASS|g" "$KEYSERVER_DB_CONFIG"
+ fi
+
+ echo "View MariaDB Logs: tail -f $MARIADB_DATA_HOME/logs" >&2
+ echo "Kill MariaDB server: pkill mariadbd" >&2
+ '';
+}
diff --git a/nix/overlay.nix b/nix/overlay.nix
--- a/nix/overlay.nix
+++ b/nix/overlay.nix
@@ -45,6 +45,11 @@
devShell = final.callPackage ./dev-shell.nix { };
+ # Make our version of mariadb the default everywhere
+ mariadb = prev.mariadb_108;
+
+ mariadb-up = prev.callPackage ./mariadb-up-mac.nix { };
+
mysql-down = prev.callPackage ./mysql-down-linux.nix { };
mysql-up = prev.callPackage ./mysql-up-linux.nix { };
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Sep 30, 9:54 PM (21 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2207570
Default Alt Text
D4750.diff (6 KB)
Attached To
Mode
D4750: [Nix] Provide nix way of starting MariaDB
Attached
Detach File
Event Timeline
Log In to Comment