maestro/app/classes/logical/services/ServiceManager.js
2020-02-21 00:36:55 -06:00

80 lines
2.3 KiB
JavaScript

const { Injectable } = require('flitter-di')
const ImplementationError = require('libflitter/errors/ImplementationError')
const ServiceConfig = require('./ServiceConfig')
class ServiceManager extends Injectable {
static SERVICE_STATE_STOPPED = 'stopped'
static SERVICE_STATE_ERROR = 'error'
static SERVICE_STATE_RUNNING = 'running'
_command_restart_service = '%%SERVICE%%'
_command_start_service = '%%SERVICE%%'
_command_stop_service = '%%SERVICE%%'
_command_reload_service = '%%SERVICE%%'
_command_enable_service = '%%SERVICE%%'
_command_disable_service = '%%SERVICE%%'
_command_daemon_reload = ''
_group_services_by = ' '
constructor(host) {
super()
this._host = host
}
async status(...services) {
throw new ImplementationError()
}
async install(config) {
throw new ImplementationError()
}
new_config() {
return new ServiceConfig()
}
async start(...services) {
await this._standard_format_execution(services, this._command_start_service)
}
async stop(...services) {
await this._standard_format_execution(services, this._command_stop_service)
}
async restart(...services) {
await this._standard_format_execution(services, this._command_restart_service)
}
async reload(...services) {
await this._standard_format_execution(services, this._command_reload_service)
}
async enable(...services) {
await this._standard_format_execution(services, this._command_enable_service)
}
async disable(...services) {
await this._standard_format_execution(services, this._command_disable_service)
}
async daemon_reload() {
await this._host.run_line_result(this._command_daemon_reload)
}
async _standard_format_execution(items, command, replace = '%%SERVICE%%') {
if ( this._group_services_by ) {
items = [items.join(this._group_services_by)]
}
for ( const item of items ) {
const result = await this._host.execute(command.replace(replace, item))
if ( result.exit_code !== 0 ) {
throw new Error('Error encountered while executing command: '+result.stderr.join('\n'))
}
}
}
}
module.exports = exports = ServiceManager