Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions rs/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use crate::modules::sql::SqlArgs;
use crate::types::RepoOrigin;
use anyhow::bail;
use clap::{CommandFactory, Parser, Subcommand};
use crate::modules::farm::FarmArgs;
use crate::modules::watch::WatchArgs;

mod config;
Expand Down Expand Up @@ -47,6 +48,8 @@ pub enum Modules {
Db(DbArgs),
/// Stops containers
Down(ContainerActionArgs),
/// Allows managing a wiki farm
Farm(FarmArgs),
/// Prints info about the environment
Info,
/// Runs a linter
Expand Down Expand Up @@ -107,6 +110,7 @@ impl Modules {
Modules::Composer(args) => modules::composer::execute(config.unwrap(), args),
Modules::Db(args) => modules::db::execute(config.unwrap(), args),
Modules::Down(args) => modules::container_action::down(config.unwrap(), args),
Modules::Farm(args) => modules::farm::execute(config.unwrap(), args),
Modules::Info => modules::info::execute(config.unwrap()),
Modules::Lint(args) => modules::lint::execute(config.unwrap(), args, true),
Modules::ListRepoRemotes => modules::list_repo_remotes::execute(config.unwrap()),
Expand Down
10 changes: 9 additions & 1 deletion rs/src/modules/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,21 @@ pub fn delete_all_dumps(config: &MWUtilConfig) -> anyhow::Result<()> {
}

pub fn drop_mw_database(config: &MWUtilConfig) -> anyhow::Result<()> {
let db = &config.mw_database.clone().ok_or_else(|| anyhow!("MW database not set!"))?;
drop_database(
config,
db
)
}

pub fn drop_database(config: &MWUtilConfig, db: &str) -> anyhow::Result<()> {
let status = run_sql_query(
config,
DbCommandUser::Root,
Some(DbCommandDatabase::None),
format!(
"DROP DATABASE IF EXISTS `{}`;",
config.mw_database.clone().ok_or_else(|| anyhow!("MW database not set!"))?
db
).as_str(),
).context("Failed to drop database")?;
if !status.success() {
Expand Down
69 changes: 69 additions & 0 deletions rs/src/modules/farm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
use anyhow::{anyhow, bail, Context};
use clap::{Args, Subcommand};
use crate::config::MWUtilConfig;
use crate::exec::{run_sql_query, DbCommandDatabase, DbCommandUser};
use crate::modules::reset;

#[derive(Args)]
pub struct FarmArgs {
#[command(subcommand)]
command: FarmCommand,
}

#[derive(Subcommand)]
pub enum FarmCommand {
/// Install a new wiki
Install(InstallArgs),
}

#[derive(Args)]
pub struct InstallArgs {
/// The DB name of the wiki that should be installed
db_name: String,
}

pub fn execute(config: &MWUtilConfig, farm_args: FarmArgs) -> anyhow::Result<()> {
match farm_args.command {
FarmCommand::Install(args) => install_wiki(config, args),
}
}

fn install_wiki(config: &MWUtilConfig, args: InstallArgs) -> anyhow::Result<()> {
if !args.db_name.ends_with("wiki") {
// TODO maybe we want to allow other suffixes?
bail!("The DB name must end with 'wiki'!");
}

let status = run_sql_query(
config,
DbCommandUser::Root,
Some(DbCommandDatabase::None),
format!(
"CREATE DATABASE IF NOT EXISTS `{}`;",
args.db_name,
).as_str()
).context("Failed to create database")?;
if !status.success() {
bail!("Failed to create database! Exit code: {:?}", status.code());
}

let status = run_sql_query(
config,
DbCommandUser::Root,
Some(DbCommandDatabase::None),
format!(
"GRANT ALL PRIVILEGES ON `{}`.* TO {};",
args.db_name,
config.db_user.clone().ok_or_else(|| anyhow!("DB User not set!"))?
).as_str()
).context("Failed to grant privileges")?;
if !status.success() {
bail!("Failed to grant privileges! Exit code: {:?}", status.code());
}

println!("Created database.");

reset::reset_database(config, &args.db_name, true)?;

Ok(())
}
1 change: 1 addition & 0 deletions rs/src/modules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ pub(crate) mod reset;
pub(crate) mod container_action;
pub(crate) mod setup_repo;
pub(crate) mod watch;
pub(crate) mod farm;
28 changes: 22 additions & 6 deletions rs/src/modules/reset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ pub fn execute(config: &MWUtilConfig, args: ResetArgs) -> anyhow::Result<()> {
}
if actions.contains(&ResetActions::Database) {
spinner.next("Resetting database");
reset_database(config)?;
reset_default_database(config)?;
}
if actions.contains(&ResetActions::OpenSearch) {
spinner.next("Resetting OpenSearch");
Expand Down Expand Up @@ -72,15 +72,25 @@ pub fn reset_uploads(config: &MWUtilConfig) -> anyhow::Result<()> {
Ok(())
}

pub fn reset_database(config: &MWUtilConfig) -> anyhow::Result<()> {
db::drop_mw_database(config)?;
pub fn reset_default_database(config: &MWUtilConfig) -> anyhow::Result<()> {
reset_database(
config,
&config.mw_database.clone().ok_or_else(|| anyhow!("MW database not set!"))?,
false
)
}

pub fn reset_database(config: &MWUtilConfig, db: &str, new: bool) -> anyhow::Result<()> {
if !new {
db::drop_database(config, db)?;
}

let local_settings = config.core_dir.join("LocalSettings.php");
let local_settings_tmp = config.core_dir.join("LocalSettings.temp.php");
fs::rename(&local_settings, &local_settings_tmp)?;

let install_args = vec![
format!("--dbname={}", config.mw_database.clone().ok_or_else(|| anyhow!("MW Database not set!"))?),
format!("--dbname={}", db),
format!("--dbuser={}", config.db_user.clone().ok_or_else(|| anyhow!("DB User not set!"))?),
format!("--dbpass={}", config.db_password.clone().ok_or_else(|| anyhow!("DB Password not set!"))?),
format!("--dbserver={}", config.db_type.clone().get_container_name()),
Expand All @@ -101,8 +111,14 @@ pub fn reset_database(config: &MWUtilConfig) -> anyhow::Result<()> {

result?;

Modules::Update.run(config)?;
Modules::Recreate(Default::default()).run(config)?;
Modules::Run(RunArgs {
script: "update".into(),
extra_args: vec!["--wiki".into(), db.into(), "--quick".into()],
}).run(config)?;

if !new {
Modules::Recreate(Default::default()).run(config)?;
}

Ok(())
}