jacc
Version:
Just Another Cloud in the Cloud
2 lines • 4.74 kB
JavaScript
/*! jacc 2014-03-13 */
(function(){var a;a=null!=a?a:this,a.create=function(){return{_commands:"[add|delete|list|update|status|help]",_dockerConnOptions:{socketPath:!1,host:"http://localhost",port:"4243"},async:require("async"),redis:require("redis"),_isset:function(a,b,c){if(null==a){if(console.log(b),void 0!==c&&c)return!1;process.exit()}return!0},_f:function(){return function(a,b,c,d){if(b)throw b;return null!==d&&d(c),a.quit()}}(this),_redis:function(a,b,c){var d;if(!b instanceof Array)throw new Error("_redis: argument not an array");return d=this.redis.createClient(),d.on("connect",function(e){return function(){switch(a){case"keys":return d.keys(b[0],function(a,b){return e._f(d,a,b,c)});case"get":return d.get(b[0],function(a,b){return e._f(d,a,b,c)});case"del":return d.del(b[0],function(a,b){return e._f(d,a,b,c)});case"rpush":return d.rpush(b[0],b[1],function(a,b){return e._f(d,a,b,c)});case"set":return d.set(b[0],b[1],function(a,b){return e._f(d,a,b,c)});case"smembers":return d.smembers(b[0],function(a,b){return e._f(d,a,b,c)});case"sadd":return d.sadd(b[0],b[1],function(a,b){return e._f(d,a,b,c)});case"lrange":return d.lrange(b[0],b[1],b[2],function(a,b){return e._f(d,a,b,c)});default:throw Error("_redis: unsuported operation")}}}(this))},_onJaccConfig:function(a,b){return this._redis("smembers",["images"],function(c){return function(d){return 0===d.length?console.log("EMPTY JACC CONFIG!"):c.async.each(d,function(b,c){return null!=b?a(b,c):void 0},function(){return null!=b?b():void 0})}}(this))},_onContainers:function(a,b){var c,d;return d={},this._containers={},c=require("docker.io")(this._dockerConnOptions),c.containers.list(d,function(e){return function(f,g){if(f)throw null!=b&&b(),f;if(0===g.length){if(null!=b)return b()}else if(e.async.each(g,function(b,e){return d={},c.containers.inspect(b.Id,d,function(b,c){if(b)throw b;return a(c),e()})},function(){return null!=b?b():void 0}),null!=b)return b()}}(this))},_listImages:function(a){return this._runningImages={},this._onContainers(function(a){return function(b){return void 0===a._runningImages[b.Image.slice(0,12)]&&(a._runningImages[b.Image.slice(0,12)]=[]),a._runningImages[b.Image.slice(0,12)].push({ID:b.ID.slice(0,12),IP:b.NetworkSettings.IPAddress})}}(this),a)},_buildHipacheConfig:function(a){return this._onJaccConfig(function(a){return function(b,c){return a._redis("get",[b],function(d){var e,f,g,h;return h=JSON.parse(d),f=h.URL,g=h.internal_port,e=h.DNS,null==a._runningImages[b]?(console.log("Image "+b+" lacks running containers"),c()):a._redis("set",[e,a._runningImages[b][0].IP],function(){var d;return d="frontend:"+f,a._redis("del",[d],function(){return a._redis("rpush",[d,b],function(){return a.async.each(a._runningImages[b],function(b,c){return a._redis("rpush",[d,"http://"+b.IP+":"+g],c)},c)})})})})}}(this),a)},update:function(){return this._listImages(function(a){return function(){return a._buildHipacheConfig()}}(this))},list:function(){return console.log("Jacc: current configuration"),this._onJaccConfig(function(a){return function(b,c){return a._redis("get",[b],function(a){return console.log(JSON.stringify(b)+" - "+JSON.stringify(a)),c()})}}(this),null)},status:function(a){return console.log("Jacc: List of running containers"),this._onContainers(function(){return function(a){return console.log("container:"+a.ID.slice(0,13)+" image:"+a.Image.slice(0,13)+" IP:"+a.NetworkSettings.IPAddress)}}(this),a)},add:function(a,b,c,d,e){return console.log("Jacc: adding "+a+" - remeber to do 'jacc update'"),this._redis("sadd",["images",a],function(f){return function(){var g;return g=[a,JSON.stringify({URL:b,internal_port:c,DNS:d})],f._redis("set",g,function(){return null!=e?e():void 0})}}(this))},"delete":function(a){var b;return console.log("Jacc: deleting "+a),b=this.redis.createClient(),b.on("connect",function(){return function(){return b.srem("images",a,function(a,c){return console.log("result - "+c),b.quit()})}}(this))},main:function(){var a;switch(a=require("optimist").usage("Usage: $0 "+this._commands).argv,this._isset(a._,"jacc requires a command - node app.js "+this._commands),a._[0]){case"add":return this.add(a._[1],a._[2],a._[3],a._[4]);case"delete":return this["delete"](a._[1]);case"update":return this.update();case"status":return this.status();case"list":return this.list();case"help":return console.log("usage: jacc "+this._commands),console.log("jacc add image URL port dns-name (exmaple: jacc add 123456789 www.example.com 80 example.local)"),console.log("jacc delete image"),console.log("jacc update"),console.log("jacc list"),console.log("jacc status"),console.log("help: show this message");default:return console.log("No such jacc command: "+a._[0]+" try jacc help!")}}}}}).call(this);