From 139091086520636b4e74af85a9856ab86fabeb89 Mon Sep 17 00:00:00 2001 From: bradleymeck Date: Tue, 27 Sep 2011 13:31:54 -0500 Subject: [PATCH] [fix] forgot to add adapters --- bin/foreverd | 10 ++ lib/foreverd/adapter/init.d/index.js | 1 + lib/foreverd/adapter/systemv/index.js | 164 ++++++++++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100755 bin/foreverd create mode 100644 lib/foreverd/adapter/init.d/index.js create mode 100644 lib/foreverd/adapter/systemv/index.js diff --git a/bin/foreverd b/bin/foreverd new file mode 100755 index 00000000..99d6700b --- /dev/null +++ b/bin/foreverd @@ -0,0 +1,10 @@ +#!/usr/bin/env node + +var clip = require('clip'); + +var app = new clip(); +console.log("FOREVERD") +require('../lib/foreverd/cli')(app); +console.log("FOREVERD LOADED") +app.run(); +console.log("FOREVER RAN") \ No newline at end of file diff --git a/lib/foreverd/adapter/init.d/index.js b/lib/foreverd/adapter/init.d/index.js new file mode 100644 index 00000000..9e63e5e1 --- /dev/null +++ b/lib/foreverd/adapter/init.d/index.js @@ -0,0 +1 @@ +module.exports = require('../systemv'); \ No newline at end of file diff --git a/lib/foreverd/adapter/systemv/index.js b/lib/foreverd/adapter/systemv/index.js new file mode 100644 index 00000000..484d63e3 --- /dev/null +++ b/lib/foreverd/adapter/systemv/index.js @@ -0,0 +1,164 @@ +var util = require('util'); +var forever = require('../../../forever'); +var ForeverServiceAdapter = require('../../adapter'); +var path = require('path'); +var fs = require('fs'); +var dnode = require('dnode'); + +module.exports = SystemVAdapter; + +// +// Classic init.d script adapter +// Sometimes called inittab, but its origin is called systemv +// +function SystemVAdapter(service) { + ForeverServiceAdapter.call(this, service); + this.daemonized = false; +} +util.inherits(SystemVAdapter, ForeverServiceAdapter); + +SystemVAdapter.prototype.install = function install(callback) { + // + // Copy the init.d script to the right location + // TODO Distribution fixes? + // + forever.config.set('root', path.join('/var', 'local', 'foreverd')); + var initdPath = path.join('/etc', 'init.d', 'foreverd'); + try { + fs.mkdirSync(forever.config.get('root'), 0777); + fs.mkdirSync(path.join(forever.config.get('root'), 'services'), 0777); + } + catch (e) { + if (e.code !== 'EEXIST') { + return callback && callback(e); + } + } + try { + var script = fs.createReadStream(path.join(__dirname, 'foreverd')); + var target = fs.createWriteStream(initdPath, { + flags: 'w', + mode: 0777 + }); + script.pipe(target); + script.on('end', function() { + var directories = fs.readdirSync('/etc'); + directories.forEach(function (directory) { + var match = directory.match(/^rc(\d+)\.d$/); + if(match) { + var kill_or_start = {0:true, 1:true, 6:true}[match[1]] ? 'K' : 'S'; + try { + fs.symlinkSync(initdPath, path.join('/etc',directory,kill_or_start+'20foreverd')); + } + catch (e) { + if (e.code !== 'EEXIST') { + return callback && callback(e); + } + } + } + }); + return callback && callback(); + }); + } + catch (e) { + if (e.code !== 'EEXIST') { + return callback && callback(e); + } + } +} + +// +// +// +SystemVAdapter.prototype.load = function load(callback) { + forever.config.set('root', path.join('/var', 'local', 'foreverd')); + var serviceFiles = fs.readdirSync(path.join(forever.config.get('root'), 'services')); + var services = []; + if (serviceFiles.length !== 0) { + serviceFiles.forEach(function loadServiceFiles(serviceFile, index) { + var serviceFilePath = path.join(forever.config.get('root'), 'services', serviceFile); + var service = JSON.parse(fs.readFileSync(serviceFilePath)); + var file = service.file; + var options = service.options; + options.minUptime = 200; + services.push({ + file:service.file, + options:service.options + }) + }); + } + callback(services); +} + +SystemVAdapter.prototype.start = function start(callback) { + require('child_process').spawn('/etc/init.d/foreverd', ['start']); + callback && callback(); +} + +SystemVAdapter.prototype.run = function run(callback) { + if(this.daemonized) { + return callback(); + } + var self = this; + var pidFilePath = path.join('/var','run', 'foreverd.pid'); + var logFilePath = path.join('/var','log','foreverd'); + process.on('exit', function removePIDFile() { + try{ + fs.unlinkSync(pidFilePath); + } + catch(err) { + //we are exiting anyway. this may have some noexist error already + } + }) + fs.open(logFilePath, 'w+', function serviceLogOpened(err, logFile) { + if(err) { + throw err; + } + self.service.startServer(function() { + try { + daemon.start(logFile); + daemon.lock(pidFilePath); + self.daemonized = true; + callback && callback(); + } + catch (err) { + console.error(err) + return callback && callback(err); + } + }); + }); +} + +SystemVAdapter.prototype.add = function add(file, options, callback) { + forever.config.set('root', path.join('/var', 'local', 'foreverd')); + // + // Add descriptor to our service list + // this is just a json file in $root/services/*.json + // + var service = { + file: file, + options: options || {} + }; + options.appendLog = true; + var filePath = path.join(forever.config.get('root'), 'services', options.uid + '.json'); + fs.writeFile(filePath, JSON.stringify(service), function(err) { + console.error('/',arguments) + callback && callback(); + }); +} + +SystemVAdapter.prototype.list = function list(callback) { + forever.config.set('root', path.join('/var', 'local', 'foreverd')); + var sockPath = path.join(forever.config.get('root'),'foreverd.sock'); + var client = dnode.connect(sockPath, function onConnect(remote, client) { + callback && callback(false, remote.applications); + client.end(); + }); + client.on('error', function onError(err) { + if (err.code === 'ECONNREFUSED') { + try { fs.unlinkSync(fullPath) } + catch (ex) { } + return callback && callback(false, []); + } + callback && callback(err); + }) +} \ No newline at end of file