Database administration tool for non-admin users, rewrite of https://git.pvv.ntnu.no/Projects/mysql-admutils
Go to file
Oystein Kristoffer Tveit e8d9237143
Bump all deps, fix db connection closing issues
2024-08-18 01:33:22 +02:00
nix flake.nix: create packaging, generate coverage 2024-08-09 19:05:16 +02:00
src Bump all deps, fix db connection closing issues 2024-08-18 01:33:22 +02:00
.gitignore .gitignore: add nix ignores 2024-08-04 14:30:35 +02:00
Cargo.lock Bump all deps, fix db connection closing issues 2024-08-18 01:33:22 +02:00
Cargo.toml Bump all deps, fix db connection closing issues 2024-08-18 01:33:22 +02:00
LICENSE Initial commit 2024-04-20 03:38:29 +02:00
README.md create compatibility layer for mysql-admutils commands 2024-08-06 23:31:47 +02:00
build.rs build.rs: don't fail on symlink creation 2024-08-07 16:19:40 +02:00
example-config.toml make database connection timeout configurable 2024-07-09 21:36:12 +02:00
flake.lock flake.nix: replace fenix with rust-overlay 2024-07-10 17:08:53 +02:00
flake.nix flake.nix: create packaging, generate coverage 2024-08-09 19:05:16 +02:00

README.md

mysqladm-rs

Work in progress rewrite of https://git.pvv.ntnu.no/Projects/mysql-admutils

Installation

The resulting binary will probably need to be marked as either SUID or SGID to work in a multi-user environment. The UID/GID of the binary should have access to the config file, which contains secrets to log in to an admin-like MySQL user. Preferrably, this UID/GID should not be root, in order to minimize the potential damage that can be done in case of security vulnerabilities in the program.

Development and testing

Ensure you have a rust toolchain installed.

In order to set up a test instance of mariadb in a docker container, run the following command:

docker run --rm --name mariadb -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 -d mariadb:latest

This will start a mariadb instance with the root password secret, and expose the port 3306 on the host machine.

Run the following command to create a configuration file with the default settings:

cp ./example-config.toml ./config.toml

If you used the docker command above, you can use these settings as is, but if you are running mariadb/mysql on another host, port or with another password, adjust the corresponding fields in config.toml. This file will contain your database password, but is ignored by git, so it will not be committed to the repository.

You should now be able to connect to the mariadb instance, after building the program and using arguments to specify the config file.

cargo run -- --config-file ./config.toml <args>

# example usage
cargo run -- --config-file ./config.toml create-db "${USER}_testdb"
cargo run -- --config-file ./config.toml create-user "${USER}_testuser"
cargo run -- --config-file ./config.toml edit-db-perm -p "${USER}_testdb:${USER}_testuser:A"
cargo run -- --config-file ./config.toml show-db-perm

To stop and remove the container, run the following command:

docker stop mariadb

Compatibility mode with mysql-admutils

If you enable the feature flag mysql-admutils-compatibility (enabled by default), the output directory will contain two symlinks to the binary, mysql-dbadm and mysql-useradm. In the same fashion as busybox, the binary will react to its argv[0] and behave as if it was called with the corresponding name. While the internal functionality is written in rust, these modes strive to behave as similar as possible to the original programs.

cargo build
./target/debug/mysql-dbadm --help
./target/debug/mysql-useradm --help

Known deviations from the original programs

  • Added flags for database configuration, not present in the original programs
  • --help output is formatted by clap in a modern style.
  • mysql-dbadm edit-perm uses the new implementation. The idea was that the parsing logic was too complex to be worth porting, and there wouldn't be any scripts depending on this command anyway. As such, the new implementation is more user-friendly and only brings positive changes.
  • The new tools use the modern implementation to find it's configuration. If you compiled the old programs with --sysconfdir=<somewhere>, you might have to provide --config-file where the old program would just work by itself.
  • The order in which some things are validated (e.g. whether you own a user, whether the contains illegal characters, whether the user does or does not exist) might be different from the original program, leading to the same command giving the errors in a different order.