mirror of
https://github.com/thelounge/thelounge.git
synced 2024-05-27 19:02:23 +02:00
Merge branch 'cliMigrations'
This commit is contained in:
commit
1c6bec2323
|
@ -275,7 +275,7 @@ class ClientManager {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readUserConfig(name: string) {
|
readUserConfig(name: string) {
|
||||||
const userPath = Config.getUserConfigPath(name);
|
const userPath = Config.getUserConfigPath(name);
|
||||||
|
|
||||||
if (!fs.existsSync(userPath)) {
|
if (!fs.existsSync(userPath)) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ program.addCommand(require("./install").default);
|
||||||
program.addCommand(require("./uninstall").default);
|
program.addCommand(require("./uninstall").default);
|
||||||
program.addCommand(require("./upgrade").default);
|
program.addCommand(require("./upgrade").default);
|
||||||
program.addCommand(require("./outdated").default);
|
program.addCommand(require("./outdated").default);
|
||||||
|
program.addCommand(require("./storage").default);
|
||||||
|
|
||||||
if (!Config.values.public) {
|
if (!Config.values.public) {
|
||||||
require("./users").default.forEach((command: Command) => {
|
require("./users").default.forEach((command: Command) => {
|
||||||
|
|
68
server/command-line/storage.ts
Normal file
68
server/command-line/storage.ts
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
import log from "../log";
|
||||||
|
import {Command} from "commander";
|
||||||
|
import ClientManager from "../clientManager";
|
||||||
|
import Utils from "./utils";
|
||||||
|
import SqliteMessageStorage from "../plugins/messageStorage/sqlite";
|
||||||
|
|
||||||
|
const program = new Command("storage").description(
|
||||||
|
"various utilities related to the message storage"
|
||||||
|
);
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("migrate")
|
||||||
|
.argument("[user]", "migrate a specific user only, all if not provided")
|
||||||
|
.description("Migrate message storage where needed")
|
||||||
|
.on("--help", Utils.extraHelp)
|
||||||
|
.action(function (user) {
|
||||||
|
runMigrations(user).catch((err) => {
|
||||||
|
log.error(err.toString());
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
async function runMigrations(user: string) {
|
||||||
|
const manager = new ClientManager();
|
||||||
|
const users = manager.getUsers();
|
||||||
|
|
||||||
|
if (user) {
|
||||||
|
if (!users.includes(user)) {
|
||||||
|
throw new Error(`invalid user ${user}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return migrateUser(manager, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const name of users) {
|
||||||
|
await migrateUser(manager, name);
|
||||||
|
// if any migration fails we blow up,
|
||||||
|
// chances are the rest won't complete either
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// runs sqlite migrations for a user, which must exist
|
||||||
|
async function migrateUser(manager: ClientManager, user: string) {
|
||||||
|
log.info("handling user", user);
|
||||||
|
|
||||||
|
if (!isUserLogEnabled(manager, user)) {
|
||||||
|
log.info("logging disabled for user", user, ". Skipping");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sqlite = new SqliteMessageStorage(user);
|
||||||
|
await sqlite.enable(); // enable runs migrations
|
||||||
|
await sqlite.close();
|
||||||
|
log.info("user", user, "migrated successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
function isUserLogEnabled(manager: ClientManager, user: string): boolean {
|
||||||
|
const conf = manager.readUserConfig(user);
|
||||||
|
|
||||||
|
if (!conf) {
|
||||||
|
log.error("Could not open user configuration of", user);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return conf.log;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default program;
|
Loading…
Reference in a new issue