Files
smartdaemon/ts/smartdaemon.classes.templatemanager.ts
T

59 lines
1.8 KiB
TypeScript

import { SmartDaemon } from './smartdaemon.classes.smartdaemon.js';
import { SmartDaemonService } from './smartdaemon.classes.service.js';
export class SmartDaemonTemplateManager {
public smartdaemonRef: SmartDaemon;
constructor(smartdaemonRefArg: SmartDaemon) {
this.smartdaemonRef = smartdaemonRefArg;
}
private generateEnvironmentLines(serviceArg: SmartDaemonService): string {
const environment = serviceArg.environment || {};
return Object.entries(environment)
.map(([key, value]) => {
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
throw new Error(`Invalid systemd environment key: ${key}`);
}
const escapedValue = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
return `Environment="${key}=${escapedValue}"`;
})
.join('\n');
}
public generateUnitFileForService = (serviceArg: SmartDaemonService) => {
const environmentLines = this.generateEnvironmentLines(serviceArg);
return `# ---
# name: ${serviceArg.name}
# version: ${serviceArg.version}
# description: ${serviceArg.description}
# command: ${serviceArg.command}
# workingDir: ${serviceArg.workingDir}${serviceArg.user ? `
# user: ${serviceArg.user}` : ''}${serviceArg.group ? `
# group: ${serviceArg.group}` : ''}
# ---
[Unit]
Description=${serviceArg.description}
Requires=network.target
After=network.target
[Service]
Type=simple${serviceArg.user ? `
User=${serviceArg.user}` : ''}${serviceArg.group ? `
Group=${serviceArg.group}` : ''}${environmentLines ? `
${environmentLines}` : ''}
ExecStart=/bin/bash -c "cd ${serviceArg.workingDir} && ${serviceArg.command}"
WorkingDirectory=${serviceArg.workingDir}
Restart=on-failure
LimitNOFILE=infinity
LimitCORE=infinity
StandardInput=null
StandardOutput=syslog
StandardError=syslog
Restart=always
[Install]
WantedBy=multi-user.target
`;
};
}