Files
portainer/dist/dockerui.js
T
2016-03-23 00:58:24 -05:00

9 lines
125 KiB
JavaScript

/*! dockerui - v0.10.0-beta - 2016-03-23
* https://github.com/crosbymichael/dockerui
* Copyright (c) 2016 Michael Crosby & Kevan Ahlquist;
* Licensed MIT
*/
function ImageViewModel(a){this.Id=a.Id,this.Tag=a.Tag,this.Repository=a.Repository,this.Created=a.Created,this.Checked=!1,this.RepoTags=a.RepoTags,this.VirtualSize=a.VirtualSize}function ContainerViewModel(a){this.Id=a.Id,this.Image=a.Image,this.Command=a.Command,this.Created=a.Created,this.SizeRw=a.SizeRw,this.Status=a.Status,this.Checked=!1,this.Names=a.Names}angular.module("dockerui",["dockerui.templates","ngRoute","dockerui.services","dockerui.filters","masthead","footer","dashboard","container","containers","containersNetwork","images","image","pullImage","startContainer","sidebar","info","builder","containerLogs","containerTop","events","stats","network","networks","volumes"]).config(["$routeProvider","$httpProvider",function(a,b){"use strict";a.when("/",{templateUrl:"app/components/dashboard/dashboard.html",controller:"DashboardController"}),a.when("/containers/",{templateUrl:"app/components/containers/containers.html",controller:"ContainersController"}),a.when("/containers/:id/",{templateUrl:"app/components/container/container.html",controller:"ContainerController"}),a.when("/containers/:id/logs/",{templateUrl:"app/components/containerLogs/containerlogs.html",controller:"ContainerLogsController"}),a.when("/containers/:id/top",{templateUrl:"app/components/containerTop/containerTop.html",controller:"ContainerTopController"}),a.when("/containers/:id/stats",{templateUrl:"app/components/stats/stats.html",controller:"StatsController"}),a.when("/containers_network",{templateUrl:"app/components/containersNetwork/containersNetwork.html",controller:"ContainersNetworkController"}),a.when("/images/",{templateUrl:"app/components/images/images.html",controller:"ImagesController"}),a.when("/images/:id*/",{templateUrl:"app/components/image/image.html",controller:"ImageController"}),a.when("/info",{templateUrl:"app/components/info/info.html",controller:"InfoController"}),a.when("/events",{templateUrl:"app/components/events/events.html",controller:"EventsController"}),a.otherwise({redirectTo:"/"}),b.interceptors.push(function(){return{response:function(a){return"string"==typeof a.data&&a.data.startsWith("Conflict.")&&$.gritter.add({title:"Error",text:a.data,time:1e4}),a}}})}]).constant("DOCKER_ENDPOINT","dockerapi").constant("DOCKER_PORT","").constant("UI_VERSION","v0.10.0-beta"),angular.module("builder",[]).controller("BuilderController",["$scope",function(a){a.template="app/components/builder/builder.html"}]),angular.module("container",[]).controller("ContainerController",["$scope","$routeParams","$location","Container","ContainerCommit","Image","Messages","ViewSpinner","$timeout",function(a,b,c,d,e,f,g,h,i){a.changes=[],a.editEnv=!1,a.editPorts=!1,a.editBinds=!1,a.newCfg={Env:[],Ports:{}};var j=function(){h.spin(),d.get({id:b.id},function(b){a.container=b,a.container.edit=!1,a.container.newContainerName=b.Name,b.Config.Env&&(a.newCfg.Env=b.Config.Env.map(function(a){return{name:a.split("=")[0],value:a.split("=")[1]}})),a.newCfg.Ports={},angular.forEach(b.Config.ExposedPorts,function(c,d){b.HostConfig.PortBindings&&d in b.HostConfig.PortBindings?a.newCfg.Ports[d]=b.HostConfig.PortBindings[d]:a.newCfg.Ports[d]=[]}),a.newCfg.Binds=[];var c={};angular.forEach(b.Config.Volumes,function(a,b){c[b]={ContPath:b,HostPath:"",ReadOnly:!1,DefaultBind:!0}}),angular.forEach(b.HostConfig.Binds,function(b,d){var e=b.split(":")[0],f=b.split(":")[1]||"",g=b.split(":").length>2&&"ro"===b.split(":")[2],h=!1;""===f&&(f=e,e=""),f in c&&(delete c[f],h=!0),a.newCfg.Binds.push({ContPath:f,HostPath:e,ReadOnly:g,DefaultBind:h})}),angular.forEach(c,function(b){a.newCfg.Binds.push(b)}),h.stop()},function(a){404===a.status?($(".detail").hide(),g.error("Not found","Container not found.")):g.error("Failure",a.data),h.stop()})};a.start=function(){h.spin(),d.start({id:a.container.Id,HostConfig:a.container.HostConfig},function(a){j(),g.send("Container started",b.id)},function(a){j(),g.error("Failure","Container failed to start."+a.data)})},a.stop=function(){h.spin(),d.stop({id:b.id},function(a){j(),g.send("Container stopped",b.id)},function(a){j(),g.error("Failure","Container failed to stop."+a.data)})},a.kill=function(){h.spin(),d.kill({id:b.id},function(a){j(),g.send("Container killed",b.id)},function(a){j(),g.error("Failure","Container failed to die."+a.data)})},a.restartEnv=function(){var i=angular.copy(a.container.Config);i.Env=a.newCfg.Env.map(function(a){return a.name+"="+a.value});var k=angular.copy(a.newCfg.Ports);angular.forEach(k,function(a,b){0===a.length&&delete k[b]});var l=[];angular.forEach(a.newCfg.Binds,function(a){if(""!==a.ContPath){var b="";""!==a.HostPath&&(b=a.HostPath+":"),b+=a.ContPath,a.ReadOnly&&(b+=":ro"),""===a.HostPath&&a.DefaultBind||l.push(b)}}),h.spin(),e.commit({id:b.id,tag:a.container.Config.Image,config:i},function(e){if("Id"in e){var h=e.Id;f.inspect({id:h},function(e){e.Config.HostConfig=angular.copy(a.container.HostConfig),e.Config.HostConfig.PortBindings=k,e.Config.HostConfig.Binds=l,"host"===e.Config.HostConfig.NetworkMode&&(e.Config.Hostname=""),d.create(e.Config,function(e){return"Id"in e?void(a.container.State.Running?d.stop({id:b.id},function(a){g.send("Container stopped",b.id),d.start({id:e.Id},function(a){c.url("/containers/"+e.Id+"/"),g.send("Container started",b.id)},function(a){j(),g.error("Failure","Container failed to start."+a.data)})},function(a){j(),g.error("Failure","Container failed to stop."+a.data)}):d.start({id:e.Id},function(a){c.url("/containers/"+e.Id+"/"),g.send("Container started",b.id)},function(a){j(),g.error("Failure","Container failed to start."+a.data)})):void g.error("Failure","Container failed to create.")},function(a){j(),g.error("Failure","Image failed to get."+a.data)})},function(a){j(),g.error("Failure","Image failed to get."+a.data)})}else j(),g.error("Failure","Container commit failed.")},function(a){j(),g.error("Failure","Container failed to commit."+a.data)})},a.commit=function(){h.spin(),e.commit({id:b.id,repo:a.container.Config.Image},function(a){j(),g.send("Container commited",b.id)},function(a){j(),g.error("Failure","Container failed to commit."+a.data)})},a.pause=function(){h.spin(),d.pause({id:b.id},function(a){j(),g.send("Container paused",b.id)},function(a){j(),g.error("Failure","Container failed to pause."+a.data)})},a.unpause=function(){h.spin(),d.unpause({id:b.id},function(a){j(),g.send("Container unpaused",b.id)},function(a){j(),g.error("Failure","Container failed to unpause."+a.data)})},a.remove=function(){h.spin(),d.remove({id:b.id},function(a){j(),c.path("/containers"),g.send("Container removed",b.id)},function(a){j(),g.error("Failure","Container failed to remove."+a.data)})},a.restart=function(){h.spin(),d.restart({id:b.id},function(a){j(),g.send("Container restarted",b.id)},function(a){j(),g.error("Failure","Container failed to restart."+a.data)})},a.hasContent=function(a){return null!==a&&void 0!==a},a.getChanges=function(){h.spin(),d.changes({id:b.id},function(b){a.changes=b,h.stop()})},a.renameContainer=function(){d.rename({id:b.id,name:a.container.newContainerName},function(c){c.name?(a.container.Name=c.name,g.send("Container renamed",b.id)):(a.container.newContainerName=a.container.Name,g.error("Failure","Container failed to rename."))}),a.container.edit=!1},a.addEntry=function(a,b){a.push(b)},a.rmEntry=function(a,b){var c=a.indexOf(b);a.splice(c,1)},a.toggleEdit=function(){a.edit=!a.edit},j(),a.getChanges()}]),angular.module("containerLogs",[]).controller("ContainerLogsController",["$scope","$routeParams","$location","$anchorScroll","ContainerLogs","Container","ViewSpinner",function(a,b,c,d,e,f,g){function h(){g.spin(),e.get(b.id,{stdout:1,stderr:0,timestamps:a.showTimestamps,tail:a.tailLines},function(b,c,d,e){b=b.replace(/[\r]/g,"\n"),b=b.substring(8),b=b.replace(/\n(.{8})/g,"\n"),a.stdout=b,g.stop()}),e.get(b.id,{stdout:0,stderr:1,timestamps:a.showTimestamps,tail:a.tailLines},function(b,c,d,e){b=b.replace(/[\r]/g,"\n"),b=b.substring(8),b=b.replace(/\n(.{8})/g,"\n"),a.stderr=b,g.stop()})}a.stdout="",a.stderr="",a.showTimestamps=!1,a.tailLines=2e3,g.spin(),f.get({id:b.id},function(b){a.container=b,g.stop()},function(a){404===a.status?Messages.error("Not found","Container not found."):Messages.error("Failure",a.data),g.stop()}),h();var i=window.setInterval(h,5e3);a.$on("$destroy",function(){clearInterval(i)}),a.scrollTo=function(a){c.hash(a),d()},a.toggleTimestamps=function(){h()},a.toggleTail=function(){h()}}]),angular.module("containerTop",[]).controller("ContainerTopController",["$scope","$routeParams","ContainerTop","Container","ViewSpinner",function(a,b,c,d,e){a.ps_args="",a.getTop=function(){e.spin(),c.get(b.id,{ps_args:a.ps_args},function(b){a.containerTop=b,e.stop()})},d.get({id:b.id},function(b){a.containerName=b.Name.substring(1)},function(a){Messages.error("Failure",a.data)}),a.getTop()}]),angular.module("containers",[]).controller("ContainersController",["$scope","Container","Settings","Messages","ViewSpinner",function(a,b,c,d,e){a.sortType="Created",a.sortReverse=!0,a.toggle=!1,a.displayAll=c.displayAll,a.order=function(b){a.sortReverse=a.sortType===b?!a.sortReverse:!1,a.sortType=b};var f=function(c){e.spin(),b.query(c,function(b){a.containers=b.map(function(a){return new ContainerViewModel(a)}),e.stop()})},g=function(g,h,i){e.spin();var j=0,k=function(){j-=1,0===j&&(e.stop(),f({all:c.displayAll?1:0}))};angular.forEach(g,function(c){c.Checked&&(h===b.start?b.get({id:c.Id},function(b){c=b,j+=1,h({id:c.Id,HostConfig:c.HostConfig||{}},function(b){d.send("Container "+i,c.Id);a.containers.indexOf(c);k()},function(a){d.error("Failure",a.data),k()})},function(a){404===a.status?($(".detail").hide(),d.error("Not found","Container not found.")):d.error("Failure",a.data),k()}):(j+=1,h({id:c.Id},function(b){d.send("Container "+i,c.Id);a.containers.indexOf(c);k()},function(a){d.error("Failure",a.data),k()})))}),0===j&&e.stop()};a.toggleSelectAll=function(){angular.forEach(a.containers,function(b){b.Checked=a.toggle})},a.toggleGetAll=function(){c.displayAll=a.displayAll,f({all:c.displayAll?1:0})},a.startAction=function(){g(a.containers,b.start,"Started")},a.stopAction=function(){g(a.containers,b.stop,"Stopped")},a.restartAction=function(){g(a.containers,b.restart,"Restarted")},a.killAction=function(){g(a.containers,b.kill,"Killed")},a.pauseAction=function(){g(a.containers,b.pause,"Paused")},a.unpauseAction=function(){g(a.containers,b.unpause,"Unpaused")},a.removeAction=function(){g(a.containers,b.remove,"Removed")},f({all:c.displayAll?1:0})}]),angular.module("containersNetwork",["ngVis"]).controller("ContainersNetworkController",["$scope","$location","Container","Messages","VisDataSet",function(a,b,c,d,f){function g(a){this.Id=a.Id,this.Name=a.Name.substring(1),this.Image=a.Config.Image,this.Running=a.State.Running;var b=a.HostConfig.Links;if(null!=b){this.Links={};for(var c=0;c<b.length;c++){var d=b[c].split(":"),e=d[0].substring(1),f=d[1].substring(d[1].lastIndexOf("/")+1);(null==this.Links[e]||f.length<this.Links[e].length)&&(this.Links[e]=f)}}var g=a.HostConfig.VolumesFrom;if(null!=g){this.VolumesFrom={};for(var h=0;h<g.length;h++)this.VolumesFrom[g[h]]=!0}}function h(){this.nodes=new f,this.edges=new f,this.addContainerNode=function(a){this.nodes.add({id:a.Id,label:a.Name,title:'<ul style="list-style-type:none; padding: 0px; margin: 0px"><li><strong>ID:</strong> '+a.Id+"</li><li><strong>Image:</strong> "+a.Image+"</li></ul>",color:a.Running?"#8888ff":"#cccccc"})},this.hasEdge=function(a,b){return this.edges.getIds({filter:function(c){return c.from===a.Id&&c.to===b.Id}}).length>0},this.addLinkEdgeIfExists=function(a,b){null==a.Links||null==a.Links[b.Name]||this.hasEdge(a,b)||this.edges.add({from:a.Id,to:b.Id,label:a.Links[b.Name]})},this.addVolumeEdgeIfExists=function(a,b){null==a.VolumesFrom||null==a.VolumesFrom[b.Id]&&null==a.VolumesFrom[b.Name]||this.hasEdge(a,b)||this.edges.add({from:a.Id,to:b.Id,color:{color:"#A0A0A0",highlight:"#A0A0A0",hover:"#848484"}})},this.removeContainersNodes=function(a){this.nodes.remove(a)}}function i(){this.data=new h,this.containers={},this.selectedContainersIds=[],this.shownContainersIds=[],this.events={select:function(b){a.network.selectedContainersIds=b.nodes,a.$apply(function(){a.query=""})},doubleClick:function(c){a.$apply(function(){b.path("/containers/"+c.nodes[0])})}},this.options={navigation:!0,keyboard:!0,height:"500px",width:"700px",nodes:{shape:"box"},edges:{style:"arrow"},physics:{barnesHut:{springLength:200}}},this.addContainer=function(a){var b=new g(a);this.containers[b.Id]=b,this.shownContainersIds.push(b.Id),this.data.addContainerNode(b);for(var c in this.containers){var d=this.containers[c];this.data.addLinkEdgeIfExists(b,d),this.data.addLinkEdgeIfExists(d,b),this.data.addVolumeEdgeIfExists(b,d),this.data.addVolumeEdgeIfExists(d,b)}},this.selectContainers=function(a){null!=this.component&&(this.selectedContainersIds=this.searchContainers(a),this.component.selectNodes(this.selectedContainersIds))},this.searchContainers=function(a){if(""===a.trim())return[];for(var b=[],c=0;c<this.shownContainersIds.length;c++){var d=this.containers[this.shownContainersIds[c]];(d.Name.indexOf(a)>-1||d.Image.indexOf(a)>-1||d.Id.indexOf(a)>-1)&&b.push(d.Id)}return b},this.hideSelected=function(){for(var b=0;b<this.shownContainersIds.length;)this.selectedContainersIds.indexOf(this.shownContainersIds[b])>-1?this.shownContainersIds.splice(b,1):b++;this.data.removeContainersNodes(this.selectedContainersIds),a.query="",this.selectedContainersIds=[]},this.searchDownstream=function(a,b){if(!(b.indexOf(a)>-1)){b.push(a);var c=this.containers[a];if(null!=c.Links||null!=c.VolumesFrom)for(var d in this.containers){var e=this.containers[d];null!=c.Links&&null!=c.Links[e.Name]?this.searchDownstream(e.Id,b):null!=c.VolumesFrom&&null!=c.VolumesFrom[e.Id]&&this.searchDownstream(e.Id,b)}}},this.updateShownContainers=function(a){for(var b in this.containers)a.indexOf(b)>-1&&-1===this.shownContainersIds.indexOf(b)?this.data.addContainerNode(this.containers[b]):-1===a.indexOf(b)&&this.shownContainersIds.indexOf(b)>-1&&this.data.removeContainersNodes(b);this.shownContainersIds=a},this.showSelectedDownstream=function(){for(var a=[],b=0;b<this.selectedContainersIds.length;b++)this.searchDownstream(this.selectedContainersIds[b],a);this.updateShownContainers(a)},this.searchUpstream=function(a,b){if(!(b.indexOf(a)>-1)){b.push(a);var c=this.containers[a];for(var d in this.containers){var e=this.containers[d];null!=e.Links&&null!=e.Links[c.Name]?this.searchUpstream(e.Id,b):null!=e.VolumesFrom&&null!=e.VolumesFrom[c.Id]&&this.searchUpstream(e.Id,b)}}},this.showSelectedUpstream=function(){for(var a=[],b=0;b<this.selectedContainersIds.length;b++)this.searchUpstream(this.selectedContainersIds[b],a);this.updateShownContainers(a)},this.showAll=function(){for(var a in this.containers)-1===this.shownContainersIds.indexOf(a)&&(this.data.addContainerNode(this.containers[a]),this.shownContainersIds.push(a))}}a.network=new i;var j=function(a){d.error("Failure",e.data)},k=function(b){a.network.addContainer(b)},l=function(a){c.query(a,function(a){for(var b=0;b<a.length;b++)c.get({id:a[b].Id},k,j)})};l({all:0}),a.includeStopped=!1,a.toggleIncludeStopped=function(){a.network.updateShownContainers([]),l({all:a.includeStopped?1:0})}}]),angular.module("dashboard",[]).controller("DashboardController",["$scope","Container","Image","Settings","LineChart",function(a,b,c,d,e){a.predicate="-Created",a.containers=[];var f=function(b){a.totalContainers=b.length,e.build("#containers-started-chart",b,function(a){return new Date(1e3*a.Created).toLocaleDateString()});var d=a;c.query({},function(a){d.totalImages=a.length,e.build("#images-created-chart",a,function(a){return new Date(1e3*a.Created).toLocaleDateString()})})},g={animation:!1};d.firstLoad&&(g.animation=!0,d.firstLoad=!1,localStorage.setItem("firstLoad",!1),$("#masthead").show(),setTimeout(function(){$("#masthead").slideUp("slow")},5e3)),b.query({all:1},function(b){for(var c=0,d=0,e=0,h=0;h<b.length;h++){var i=b[h];"Ghost"===i.Status?d+=1:-1!==i.Status.indexOf("Exit")?e+=1:(c+=1,a.containers.push(new ContainerViewModel(i)))}f(b);var j=new Chart($("#containers-chart").get(0).getContext("2d")),k=[{value:c,color:"#5bb75b",title:"Running"},{value:e,color:"#C7604C",title:"Stopped"},{value:d,color:"#E2EAE9",title:"Ghost"}];j.Doughnut(k,g);var l=$("#chart-legend").get(0);legend(l,k)})}]),angular.module("events",["ngOboe"]).controller("EventsController",["Settings","$scope","Oboe","Messages","$timeout",function(a,b,c,d,e){b.updateEvents=function(){b.dockerEvents=[];var f=a.url+"/events?";if(b.model.since){var g=Math.floor(b.model.since.getTime()/1e3);f+="since="+g+"&"}if(b.model.until){var h=Math.floor(b.model.until.getTime()/1e3);f+="until="+h}c({url:f,pattern:"{id status time}"}).then(function(a){e(function(){b.$apply()})},function(a){d.error("Failure",a.data)},function(a){b.dockerEvents.push(a)})},b.model={},b.model.since=new Date(Date.now()-864e5),b.model.until=new Date,b.updateEvents()}]),angular.module("footer",[]).controller("FooterController",["$scope","Settings","Version",function(a,b,c){a.template="app/components/footer/statusbar.html",a.uiVersion=b.uiVersion,c.get({},function(b){a.apiVersion=b.ApiVersion})}]),angular.module("image",[]).controller("ImageController",["$scope","$q","$routeParams","$location","Image","Container","Messages","LineChart",function(a,b,c,d,e,f,g,h){function i(a,b,c){var d=a.defer();return b.query({all:1,notruc:1},function(a){for(var b=[],e=0;e<a.length;e++){var f=a[e];f.ImageID===c&&b.push(new ContainerViewModel(f))}d.resolve(b)}),d.promise}function j(b){e.query({},function(c){c.forEach(function(c){c.Id===b&&"<none>:<none>"!==c.RepoTags[0]&&(a.RepoTags=c.RepoTags)})})}a.history=[],a.tagInfo={repo:"",version:"",force:!1},a.id="",a.repoTags=[],a.removeImage=function(b){e.remove({id:b},function(b){b.forEach(function(a){var b=Object.keys(a)[0];g.send(b,a[b])}),b[b.length-1].Deleted?d.path("/images"):d.path("/images/"+a.id)},function(b){a.error=b.data,$("#error-message").show()})},a.getHistory=function(){e.history({id:c.id},function(b){a.history=b})},a.addTag=function(){var b=a.tagInfo;e.tag({id:c.id,repo:b.repo,tag:b.version,force:b.force?1:0},function(b){g.send("Tag Added",c.id),d.path("/images/"+a.id)},function(b){a.error=b.data,$("#error-message").show()})},e.get({id:c.id},function(c){a.image=c,a.id=c.Id,c.RepoTags?a.RepoTags=c.RepoTags:j(a.id),i(b,f,a.id).then(function(a){h.build("#containers-started-chart",a,function(a){return new Date(1e3*a.Created).toLocaleDateString()})})},function(b){404===b.status?($(".detail").hide(),a.error="Image not found.<br />"+c.id):a.error=b.data,$("#error-message").show()}),a.getHistory()}]),angular.module("images",[]).controller("ImagesController",["$scope","Image","ViewSpinner","Messages",function(a,b,c,d){a.sortType="Created",a.sortReverse=!0,a.toggle=!1,a.order=function(b){a.sortReverse=a.sortType===b?!a.sortReverse:!1,a.sortType=b},a.showBuilder=function(){$("#build-modal").modal("show")},a.removeAction=function(){c.spin();var e=0,f=function(){e-=1,0===e&&c.stop()};angular.forEach(a.images,function(c){c.Checked&&(e+=1,b.remove({id:c.Id},function(b){angular.forEach(b,function(a){d.send("Image deleted",a.Deleted)});var e=a.images.indexOf(c);a.images.splice(e,1),f()},function(a){d.error("Failure",a.data),f()}))})},a.toggleSelectAll=function(){angular.forEach(a.images,function(b){b.Checked=a.toggle})},c.spin(),b.query({},function(b){a.images=b.map(function(a){return new ImageViewModel(a)}),c.stop()},function(a){d.error("Failure",a.data),c.stop()})}]),angular.module("info",[]).controller("InfoController",["$scope","Info","Version","Settings",function(a,b,c,d){a.info={},a.docker={},a.endpoint=d.endpoint,c.get({},function(b){a.docker=b}),b.get({},function(b){a.info=b})}]),angular.module("masthead",[]).controller("MastheadController",["$scope","Version",function(a,b){a.template="app/components/masthead/masthead.html",a.showNetworksVolumes=!1,b.get(function(b){b.ApiVersion>=1.21&&(a.showNetworksVolumes=!0)}),a.refresh=function(){location.reload()}}]),angular.module("network",[]).config(["$routeProvider",function(a){a.when("/networks/:id/",{templateUrl:"app/components/network/network.html",controller:"NetworkController"})}]).controller("NetworkController",["$scope","Network","ViewSpinner","Messages","$routeParams","$location","errorMsgFilter",function(a,b,c,d,e,f,g){a.disconnect=function(a,g){c.spin(),b.disconnect({id:e.id},{Container:g},function(a){c.stop(),d.send("Container disconnected",g),f.path("/networks/"+e.id)},function(a){c.stop(),d.error("Failure",a.data)})},a.connect=function(a,h){c.spin(),b.connect({id:e.id},{Container:h},function(a){c.stop();var b=g(a);b?d.error("Error",b):d.send("Container connected",a),f.path("/networks/"+e.id)},function(a){c.stop(),d.error("Failure",a.data)})},a.remove=function(a){c.spin(),b.remove({id:e.id},function(a){c.stop(),d.send("Network removed",a),f.path("/networks")},function(a){c.stop(),d.error("Failure",a.data)})},c.spin(),b.get({id:e.id},function(b){a.network=b,c.stop()},function(a){d.error("Failure",a.data),c.stop()})}]),angular.module("networks",[]).config(["$routeProvider",function(a){a.when("/networks/",{templateUrl:"app/components/networks/networks.html",controller:"NetworksController"})}]).controller("NetworksController",["$scope","Network","ViewSpinner","Messages","$route","errorMsgFilter",function(a,b,c,d,e,f){function g(){c.spin(),b.query({},function(b){a.networks=b,c.stop()},function(a){d.error("Failure",a.data),c.stop()})}a.sortType="Name",a.sortReverse=!0,a.toggle=!1,a.order=function(b){a.sortReverse=a.sortType===b?!a.sortReverse:!1,a.sortType=b},a.createNetworkConfig={Name:"",Driver:"",IPAM:{Config:[{Subnet:"",IPRange:"",Gateway:""}]}},a.removeAction=function(){c.spin();var e=0,f=function(){e-=1,0===e&&c.stop()};angular.forEach(a.networks,function(c){c.Checked&&(e+=1,b.remove({id:c.Id},function(b){d.send("Network deleted",c.Id);var e=a.networks.indexOf(c);a.networks.splice(e,1),f()},function(a){d.error("Failure",a.data),f()}))})},a.toggleSelectAll=function(){angular.forEach(a.networks,function(b){b.Checked=a.toggle})},a.addNetwork=function(a){c.spin(),b.create(a,function(a){a.Id?d.send("Network created",a.Id):d.error("Failure",f(a)),c.stop(),g()},function(a){d.error("Failure",a.data),c.stop()})},g()}]),angular.module("pullImage",[]).controller("PullImageController",["$scope","$log","Messages","Image","ViewSpinner",function(a,b,c,d,e){a.template="app/components/pullImage/pullImage.html",a.init=function(){a.config={registry:"",repo:"",fromImage:"",tag:"latest"}},a.init(),a.pull=function(){$("#error-message").hide();var b=angular.copy(a.config),f=(b.registry?b.registry+"/":"")+(b.repo?b.repo+"/":"")+b.fromImage+(b.tag?":"+b.tag:"");e.spin(),$("#pull-modal").modal("hide"),d.create(b,function(b){if(e.stop(),b.constructor===Array){var d=b.length>0&&b[b.length-1].hasOwnProperty("error");if(d){var g=b[b.length-1];a.error="Cannot pull image "+f+" Reason: "+g.error,$("#pull-modal").modal("show"),$("#error-message").show()}else c.send("Image Added",f),a.init()}else c.send("Image Added",f),a.init()},function(b){e.stop(),a.error="Cannot pull image "+f+" Reason: "+b.data,$("#pull-modal").modal("show"),$("#error-message").show()})}}]),angular.module("sidebar",[]).controller("SideBarController",["$scope","Container","Settings",function(a,b,c){a.template="partials/sidebar.html",a.containers=[],a.endpoint=c.endpoint,b.query({all:0},function(b){a.containers=b})}]),angular.module("startContainer",["ui.bootstrap"]).controller("StartContainerController",["$scope","$routeParams","$location","Container","Messages","containernameFilter","errorMsgFilter",function(a,b,c,d,e,f,g){function h(a,b){b.error("Error",g(a))}function i(a){for(var b in a)(null===a[b]||void 0===a[b]||""===a[b]||$.isPlainObject(a[b])&&$.isEmptyObject(a[b])||0===a[b].length)&&delete a[b]}function j(a){return a.map(function(a){return a.name})}a.template="app/components/startContainer/startcontainer.html",d.query({all:1},function(b){a.containerNames=b.map(function(a){return f(a)})}),a.config={Env:[],Labels:[],Volumes:[],SecurityOpts:[],HostConfig:{PortBindings:[],Binds:[],Links:[],Dns:[],DnsSearch:[],VolumesFrom:[],CapAdd:[],CapDrop:[],Devices:[],LxcConf:[],ExtraHosts:[]}},a.menuStatus={containerOpen:!0,hostConfigOpen:!1},a.create=function(){var f=angular.copy(a.config);f.Image=b.id,f.Cmd&&"["===f.Cmd[0]?f.Cmd=angular.fromJson(f.Cmd):f.Cmd&&(f.Cmd=f.Cmd.split(" ")),f.Env=f.Env.map(function(a){return a.name+"="+a.value});var g={};f.Labels=f.Labels.forEach(function(a){g[a.key]=a.value}),f.Labels=g,f.Volumes=j(f.Volumes),f.SecurityOpts=j(f.SecurityOpts),f.HostConfig.VolumesFrom=j(f.HostConfig.VolumesFrom),f.HostConfig.Binds=j(f.HostConfig.Binds),f.HostConfig.Links=j(f.HostConfig.Links),f.HostConfig.Dns=j(f.HostConfig.Dns),f.HostConfig.DnsSearch=j(f.HostConfig.DnsSearch),f.HostConfig.CapAdd=j(f.HostConfig.CapAdd),f.HostConfig.CapDrop=j(f.HostConfig.CapDrop),f.HostConfig.LxcConf=f.HostConfig.LxcConf.reduce(function(a,b,c){return a[b.name]=b.value,a},{}),f.HostConfig.ExtraHosts=f.HostConfig.ExtraHosts.map(function(a){return a.host+":"+a.ip});var k={},l={};f.HostConfig.PortBindings.forEach(function(a){var b=a.intPort+"/tcp";"udp"===a.protocol&&(b=a.intPort+"/udp");var c={HostIp:a.ip,HostPort:a.extPort};a.intPort?(k[b]={},b in l?l[b].push(c):l[b]=[c]):e.send("Warning","Internal port must be specified for PortBindings")}),f.ExposedPorts=k,f.HostConfig.PortBindings=l,i(f.HostConfig),i(f);var m=d,n=c;d.create(f,function(a){if(a.Id){var b=f.HostConfig||{};b.id=a.Id,m.start(b,function(b){b.id?(e.send("Container Started",a.Id),$("#create-modal").modal("hide"),n.path("/containers/"+a.Id+"/")):(h(b,e),m.remove({id:a.Id},function(){e.send("Container Removed",a.Id)}))},function(a){h(a,e)})}else h(a,e)},function(a){h(a,e)})},a.addEntry=function(a,b){a.push(b)},a.rmEntry=function(a,b){var c=a.indexOf(b);a.splice(c,1)}}]),angular.module("stats",[]).controller("StatsController",["Settings","$scope","Messages","$timeout","Container","$routeParams","humansizeFilter","$sce",function(a,b,c,d,e,f,g,h){function i(){e.stats({id:f.id},function(a){var e=Object.keys(a).map(function(b){return a[b]});return-1!==e.join("").indexOf("no such id")?void c.error("Unable to retrieve stats","Is this container running?"):(b.data=a,j(a),k(a),l(a),void(D=d(i,5e3)))},function(){c.error("Unable to retrieve stats","Is this container running?"),D=d(i,5e3)})}function j(a){A.addData([m(a)],new Date(a.read).toLocaleTimeString()),A.removeData()}function k(a){B.addData([a.memory_stats.usage],new Date(a.read).toLocaleTimeString()),B.removeData()}function l(a){a.networks&&(b.networkName=Object.keys(a.networks)[0],a.network=a.networks[b.networkName]);var c=0,d=0;(0!==E||0!==F)&&(c=a.network.rx_bytes-E,d=a.network.tx_bytes-F),E=a.network.rx_bytes,F=a.network.tx_bytes,C.addData([c,d],new Date(a.read).toLocaleTimeString()),C.removeData()}function m(a){var b=a.precpu_stats,c=a.cpu_stats,d=0,e=c.cpu_usage.total_usage-b.cpu_usage.total_usage,f=c.system_cpu_usage-b.system_cpu_usage;return f>0&&e>0&&(d=e/f*c.cpu_usage.percpu_usage.length*100),d}for(var n=[],o=[],p=[],q=[],r=[],s=[],t=[],u=0;20>u;u++)n.push(""),o.push(0),p.push(""),q.push(0),r.push(""),s.push(0),t.push(0);var v={fillColor:"rgba(151,187,205,0.5)",strokeColor:"rgba(151,187,205,1)",pointColor:"rgba(151,187,205,1)",pointStrokeColor:"#fff",data:o},w={fillColor:"rgba(151,187,205,0.5)",strokeColor:"rgba(151,187,205,1)",pointColor:"rgba(151,187,205,1)",pointStrokeColor:"#fff",data:q},x={label:"Rx Bytes",fillColor:"rgba(151,187,205,0.5)",strokeColor:"rgba(151,187,205,1)",pointColor:"rgba(151,187,205,1)",pointStrokeColor:"#fff",data:t},y={label:"Tx Bytes",fillColor:"rgba(255,180,174,0.5)",strokeColor:"rgba(255,180,174,1)",pointColor:"rgba(255,180,174,1)",pointStrokeColor:"#fff",data:s},z=[{color:"rgba(151,187,205,0.5)",title:"Rx Data"},{color:"rgba(255,180,174,0.5)",title:"Rx Data"}];legend($("#network-legend").get(0),z),Chart.defaults.global.animationSteps=30;var A=new Chart($("#cpu-stats-chart").get(0).getContext("2d")).Line({labels:n,datasets:[v]},{responsive:!0}),B=new Chart($("#memory-stats-chart").get(0).getContext("2d")).Line({labels:p,datasets:[w]},{scaleLabel:function(a){return g(parseInt(a.value,10))},responsive:!0}),C=new Chart($("#network-stats-chart").get(0).getContext("2d")).Line({labels:r,datasets:[x,y]},{scaleLabel:function(a){return g(parseInt(a.value,10))},responsive:!0});b.networkLegend=h.trustAsHtml(C.generateLegend());var D;b.$on("$destroy",function(){d.cancel(D)}),i();var E=0,F=0;e.get({id:f.id},function(a){b.containerName=a.Name.substring(1)},function(a){c.error("Failure",a.data)})}]),angular.module("volumes",[]).config(["$routeProvider",function(a){a.when("/volumes/",{templateUrl:"app/components/volumes/volumes.html",controller:"VolumesController"})}]).controller("VolumesController",["$scope","Volume","ViewSpinner","Messages","$route","errorMsgFilter",function(a,b,c,d,e,f){function g(){c.spin(),b.query({},function(b){a.volumes=b.Volumes,c.stop()},function(a){d.error("Failure",a.data),c.stop()})}a.sortType="Name",a.sortReverse=!0,a.toggle=!1,a.order=function(b){a.sortReverse=a.sortType===b?!a.sortReverse:!1,a.sortType=b},a.createVolumeConfig={Name:"",Driver:""},a.removeAction=function(){c.spin();var e=0,f=function(){e-=1,0===e&&c.stop()};angular.forEach(a.volumes,function(c){c.Checked&&(e+=1,b.remove({name:c.Name},function(b){d.send("Volume deleted",c.Name);var e=a.volumes.indexOf(c);a.volumes.splice(e,1),f()},function(a){d.error("Failure",a.data),f()}))})},a.toggleSelectAll=function(){angular.forEach(a.volumes,function(b){b.Checked=a.toggle})},a.addVolume=function(a){c.spin(),b.create(a,function(a){a.Name?d.send("Volume created",a.Name):d.error("Failure",f(a)),c.stop(),g()},function(a){d.error("Failure",a.data),c.stop()})},g()}]),angular.module("dockerui.filters",[]).filter("truncate",function(){"use strict";return function(a,b,c){return isNaN(b)&&(b=10),void 0===c&&(c="..."),a.length<=b||a.length-c.length<=b?a:String(a).substring(0,b-c.length)+c}}).filter("statusbadge",function(){"use strict";return function(a){return"Ghost"===a?"important":-1!==a.indexOf("Exit")&&"Exit 0"!==a?"warning":"success"}}).filter("getstatetext",function(){"use strict";return function(a){return void 0===a?"":a.Ghost&&a.Running?"Ghost":a.Running&&a.Paused?"Running (Paused)":a.Running?"Running":"Stopped"}}).filter("getstatelabel",function(){"use strict";return function(a){return void 0===a?"label-default":a.Ghost&&a.Running?"label-important":a.Running?"label-success":"label-default"}}).filter("humansize",function(){"use strict";return function(a){var b=["Bytes","KB","MB","GB","TB"];if(0===a)return"n/a";var c=parseInt(Math.floor(Math.log(a)/Math.log(1024)),10),d=a/Math.pow(1024,c),e=1>c?0:c-1;return d.toFixed(e)+" "+b[[c]]}}).filter("containername",function(){"use strict";return function(a){var b=a.Names[0];return b.substring(1,b.length)}}).filter("repotag",function(){"use strict";return function(a){if(a.RepoTags&&a.RepoTags.length>0){var b=a.RepoTags[0];return"<none>:<none>"===b&&(b=""),b}return""}}).filter("getdate",function(){"use strict";return function(a){var b=new Date(1e3*a);return b.toDateString()}}).filter("errorMsg",function(){return function(a){for(var b=0,c="";a[b]&&"string"==typeof a[b];)c+=a[b],b++;return c}}),angular.module("dockerui.services",["ngResource"]).factory("Container",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/containers/:id/:action",{name:"@name"},{query:{method:"GET",params:{all:0,action:"json"},isArray:!0},get:{method:"GET",params:{action:"json"}},start:{method:"POST",params:{id:"@id",action:"start"}},stop:{method:"POST",params:{id:"@id",t:5,action:"stop"}},restart:{method:"POST",params:{id:"@id",t:5,action:"restart"}},kill:{method:"POST",params:{id:"@id",action:"kill"}},pause:{method:"POST",params:{id:"@id",action:"pause"}},unpause:{method:"POST",params:{id:"@id",action:"unpause"}},changes:{
method:"GET",params:{action:"changes"},isArray:!0},create:{method:"POST",params:{action:"create"}},remove:{method:"DELETE",params:{id:"@id",v:0}},rename:{method:"POST",params:{id:"@id",action:"rename"},isArray:!1},stats:{method:"GET",params:{id:"@id",stream:!1,action:"stats"},timeout:5e3}})}]).factory("ContainerCommit",["$resource","$http","Settings",function(a,b,c){"use strict";return{commit:function(a,d){b({method:"POST",url:c.url+"/commit",params:{container:a.id,tag:a.tag||null,repo:a.repo||null},data:a.config}).success(d).error(function(a,b,c,d){console.log(error,a)})}}}]).factory("ContainerLogs",["$resource","$http","Settings",function(a,b,c){"use strict";return{get:function(a,d,e){b({method:"GET",url:c.url+"/containers/"+a+"/logs",params:{stdout:d.stdout||0,stderr:d.stderr||0,timestamps:d.timestamps||0,tail:d.tail||"all"}}).success(e).error(function(a,b,c,d){console.log(error,a)})}}}]).factory("ContainerTop",["$http","Settings",function(a,b){"use strict";return{get:function(c,d,e,f){a({method:"GET",url:b.url+"/containers/"+c+"/top",params:{ps_args:d.ps_args}}).success(e)}}}]).factory("Image",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/images/:id/:action",{},{query:{method:"GET",params:{all:0,action:"json"},isArray:!0},get:{method:"GET",params:{action:"json"}},search:{method:"GET",params:{action:"search"}},history:{method:"GET",params:{action:"history"},isArray:!0},create:{method:"POST",isArray:!0,transformResponse:[function(a){var b=a.replace(/\n/g," ").replace(/\}\W*\{/g,"}, {");return angular.fromJson("["+b+"]")}],params:{action:"create",fromImage:"@fromImage",repo:"@repo",tag:"@tag",registry:"@registry"}},insert:{method:"POST",params:{id:"@id",action:"insert"}},push:{method:"POST",params:{id:"@id",action:"push"}},tag:{method:"POST",params:{id:"@id",action:"tag",force:0,repo:"@repo",tag:"@tag"}},remove:{method:"DELETE",params:{id:"@id"},isArray:!0},inspect:{method:"GET",params:{id:"@id",action:"json"}}})}]).factory("Version",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/version",{},{get:{method:"GET"}})}]).factory("Auth",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/auth",{},{get:{method:"GET"},update:{method:"POST"}})}]).factory("Info",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/info",{},{get:{method:"GET"}})}]).factory("Network",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/networks/:id/:action",{id:"@id"},{query:{method:"GET",isArray:!0},get:{method:"GET"},create:{method:"POST",params:{action:"create"}},remove:{method:"DELETE"},connect:{method:"POST",params:{action:"connect"}},disconnect:{method:"POST",params:{action:"disconnect"}}})}]).factory("Volume",["$resource","Settings",function(a,b){"use strict";return a(b.url+"/volumes/:name/:action",{name:"@name"},{query:{method:"GET"},get:{method:"GET"},create:{method:"POST",params:{action:"create"}},remove:{method:"DELETE"}})}]).factory("Settings",["DOCKER_ENDPOINT","DOCKER_PORT","UI_VERSION",function(a,b,c){"use strict";var d=a;b&&(d=d+b+"\\"+b);var e="true"===(localStorage.getItem("firstLoad")||"true");return{displayAll:!1,endpoint:a,uiVersion:c,url:d,firstLoad:e}}]).factory("ViewSpinner",function(){"use strict";var a=new Spinner,b=document.getElementById("view");return{spin:function(){a.spin(b)},stop:function(){a.stop()}}}).factory("Messages",["$rootScope",function(a){"use strict";return{send:function(a,b){$.gritter.add({title:a,text:b,time:2e3,before_open:function(){return 3===$(".gritter-item-wrapper").length?!1:void 0}})},error:function(a,b){$.gritter.add({title:a,text:b,time:1e4,before_open:function(){return 4===$(".gritter-item-wrapper").length?!1:void 0}})}}}]).factory("LineChart",["Settings",function(a){"use strict";return{build:function(a,b,c){for(var d=new Chart($(a).get(0).getContext("2d")),e={},f=0;f<b.length;f++){var g=b[f],h=c(g),i=e[h];void 0===i&&(i=0),i+=1,e[h]=i}var j=[];b=[];var k=Object.keys(e),l=1;for(f=k.length-1;f>-1;f--){var m=k[f];j.push(m),b.push(e[m]),e[m]>l&&(l=e[m])}var n=Math.min(l,10),o={fillColor:"rgba(151,187,205,0.5)",strokeColor:"rgba(151,187,205,1)",pointColor:"rgba(151,187,205,1)",pointStrokeColor:"#fff",data:b};d.Line({labels:j,datasets:[o]},{scaleStepWidth:Math.ceil(l/n),pointDotRadius:1,scaleIntegersOnly:!0,scaleOverride:!0,scaleSteps:n})}}}]),angular.module("dockerui.templates",["app/components/builder/builder.html","app/components/container/container.html","app/components/containerLogs/containerlogs.html","app/components/containerTop/containerTop.html","app/components/containers/containers.html","app/components/containersNetwork/containersNetwork.html","app/components/dashboard/dashboard.html","app/components/events/events.html","app/components/footer/statusbar.html","app/components/image/image.html","app/components/images/images.html","app/components/info/info.html","app/components/masthead/masthead.html","app/components/network/network.html","app/components/networks/networks.html","app/components/pullImage/pullImage.html","app/components/sidebar/sidebar.html","app/components/startContainer/startcontainer.html","app/components/stats/stats.html","app/components/volumes/volumes.html"]),angular.module("app/components/builder/builder.html",[]).run(["$templateCache",function(a){a.put("app/components/builder/builder.html",'<div id="build-modal" class="modal fade">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n <h3>Build Image</h3>\n </div>\n <div class="modal-body">\n <div id="editor"></div>\n <p>{{ messages }}</p>\n </div>\n <div class="modal-footer">\n <a href="" class="btn btn-primary" ng-click="build()">Build</a>\n </div>\n </div>\n </div>\n</div>\n')}]),angular.module("app/components/container/container.html",[]).run(["$templateCache",function(a){a.put("app/components/container/container.html",'<div class="detail">\n\n <div ng-if="!container.edit">\n <h4>Container: {{ container.Name }}\n <button class="btn btn-primary"\n ng-click="container.edit = true;">Rename\n </button>\n </h4>\n </div>\n <div ng-if="container.edit">\n <h4>\n Container:\n <input type="text" ng-model="container.newContainerName">\n <button class="btn btn-success"\n ng-click="renameContainer()">Save\n </button>\n <button class="btn btn-danger"\n ng-click="container.edit = false;">&times;</button>\n </h4>\n </div>\n\n <div class="btn-group detail">\n <button class="btn btn-success"\n ng-click="start()"\n ng-show="!container.State.Running">Start\n </button>\n <button class="btn btn-warning"\n ng-click="stop()"\n ng-show="container.State.Running && !container.State.Paused">Stop\n </button>\n <button class="btn btn-danger"\n ng-click="kill()"\n ng-show="container.State.Running && !container.State.Paused">Kill\n </button>\n <button class="btn btn-info"\n ng-click="pause()"\n ng-show="container.State.Running && !container.State.Paused">Pause\n </button>\n <button class="btn btn-success"\n ng-click="unpause()"\n ng-show="container.State.Running && container.State.Paused">Unpause\n </button>\n <button class="btn btn-success"\n ng-click="restart()"\n ng-show="container.State.Running && !container.State.Stopped">Restart\n </button>\n <button class="btn btn-primary"\n ng-click="commit()">Commit\n </button>\n </div>\n\n <table class="table table-striped">\n <tbody>\n <tr>\n <td>Created:</td>\n <td>{{ container.Created | date: \'medium\' }}</td>\n </tr>\n <tr>\n <td>Path:</td>\n <td>{{ container.Path }}</td>\n </tr>\n <tr>\n <td>Args:</td>\n <td>\n <pre>{{ container.Args.join(\' \') || \'None\' }}</pre>\n </td>\n </tr>\n <tr>\n <td>Exposed Ports:</td>\n <td>\n <ul>\n <li ng-repeat="(k, v) in container.Config.ExposedPorts">{{ k }}</li>\n </ul>\n </td>\n </tr>\n <tr>\n <td>Environment:</td>\n <td>\n <div ng-show="!editEnv">\n <button class="btn btn-default btn-xs pull-right" ng-click="editEnv = true"><i class="glyphicon glyphicon-pencil"></i></button>\n <ul>\n <li ng-repeat="k in container.Config.Env">{{ k }}</li>\n </ul>\n </div>\n <div class="form-group" ng-show="editEnv">\n <label>Env:</label>\n\n <div ng-repeat="envar in newCfg.Env">\n <div class="form-group form-inline">\n <div class="form-group">\n <label class="sr-only">Variable Name:</label>\n <input type="text" ng-model="envar.name" class="form-control input-sm"\n placeholder="NAME"/>\n </div>\n <div class="form-group">\n <label class="sr-only">Variable Value:</label>\n <input type="text" ng-model="envar.value" class="form-control input-sm" style="width: 400px"\n placeholder="value"/>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-sm input-sm form-control"\n ng-click="rmEntry(newCfg.Env, envar)"><i class="glyphicon glyphicon-remove"></i>\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(newCfg.Env, {name: \'\', value: \'\'})"><i class="glyphicon glyphicon-plus"></i> Add\n </button>\n <button class="btn btn-primary btn-sm"\n ng-click="restartEnv()"\n ng-show="!container.State.Restarting">Commit and restart</button>\n </div>\n\n\n </td>\n </tr>\n <tr>\n <td>Labels:</td>\n <td>\n <table role="table" class="table">\n <tr>\n <th>Key</th>\n <th>Value</th>\n </tr>\n <tr ng-repeat="(k, v) in container.Config.Labels">\n <td>{{ k }}</td>\n <td>{{ v }}</td>\n </tr>\n </table>\n </td>\n </tr>\n\n <tr>\n <td>Publish All:</td>\n <td>{{ container.HostConfig.PublishAllPorts }}</td>\n </tr>\n <tr>\n <td>Ports:</td>\n <td>\n <div ng-show="!editPorts">\n <button class="btn btn-default btn-xs pull-right" ng-click="editPorts = true"><i class="glyphicon glyphicon-pencil"></i></button>\n <ul>\n <li ng-repeat="(containerport, hostports) in container.NetworkSettings.Ports">\n {{ containerport }} =>\n <span class="label label-default" style="margin-right: 5px;" ng-repeat="(k,v) in hostports">{{ v.HostIp }}:{{ v.HostPort }}</span>\n </li>\n </ul>\n </div>\n <div ng-show="editPorts">\n <div ng-repeat="(containerport, hostports) in newCfg.Ports" style="margin-bottom: 5px;">\n <label>{{ containerport }}</label>\n <div style="margin-left: 20px;">\n <div ng-repeat="(k,v) in hostports" class="form-group form-inline">\n <div class="form-group">\n <input type="text" ng-model="v.HostIp" class="form-control input-sm" placeholder="IP address, ex. 0.0.0.0" />\n </div>\n <div class="form-group">\n <input type="text" ng-model="v.HostPort" class="form-control input-sm"\n placeholder="Port" />\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-sm input-sm form-control"\n ng-click="rmEntry(hostports, v)"><i class="glyphicon glyphicon-remove"></i>\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(hostports, {HostIp: \'0.0.0.0\', HostPort: \'\'})"><i class="glyphicon glyphicon-plus"></i> Add\n </button>\n </div>\n <button class="btn btn-primary btn-sm"\n ng-click="restartEnv()"\n ng-show="!container.State.Restarting">Commit and restart</button>\n </div>\n </td>\n\n </tr>\n <tr>\n <td>Hostname:</td>\n <td>{{ container.Config.Hostname }}</td>\n </tr>\n <tr>\n <td>IPAddress:</td>\n <td>{{ container.NetworkSettings.IPAddress }}</td>\n </tr>\n <tr>\n <td>Cmd:</td>\n <td>{{ container.Config.Cmd }}</td>\n </tr>\n <tr>\n <td>Entrypoint:</td>\n <td>\n <pre>{{ container.Config.Entrypoint.join(\' \') }}</pre>\n </td>\n </tr>\n <tr>\n <td>Bindings:</td>\n <td>\n <div ng-show="!editBinds">\n <button class="btn btn-default btn-xs pull-right" ng-click="editBinds = true"><i class="glyphicon glyphicon-pencil"></i></button>\n\n <ul>\n <li ng-repeat="b in container.HostConfig.Binds">{{ b }}</li>\n </ul>\n </div>\n <div ng-show="editBinds">\n <div ng-repeat="(vol, b) in newCfg.Binds" class="form-group form-inline">\n <div class="form-group">\n <input type="text" ng-model="b.HostPath" class="form-control input-sm"\n placeholder="Host path or volume name" style="width: 250px;" />\n </div>\n <div class="form-group">\n <input type="text" ng-model="b.ContPath" ng-readonly="b.DefaultBind" class="form-control input-sm" placeholder="Container path" />\n </div>\n <div class="form-group">\n <label><input type="checkbox" ng-model="b.ReadOnly" /> read only</label>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-sm input-sm form-control"\n ng-click="rmEntry(newCfg.Binds, b)"><i class="glyphicon glyphicon-remove"></i>\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(newCfg.Binds, { ContPath: \'\', HostPath: \'\', ReadOnly: false, DefaultBind: false })"><i class="glyphicon glyphicon-plus"></i> Add\n </button>\n <button class="btn btn-primary btn-sm"\n ng-click="restartEnv()"\n ng-show="!container.State.Restarting">Commit and restart</button>\n\n </div>\n </td>\n </tr>\n <tr>\n <td>Volumes:</td>\n <td>{{ container.Volumes }}</td>\n </tr>\n\n <tr>\n <td>SysInitpath:</td>\n <td>{{ container.SysInitPath }}</td>\n </tr>\n <tr>\n <td>Image:</td>\n <td><a href="#/images/{{ container.Image }}/">{{ container.Image }}</a></td>\n </tr>\n <tr>\n <td>State:</td>\n <td>\n <accordion close-others="true">\n <accordion-group heading="{{ container.State|getstatetext }}">\n <ul>\n <li ng-repeat="(key, val) in container.State">{{key}} : {{ val }}</li>\n </ul>\n </accordion-group>\n </accordion>\n </td>\n </tr>\n <tr>\n <td>Logs:</td>\n <td><a href="#/containers/{{ container.Id }}/logs">stdout/stderr</a></td>\n </tr>\n <tr>\n <td>Stats:</td>\n <td><a href="#/containers/{{ container.Id }}/stats">stats</a></td>\n </tr>\n <tr>\n <td>Top:</td>\n <td><a href="#/containers/{{ container.Id }}/top">Top</a></td>\n </tr>\n </tbody>\n </table>\n\n <div class="row-fluid">\n <div class="span1">\n Changes:\n </div>\n <div class="span5">\n <i class="icon-refresh" style="width:32px;height:32px;" ng-click="getChanges()"></i>\n </div>\n </div>\n\n <div class="well well-large">\n <ul>\n <li ng-repeat="change in changes | filter:hasContent">\n <strong>{{ change.Path }}</strong> {{ change.Kind }}\n </li>\n </ul>\n </div>\n\n <hr/>\n\n <div class="btn-remove">\n <button class="btn btn-large btn-block btn-primary btn-danger" ng-click="remove()">Remove Container</button>\n </div>\n</div>\n')}]),angular.module("app/components/containerLogs/containerlogs.html",[]).run(["$templateCache",function(a){a.put("app/components/containerLogs/containerlogs.html",'<div class="row logs">\n <div class="col-xs-12">\n <h4>Logs for container: <a href="#/containers/{{ container.Id }}/">{{ container.Name }}</a></td></h4>\n\n <div class="btn-group detail">\n <button class="btn btn-info" ng-click="scrollTo(\'stdout\')">stdout</button>\n <button class="btn btn-warning" ng-click="scrollTo(\'stderr\')">stderr</button>\n </div>\n <div class="pull-right col-xs-6">\n <div class="col-xs-6">\n <a class="btn btn-primary" ng-click="toggleTail()" role="button">Reload logs</a>\n <input id="tailLines" type="number" ng-style="{width: \'45px\'}"\n ng-model="tailLines" ng-keypress="($event.which === 13)? toggleTail() : 0"/>\n <label for="tailLines">lines</label>\n </div>\n <div class="col-xs-4">\n <input id="timestampToggle" type="checkbox" ng-model="showTimestamps"\n ng-change="toggleTimestamps()"/> <label for="timestampToggle">Timestamps</label>\n </div>\n </div>\n </div>\n\n <div class="col-xs-12">\n <div class="panel panel-default">\n <div class="panel-heading">\n <h3 id="stdout" class="panel-title">STDOUT</h3>\n </div>\n <div class="panel-body">\n <pre id="stdoutLog" class="pre-scrollable pre-x-scrollable">{{stdout}}</pre>\n </div>\n </div>\n </div>\n <div class="col-xs-12">\n <div class="panel panel-default">\n <div class="panel-heading">\n <h3 id="stderr" class="panel-title">STDERR</h3>\n </div>\n <div class="panel-body">\n <pre id="stderrLog" class="pre-scrollable pre-x-scrollable">{{stderr}}</pre>\n </div>\n </div>\n </div>\n</div>\n')}]),angular.module("app/components/containerTop/containerTop.html",[]).run(["$templateCache",function(a){a.put("app/components/containerTop/containerTop.html",'<div class="containerTop">\n <div class="row">\n <div class="col-xs-12">\n <h1>Top for: {{ containerName }}</h1>\n </div>\n </div>\n <div class="row">\n <div class="form-group col-xs-2">\n <input type="text" class="form-control" placeholder="[options] (aux)" ng-model="ps_args">\n </div>\n <button type="button" class="btn btn-default" ng-click="getTop()">Submit</button>\n </div>\n <div class="row">\n <div class="col-xs-12">\n <table class="table table-striped">\n <thead>\n <tr>\n <th ng-repeat="title in containerTop.Titles">{{title}}</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="processInfos in containerTop.Processes">\n <td ng-repeat="processInfo in processInfos track by $index">{{processInfo}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>')}]),angular.module("app/components/containers/containers.html",[]).run(["$templateCache",function(a){a.put("app/components/containers/containers.html",'\n<h2>Containers:</h2>\n\n<div>\n <ul class="nav nav-pills pull-left">\n <li class="dropdown">\n <a class="dropdown-toggle" id="drop4" role="button" data-toggle="dropdown" data-target="#">Actions <b class="caret"></b></a>\n <ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="drop4">\n <li><a tabindex="-1" href="" ng-click="startAction()">Start</a></li>\n <li><a tabindex="-1" href="" ng-click="stopAction()">Stop</a></li>\n <li><a tabindex="-1" href="" ng-click="restartAction()">Restart</a></li>\n <li><a tabindex="-1" href="" ng-click="killAction()">Kill</a></li>\n <li><a tabindex="-1" href="" ng-click="pauseAction()">Pause</a></li>\n <li><a tabindex="-1" href="" ng-click="unpauseAction()">Unpause</a></li>\n <li><a tabindex="-1" href="" ng-click="removeAction()">Remove</a></li>\n </ul>\n </li>\n </ul>\n\n <div class="pull-right form-inline">\n <input type="checkbox" ng-model="displayAll" id="displayAll" ng-change="toggleGetAll()"/> <label for="displayAll">Display All</label>&nbsp;\n <input type="text" class="form-control" style="vertical-align: center" id="filter" placeholder="Filter" ng-model="filter"/> <label class="sr-only" for="filter">Filter</label>\n </div>\n</div>\n<table class="table table-striped">\n <thead>\n <tr>\n <th><label><input type="checkbox" ng-model="toggle" ng-change="toggleSelectAll()" /> Select</label></th>\n <th>\n <a href="#/containers/" ng-click="order(\'Names\')">\n Name\n <span ng-show="sortType == \'Names\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Names\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/containers/" ng-click="order(\'Image\')">\n Image\n <span ng-show="sortType == \'Image\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Image\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/containers/" ng-click="order(\'Command\')">\n Command\n <span ng-show="sortType == \'Command\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Command\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/containers/" ng-click="order(\'Created\')">\n Created\n <span ng-show="sortType == \'Created\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Created\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/containers/" ng-click="order(\'Status\')">\n Status\n <span ng-show="sortType == \'Status\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Status\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="container in containers | filter:filter | orderBy:sortType:sortReverse">\n <td><input type="checkbox" ng-model="container.Checked" /></td>\n <td><a href="#/containers/{{ container.Id }}/">{{ container|containername}}</a></td>\n <td><a href="#/images/{{ container.Image }}/">{{ container.Image }}</a></td>\n <td>{{ container.Command|truncate:40 }}</td>\n <td>{{ container.Created|getdate }}</td>\n <td><span class="label label-{{ container.Status|statusbadge }}">{{ container.Status }}</span></td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("app/components/containersNetwork/containersNetwork.html",[]).run(["$templateCache",function(a){a.put("app/components/containersNetwork/containersNetwork.html",'<div class="detail">\n <h2>Containers Network</h2>\n\n <div class="row">\n <div class="input-group">\n <input type="text" ng-model="query" autofocus="true" class="form-control"\n placeholder="Search" ng-change="network.selectContainers(query)"/>\n <span class="input-group-addon"><span class="glyphicon glyphicon-search"/></span>\n </div>\n </div>\n <div class="row">\n <div class="btn-group">\n <button class="btn btn-warning" ng-click="network.hideSelected()">Hide Selected</button>\n <button class="btn btn-info" ng-click="network.showSelectedDownstream()">Show Selected Downstream</button>\n <button class="btn btn-info" ng-click="network.showSelectedUpstream()">Show Selected Upstream</button>\n <button class="btn btn-success" ng-click="network.showAll()">Show All</button>\n </div>\n <input type="checkbox" ng-model="includeStopped" id="includeStopped" ng-change="toggleIncludeStopped()"/> <label\n for="includeStopped">Include stopped containers</label>\n </div>\n <div class="row">\n <vis-network data="network.data" options="network.options" events="network.events"\n component="network.component"/>\n </div>\n</div>\n')}]),angular.module("app/components/dashboard/dashboard.html",[]).run(["$templateCache",function(a){a.put("app/components/dashboard/dashboard.html",'<div class="col-xs-offset-1">\n <!--<div class="sidebar span4">\n <div ng-include="template" ng-controller="SideBarController"></div>\n </div>-->\n <div class="row">\n <div class="col-xs-10" id="masthead" style="display:none">\n <div class="jumbotron">\n <h1>DockerUI</h1>\n\n <p class="lead">The UI for Docker container engine</p>\n <a class="btn btn-large btn-success" href="http://docker.io">Learn more.</a>\n </div>\n </div>\n </div>\n\n <div class="row">\n <div class="col-xs-10">\n <div class="col-xs-5">\n <h3>Running Containers</h3>\n <ul>\n <li ng-repeat="container in containers|orderBy:predicate">\n <a href="#/containers/{{ container.Id }}/">{{ container|containername }}</a>\n <span class="label label-{{ container.Status|statusbadge }}">{{ container.Status }}</span>\n </li>\n </ul>\n </div>\n <div class="col-xs-5 text-right">\n <h3>Status</h3>\n <canvas id="containers-chart" class="pull-right">\n <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a\n href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>\n </canvas>\n <div id="chart-legend"></div>\n </div>\n </div>\n </div>\n\n <div class="row">\n <div class="col-xs-10" id="stats">\n <h4>Containers created</h4>\n <canvas id="containers-started-chart" width="700">\n <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a\n href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>\n </canvas>\n <h4>Images created</h4>\n <canvas id="images-created-chart" width="700">\n <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a\n href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>\n </canvas>\n </div>\n </div>\n</div>\n')}]),angular.module("app/components/events/events.html",[]).run(["$templateCache",function(a){a.put("app/components/events/events.html",'<div class="row">\n <div class="col-xs-12">\n <h2>Events</h2>\n\n <form class="form-inline">\n <div class="form-group">\n <label for="since">Since:</label>\n <input id="since" type="datetime-local" ng-model="model.since" class="form-control" step="any"/>\n </div>\n <div class="form-group">\n <label for="until">Until:</label>\n <input id="until" type="datetime-local" ng-model="model.until" class="form-control" step="any"/>\n </div>\n <button ng-click="updateEvents()" class="btn btn-primary">Update</button>\n </form>\n <br>\n <table class="table">\n <tbody>\n <tr>\n <th>Event</th>\n <th>From</th>\n <th>ID</th>\n <th>Time</th>\n </tr>\n <tr ng-repeat="event in dockerEvents">\n <td ng-bind="event.status"/>\n <td ng-bind="event.from"/>\n <td ng-bind="event.id"/>\n <td ng-bind="event.time * 1000 | date:\'medium\'"/>\n </tr>\n </tbody>\n </table>\n </div>\n</div>\n')}]),angular.module("app/components/footer/statusbar.html",[]).run(["$templateCache",function(a){a.put("app/components/footer/statusbar.html",'<footer class="center well">\n <p>\n <small>Docker API Version: <strong>{{ apiVersion }}</strong> UI Version: <strong>{{ uiVersion }}</strong> <a\n class="pull-right" href="https://github.com/crosbymichael/dockerui">dockerui</a></small>\n </p>\n</footer>\n');
}]),angular.module("app/components/image/image.html",[]).run(["$templateCache",function(a){a.put("app/components/image/image.html",'<div ng-include="template" ng-controller="StartContainerController"></div>\n\n<div class="alert alert-error" id="error-message" style="display:none">\n {{ error }}\n</div>\n\n<div class="detail">\n\n <h4>Image: {{ id }}</h4>\n\n <div class="btn-group detail">\n <button class="btn btn-success" data-toggle="modal" data-target="#create-modal">Start Container</button>\n </div>\n\n <div>\n <h4>Containers created:</h4>\n <canvas id="containers-started-chart" width="750">\n <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a\n href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>\n </canvas>\n </div>\n\n <table class="table table-striped">\n <tbody>\n <tr>\n <td>Tags:</td>\n <td>\n <ul>\n <li ng-repeat="tag in RepoTags">{{ tag }}\n <button ng-click="removeImage(tag)" class="btn btn-sm btn-danger">Remove tag</button>\n </li>\n </ul>\n </td>\n </tr>\n <tr>\n <td>Created:</td>\n <td>{{ image.Created | date: \'medium\'}}</td>\n </tr>\n <tr>\n <td>Parent:</td>\n <td><a href="#/images/{{ image.Parent }}/">{{ image.Parent }}</a></td>\n </tr>\n <tr>\n <td>Size (Virtual Size):</td>\n <td>{{ image.Size|humansize }} ({{ image.VirtualSize|humansize }})</td>\n </tr>\n\n <tr>\n <td>Hostname:</td>\n <td>{{ image.ContainerConfig.Hostname }}</td>\n </tr>\n <tr>\n <td>User:</td>\n <td>{{ image.ContainerConfig.User }}</td>\n </tr>\n <tr>\n <td>Cmd:</td>\n <td>{{ image.ContainerConfig.Cmd }}</td>\n </tr>\n <tr>\n <td>Volumes:</td>\n <td>{{ image.ContainerConfig.Volumes }}</td>\n </tr>\n <tr>\n <td>Volumes from:</td>\n <td>{{ image.ContainerConfig.VolumesFrom }}</td>\n </tr>\n <tr>\n <td>Built with:</td>\n <td>Docker {{ image.DockerVersion }} on {{ image.Os}}, {{ image.Architecture }}</td>\n </tr>\n\n </tbody>\n </table>\n\n <div class="row-fluid">\n <div class="span1">\n History:\n </div>\n <div class="span5">\n <i class="icon-refresh" style="width:32px;height:32px;" ng-click="getHistory()"></i>\n </div>\n </div>\n\n <div class="well well-large">\n <ul>\n <li ng-repeat="change in history">\n <strong>{{ change.Id }}</strong>: Created: {{ change.Created|getdate }} Created by: {{ change.CreatedBy\n }}\n </li>\n </ul>\n </div>\n\n <hr/>\n\n <div class="row-fluid">\n <form class="form-inline" role="form">\n <fieldset>\n <legend>Tag image</legend>\n <div class="form-group">\n <label>Tag:</label>\n <input type="text" placeholder="repo" ng-model="tagInfo.repo" class="form-control">\n <input type="text" placeholder="version" ng-model="tagInfo.version" class="form-control">\n </div>\n <div class="form-group">\n <label class="checkbox">\n <input type="checkbox" ng-model="tagInfo.force" class="form-control"/> Force?\n </label>\n </div>\n <input type="button" ng-click="addTag()" value="Add Tag" class="btn btn-primary"/>\n </fieldset>\n </form>\n </div>\n\n <hr/>\n\n <div class="btn-remove">\n <button class="btn btn-large btn-block btn-primary btn-danger" ng-click="removeImage(id)">Remove Image</button>\n </div>\n</div>\n')}]),angular.module("app/components/images/images.html",[]).run(["$templateCache",function(a){a.put("app/components/images/images.html",'<div ng-include="template" ng-controller="BuilderController"></div>\n<div ng-include="template" ng-controller="PullImageController"></div>\n\n<h2>Images:</h2>\n\n<div>\n <ul class="nav nav-pills pull-left">\n <li class="dropdown">\n <a class="dropdown-toggle" id="drop4" role="button" data-toggle="dropdown" data-target="#">Actions <b class="caret"></b></a>\n <ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="drop4">\n <li><a tabindex="-1" href="" ng-click="removeAction()">Remove</a></li>\n </ul>\n </li>\n <li><a data-toggle="modal" data-target="#pull-modal" href="">Pull</a></li>\n </ul>\n\n <div class="pull-right form-inline">\n <input type="text" class="form-control" id="filter" placeholder="Filter" ng-model="filter"/> <label class="sr-only" for="filter">Filter</label>\n </div>\n</div>\n<table class="table table-striped">\n <thead>\n <tr>\n <th><label><input type="checkbox" ng-model="toggle" ng-change="toggleSelectAll()" /> Select</label></th>\n <th>\n <a href="#/images/" ng-click="order(\'Id\')">\n Id\n <span ng-show="sortType == \'Id\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Id\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/images/" ng-click="order(\'RepoTags\')">\n Repository\n <span ng-show="sortType == \'RepoTags\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'RepoTags\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/images/" ng-click="order(\'VirtualSize\')">\n VirtualSize\n <span ng-show="sortType == \'VirtualSize\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'VirtualSize\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/images/" ng-click="order(\'Created\')">\n Created\n <span ng-show="sortType == \'Created\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Created\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="image in images | filter:filter | orderBy:sortType:sortReverse">\n <td><input type="checkbox" ng-model="image.Checked" /></td>\n <td><a href="#/images/{{ image.Id }}/?tag={{ image|repotag }}">{{ image.Id|truncate:20}}</a></td>\n <td>{{ image|repotag }}</td>\n <td>{{ image.VirtualSize|humansize }}</td>\n <td>{{ image.Created|getdate }}</td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("app/components/info/info.html",[]).run(["$templateCache",function(a){a.put("app/components/info/info.html",'<div class="detail">\n <h2>Docker Information</h2>\n\n <div>\n <p class="lead">\n <strong>API Endpoint: </strong>{{ endpoint }}<br/>\n <strong>API Version: </strong>{{ docker.ApiVersion }}<br/>\n <strong>Docker version: </strong>{{ docker.Version }}<br/>\n <strong>Git Commit: </strong>{{ docker.GitCommit }}<br/>\n <strong>Go Version: </strong>{{ docker.GoVersion }}<br/>\n </p>\n </div>\n\n <table class="table table-striped">\n <tbody>\n <tr>\n <td>Containers:</td>\n <td>{{ info.Containers }}</td>\n </tr>\n <tr>\n <td>Images:</td>\n <td>{{ info.Images }}</td>\n </tr>\n <tr>\n <td>Debug:</td>\n <td>{{ info.Debug }}</td>\n </tr>\n <tr>\n <td>CPUs:</td>\n <td>{{ info.NCPU }}</td>\n </tr>\n <tr>\n <td>Total Memory:</td>\n <td>{{ info.MemTotal|humansize }}</td>\n </tr>\n <tr>\n <td>Operating System:</td>\n <td>{{ info.OperatingSystem }}</td>\n </tr>\n <tr>\n <td>Kernel Version:</td>\n <td>{{ info.KernelVersion }}</td>\n </tr>\n <tr>\n <td>ID:</td>\n <td>{{ info.ID }}</td>\n </tr>\n <tr>\n <td>Labels:</td>\n <td>{{ info.Labels }}</td>\n </tr>\n <tr>\n <td>File Descriptors:</td>\n <td>{{ info.NFd }}</td>\n </tr>\n <tr>\n <td>Goroutines:</td>\n <td>{{ info.NGoroutines }}</td>\n </tr>\n <tr>\n <td>Storage Driver:</td>\n <td>{{ info.Driver }}</td>\n </tr>\n <tr>\n <td>Storage Driver Status:</td>\n <td>\n <p ng-repeat="val in info.DriverStatus">\n {{ val[0] }}: {{ val[1] }}\n </p>\n </td>\n </tr>\n <tr>\n <td>Execution Driver:</td>\n <td>{{ info.ExecutionDriver }}</td>\n </tr>\n <tr>\n <td>Events:</td>\n <td><a href="#/events">Events</a></td>\n </tr>\n <tr>\n <td>IPv4 Forwarding:</td>\n <td>{{ info.IPv4Forwarding }}</td>\n </tr>\n <tr>\n <td>Index Server Address:</td>\n <td>{{ info.IndexServerAddress }}</td>\n </tr>\n <tr>\n <td>Init Path:</td>\n <td>{{ info.InitPath }}</td>\n </tr>\n <tr>\n <td>Docker Root Directory:</td>\n <td>{{ info.DockerRootDir }}</td>\n </tr>\n <tr>\n <td>Init SHA1</td>\n <td>{{ info.InitSha1 }}</td>\n </tr>\n <tr>\n <td>Memory Limit:</td>\n <td>{{ info.MemoryLimit }}</td>\n </tr>\n <tr>\n <td>Swap Limit:</td>\n <td>{{ info.SwapLimit }}</td>\n </tr>\n </tbody>\n </table>\n</div>\n')}]),angular.module("app/components/masthead/masthead.html",[]).run(["$templateCache",function(a){a.put("app/components/masthead/masthead.html",'<div class="masthead">\n <h3 class="text-muted">DockerUI</h3>\n\n <div class="col-xs-11">\n <ul class="nav well">\n <li><a href="#/">Dashboard</a></li>\n <li><a href="#/containers/">Containers</a></li>\n <li><a href="#/containers_network/">Containers Network</a></li>\n <li><a href="#/images/">Images</a></li>\n <li ng-if="showNetworksVolumes"><a href="#/networks/">Networks</a></li>\n <li ng-if="showNetworksVolumes"><a href="#/volumes/">Volumes</a></li>\n <li><a href="#/info/">Info</a></li>\n </ul>\n </div>\n <div class="col-xs-1">\n <button class="btn btn-primary" ng-click="refresh()">\n <span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>\n Refresh\n </button>\n </div>\n</div>\n')}]),angular.module("app/components/network/network.html",[]).run(["$templateCache",function(a){a.put("app/components/network/network.html",'<div class="detail">\n\n <h4>Network: {{ network.Name }}</h4>\n\n <table class="table table-striped">\n <tbody>\n <tr>\n <td>Name:</td>\n <td>{{ network.Name }}</td>\n </tr>\n <tr>\n <td>Id:</td>\n <td>{{ network.Id }}</td>\n </tr>\n <tr>\n <td>Scope:</td>\n <td>{{ network.Scope }}</td>\n </tr>\n <tr>\n <td>Driver:</td>\n <td>{{ network.Driver }}</td>\n </tr>\n <tr>\n <td>IPAM:</td>\n <td>\n <table class="table table-striped">\n <tr>\n <td>Driver:</td>\n <td>{{ network.IPAM.Driver }}</td>\n </tr>\n <tr>\n <td>Subnet:</td>\n <td>{{ network.IPAM.Config[0].Subnet }}</td>\n </tr>\n <tr>\n <td>Gateway:</td>\n <td>{{ network.IPAM.Config[0].Gateway }}</td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td>Containers:</td>\n <td>\n <table class="table table-striped" ng-repeat="(Id, container) in network.Containers">\n <tr>\n <td>Id:</td>\n <td><a href="#/containers/{{ Id }}">{{ Id }}</a></td>\n <td>\n <button ng-click="disconnect(network.Id, Id)" class="btn btn-danger btn-sm">\n Disconnect from network\n </button>\n </td>\n </tr>\n <tr>\n <td>EndpointID:</td>\n <td>{{ container.EndpointID}}</td>\n </tr>\n <tr>\n <td>MacAddress:</td>\n <td>{{ container.MacAddress}}</td>\n </tr>\n <tr>\n <td>IPv4Address:</td>\n <td>{{ container.IPv4Address}}</td>\n </tr>\n <tr>\n <td>IPv6Address:</td>\n <td>{{ container.IPv6Address}}</td>\n </tr>\n </table>\n <form class="form-inline">\n <div class="form-group">\n <label>Container ID:\n <input ng-model="containerId" placeholder="3613f73ba0e4" class="form-control">\n </label>\n </div>\n <button ng-click="connect(network.Id, containerId)" class="btn btn-primary">\n Connect\n </button>\n </form>\n </td>\n </tr>\n <tr>\n <td>Options:</td>\n <td>\n <table role="table" class="table table-striped">\n <tr>\n <th>Key</th>\n <th>Value</th>\n </tr>\n <tr ng-repeat="(k, v) in network.Options">\n <td>{{ k }}</td>\n <td>{{ v }}</td>\n </tr>\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n\n\n <hr/>\n\n\n <div class="btn-remove">\n <button class="btn btn-large btn-block btn-primary btn-danger" ng-click="removeImage(id)">Remove Network\n </button>\n </div>\n</div>')}]),angular.module("app/components/networks/networks.html",[]).run(["$templateCache",function(a){a.put("app/components/networks/networks.html",'<h2>Networks:</h2>\n\n<div>\n <ul class="nav nav-pills pull-left">\n <li class="dropdown">\n <a class="dropdown-toggle" id="drop4" role="button" data-toggle="dropdown" data-target="#">Actions <b\n class="caret"></b></a>\n <ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="drop4">\n <li><a tabindex="-1" href="" ng-click="removeAction()">Remove</a></li>\n </ul>\n </li>\n </ul>\n\n <div class="pull-right form-inline">\n <input type="text" class="form-control" id="filter" placeholder="Filter" ng-model="filter"/> <label\n class="sr-only" for="filter">Filter</label>\n </div>\n</div>\n<table class="table table-striped">\n <thead>\n <tr>\n <th><label><input type="checkbox" ng-model="toggle" ng-change="toggleSelectAll()"/> Select</label></th>\n <th>\n <a href="#/networks/" ng-click="order(\'Name\')">\n Name\n <span ng-show="sortType == \'Name\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Name\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'Id\')">\n Id\n <span ng-show="sortType == \'Id\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Id\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'Scope\')">\n Scope\n <span ng-show="sortType == \'Scope\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Scope\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'Driver\')">\n Driver\n <span ng-show="sortType == \'Driver\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Driver\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'IPAM.Driver\')">\n IPAM Driver\n <span ng-show="sortType == \'IPAM.Driver\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'IPAM.Driver\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'IPAM.Config[0].Subnet\')">\n IPAM Subnet\n <span ng-show="sortType == \'IPAM.Config[0].Subnet\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'IPAM.Config[0].Subnet\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/networks/" ng-click="order(\'IPAM.Config[0].Gateway\')">\n IPAM Gateway\n <span ng-show="sortType == \'IPAM.Config[0].Gateway\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'IPAM.Config[0].Gateway\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="network in networks | filter:filter | orderBy:sortType:sortReverse">\n <td><input type="checkbox" ng-model="network.Checked"/></td>\n <td><a href="#/networks/{{ network.Id }}/">{{ network.Name|truncate:20}}</a></td>\n <td>{{ network.Id }}</td>\n <td>{{ network.Scope }}</td>\n <td>{{ network.Driver }}</td>\n <td>{{ network.IPAM.Driver }}</td>\n <td>{{ network.IPAM.Config[0].Subnet }}</td>\n <td>{{ network.IPAM.Config[0].Gateway }}</td>\n </tr>\n </tbody>\n</table>\n<div class="row">\n <div class="col-xs-offset-3 col-xs-6">\n <form role="form" class="">\n <div class="form-group">\n <label>Name:</label>\n <input type="text" placeholder=\'isolated_nw\'\n ng-model="createNetworkConfig.Name" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Driver:</label>\n <input type="text" placeholder=\'bridge\'\n ng-model="createNetworkConfig.Driver" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Subnet:</label>\n <input type="text" placeholder=\'172.20.0.0/16\'\n ng-model="createNetworkConfig.IPAM.Config[0].Subnet" class="form-control"/>\n </div>\n <div class="form-group">\n <label>IPRange:</label>\n <input type="text" placeholder=\'172.20.10.0/24\'\n ng-model="createNetworkConfig.IPAM.Config[0].IPRange" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Gateway:</label>\n <input type="text" placeholder=\'172.20.10.11\'\n ng-model="createNetworkConfig.IPAM.Config[0].Gateway" class="form-control"/>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addNetwork(createNetworkConfig)">\n Create Network\n </button>\n </form>\n </div>\n</div>')}]),angular.module("app/components/pullImage/pullImage.html",[]).run(["$templateCache",function(a){a.put("app/components/pullImage/pullImage.html",'<div id="pull-modal" class="modal fade">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n <h3>Pull Image</h3>\n </div>\n <div class="modal-body">\n <form novalidate role="form" name="pullForm">\n <!--<div class="input-group">\n <span class="input-group-addon" id="basic-addon1">Image name</span>\n <input type="text" class="form-control" placeholder="imageName" aria-describedby="basic-addon1">\n </div>-->\n <div class="form-group">\n <label>Registry:</label>\n <input type="text" ng-model="config.registry" class="form-control"\n placeholder="Registry. Leave empty to user docker hub"/>\n </div>\n <div class="form-group">\n <label>Repo:</label>\n <input type="text" ng-model="config.repo" class="form-control"\n placeholder="Repository - usually your username."/>\n </div>\n <div class="form-group">\n <label>Image Name:</label>\n <input type="text" ng-model="config.fromImage" class="form-control" placeholder="Image name"\n required/>\n </div>\n <div class="form-group">\n <label>Tag Name:</label>\n <input type="text" ng-model="config.tag" class="form-control"\n placeholder="Tag name. If empty it will download ALL tags."/>\n </div>\n </form>\n </div>\n <div class="alert alert-error" id="error-message" style="display:none">\n {{ error }}\n </div>\n <div class="modal-footer">\n <a href="" class="btn btn-primary" ng-click="pull()">Pull</a>\n </div>\n </div>\n </div>\n</div>\n')}]),angular.module("app/components/sidebar/sidebar.html",[]).run(["$templateCache",function(a){a.put("app/components/sidebar/sidebar.html",'<div class="well">\n <strong>Running containers:</strong>\n <br/>\n <strong>Endpoint: </strong>{{ endpoint }}\n <ul>\n <li ng-repeat="container in containers">\n <a href="#/containers/{{ container.Id }}/">{{ container.Id|truncate:20 }}</a>\n <span class="pull-right label label-{{ container.Status|statusbadge }}">{{ container.Status }}</span>\n </li>\n </ul>\n</div> \n')}]),angular.module("app/components/startContainer/startcontainer.html",[]).run(["$templateCache",function(a){a.put("app/components/startContainer/startcontainer.html",'<div id="create-modal" class="modal fade">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n <h3>Create And Start Container From Image</h3>\n </div>\n <div class="modal-body">\n <form role="form">\n <accordion close-others="true">\n <accordion-group heading="Container options" is-open="menuStatus.containerOpen">\n <fieldset>\n <div class="row">\n <div class="col-xs-6">\n <div class="form-group">\n <label>Cmd:</label>\n <input type="text" placeholder=\'["/bin/echo", "Hello world"]\'\n ng-model="config.Cmd" class="form-control"/>\n <small>Input commands as a raw string or JSON array</small>\n </div>\n <div class="form-group">\n <label>Entrypoint:</label>\n <input type="text" ng-model="config.Entrypoint" class="form-control"\n placeholder="./entrypoint.sh"/>\n </div>\n <div class="form-group">\n <label>Name:</label>\n <input type="text" ng-model="config.name" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Hostname:</label>\n <input type="text" ng-model="config.Hostname" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Domainname:</label>\n <input type="text" ng-model="config.Domainname" class="form-control"/>\n </div>\n <div class="form-group">\n <label>User:</label>\n <input type="text" ng-model="config.User" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Memory:</label>\n <input type="number" ng-model="config.Memory" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Volumes:</label>\n\n <div ng-repeat="volume in config.Volumes">\n <div class="form-group form-inline">\n <input type="text" ng-model="volume.name" class="form-control"\n placeholder="/var/data"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.Volumes, volume)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.Volumes, {name: \'\'})">Add Volume\n </button>\n </div>\n </div>\n <div class="col-xs-6">\n <div class="form-group">\n <label>MemorySwap:</label>\n <input type="number" ng-model="config.MemorySwap" class="form-control"/>\n </div>\n <div class="form-group">\n <label>CpuShares:</label>\n <input type="number" ng-model="config.CpuShares" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Cpuset:</label>\n <input type="text" ng-model="config.Cpuset" class="form-control"\n placeholder="1,2"/>\n <small>Input as comma-separated list of numbers</small>\n </div>\n <div class="form-group">\n <label>WorkingDir:</label>\n <input type="text" ng-model="config.WorkingDir" class="form-control"\n placeholder="/app"/>\n </div>\n <div class="form-group">\n <label>MacAddress:</label>\n <input type="text" ng-model="config.MacAddress" class="form-control"\n placeholder="12:34:56:78:9a:bc"/>\n </div>\n <div class="form-group">\n <label for="networkDisabled">NetworkDisabled:</label>\n <input id="networkDisabled" type="checkbox"\n ng-model="config.NetworkDisabled"/>\n </div>\n <div class="form-group">\n <label for="tty">Tty:</label>\n <input id="tty" type="checkbox" ng-model="config.Tty"/>\n </div>\n <div class="form-group">\n <label for="openStdin">OpenStdin:</label>\n <input id="openStdin" type="checkbox" ng-model="config.OpenStdin"/>\n </div>\n <div class="form-group">\n <label for="stdinOnce">StdinOnce:</label>\n <input id="stdinOnce" type="checkbox" ng-model="config.StdinOnce"/>\n </div>\n <div class="form-group">\n <label>SecurityOpts:</label>\n\n <div ng-repeat="opt in config.SecurityOpts">\n <div class="form-group form-inline">\n <input type="text" ng-model="opt.name" class="form-control"\n placeholder="label:type:svirt_apache"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.SecurityOpts, opt)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.SecurityOpts, {name: \'\'})">Add Option\n </button>\n </div>\n </div>\n </div>\n <hr>\n <div class="form-group">\n <label>Env:</label>\n\n <div ng-repeat="envar in config.Env">\n <div class="form-group form-inline">\n <div class="form-group">\n <label class="sr-only">Variable Name:</label>\n <input type="text" ng-model="envar.name" class="form-control"\n placeholder="NAME"/>\n </div>\n <div class="form-group">\n <label class="sr-only">Variable Value:</label>\n <input type="text" ng-model="envar.value" class="form-control"\n placeholder="value"/>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.Env, envar)">Remove\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.Env, {name: \'\', value: \'\'})">Add environment\n variable\n </button>\n </div>\n <div class="form-group">\n <label>Labels:</label>\n\n <div ng-repeat="label in config.Labels">\n <div class="form-group form-inline">\n <div class="form-group">\n <label class="sr-only">Key:</label>\n <input type="text" ng-model="label.key" class="form-control"\n placeholder="key"/>\n </div>\n <div class="form-group">\n <label class="sr-only">Value:</label>\n <input type="text" ng-model="label.value" class="form-control"\n placeholder="value"/>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.Labels, label)">Remove\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.Labels, {key: \'\', value: \'\'})">Add Label\n </button>\n </div>\n </fieldset>\n </accordion-group>\n <accordion-group heading="HostConfig options" is-open="menuStatus.hostConfigOpen">\n <fieldset>\n <div class="row">\n <div class="col-xs-6">\n <div class="form-group">\n <label>Binds:</label>\n\n <div ng-repeat="bind in config.HostConfig.Binds">\n <div class="form-group form-inline">\n <input type="text" ng-model="bind.name" class="form-control"\n placeholder="/host:/container"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.Binds, bind)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.Binds, {name: \'\'})">Add Bind\n </button>\n </div>\n <div class="form-group">\n <label>Links:</label>\n\n <div ng-repeat="link in config.HostConfig.Links">\n <div class="form-group form-inline">\n <input type="text" ng-model="link.name" class="form-control"\n placeholder="web:db">\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.Links, link)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.Links, {name: \'\'})">Add Link\n </button>\n </div>\n <div class="form-group">\n <label>Dns:</label>\n\n <div ng-repeat="entry in config.HostConfig.Dns">\n <div class="form-group form-inline">\n <input type="text" ng-model="entry.name" class="form-control"\n placeholder="8.8.8.8"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.Dns, entry)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.Dns, {name: \'\'})">Add entry\n </button>\n </div>\n <div class="form-group">\n <label>DnsSearch:</label>\n\n <div ng-repeat="entry in config.HostConfig.DnsSearch">\n <div class="form-group form-inline">\n <input type="text" ng-model="entry.name" class="form-control"\n placeholder="example.com"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.DnsSearch, entry)">\n Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.DnsSearch, {name: \'\'})">Add\n entry\n </button>\n </div>\n <div class="form-group">\n <label>CapAdd:</label>\n\n <div ng-repeat="entry in config.HostConfig.CapAdd">\n <div class="form-group form-inline">\n <input type="text" ng-model="entry.name" class="form-control"\n placeholder="cap_sys_admin"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.CapAdd, entry)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.CapAdd, {name: \'\'})">Add entry\n </button>\n </div>\n <div class="form-group">\n <label>CapDrop:</label>\n\n <div ng-repeat="entry in config.HostConfig.CapDrop">\n <div class="form-group form-inline">\n <input type="text" ng-model="entry.name" class="form-control"\n placeholder="cap_sys_admin"/>\n <button type="button" class="btn btn-danger btn-sm"\n ng-click="rmEntry(config.HostConfig.CapDrop, entry)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.CapDrop, {name: \'\'})">Add entry\n </button>\n </div>\n </div>\n <div class="col-xs-6">\n <div class="form-group">\n <label>NetworkMode:</label>\n <input type="text" ng-model="config.HostConfig.NetworkMode"\n class="form-control" placeholder="bridge"/>\n </div>\n <div class="form-group">\n <label for="publishAllPorts">PublishAllPorts:</label>\n <input id="publishAllPorts" type="checkbox"\n ng-model="config.HostConfig.PublishAllPorts"/>\n </div>\n <div class="form-group">\n <label for="privileged">Privileged:</label>\n <input id="privileged" type="checkbox"\n ng-model="config.HostConfig.Privileged"/>\n </div>\n <div class="form-group">\n <label>VolumesFrom:</label>\n\n <div ng-repeat="volume in config.HostConfig.VolumesFrom">\n <div class="form-group form-inline">\n <select ng-model="volume.name"\n ng-options="name for name in containerNames track by name"\n class="form-control">\n </select>\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.HostConfig.VolumesFrom, volume)">\n Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.VolumesFrom, {name: \'\'})">Add\n volume\n </button>\n </div>\n\n <div class="form-group">\n <label>RestartPolicy:</label>\n <select ng-model="config.HostConfig.RestartPolicy.name">\n <option value="">disabled</option>\n <option value="always">always</option>\n <option value="on-failure">on-failure</option>\n </select>\n <label>MaximumRetryCount:</label>\n <input type="number"\n ng-model="config.HostConfig.RestartPolicy.MaximumRetryCount"/>\n </div>\n </div>\n </div>\n <hr>\n <div class="form-group">\n <label>ExtraHosts:</label>\n\n <div ng-repeat="entry in config.HostConfig.ExtraHosts">\n <div class="form-group form-inline">\n <div class="form-group">\n <label class="sr-only">Hostname:</label>\n <input type="text" ng-model="entry.host" class="form-control"\n placeholder="hostname"/>\n </div>\n <div class="form-group">\n <label class="sr-only">IP Address:</label>\n <input type="text" ng-model="entry.ip" class="form-control"\n placeholder="127.0.0.1"/>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.HostConfig.ExtraHosts, entry)">Remove\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.ExtraHosts, {host: \'\', ip: \'\'})">Add\n extra host\n </button>\n </div>\n <div class="form-group">\n <label>LxcConf:</label>\n\n <div ng-repeat="entry in config.HostConfig.LxcConf">\n <div class="form-group form-inline">\n <div class="form-group">\n <label class="sr-only">Name:</label>\n <input type="text" ng-model="entry.name" class="form-control"\n placeholder="lxc.utsname"/>\n </div>\n <div class="form-group">\n <label class="sr-only">Value:</label>\n <input type="text" ng-model="entry.value" class="form-control"\n placeholder="docker"/>\n </div>\n <div class="form-group">\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.HostConfig.LxcConf, entry)">Remove\n </button>\n </div>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.LxcConf, {name: \'\', value: \'\'})">Add\n Entry\n </button>\n </div>\n <div class="form-group">\n <label>Devices:</label>\n\n <div ng-repeat="device in config.HostConfig.Devices">\n <div class="form-group form-inline inline-four">\n <label class="sr-only">PathOnHost:</label>\n <input type="text" ng-model="device.PathOnHost" class="form-control"\n placeholder="PathOnHost"/>\n <label class="sr-only">PathInContainer:</label>\n <input type="text" ng-model="device.PathInContainer" class="form-control"\n placeholder="PathInContainer"/>\n <label class="sr-only">CgroupPermissions:</label>\n <input type="text" ng-model="device.CgroupPermissions" class="form-control"\n placeholder="CgroupPermissions"/>\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.HostConfig.Devices, device)">Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.Devices, { PathOnHost: \'\', PathInContainer: \'\', CgroupPermissions: \'\'})">\n Add Device\n </button>\n </div>\n <div class="form-group">\n <label>PortBindings:</label>\n\n <div ng-repeat="portBinding in config.HostConfig.PortBindings">\n <div class="form-group form-inline inline-four">\n <label class="sr-only">Host IP:</label>\n <input type="text" ng-model="portBinding.ip" class="form-control"\n placeholder="Host IP Address"/>\n <label class="sr-only">Host Port:</label>\n <input type="text" ng-model="portBinding.extPort" class="form-control"\n placeholder="Host Port"/>\n <label class="sr-only">Container port:</label>\n <input type="text" ng-model="portBinding.intPort" class="form-control"\n placeholder="Container Port"/>\n <select ng-model="portBinding.protocol">\n <option value="">tcp</option>\n <option value="udp">udp</option>\n </select>\n <button class="btn btn-danger btn-xs form-control"\n ng-click="rmEntry(config.HostConfig.PortBindings, portBinding)">\n Remove\n </button>\n </div>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addEntry(config.HostConfig.PortBindings, {ip: \'\', extPort: \'\', intPort: \'\'})">\n Add Port Binding\n </button>\n </div>\n </fieldset>\n </accordion-group>\n </accordion>\n </form>\n </div>\n <div class="modal-footer">\n <a href="" class="btn btn-primary btn-lg" ng-click="create()">Create</a>\n </div>\n </div>\n </div>\n</div>\n');
}]),angular.module("app/components/stats/stats.html",[]).run(["$templateCache",function(a){a.put("app/components/stats/stats.html",'<div class="row">\n <div class="col-xs-12">\n <h1>Stats for: {{ containerName }}</h1>\n\n <h2>CPU</h2>\n\n <div class="row">\n <div class="col-sm-7">\n <canvas id="cpu-stats-chart" width="650" height="300"></canvas>\n </div>\n </div>\n\n <h2>Memory</h2>\n\n <div class="row">\n <div class="col-sm-7">\n <canvas id="memory-stats-chart" width="650" height="300"></canvas>\n </div>\n <div class="col-sm-offset-1 col-sm-4">\n <table class="table">\n <tr>\n <td>Max usage</td>\n <td>{{ data.memory_stats.max_usage | humansize }}</td>\n </tr>\n <tr>\n <td>Limit</td>\n <td>{{ data.memory_stats.limit | humansize }}</td>\n </tr>\n <tr>\n <td>Fail count</td>\n <td>{{ data.memory_stats.failcnt }}</td>\n </tr>\n </table>\n <accordion>\n <accordion-group heading="Other stats">\n <table class="table">\n <tr ng-repeat="(key, value) in data.memory_stats.stats">\n <td>{{ key }}</td>\n <td>{{ value }}</td>\n </tr>\n </table>\n </accordion-group>\n </accordion>\n </div>\n </div>\n\n <h1>Network {{ networkName}}</h1>\n <div class="row">\n <div class="col-sm-7">\n <canvas id="network-stats-chart" width="650" height="300"></canvas>\n </div>\n <div class="col-sm-offset-1 col-sm-4">\n <div id="network-legend" style="margin-bottom: 20px;"></div>\n <accordion>\n <accordion-group heading="Other stats">\n <table class="table">\n <tr ng-repeat="(key, value) in data.network">\n <td>{{ key }}</td>\n <td>{{ value }}</td>\n </tr>\n </table>\n </accordion-group>\n </accordion>\n </div>\n </div>\n </div>\n</div>\n')}]),angular.module("app/components/volumes/volumes.html",[]).run(["$templateCache",function(a){a.put("app/components/volumes/volumes.html",'<h2>Volumes:</h2>\n\n<div>\n <ul class="nav nav-pills pull-left">\n <li class="dropdown">\n <a class="dropdown-toggle" id="drop4" role="button" data-toggle="dropdown" data-target="#">Actions <b\n class="caret"></b></a>\n <ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="drop4">\n <li><a tabindex="-1" href="" ng-click="removeAction()">Remove</a></li>\n </ul>\n </li>\n </ul>\n\n <div class="pull-right form-inline">\n <input type="text" class="form-control" id="filter" placeholder="Filter" ng-model="filter"/> <label\n class="sr-only" for="filter">Filter</label>\n </div>\n</div>\n<table class="table table-striped">\n <thead>\n <tr>\n <th><label><input type="checkbox" ng-model="toggle" ng-change="toggleSelectAll()"/> Select</label></th>\n <th>\n <a href="#/volumes/" ng-click="order(\'Name\')">\n Name\n <span ng-show="sortType == \'Name\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Name\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/volumes/" ng-click="order(\'Driver\')">\n Driver\n <span ng-show="sortType == \'Driver\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Driver\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n <th>\n <a href="#/volumes/" ng-click="order(\'Mountpoint\')">\n Mountpoint\n <span ng-show="sortType == \'Mountpoint\' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>\n <span ng-show="sortType == \'Mountpoint\' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>\n </a>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="volume in volumes | filter:filter | orderBy:sortType:sortReverse">\n <td><input type="checkbox" ng-model="volume.Checked"/></td>\n <td>{{ volume.Name|truncate:20 }}</td>\n <td>{{ volume.Driver }}</td>\n <td>{{ volume.Mountpoint }}</td>\n </tr>\n </tbody>\n</table>\n<div class="row">\n <div class="col-xs-offset-3 col-xs-6">\n <form role="form" class="">\n <div class="form-group">\n <label>Name:</label>\n <input type="text" placeholder=\'tardis\'\n ng-model="createVolumeConfig.Name" class="form-control"/>\n </div>\n <div class="form-group">\n <label>Driver:</label>\n <input type="text" placeholder=\'local\'\n ng-model="createVolumeConfig.Driver" class="form-control"/>\n </div>\n <button type="button" class="btn btn-success btn-sm"\n ng-click="addVolume(createVolumeConfig)">\n Create Volume\n </button>\n </form>\n </div>\n</div>')}]);