Files
homeAutomation/home-server/systemd/recurring-tasks/homeassistant-backup/index.ts
2025-06-14 09:25:46 +02:00

90 lines
2.2 KiB
TypeScript

import { $ } from "bun";
import moment from "moment";
import logger from "pino";
import { parseArgs } from "util";
const { values } = parseArgs({
args: Bun.argv,
options: {
mode: {
type: "string",
required: true,
},
sourceFolder: {
type: "string",
required: true,
},
targetFolder: {
type: "string",
required: true,
},
backupName: {
type: "string",
required: true,
},
},
strict: true,
allowPositionals: true,
});
const log = logger();
switch (values.mode) {
case "hot":
await hotCopy(
values.sourceFolder!,
values.targetFolder!,
values.backupName!,
);
break;
case "cold":
await coldCopy(
values.sourceFolder!,
values.targetFolder!,
values.backupName!,
);
break;
}
// 3 cold copies are stored
async function hotCopy(
sourceFolder: string,
targetFolder: string,
backupName: string,
) {
const timestamp = moment().format("YYYY-MM-DD_HH-mm-ss"); // Return today's date time
// Make sure user has access to all folders
await $`sudo chown -R willem:willem /etc/homeassistant`;
log.info("Creating new copy");
await $`mkdir -p ${targetFolder}`;
// Sync new copy
await $`rsync -a ${sourceFolder} ${targetFolder}/backup_${backupName}_${timestamp}`;
log.info("Only keep last 3 copies");
// Only keep last 3 copies
await $`cd ${targetFolder} && ls | grep ${backupName} | sort -r | tail -n +4 | xargs rm -rf`;
}
// Only 1 cold copy is retained
async function coldCopy(
sourceFolder: string,
targetFolder: string,
backupName: string,
) {
const timestamp = moment().format("YYYY-MM-DD_HH-mm-ss"); // Return today's date time
log.info("Creating new copy");
// find latest backup
const sourceFolderToBackup =
await $`cd ${sourceFolder} && ls | grep ${backupName} | sort | tail -n 1`.text().then(resp => resp.replace('\n',''));
log.info(`Folder to back up: ${sourceFolderToBackup}`);
await $`mkdir -p ${targetFolder}`;
await $`zip -r ${targetFolder}/${backupName}_${timestamp}.zip ${sourceFolder}/${sourceFolderToBackup}`;
log.info("Only keep last copy");
// Only keep last copy
await $`cd ${targetFolder} && ls | grep ${backupName} | sort -r | tail -n +2 | xargs rm -rf`;
}