fh-fhc
Version:
A Command Line Interface for FeedHenry
132 lines (119 loc) • 3.73 kB
JavaScript
// target millicore
/* globals i18n */
module.exports = target;
target.desc = i18n._("Get/Set the FeedHenry FHC Target URL");
target.usage = "fhc target"
+"\nfhc target <feedhenry-url>"
+"\nfhc target <feedhenry-url> <user>"
+"\nfhc target <feedhenry-url> <user> <password>";
var fhc = require("../../fhc");
var ini = require("../../utils/ini");
var login = require("./login.js");
var targets = require("./targets.js");
var log = require("../../utils/log");
var fhreq = require("../../utils/request");
var keys = require('../../utils/userkeys');
var async = require('async');
var util = require('util');
// Main target entry point
function target(argv, cb) {
var args = argv._;
var targ = fhc.config.get("feedhenry");
if (args.length === 0) {
if (!targ) {
return cb(undefined, i18n._("You have not targetted a domain - please target one via `fhc target <hostname>`"));
}
return cb(undefined, targ);
}
if (args.length !== 1 && args.length > 4) {
return cb(target.usage);
}
var tar = args[0];
// Check if target begins with http/https
if (tar.indexOf('http://') !== 0 && tar.indexOf('https://') !== 0) {
log.info(i18n._("No http/https given, assuming https://"));
tar = "https://" + tar;
}
async.series([
function(cb) {
// Valiate FeedHenry target can be pinged..
pingTarget(tar, function(err, data) {
if (err) {
return cb(err);
}
if (data.statusCode !== 200) {
return cb(i18n._("Invalid target: ") + tar + JSON.stringify(data));
}
return cb();
});
}
], function(err) {
if (err) {
return cb(err);
}
// TODO - suboptimal this now that we have 'targets', ini file being saved twice.. REFACTOR
log.silly(tar, "Setting new feedhenry url");
var where = ini.get("global") ? "global" : "user";
ini.set('feedhenry', tar, where);
ini.save(function(err) {
if (err) {
return cb(err);
}
if (args.length === 3) {
return login({ _ : [args[1], args[2]] }, cb);
}
// attempt to set existing target cookie..
var t = { target: tar };
if (args[1]) {
t.user = args[1];
}
log.silly(t, "Getting Target");
var targ = targets.getTarget(t);
log.silly(targ, "Got Target");
if (typeof targ === 'undefined') {
return undefinedTargCleanup(cb, tar);
}
// set username and cookie
if (targ.user) {
ini.set("username", targ.user, "user");
}
if (targ.cookie) {
ini.set("cookie", targ.cookie, "user");
}
if (targ.domain) {
ini.set("domain", targ.domain, "user");
}
if (targ[keys.KEY_ID]) {
ini.set(keys.KEY_ID, targ[keys.KEY_ID], "user");
}
ini.save(function(err) {
var message;
if (targ.user) {
message = " User: " + targ.user;
} else {
message = " API Key: " + targ[keys.KEY_ID];
}
target.message = i18n._("Successfully targeted: ") + targ.target + message;
return cb(err, targ);
});
});
});
}
function undefinedTargCleanup(cb, tar) {
ini.del("cookie");
keys.delUserApiKey();
ini.save(function(err) {
target.message = util.format(i18n._("Successfully targeted %s"), tar);
target.message += i18n._(" - now, log in.\n");
target.message += login.usage;
return cb(err, tar);
});
}
function pingTarget(targ, callback) {
fhreq.GET(targ, "/box/srv/1.1/tst/version", i18n._("error pinging target"), function(err, parsed, _, response) {
if (err) {
return callback(err);
}
return callback(err, {statusCode: response.statusCode, data: parsed});
});
}