Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
dd5e1a978d | |||
692602b463 | |||
382b694027 | |||
de831b086f | |||
01c7d2e482 | |||
49ebf991a2 | |||
513337355f | |||
5e5a679f99 | |||
9ef366eee9 | |||
10562afea1 | |||
c4e3f628cd | |||
40e6a7abe4 |
1
license
1
license
@ -1,4 +1,5 @@
|
||||
Copyright (c) 2019 Lossless GmbH (hello@lossless.com)
|
||||
Copyright (c) 2017-2019, braces lab
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
473
package-lock.json
generated
473
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/smartdaemon",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.8",
|
||||
"private": false,
|
||||
"description": "start scripts as long running daemons and manage them",
|
||||
"main": "dist/index.js",
|
||||
@ -13,14 +13,21 @@
|
||||
"format": "(gitzone format)"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@gitzone/tsbuild": "^2.0.22",
|
||||
"@gitzone/tsbuild": "^2.1.17",
|
||||
"@gitzone/tstest": "^1.0.15",
|
||||
"@pushrocks/tapbundle": "^3.0.7",
|
||||
"@pushrocks/tapbundle": "^3.0.13",
|
||||
"@types/node": "^10.11.7",
|
||||
"tslint": "^5.11.0",
|
||||
"tslint-config-prettier": "^1.15.0"
|
||||
},
|
||||
"dependencies": {},
|
||||
"dependencies": {
|
||||
"@pushrocks/lik": "^3.0.11",
|
||||
"@pushrocks/smartfile": "^7.0.4",
|
||||
"@pushrocks/smartlog": "^2.0.19",
|
||||
"@pushrocks/smartlog-destination-local": "^8.0.2",
|
||||
"@pushrocks/smartshell": "^2.0.25",
|
||||
"@pushrocks/smartsystem": "^2.0.8"
|
||||
},
|
||||
"files": [
|
||||
"ts/*",
|
||||
"ts_web/*",
|
||||
|
@ -1,8 +1,11 @@
|
||||
import { expect, tap } from '@pushrocks/tapbundle';
|
||||
import * as smartdaemon from '../ts/index';
|
||||
|
||||
tap.test('first test', async () => {
|
||||
console.log(smartdaemon.standardExport);
|
||||
let testSmartdaemon: smartdaemon.SmartDaemon;
|
||||
|
||||
tap.test('should create an instance of smartdaemon', async () => {
|
||||
testSmartdaemon = new smartdaemon.SmartDaemon();
|
||||
expect(testSmartdaemon).to.be.instanceOf(smartdaemon.SmartDaemon);
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
@ -1,3 +1 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
|
||||
export let standardExport = 'Hi there! :) This is an exported string';
|
||||
export * from './smartdaemon.classes.smartdaemon';
|
||||
|
57
ts/smartdaemon.classes.service.ts
Normal file
57
ts/smartdaemon.classes.service.ts
Normal file
@ -0,0 +1,57 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
import * as paths from './smartdaemon.paths';
|
||||
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||
|
||||
export interface SmartDaemonServiceConstructorOptions {
|
||||
name: string;
|
||||
command: string;
|
||||
workingDir: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* represents a service that is being spawned by SmartDaemon
|
||||
*/
|
||||
export class SmartDaemonService implements SmartDaemonServiceConstructorOptions {
|
||||
public static async createFromOptions(smartdaemonRef: SmartDaemon, optionsArg: SmartDaemonServiceConstructorOptions) {
|
||||
const service = new SmartDaemonService(smartdaemonRef);
|
||||
for (const key of Object.keys(optionsArg)) {
|
||||
service[key] = optionsArg[key];
|
||||
}
|
||||
return service;
|
||||
}
|
||||
|
||||
public options: SmartDaemonServiceConstructorOptions;
|
||||
|
||||
public name: string;
|
||||
public command: string;
|
||||
public workingDir: string;
|
||||
|
||||
public smartdaemonRef: SmartDaemon;
|
||||
|
||||
constructor(smartdaemonRegfArg: SmartDaemon) {
|
||||
this.smartdaemonRef = smartdaemonRegfArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* enables the service
|
||||
*/
|
||||
public async enable() {
|
||||
this.smartdaemonRef
|
||||
}
|
||||
|
||||
/**
|
||||
* disables the service
|
||||
*/
|
||||
public async disable() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* pauses the service
|
||||
*/
|
||||
public pause() {};
|
||||
|
||||
public save() {
|
||||
|
||||
}
|
||||
}
|
40
ts/smartdaemon.classes.smartdaemon.ts
Normal file
40
ts/smartdaemon.classes.smartdaemon.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
import { SmartDaemonTemplateManager } from './smartdaemon.classes.templatemanager';
|
||||
import { SmartDaemonService } from './smartdaemon.classes.service';
|
||||
import { SmartDaemonSystemdManager } from './smartdaemon.classes.systemdmanager';
|
||||
|
||||
|
||||
|
||||
export class SmartDaemon {
|
||||
|
||||
public serviceMap: plugins.lik.Objectmap<SmartDaemonService>;
|
||||
public templateManager: SmartDaemonTemplateManager;
|
||||
public systemdManager: SmartDaemonSystemdManager;
|
||||
|
||||
constructor() {
|
||||
this.serviceMap = new plugins.lik.Objectmap<SmartDaemonService>();
|
||||
this.templateManager = new SmartDaemonTemplateManager(this);
|
||||
this.systemdManager = new SmartDaemonSystemdManager(this);
|
||||
}
|
||||
|
||||
public async addService(nameArg: string, commandArg: string, workingDirectoryArg?: string): Promise<SmartDaemonService> {
|
||||
let serviceToAdd: SmartDaemonService;
|
||||
const existingService = this.serviceMap.find(serviceArg => {
|
||||
return serviceArg.name === nameArg;
|
||||
});
|
||||
if (!existingService) {
|
||||
serviceToAdd = await SmartDaemonService.createFromOptions(this, {
|
||||
command: commandArg,
|
||||
name: nameArg,
|
||||
workingDir: workingDirectoryArg
|
||||
})
|
||||
} else {
|
||||
|
||||
}
|
||||
return serviceToAdd;
|
||||
};
|
||||
|
||||
public async init() {
|
||||
await this.systemdManager.init();
|
||||
}
|
||||
}
|
43
ts/smartdaemon.classes.systemdmanager.ts
Normal file
43
ts/smartdaemon.classes.systemdmanager.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
import * as paths from './smartdaemon.paths';
|
||||
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||
|
||||
export class SmartDaemonSystemdManager {
|
||||
private smartDaemonNamespace = 'smartdaemon_';
|
||||
public smartdaemonRef: SmartDaemon;
|
||||
public smartshellInstance: plugins.smartshell.Smartshell;
|
||||
public smartsystem: plugins.smartsystem.Smartsystem;
|
||||
|
||||
public shouldExecute: boolean = false;
|
||||
|
||||
constructor(smartdaemonRefArg: SmartDaemon) {
|
||||
this.smartdaemonRef = smartdaemonRefArg;
|
||||
this.smartshellInstance = new plugins.smartshell.Smartshell({
|
||||
executor: 'bash'
|
||||
});
|
||||
this.smartsystem = new plugins.smartsystem.Smartsystem();
|
||||
}
|
||||
|
||||
public async checkElegibility() {
|
||||
if (await this.smartsystem.env.isLinuxAsync()) {
|
||||
this.shouldExecute = true;
|
||||
} else {
|
||||
console.log('Smartdaemon can only be used on Linuc systems! Refusing to set up a service.');
|
||||
this.shouldExecute = false;
|
||||
}
|
||||
return this.shouldExecute;
|
||||
}
|
||||
|
||||
public async execute(commandArg: string) {
|
||||
(await this.checkElegibility()) ? await this.smartshellInstance.exec(commandArg) : null;
|
||||
}
|
||||
|
||||
public async getServices () {
|
||||
const availableServices = plugins.smartfile.fs.listAllItems(paths.systemdDir, new RegExp(`${this.smartDaemonNamespace}`));
|
||||
}
|
||||
|
||||
public async init() {
|
||||
|
||||
};
|
||||
|
||||
}
|
41
ts/smartdaemon.classes.templatemanager.ts
Normal file
41
ts/smartdaemon.classes.templatemanager.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||
|
||||
export class SmartDaemonTemplateManager {
|
||||
public smartdaemonRef: SmartDaemon;
|
||||
|
||||
constructor(smartdaemonRefArg: SmartDaemon) {
|
||||
this.smartdaemonRef = smartdaemonRefArg;
|
||||
}
|
||||
|
||||
public generateServiceTemplate = (optionsArg: {
|
||||
serviceName: string;
|
||||
description: string;
|
||||
serviceVersion: string;
|
||||
command: string;
|
||||
pathWorkkingDir;
|
||||
pathJsFileToRun;
|
||||
}) => {
|
||||
return `
|
||||
# servicVersion: ${optionsArg.serviceVersion}
|
||||
[Unit]
|
||||
Description=${optionsArg.description}
|
||||
Requires=network.target
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/bin/bash -c "cd ${optionsArg.pathWorkkingDir} && ${optionsArg.command}"
|
||||
WorkingDirectory=${optionsArg.pathWorkkingDir}
|
||||
Restart=on-failure
|
||||
LimitNOFILE=infinity
|
||||
LimitCORE=infinity
|
||||
StandardInput=null
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
Restart=always
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
`;
|
||||
}
|
||||
}
|
4
ts/smartdaemon.paths.ts
Normal file
4
ts/smartdaemon.paths.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
|
||||
export const packageDir = plugins.path.join(__dirname, '../');
|
||||
export const systemdDir = plugins.path.join('/lib/systemd/system/');
|
@ -1,2 +1,26 @@
|
||||
const removeme = {};
|
||||
export { removeme };
|
||||
// node native scope
|
||||
import * as path from 'path';
|
||||
|
||||
|
||||
export {
|
||||
path
|
||||
};
|
||||
|
||||
// @pushrocks scope
|
||||
import * as lik from '@pushrocks/lik';
|
||||
import * as smartfile from '@pushrocks/smartfile';
|
||||
import * as smartlog from '@pushrocks/smartlog';
|
||||
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
|
||||
import * as smartshell from '@pushrocks/smartshell';
|
||||
import * as smartsystem from '@pushrocks/smartsystem';
|
||||
|
||||
export {
|
||||
lik,
|
||||
smartfile,
|
||||
smartlog,
|
||||
smartlogDestinationLocal,
|
||||
smartshell,
|
||||
smartsystem
|
||||
};
|
||||
|
||||
// third party
|
||||
|
15
ts/smartdamon.logging.ts
Normal file
15
ts/smartdamon.logging.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import * as plugins from './smartdaemon.plugins';
|
||||
|
||||
export const logger = new plugins.smartlog.Smartlog({
|
||||
logContext: {
|
||||
company: 'Some Company',
|
||||
companyunit: 'Some CompanyUnit',
|
||||
containerName: 'Some Containername',
|
||||
environment: 'local',
|
||||
runtime: 'node',
|
||||
zone: 'gitzone'
|
||||
},
|
||||
minimumLogLevel: 'silly'
|
||||
});
|
||||
|
||||
logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());
|
Reference in New Issue
Block a user