package kernel.service; import kernel.log.Log; import kernel.binstore.BinStore; import lib.KVStore; using tink.CoreApi; class ServiceManager { public static var instance: ServiceManager; private final services:Map = new Map(); @:allow(kernel.Init) private function new() { this.startAllEnabled(); } /** Add a service to be automatically started. **/ public function enable(name: String) { if (!this.services.exists(name)){ return; // Service must be started } var store = KVStore.getStoreForClass(); var enabled = store.get("enabled",[]); enabled.push(name); store.set("enabled",enabled); store.save(); } /** Remove a service from being automatically started. **/ private function disable(name: String) { var store = KVStore.getStoreForClass(); var enabled: Array = store.get("enabled"); var index = enabled.indexOf(name); if (index == -1){ return; } enabled.splice(index,1); store.save(); } private function startAllEnabled() { var store = KVStore.getStoreForClass(); var enabled: Array = store.get("enabled",[]); for (name in enabled){ this.start(name); } } private function load(name: String): Null { var store = new KVStore('service/${name}'); store.load(); if (!store.exists("service")){ return null; } return store.get("service"); } public function register(name: String, binName: String,args: Array): Outcome { if (BinStore.instance.getBinByAlias(binName) == null){ return Failure("bin not found"); } if (this.load(name) != null){ return Failure("service already exists"); } var service = new Service(binName,name,args); var store = new KVStore('service/${name}'); store.set("service",service); store.save(); Log.info('Service ${name} registered'); return Success(Noise); } public function unregister(name: String): Outcome { if (this.services.exists(name)){ return Failure("service is running"); } KVStore.removeNamespace('service/${name}'); Log.info('Service ${name} unregistered'); return Success(Noise); } public function start(name: String): Outcome { var service = this.load(name); if (service == null){ return Failure("service not found"); } service.start(); this.services.set(name,service); Log.info('Service ${name} started'); return Success(Noise); } public function stop(name: String): Outcome { if (!this.services.exists(name)){ return Failure("service not found"); } var service = this.services.get(name); service.stop(); this.services.remove(name); Log.info('Service ${name} stopped'); return Success(Noise); } public function listRunning(): Array { var running = []; for (name in this.services.keys()){ running.push(name); } return running; } }