mirror of https://github.com/icedream/ts3bot.git
69 lines
1.9 KiB
Plaintext
69 lines
1.9 KiB
Plaintext
|
# At this point I feel like I'm writing my own init system. Phew...
|
||
|
|
||
|
merge = require "merge"
|
||
|
getLogger = require("./logger")
|
||
|
EventEmitter = require("events").EventEmitter
|
||
|
log = getLogger("ServiceMgr")
|
||
|
Sync = require "sync"
|
||
|
|
||
|
getLegacyServiceName = (serviceName) -> serviceName.toLowerCase().replace(/[^A-z0-9]/g, "_")
|
||
|
|
||
|
module.exports =
|
||
|
services: []
|
||
|
|
||
|
find: (serviceName) ->
|
||
|
serviceNameUpper = serviceName.toUpperCase()
|
||
|
for service in services
|
||
|
if service.name.toUpperCase() == serviceNameUpper
|
||
|
return service
|
||
|
null
|
||
|
|
||
|
register: (service) ->
|
||
|
if @[service.name]
|
||
|
throw new Error "There is already a service registered under that name"
|
||
|
@services.push service
|
||
|
log.debug "Registered service #{service.name}"
|
||
|
|
||
|
unregister: (serviceName) ->
|
||
|
for service, index in @services
|
||
|
if service.name == serviceName
|
||
|
@services.splice index, 1
|
||
|
log.debug "Unregistered service #{service.name}"
|
||
|
throw new Error "There is no service registered under that name"
|
||
|
|
||
|
shutdown: (cb) ->
|
||
|
shutdownOrder = @services.splice 0
|
||
|
shutdownOrder.reverse()
|
||
|
|
||
|
while true
|
||
|
for own k, v of shutdownOrder
|
||
|
if v.state == "stopped"
|
||
|
continue
|
||
|
await v.stop defer()
|
||
|
breakOut = true
|
||
|
for own k, v of shutdownOrder
|
||
|
if v.state != "stopped"
|
||
|
log.debug "Service #{k} in state #{v.state} after shutdown loop, relooping"
|
||
|
breakOut = false
|
||
|
if breakOut
|
||
|
break
|
||
|
cb?()
|
||
|
|
||
|
shutdownSync: () -> Sync () => @shutdown.sync @
|
||
|
|
||
|
# base class for all services
|
||
|
module.exports.Service = require "./service_template"
|
||
|
|
||
|
# register services
|
||
|
services = [
|
||
|
new(require "./services/pulseaudio")
|
||
|
new(require "./services/ts3client")
|
||
|
new(require "./services/vlc")
|
||
|
new(require "./services/xvfb")
|
||
|
new(require "./services/blackbox")
|
||
|
]
|
||
|
services.sort require("./service_depcomparer") # sort services by dependency
|
||
|
for service in services
|
||
|
module.exports.register service
|
||
|
|
||
|
module.exports.services = services
|