'use strict'; const child_process = require('node:child_process'); function patchMountFile(mountPath, fstype) { const mountFilename = child_process.execSync(`systemd-escape -p --suffix=mount "${mountPath}"`, { encoding: 'utf8' }).trim(); const mountFile = `/etc/systemd/system/${mountFilename}`; try { child_process.execSync(`sed -i 's/^Type=auto$/Type=${fstype}/' "${mountFile}"`); child_process.execSync('systemctl daemon-reload'); console.log(`Patched ${mountFile}: Type=auto -> Type=${fstype}`); } catch (e) { console.log(`Warning: failed to patch ${mountFile}: ${e.message}`); } } exports.up = async function (db) { const results = await db.runSql('SELECT id, configJson FROM backupSites WHERE provider = ?', ['disk']); for (const row of results) { const config = JSON.parse(row.configJson); let fstype = 'ext4'; try { const diskPath = config.mountOptions.diskPath; const output = child_process.execSync(`lsblk --paths --json --list --fs ${diskPath}`, { encoding: 'utf8' }); const info = JSON.parse(output); if (info.blockdevices[0].fstype === 'xfs') fstype = 'xfs'; } catch (e) { console.log(`Could not detect filesystem type for backup site ${row.id}, defaulting to ext4: ${e.message}`); } config._provider = fstype; console.log(`Migrating backup site ${row.id} from disk to ${fstype}`); await db.runSql('UPDATE backupSites SET provider = ?, configJson = ? WHERE id = ?', [fstype, JSON.stringify(config), row.id]); if (config._managedMountPath) { patchMountFile(config._managedMountPath, fstype); } } }; exports.down = function (db, callback) { callback(); };