antfarm
Version:
File automation framework for ants.
114 lines (112 loc) • 15 kB
JavaScript
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var nest_1 = require("./nest");
var ftpFileJob_1 = require("./../job/ftpFileJob");
var EasyFtp = require("easy-ftp"), tmp = require("tmp"), fs = require("fs"), async = require("async");
var FtpNest = (function (_super) {
__extends(FtpNest, _super);
function FtpNest(e, host, port, username, password, checkEvery) {
_super.call(this, e, host);
this.config = {
host: host,
port: port,
username: username,
password: password
};
this.checkEvery = checkEvery;
this.checkEveryMs = this.checkEvery * 60000;
}
FtpNest.prototype.getClient = function () {
return new EasyFtp();
};
FtpNest.prototype.load = function () {
var ftp = this;
try {
var ftp_client_1 = ftp.getClient();
ftp_client_1.connect(ftp.config);
ftp_client_1.ls("/", function (err, list) {
if (err) {
ftp_client_1.close();
}
ftp.e.log(1, "FTP ls found " + list.length + " files.", ftp);
async.eachSeries(list, function (file, done) {
// Create temp file
ftp.e.log(1, "FTP found file \"" + file.name + "\".", ftp);
var job = new ftpFileJob_1.FtpFileJob(ftp.e, file.name);
// Download to the temp job location
ftp_client_1.download(file.name, job.path, function (err) {
if (err) {
ftp.e.log(3, "Download error: \"" + err + "\".", ftp);
done();
}
else {
job.locallyAvailable = true;
// Delete on success
ftp_client_1.rm(file.name, function (err) {
if (err) {
ftp.e.log(3, "Remove error: \"" + err + "\".", ftp);
}
ftp.arrive(job);
done();
});
}
});
}, function (err) {
if (err) {
ftp.e.log(3, "Async series download error: \"" + err + "\".", ftp);
}
ftp.e.log(0, "Completed " + list.length + " synchronous download(s).", ftp);
ftp_client_1.close();
});
//
// list.forEach(function (file, index) {
//
// });
});
}
catch (e) {
ftp.e.log(3, e, ftp);
}
};
FtpNest.prototype.watch = function () {
var ftp = this;
ftp.e.log(1, "Watching FTP directory.", ftp);
var count = 0;
setInterval(function () {
count++;
ftp.e.log(1, "Re-checking FTP, attempt " + count + ".", ftp);
ftp.load();
}, ftp.checkEveryMs, count);
};
FtpNest.prototype.arrive = function (job) {
_super.prototype.arrive.call(this, job);
};
FtpNest.prototype.take = function (job, callback) {
var ftp = this;
try {
var ftp_path = "/" + job.name;
var ftp_client_2 = ftp.getClient();
ftp_client_2.connect(ftp.config);
ftp_client_2.upload(job.path, ftp_path, function (err) {
if (err) {
ftp.e.log(3, "Error uploading " + job.name + " to FTP.", ftp);
}
fs.unlinkSync(job.path);
ftp_client_2.close();
var ftpJob = job;
ftpJob.locallyAvailable = false;
callback(ftpJob);
});
}
catch (e) {
ftp.e.log(3, "Take upload error, " + e, ftp);
}
};
return FtpNest;
}(nest_1.Nest));
exports.FtpNest = FtpNest;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLENBQUMsQ0FBQztZQUNULEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNMLENBQUM7SUFFTCxjQUFDO0FBQUQsQ0FqSUEsQUFpSUMsQ0FqSTRCLFdBQUksR0FpSWhDO0FBaklZLGVBQU8sVUFpSW5CLENBQUEiLCJmaWxlIjoibGliL25lc3QvZnRwTmVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5lc3QgfSBmcm9tIFwiLi9uZXN0XCI7XG5pbXBvcnQgeyBGaWxlSm9iIH0gZnJvbSBcIi4vLi4vam9iL2ZpbGVKb2JcIjtcbmltcG9ydCB7IEZ0cEZpbGVKb2IgfSBmcm9tIFwiLi8uLi9qb2IvZnRwRmlsZUpvYlwiO1xuXG5jb25zdCAgIEVhc3lGdHAgPSByZXF1aXJlKFwiZWFzeS1mdHBcIiksXG4gICAgICAgIHRtcCA9IHJlcXVpcmUoXCJ0bXBcIiksXG4gICAgICAgIGZzID0gcmVxdWlyZShcImZzXCIpLFxuICAgICAgICBhc3luYyA9IHJlcXVpcmUoXCJhc3luY1wiKTtcblxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSBcIi4uL2Vudmlyb25tZW50L2Vudmlyb25tZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBGdHBOZXN0IGV4dGVuZHMgTmVzdCB7XG5cbiAgICBwcm90ZWN0ZWQgY2xpZW50OiBhbnk7XG4gICAgcHJvdGVjdGVkIGNvbmZpZzoge307XG4gICAgcHJvdGVjdGVkIGNoZWNrRXZlcnk6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgY2hlY2tFdmVyeU1zOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihlOiBFbnZpcm9ubWVudCwgaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIsIHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGNoZWNrRXZlcnk6IG51bWJlcikge1xuICAgICAgICBzdXBlcihlLCBob3N0KTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICBwb3J0OiBwb3J0LFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jaGVja0V2ZXJ5ID0gY2hlY2tFdmVyeTtcblxuICAgICAgICB0aGlzLmNoZWNrRXZlcnlNcyA9IHRoaXMuY2hlY2tFdmVyeSAqIDYwMDAwO1xuXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFYXN5RnRwKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKSB7XG5cbiAgICAgICAgbGV0IGZ0cCA9IHRoaXM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBmdHBfY2xpZW50ID0gZnRwLmdldENsaWVudCgpO1xuICAgICAgICAgICAgZnRwX2NsaWVudC5jb25uZWN0KGZ0cC5jb25maWcpO1xuXG4gICAgICAgICAgICBmdHBfY2xpZW50LmxzKFwiL1wiLCBmdW5jdGlvbihlcnIsIGxpc3QpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZnRwX2NsaWVudC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ0cC5lLmxvZygxLCBgRlRQIGxzIGZvdW5kICR7bGlzdC5sZW5ndGh9IGZpbGVzLmAsIGZ0cCk7XG5cblxuICAgICAgICAgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMobGlzdCwgZnVuY3Rpb24gKGZpbGUsIGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRlbXAgZmlsZVxuICAgICAgICAgICAgICAgICAgICBmdHAuZS5sb2coMSwgYEZUUCBmb3VuZCBmaWxlIFwiJHtmaWxlLm5hbWV9XCIuYCwgZnRwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGpvYiA9IG5ldyBGdHBGaWxlSm9iKGZ0cC5lLCBmaWxlLm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvd25sb2FkIHRvIHRoZSB0ZW1wIGpvYiBsb2NhdGlvblxuICAgICAgICAgICAgICAgICAgICBmdHBfY2xpZW50LmRvd25sb2FkKGZpbGUubmFtZSwgam9iLnBhdGgsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZS5sb2coMywgYERvd25sb2FkIGVycm9yOiBcIiR7ZXJyfVwiLmAsIGZ0cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IubG9jYWxseUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIG9uIHN1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHBfY2xpZW50LnJtKGZpbGUubmFtZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZS5sb2coMywgYFJlbW92ZSBlcnJvcjogXCIke2Vycn1cIi5gLCBmdHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0cC5hcnJpdmUoam9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ0cC5lLmxvZygzLCBgQXN5bmMgc2VyaWVzIGRvd25sb2FkIGVycm9yOiBcIiR7ZXJyfVwiLmAsIGZ0cCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnRwLmUubG9nKDAsIGBDb21wbGV0ZWQgJHtsaXN0Lmxlbmd0aH0gc3luY2hyb25vdXMgZG93bmxvYWQocykuYCwgZnRwKTtcbiAgICAgICAgICAgICAgICAgICAgZnRwX2NsaWVudC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZnRwLmUubG9nKDMsIGUsIGZ0cCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd2F0Y2goKSB7XG4gICAgICAgIGxldCBmdHAgPSB0aGlzO1xuXG4gICAgICAgIGZ0cC5lLmxvZygxLCBcIldhdGNoaW5nIEZUUCBkaXJlY3RvcnkuXCIsIGZ0cCk7XG5cbiAgICAgICAgbGV0IGNvdW50ID0gMDtcblxuICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBmdHAuZS5sb2coMSwgYFJlLWNoZWNraW5nIEZUUCwgYXR0ZW1wdCAke2NvdW50fS5gLCBmdHApO1xuICAgICAgICAgICAgZnRwLmxvYWQoKTtcbiAgICAgICAgfSwgZnRwLmNoZWNrRXZlcnlNcywgY291bnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcnJpdmUoam9iOiBGaWxlSm9iKSB7XG4gICAgICAgIHN1cGVyLmFycml2ZShqb2IpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0YWtlKGpvYjogRmlsZUpvYiwgY2FsbGJhY2s6IGFueSkge1xuICAgICAgICBsZXQgZnRwID0gdGhpcztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZ0cF9wYXRoID0gYC8ke2pvYi5uYW1lfWA7XG5cbiAgICAgICAgICAgIGxldCBmdHBfY2xpZW50ID0gZnRwLmdldENsaWVudCgpO1xuXG4gICAgICAgICAgICBmdHBfY2xpZW50LmNvbm5lY3QoZnRwLmNvbmZpZyk7XG5cbiAgICAgICAgICAgIGZ0cF9jbGllbnQudXBsb2FkKGpvYi5wYXRoLCBmdHBfcGF0aCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZnRwLmUubG9nKDMsIGBFcnJvciB1cGxvYWRpbmcgJHtqb2IubmFtZX0gdG8gRlRQLmAsIGZ0cCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhqb2IucGF0aCk7XG4gICAgICAgICAgICAgICAgZnRwX2NsaWVudC5jbG9zZSgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGZ0cEpvYiA9IGpvYiBhcyBGdHBGaWxlSm9iO1xuICAgICAgICAgICAgICAgIGZ0cEpvYi5sb2NhbGx5QXZhaWxhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhmdHBKb2IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGZ0cC5lLmxvZygzLCBcIlRha2UgdXBsb2FkIGVycm9yLCBcIiArIGUsIGZ0cCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iXX0=