mirror of https://github.com/jo/couchmagick.git
use couchmagick-listen
parent
30c1b47d40
commit
b53060fec3
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
require('..')();
|
|
@ -1,159 +1,69 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
/* couchmagick
|
/* couchmagick
|
||||||
* (c) 2013 Johannes J. Schmidt, null2 GmbH, Berlin
|
* (c) 2013 Johannes J. Schmidt, null2 GmbH, Berlin
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var pkg = require('./package.json');
|
var pkg = require('./package.json');
|
||||||
var couchdbWorker = require('couchdb-worker');
|
|
||||||
var url = require('url');
|
|
||||||
|
|
||||||
// logging
|
|
||||||
function info(msg) {
|
|
||||||
process.stdout.write(JSON.stringify(["log", msg]) + '\n');
|
|
||||||
}
|
|
||||||
function error(msg) {
|
|
||||||
process.stdout.write(JSON.stringify(["log", msg, {"level": "error"}]) + '\n');
|
|
||||||
}
|
|
||||||
function debug(msg) {
|
|
||||||
process.stdout.write(JSON.stringify(["log", msg, {"level": "debug"}]) + '\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
// configuration
|
|
||||||
// [httpd]
|
|
||||||
// {"bind_address": "127.0.0.1", "port": "5984"}
|
|
||||||
// [couchmagick]
|
|
||||||
// {"dbs": "myfotos"}
|
|
||||||
var config = {};
|
|
||||||
function parseConfig(data) {
|
|
||||||
debug('parsing config: ' + data);
|
|
||||||
|
|
||||||
try {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
} catch(e) {
|
|
||||||
error('Error parsing config: ' + e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// [httpd]
|
|
||||||
if (data.port) {
|
|
||||||
config.port = data.port;
|
|
||||||
}
|
|
||||||
if (data.bind_address) {
|
|
||||||
config.bind_address = data.bind_address;
|
|
||||||
}
|
|
||||||
|
|
||||||
// [couchmagick]
|
|
||||||
if (data.dbs) {
|
|
||||||
config.dbs = data.dbs.split(/,\s+/);
|
|
||||||
}
|
|
||||||
if (data.user) {
|
|
||||||
config.user = data.user;
|
|
||||||
}
|
|
||||||
if (data.password) {
|
|
||||||
config.password = data.password;
|
|
||||||
}
|
|
||||||
if (data.filter) {
|
|
||||||
config.filter = data.filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
// process function
|
|
||||||
function convert(doc, db, next) {
|
|
||||||
info('processing doc ' + doc._id + '...');
|
|
||||||
next(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
// run workers
|
|
||||||
function run(config) {
|
|
||||||
if (!config.bind_address) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!config.dbs) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
info('using config: ' + JSON.stringify(config));
|
var url = require('url');
|
||||||
|
var es = require('event-stream');
|
||||||
var server = url.format({
|
var async = require('async');
|
||||||
|
var nano = require('nano');
|
||||||
|
var magick = require('couchmagick-listen');
|
||||||
|
var daemon = require('couch-daemon');
|
||||||
|
|
||||||
|
var couchmagick = daemon(process.stdin, process.stdout, function() {
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
var noop = function() {};
|
||||||
|
|
||||||
|
couchmagick.get({
|
||||||
|
address: 'httpd.bind_address',
|
||||||
|
port: 'httpd.port',
|
||||||
|
// auth: {
|
||||||
|
// username: pkg.name + '.username',
|
||||||
|
// password: pkg.name + '.password'
|
||||||
|
// }
|
||||||
|
}, function(config) {
|
||||||
|
|
||||||
|
console.log(config);
|
||||||
|
|
||||||
|
var auth = config.auth && config.auth.username && config.auth.password ?
|
||||||
|
[config.auth.username, config.auth.password].join(':') :
|
||||||
|
null;
|
||||||
|
|
||||||
|
var couch = url.format({
|
||||||
protocol: 'http',
|
protocol: 'http',
|
||||||
hostname: config.bind_address,
|
hostname: config.address,
|
||||||
port: config.port
|
port: config.port,
|
||||||
|
auth: auth
|
||||||
});
|
});
|
||||||
debug('using server: ' + server);
|
|
||||||
|
|
||||||
var auth;
|
|
||||||
if (config.user && config.password) {
|
|
||||||
auth = {
|
|
||||||
user: config.user,
|
|
||||||
password: config.password
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var followOptions = {};
|
|
||||||
if (config.filter) {
|
|
||||||
followOptions.filter = config.filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
config.dbs.forEach(function(db) {
|
|
||||||
debug('starting worker for ' + db);
|
|
||||||
|
|
||||||
var options = {
|
|
||||||
id: pkg.name,
|
|
||||||
db: {
|
|
||||||
url: url.resolve(server, db),
|
|
||||||
auth: auth
|
|
||||||
},
|
|
||||||
follow: followOptions,
|
|
||||||
process: convert
|
|
||||||
};
|
|
||||||
|
|
||||||
debug('using worker options: ' + JSON.stringify(options));
|
|
||||||
|
|
||||||
try {
|
var options = {
|
||||||
var worker = couchdbWorker(options);
|
limit: 100,
|
||||||
|
feed: 'continuous',
|
||||||
|
timeout: 1000
|
||||||
|
};
|
||||||
|
|
||||||
worker.on('error', function(err) {
|
function listen(db, next) {
|
||||||
error('Serious error: ' + err);
|
couchmagick.info('Listening on ' + db);
|
||||||
});
|
|
||||||
|
|
||||||
worker.on('worker:complete', function(doc) {
|
var stream = magick(url.resolve(couch, db), options);
|
||||||
debug('Completed: ' + doc._id);
|
|
||||||
});
|
|
||||||
|
|
||||||
worker.on('worker:error', function(err, doc) {
|
// stream.pipe(couchmagick.info());
|
||||||
info('Error processing ' + doc._id + ' :' + err);
|
// stream.on('error', couchmagick.error().write);
|
||||||
});
|
|
||||||
|
|
||||||
worker.start();
|
stream.on('end', next);
|
||||||
} catch(e) {
|
}
|
||||||
error('Error starting worker: ' + e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = function() {
|
|
||||||
process.stdin.on('data', function(data) {
|
|
||||||
if (typeof data !== 'string') {
|
|
||||||
data = data.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
data.replace(/\s+$/, '').split(/\n+/).forEach(parseConfig);
|
|
||||||
|
|
||||||
run(config);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.stdin.on('end', function () {
|
console.log('start list dbs');
|
||||||
process.exit(0);
|
nano(couch).db.list(function(err, dbs) {
|
||||||
|
async.eachSeries(dbs, listen, function() {
|
||||||
|
couchmagick.info('done.');
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// restart on config change
|
// TODO: listen to db changes
|
||||||
process.stdout.write(JSON.stringify(["register", "httpd"]) + '\n');
|
});
|
||||||
process.stdout.write(JSON.stringify(["register", pkg.name]) + '\n');
|
|
||||||
|
|
||||||
// get config
|
|
||||||
process.stdout.write(JSON.stringify(["get", "httpd"]) + '\n');
|
|
||||||
process.stdout.write(JSON.stringify(["get", pkg.name]) + '\n');
|
|
||||||
};
|
|
||||||
|
Loading…
Reference in New Issue