58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
// Utility to parse and stringify Bacula Config Resources
|
|
// Format:
|
|
// ResourceType {
|
|
// Key = Value
|
|
// Key = "Value With Spaces"
|
|
// }
|
|
|
|
const parseConfig = (content) => {
|
|
const lines = content.split('\n');
|
|
const resources = [];
|
|
let currentResource = null;
|
|
|
|
lines.forEach(line => {
|
|
const trimmed = line.trim();
|
|
if (!trimmed || trimmed.startsWith('#')) return;
|
|
|
|
// Start of Resource
|
|
if (trimmed.match(/^[a-zA-Z0-9]+\s*{/)) {
|
|
const type = trimmed.split(/\s+/)[0];
|
|
currentResource = { _type: type };
|
|
}
|
|
// End of Resource
|
|
else if (trimmed === '}') {
|
|
if (currentResource) {
|
|
resources.push(currentResource);
|
|
currentResource = null;
|
|
}
|
|
}
|
|
// Key-Value Pair
|
|
else if (currentResource && trimmed.includes('=')) {
|
|
const [key, ...values] = trimmed.split('=');
|
|
let value = values.join('=').trim();
|
|
|
|
// Remove wrapping quotes and trailing semicolons
|
|
value = value.replace(/^"|"$/g, '').replace(/;$/, '');
|
|
|
|
currentResource[key.trim()] = value;
|
|
}
|
|
});
|
|
|
|
return resources;
|
|
};
|
|
|
|
const generateClientConfig = (data) => {
|
|
return `Client {
|
|
Name = "${data.Name}"
|
|
Address = "${data.Address}"
|
|
FDPort = ${data.FDPort || 9102}
|
|
Catalog = "${data.Catalog || 'MyCatalog'}"
|
|
Password = "${data.Password}"
|
|
File Retention = ${data.FileRetention || '30 days'}
|
|
Job Retention = ${data.JobRetention || '6 months'}
|
|
AutoPrune = ${data.AutoPrune || 'yes'}
|
|
}`;
|
|
};
|
|
|
|
module.exports = { parseConfig, generateClientConfig };
|