keigan 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.markdown +10 -0
- data/README.markdown +49 -2
- data/Rakefile +3 -2
- data/TODO.markdown +9 -0
- data/bin/keigan +2 -1
- data/keigan.gemspec +3 -5
- data/lib/keigan/cli/application.rb +215 -0
- data/lib/keigan/cli.rb +32 -0
- data/lib/keigan/web/application.rb +66 -0
- data/lib/keigan/web/public/css/layout.css +380 -0
- data/lib/keigan/web/public/images/risks_by_severity.png +0 -0
- data/lib/keigan/web/public/js/bluff-min.js +1 -0
- data/lib/keigan/web/public/js/bluff-src.js +2990 -0
- data/lib/keigan/web/public/js/excanvas.js +35 -0
- data/lib/keigan/web/public/js/js-class.js +1 -0
- data/lib/keigan/web/views/header.haml +16 -0
- data/lib/keigan/web/views/host.haml +47 -0
- data/lib/keigan/web/views/hosts.haml +34 -0
- data/lib/keigan/web/views/index.haml +72 -0
- data/lib/keigan/web/views/items.haml +34 -0
- data/lib/keigan/web/views/layout.haml +19 -0
- data/lib/keigan/web/views/not_implemented.haml +2 -0
- data/lib/keigan/web/views/report.haml +8 -0
- data/lib/keigan/web/views/reports.haml +9 -0
- data/lib/keigan/web.rb +32 -0
- data/lib/keigan.rb +16 -1
- metadata +72 -3
@@ -0,0 +1,35 @@
|
|
1
|
+
// Copyright 2006 Google Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_||
|
15
|
+
b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d<c.length;d++)this.initElement(c[d])},
|
16
|
+
initElement:function(b){if(!b.getContext){b.getContext=X;b.innerHTML="";b.attachEvent("onpropertychange",Z);b.attachEvent("onresize",$);var a=b.attributes;if(a.width&&a.width.specified)b.style.width=a.width.nodeValue+"px";else b.width=b.clientWidth;if(a.height&&a.height.specified)b.style.height=a.height.nodeValue+"px";else b.height=b.clientHeight}return b}};function Z(b){var a=b.srcElement;switch(b.propertyName){case "width":a.style.width=a.attributes.width.nodeValue+"px";a.getContext().clearRect();
|
17
|
+
break;case "height":a.style.height=a.attributes.height.nodeValue+"px";a.getContext().clearRect();break}}function $(b){var a=b.srcElement;if(a.firstChild){a.firstChild.style.width=a.clientWidth+"px";a.firstChild.style.height=a.clientHeight+"px"}}M.init();var N=[],B=0;for(;B<16;B++){var C=0;for(;C<16;C++)N[B*16+C]=B.toString(16)+C.toString(16)}function I(){return[[1,0,0],[0,1,0],[0,0,1]]}function y(b,a){var c=I(),d=0;for(;d<3;d++){var f=0;for(;f<3;f++){var h=0,g=0;for(;g<3;g++)h+=b[d][g]*a[g][f];c[d][f]=
|
18
|
+
h}}return c}function O(b,a){a.fillStyle=b.fillStyle;a.lineCap=b.lineCap;a.lineJoin=b.lineJoin;a.lineWidth=b.lineWidth;a.miterLimit=b.miterLimit;a.shadowBlur=b.shadowBlur;a.shadowColor=b.shadowColor;a.shadowOffsetX=b.shadowOffsetX;a.shadowOffsetY=b.shadowOffsetY;a.strokeStyle=b.strokeStyle;a.globalAlpha=b.globalAlpha;a.arcScaleX_=b.arcScaleX_;a.arcScaleY_=b.arcScaleY_;a.lineScale_=b.lineScale_}function P(b){var a,c=1;b=String(b);if(b.substring(0,3)=="rgb"){var d=b.indexOf("(",3),f=b.indexOf(")",d+
|
19
|
+
1),h=b.substring(d+1,f).split(",");a="#";var g=0;for(;g<3;g++)a+=N[Number(h[g])];if(h.length==4&&b.substr(3,1)=="a")c=h[3]}else a=b;return{color:a,alpha:c}}function aa(b){switch(b){case "butt":return"flat";case "round":return"round";case "square":default:return"square"}}function H(b){this.m_=I();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=k*1;this.globalAlpha=1;this.canvas=b;
|
20
|
+
var a=b.ownerDocument.createElement("div");a.style.width=b.clientWidth+"px";a.style.height=b.clientHeight+"px";a.style.overflow="hidden";a.style.position="absolute";b.appendChild(a);this.element_=a;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}var i=H.prototype;i.clearRect=function(){this.element_.innerHTML=""};i.beginPath=function(){this.currentPath_=[]};i.moveTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};
|
21
|
+
i.lineTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};i.bezierCurveTo=function(b,a,c,d,f,h){var g=this.getCoords_(f,h),l=this.getCoords_(b,a),e=this.getCoords_(c,d);Q(this,l,e,g)};function Q(b,a,c,d){b.currentPath_.push({type:"bezierCurveTo",cp1x:a.x,cp1y:a.y,cp2x:c.x,cp2y:c.y,x:d.x,y:d.y});b.currentX_=d.x;b.currentY_=d.y}i.quadraticCurveTo=function(b,a,c,d){var f=this.getCoords_(b,a),h=this.getCoords_(c,d),g={x:this.currentX_+
|
22
|
+
0.6666666666666666*(f.x-this.currentX_),y:this.currentY_+0.6666666666666666*(f.y-this.currentY_)};Q(this,g,{x:g.x+(h.x-this.currentX_)/3,y:g.y+(h.y-this.currentY_)/3},h)};i.arc=function(b,a,c,d,f,h){c*=k;var g=h?"at":"wa",l=b+G(d)*c-v,e=a+F(d)*c-v,m=b+G(f)*c-v,r=a+F(f)*c-v;if(l==m&&!h)l+=0.125;var n=this.getCoords_(b,a),o=this.getCoords_(l,e),q=this.getCoords_(m,r);this.currentPath_.push({type:g,x:n.x,y:n.y,radius:c,xStart:o.x,yStart:o.y,xEnd:q.x,yEnd:q.y})};i.rect=function(b,a,c,d){this.moveTo(b,
|
23
|
+
a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath()};i.strokeRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.stroke();this.currentPath_=f};i.fillRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.fill();this.currentPath_=f};i.createLinearGradient=function(b,
|
24
|
+
a,c,d){var f=new D("gradient");f.x0_=b;f.y0_=a;f.x1_=c;f.y1_=d;return f};i.createRadialGradient=function(b,a,c,d,f,h){var g=new D("gradientradial");g.x0_=b;g.y0_=a;g.r0_=c;g.x1_=d;g.y1_=f;g.r1_=h;return g};i.drawImage=function(b){var a,c,d,f,h,g,l,e,m=b.runtimeStyle.width,r=b.runtimeStyle.height;b.runtimeStyle.width="auto";b.runtimeStyle.height="auto";var n=b.width,o=b.height;b.runtimeStyle.width=m;b.runtimeStyle.height=r;if(arguments.length==3){a=arguments[1];c=arguments[2];h=g=0;l=d=n;e=f=o}else if(arguments.length==
|
25
|
+
5){a=arguments[1];c=arguments[2];d=arguments[3];f=arguments[4];h=g=0;l=n;e=o}else if(arguments.length==9){h=arguments[1];g=arguments[2];l=arguments[3];e=arguments[4];a=arguments[5];c=arguments[6];d=arguments[7];f=arguments[8]}else throw Error("Invalid number of arguments");var q=this.getCoords_(a,c),t=[];t.push(" <g_vml_:group",' coordsize="',k*10,",",k*10,'"',' coordorigin="0,0"',' style="width:',10,"px;height:",10,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var E=[];E.push("M11=",
|
26
|
+
this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",j(q.x/k),",","Dy=",j(q.y/k),"");var p=q,z=this.getCoords_(a+d,c),w=this.getCoords_(a,c+f),x=this.getCoords_(a+d,c+f);p.x=s.max(p.x,z.x,w.x,x.x);p.y=s.max(p.y,z.y,w.y,x.y);t.push("padding:0 ",j(p.x/k),"px ",j(p.y/k),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",E.join(""),", sizingmethod='clip');")}else t.push("top:",j(q.y/k),"px;left:",j(q.x/k),"px;");t.push(' ">','<g_vml_:image src="',b.src,
|
27
|
+
'"',' style="width:',k*d,"px;"," height:",k*f,'px;"',' cropleft="',h/n,'"',' croptop="',g/o,'"',' cropright="',(n-h-l)/n,'"',' cropbottom="',(o-g-e)/o,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("<g_vml_:shape",' filled="',!!b,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0 0" coordsize="',k*10," ",k*10,'"',' stroked="',
|
28
|
+
!b,'"',' path="');var h={x:null,y:null},g={x:null,y:null},l=0;for(;l<this.currentPath_.length;l++){var e=this.currentPath_[l];switch(e.type){case "moveTo":a.push(" m ",j(e.x),",",j(e.y));break;case "lineTo":a.push(" l ",j(e.x),",",j(e.y));break;case "close":a.push(" x ");e=null;break;case "bezierCurveTo":a.push(" c ",j(e.cp1x),",",j(e.cp1y),",",j(e.cp2x),",",j(e.cp2y),",",j(e.x),",",j(e.y));break;case "at":case "wa":a.push(" ",e.type," ",j(e.x-this.arcScaleX_*e.radius),",",j(e.y-this.arcScaleY_*e.radius),
|
29
|
+
" ",j(e.x+this.arcScaleX_*e.radius),",",j(e.y+this.arcScaleY_*e.radius)," ",j(e.xStart),",",j(e.yStart)," ",j(e.xEnd),",",j(e.yEnd));break}if(e){if(h.x==null||e.x<h.x)h.x=e.x;if(g.x==null||e.x>g.x)g.x=e.x;if(h.y==null||e.y<h.y)h.y=e.y;if(g.y==null||e.y>g.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_),
|
30
|
+
z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l<J;l++){var T=u[l];S.push(T.offset*q+
|
31
|
+
o+" "+T.color)}a.push('<g_vml_:fill type="',m.type_,'"',' method="none" focus="100%"',' color="',da,'"',' color2="',ea,'"',' colors="',S.join(","),'"',' opacity="',ga,'"',' g_o_:opacity2="',fa,'"',' angle="',r,'"',' focusposition="',n.x,",",n.y,'" />')}else a.push('<g_vml_:fill color="',d,'" opacity="',f,'" />');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("<g_vml_:stroke",' opacity="',f,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',aa(this.lineCap),
|
32
|
+
'"',' weight="',K,'px"',' color="',d,'" />')}a.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(),
|
33
|
+
this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a,
|
34
|
+
0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager=
|
35
|
+
M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})();
|
@@ -0,0 +1 @@
|
|
1
|
+
this.JS=this.JS||{};JS.extend=function(a,b){b=b||{};for(var c in b){if(a[c]===b[c])continue;a[c]=b[c]}return a};JS.extend(JS,{makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this}},makeBridge:function(a){var b=function(){};b.prototype=a.prototype;return new b},bind:function(){var a=JS.array(arguments),b=a.shift(),c=a.shift()||null;return function(){return b.apply(c,a.concat(JS.array(arguments)))}},callsSuper:function(a){return a.SUPER===undefined?a.SUPER=/\bcallSuper\b/.test(a.toString()):a.SUPER},mask:function(a){var b=a.toString().replace(/callSuper/g,'super');a.toString=function(){return b};return a},array:function(a){if(!a)return[];if(a.toArray)return a.toArray();var b=a.length,c=[];while(b--)c[b]=a[b];return c},indexOf:function(a,b){for(var c=0,d=a.length;c<d;c++){if(a[c]===b)return c}return-1},isFn:function(a){return a instanceof Function},isType:function(a,b){if(!a||!b)return false;return(b instanceof Function&&a instanceof b)||(typeof b==='string'&&typeof a===b)||(a.isA&&a.isA(b))},ignore:function(a,b){return/^(include|extend)$/.test(a)&&typeof b==='object'}});JS.Module=JS.makeFunction();JS.extend(JS.Module.prototype,{END_WITHOUT_DOT:/([^\.])$/,initialize:function(a,b,c){this.__mod__=this;this.__inc__=[];this.__fns__={};this.__dep__=[];this.__mct__={};if(typeof a==='string'){this.__nom__=this.displayName=a}else{this.__nom__=this.displayName='';c=b;b=a}c=c||{};this.__res__=c._1||null;if(b)this.include(b,false);if(JS.Module.__chainq__)JS.Module.__chainq__.push(this)},setName:function(a){this.__nom__=this.displayName=a||'';for(var b in this.__mod__.__fns__)this.__name__(b);if(a&&this.__meta__)this.__meta__.setName(a+'.')},__name__:function(a){if(!this.__nom__)return;var b=this.__mod__.__fns__[a]||{};a=this.__nom__.replace(this.END_WITHOUT_DOT,'$1#')+a;if(JS.isFn(b.setName))return b.setName(a);if(JS.isFn(b))b.displayName=a},define:function(a,b,c,d){var f=(d||{})._0||this;this.__fns__[a]=b;this.__name__(a);if(JS.Module._0&&f&&JS.isFn(b))JS.Module._0(a,f);if(c!==false)this.resolve()},instanceMethod:function(a){var b=this.lookup(a).pop();return JS.isFn(b)?b:null},instanceMethods:function(a,b){var c=this.__mod__,b=b||[],d=c.ancestors(),f=d.length,e;for(e in c.__fns__){if(c.__fns__.hasOwnProperty(e)&&JS.isFn(c.__fns__[e])&&JS.indexOf(b,e)===-1)b.push(e)}if(a===false)return b;while(f--)d[f].instanceMethods(false,b);return b},include:function(a,b,c){b=(b!==false);if(!a)return b?this.resolve():this.uncache();c=c||{};if(a.__mod__)a=a.__mod__;var d=a.include,f=a.extend,e=c._4||this,g,h,i,j;if(a.__inc__&&a.__fns__){this.__inc__.push(a);a.__dep__.push(this);if(c._2)a.extended&&a.extended(c._2);else a.included&&a.included(e)}else{if(c._5){for(h in a){if(JS.ignore(h,a[h]))continue;this.define(h,a[h],false,{_0:e||c._2||this})}}else{if(typeof d==='object'||JS.isType(d,JS.Module)){g=[].concat(d);for(i=0,j=g.length;i<j;i++)e.include(g[i],b,c)}if(typeof f==='object'||JS.isType(f,JS.Module)){g=[].concat(f);for(i=0,j=g.length;i<j;i++)e.extend(g[i],false);e.extend()}c._5=true;return e.include(a,b,c)}}b?this.resolve():this.uncache()},includes:function(a){var b=this.__mod__,c=b.__inc__.length;if(Object===a||b===a||b.__res__===a.prototype)return true;while(c--){if(b.__inc__[c].includes(a))return true}return false},match:function(a){return a.isA&&a.isA(this)},ancestors:function(a){var b=this.__mod__,c=(a===undefined),d=(b.__res__||{}).klass,f=(d&&b.__res__===d.prototype)?d:b,e,g;if(c&&b.__anc__)return b.__anc__.slice();a=a||[];for(e=0,g=b.__inc__.length;e<g;e++)b.__inc__[e].ancestors(a);if(JS.indexOf(a,f)===-1)a.push(f);if(c)b.__anc__=a.slice();return a},lookup:function(a){var b=this.__mod__,c=b.__mct__;if(c[a])return c[a].slice();var d=b.ancestors(),f=[],e,g,h;for(e=0,g=d.length;e<g;e++){h=d[e].__mod__.__fns__[a];if(h)f.push(h)}c[a]=f.slice();return f},make:function(a,b){if(!JS.isFn(b)||!JS.callsSuper(b))return b;var c=this;return function(){return c.chain(this,a,arguments)}},chain:JS.mask(function(c,d,f){var e=this.lookup(d),g=e.length-1,h=c.callSuper,i=JS.array(f),j;c.callSuper=function(){var a=arguments.length;while(a--)i[a]=arguments[a];g-=1;var b=e[g].apply(c,i);g+=1;return b};j=e.pop().apply(c,i);h?c.callSuper=h:delete c.callSuper;return j}),resolve:function(a){var b=this.__mod__,a=a||b,c=a.__res__,d,f,e,g;if(a===b){b.uncache(false);d=b.__dep__.length;while(d--)b.__dep__[d].resolve()}if(!c)return;for(d=0,f=b.__inc__.length;d<f;d++)b.__inc__[d].resolve(a);for(e in b.__fns__){g=a.make(e,b.__fns__[e]);if(c[e]!==g)c[e]=g}},uncache:function(a){var b=this.__mod__,c=b.__dep__.length;b.__anc__=null;b.__mct__={};if(a===false)return;while(c--)b.__dep__[c].uncache()}});JS.Class=JS.makeFunction();JS.extend(JS.Class.prototype=JS.makeBridge(JS.Module),{initialize:function(a,b,c){if(typeof a==='string'){this.__nom__=this.displayName=a}else{this.__nom__=this.displayName='';c=b;b=a}var d=JS.extend(JS.makeFunction(),this);d.klass=d.constructor=this.klass;if(!JS.isFn(b)){c=b;b=Object}d.inherit(b);d.include(c,false);d.resolve();do{b.inherited&&b.inherited(d)}while(b=b.superclass);return d},inherit:function(a){this.superclass=a;if(this.__eigen__&&a.__eigen__)this.extend(a.__eigen__(),true);this.subclasses=[];(a.subclasses||[]).push(this);var b=this.prototype=JS.makeBridge(a);b.klass=b.constructor=this;this.__mod__=new JS.Module(this.__nom__,{},{_1:this.prototype});this.include(JS.Kernel,false);if(a!==Object)this.include(a.__mod__||new JS.Module(a.prototype,{_1:a.prototype}),false)},include:function(a,b,c){if(!a)return;var d=this.__mod__,c=c||{};c._4=this;return d.include(a,b,c)},define:function(a,b,c,d){var f=this.__mod__;d=d||{};d._0=this;f.define(a,b,c,d)}});JS.Module=new JS.Class('Module',JS.Module.prototype);JS.Class=new JS.Class('Class',JS.Module,JS.Class.prototype);JS.Module.klass=JS.Module.constructor=JS.Class.klass=JS.Class.constructor=JS.Class;JS.extend(JS.Module,{_3:[],__chainq__:[],methodAdded:function(a,b){this._3.push([a,b])},_0:function(a,b){var c=this._3,d=c.length;while(d--)c[d][0].call(c[d][1]||null,a,b)}});JS.Kernel=JS.extend(new JS.Module('Kernel',{__eigen__:function(){if(this.__meta__)return this.__meta__;var a=this.__nom__,b=this.klass.__nom__,c=a||(b?'#<'+b+'>':''),d=this.__meta__=new JS.Module(c?c+'.':'',{},{_1:this});d.include(this.klass.__mod__,false);return d},equals:function(a){return this===a},extend:function(a,b){return this.__eigen__().include(a,b,{_2:this})},hash:function(){return this.__hashcode__=this.__hashcode__||JS.Kernel.getHashCode()},isA:function(a){return this.__eigen__().includes(a)},method:function(a){var b=this,c=b.__mcache__=b.__mcache__||{};if((c[a]||{}).fn===b[a])return c[a].bd;return(c[a]={fn:b[a],bd:JS.bind(b[a],b)}).bd},methods:function(){return this.__eigen__().instanceMethods(true)},tap:function(a,b){a.call(b||null,this);return this}}),{__hashIndex__:0,getHashCode:function(){this.__hashIndex__+=1;return(Math.floor(new Date().getTime()/1000)+this.__hashIndex__).toString(16)}});JS.Module.include(JS.Kernel);JS.extend(JS.Module,JS.Kernel.__fns__);JS.Class.include(JS.Kernel);JS.extend(JS.Class,JS.Kernel.__fns__);JS.Interface=new JS.Class({initialize:function(d){this.test=function(a,b){var c=d.length;while(c--){if(!JS.isFn(a[d[c]]))return b?d[c]:false}return true}},extend:{ensure:function(){var a=JS.array(arguments),b=a.shift(),c,d;while(c=a.shift()){d=c.test(b,true);if(d!==true)throw new Error('object does not implement '+d+'()');}}}});JS.Singleton=new JS.Class({initialize:function(a,b,c){return new(new JS.Class(a,b,c))}});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#header
|
2
|
+
#header-left
|
3
|
+
#menu
|
4
|
+
%ul
|
5
|
+
%li
|
6
|
+
%a{:href => url("/")} Dashboard
|
7
|
+
%li
|
8
|
+
%a{:href => url("/reports")} Scans
|
9
|
+
%li
|
10
|
+
%a{:href => url("/hosts")} Hosts
|
11
|
+
%li
|
12
|
+
%a{:href => url("/items")} Items
|
13
|
+
%li
|
14
|
+
%a{:href => url("/plugins")} Plugins
|
15
|
+
#header-right
|
16
|
+
%a{:href => url("/")} Keigan
|
@@ -0,0 +1,47 @@
|
|
1
|
+
%h1 Host Details
|
2
|
+
%table
|
3
|
+
%tr
|
4
|
+
%td Report:
|
5
|
+
%td= @host.report_id
|
6
|
+
%tr
|
7
|
+
%td Name:
|
8
|
+
%td= @host.name
|
9
|
+
%tr
|
10
|
+
%td OS:
|
11
|
+
%td= @host.os
|
12
|
+
%tr
|
13
|
+
%td Mac:
|
14
|
+
%td= @host.mac
|
15
|
+
%tr
|
16
|
+
%td Host Scan Start Time:
|
17
|
+
%td= @host.start
|
18
|
+
%tr
|
19
|
+
%td Host Scan End Time:
|
20
|
+
%td= @host.end
|
21
|
+
%tr
|
22
|
+
%td IP Address:
|
23
|
+
%td= @host.ip
|
24
|
+
%tr
|
25
|
+
%td FQDN:
|
26
|
+
%td= @host.fqdn
|
27
|
+
%tr
|
28
|
+
%td Net BIOS Name:
|
29
|
+
%td= @host.netbios
|
30
|
+
%tr
|
31
|
+
%td System Type:
|
32
|
+
%td= @host.system_type
|
33
|
+
%tr
|
34
|
+
%td Notes:
|
35
|
+
%td= @host.notes
|
36
|
+
|
37
|
+
%h1 Findings
|
38
|
+
%h2 Critical Risks
|
39
|
+
- @host.items.critical_risks.each do |item|
|
40
|
+
%p= "#{item.plugin_name}"
|
41
|
+
|
42
|
+
%h2 High Risks
|
43
|
+
- @host.items.high_risks.each do |item|
|
44
|
+
%p= "#{item.plugin_name}"
|
45
|
+
|
46
|
+
%p
|
47
|
+
%a{:href => url("/hosts")} Back to Hosts
|
@@ -0,0 +1,34 @@
|
|
1
|
+
%h1 Hosts
|
2
|
+
%table
|
3
|
+
%tr
|
4
|
+
%td
|
5
|
+
%b IP
|
6
|
+
%td
|
7
|
+
%b OS
|
8
|
+
%td
|
9
|
+
%b Critical
|
10
|
+
%td
|
11
|
+
%b High
|
12
|
+
%td
|
13
|
+
%b Medium
|
14
|
+
%td
|
15
|
+
%b Low
|
16
|
+
%td
|
17
|
+
%b Open Ports
|
18
|
+
%td
|
19
|
+
%b %
|
20
|
+
|
21
|
+
- Risu::Models::Host.all.each do |host|
|
22
|
+
%tr
|
23
|
+
%td
|
24
|
+
%a{:href => url("/host/#{host.id}")}= host.name
|
25
|
+
%td= host.os.split(",")[0] if host.os != nil
|
26
|
+
%td= host.items.critical_risks.count
|
27
|
+
%td= host.items.high_risks.count
|
28
|
+
%td= host.items.medium_risks.count
|
29
|
+
%td= host.items.low_risks.count
|
30
|
+
%td= host.items.info_risks.count
|
31
|
+
%td %
|
32
|
+
|
33
|
+
%p
|
34
|
+
%a{:href => url("/reports")} Back to Reports
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#content
|
2
|
+
#dashboard-left
|
3
|
+
%h2 Top 5 Vulnerable Hosts
|
4
|
+
|
5
|
+
- Host.top_n_vulnerable(5).each do |host, count|
|
6
|
+
%ul
|
7
|
+
%li
|
8
|
+
%a{:href => url("/host/#{host.id}")}= host.name
|
9
|
+
= "- #{host.items.critical_risks.count} Critical Risks"
|
10
|
+
|
11
|
+
%br
|
12
|
+
|
13
|
+
%h2 Top 5 Vulnerabilities
|
14
|
+
|
15
|
+
- Item.top_10_sorted[0...5].each do |item, count|
|
16
|
+
%ul
|
17
|
+
%li= "#{item} - #{count}"
|
18
|
+
|
19
|
+
#dashboard-right
|
20
|
+
%h2 Quick stats
|
21
|
+
|
22
|
+
%table
|
23
|
+
%tr
|
24
|
+
%td
|
25
|
+
%b Hosts
|
26
|
+
%td
|
27
|
+
%b Critical
|
28
|
+
%td
|
29
|
+
%b High
|
30
|
+
%td
|
31
|
+
%b Medium
|
32
|
+
%td
|
33
|
+
%b Low
|
34
|
+
%td
|
35
|
+
%b Info
|
36
|
+
%tr
|
37
|
+
%td= "#{Host.all.count}"
|
38
|
+
%td= "#{Item.critical_risks.all.count}"
|
39
|
+
%td= "#{Item.high_risks.all.count}"
|
40
|
+
%td= "#{Item.medium_risks.all.count}"
|
41
|
+
%td= "#{Item.low_risks.all.count}"
|
42
|
+
%td= "#{Item.info_risks.all.count}"
|
43
|
+
|
44
|
+
%p
|
45
|
+
|
46
|
+
%canvas#risks{:height => "300", :width => "400"}
|
47
|
+
:javascript
|
48
|
+
var g = new Bluff.Bar('risks', '400x300');
|
49
|
+
g.title = 'Risks By Severity';
|
50
|
+
g.tooltips = true;
|
51
|
+
g.sort = false;
|
52
|
+
g.set_theme({
|
53
|
+
colors: ["purple", "red", "orange", "yellow", "blue", "green", "grey", "brown", "pink", "black"],
|
54
|
+
background_colors: ['white', 'white']
|
55
|
+
});
|
56
|
+
|
57
|
+
crit = #{Item.critical_risks.count};
|
58
|
+
high = #{Item.high_risks.count};
|
59
|
+
medium = #{Item.medium_risks.count};
|
60
|
+
low = #{Item.low_risks.count};
|
61
|
+
info = #{Item.info_risks.count};
|
62
|
+
|
63
|
+
g.data("Critical", crit, "purple");
|
64
|
+
g.data("High", high, "red");
|
65
|
+
g.data("Medium", medium, "orange");
|
66
|
+
g.data("Low", low, "yellow");
|
67
|
+
g.data("Open Ports", info, "blue");
|
68
|
+
|
69
|
+
g.draw();
|
70
|
+
|
71
|
+
|
72
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
%h1 Items
|
2
|
+
%table
|
3
|
+
%tr
|
4
|
+
%td
|
5
|
+
%b IP
|
6
|
+
%td
|
7
|
+
%b OS
|
8
|
+
%td
|
9
|
+
%b Critical
|
10
|
+
%td
|
11
|
+
%b High
|
12
|
+
%td
|
13
|
+
%b Medium
|
14
|
+
%td
|
15
|
+
%b Low
|
16
|
+
%td
|
17
|
+
%b Open Ports
|
18
|
+
%td
|
19
|
+
%b %
|
20
|
+
|
21
|
+
- Risu::Models::Item.all.each do |item|
|
22
|
+
%tr
|
23
|
+
%td
|
24
|
+
%a{:href => url("/host/#{host.id}")}= item.host_id
|
25
|
+
%td= host.os.split(",")[0] if host.os != nil
|
26
|
+
%td= host.items.critical_risks.count
|
27
|
+
%td= host.items.high_risks.count
|
28
|
+
%td= host.items.medium_risks.count
|
29
|
+
%td= host.items.low_risks.count
|
30
|
+
%td= host.items.info_risks.count
|
31
|
+
%td %
|
32
|
+
|
33
|
+
%p
|
34
|
+
%a{:href => url("/reports")} Back to Reports
|
@@ -0,0 +1,19 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Keigan Web GUI
|
5
|
+
%link(rel="stylesheet" href="/css/layout.css")
|
6
|
+
%script{:type => "text/javascript",
|
7
|
+
:src => "/js/js-class.js"}
|
8
|
+
%script{:type => "text/javascript",
|
9
|
+
:src => "/js/excanvas.js"}
|
10
|
+
%script{:type => "text/javascript",
|
11
|
+
:src => "/js/bluff-min.js"}
|
12
|
+
%body
|
13
|
+
#wrapper
|
14
|
+
= haml :header
|
15
|
+
#page
|
16
|
+
#content
|
17
|
+
= yield
|
18
|
+
%br{:style => "clear:both;"}
|
19
|
+
footer
|
data/lib/keigan/web.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Copyright (c) 2012 Arxopia LLC.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Arxopia LLC nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
|
20
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
21
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
22
|
+
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
24
|
+
#OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
25
|
+
#OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
|
27
|
+
module Keigan
|
28
|
+
module Web
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'keigan/web/application'
|
data/lib/keigan.rb
CHANGED
@@ -26,5 +26,20 @@
|
|
26
26
|
|
27
27
|
module Keigan
|
28
28
|
APP_NAME = "keigan"
|
29
|
-
VERSION = "0.0.
|
29
|
+
VERSION = "0.0.1"
|
30
|
+
CONFIG_FILE = "./risu.cfg"
|
31
|
+
AUTHOR = "Arxopia LLC."
|
32
|
+
EMAIL = "keigan@arxopia.com"
|
33
|
+
SITE = "http://www.arxopia.com/projects/keigan"
|
30
34
|
end
|
35
|
+
|
36
|
+
require 'optparse'
|
37
|
+
|
38
|
+
require 'sinatra'
|
39
|
+
require 'haml'
|
40
|
+
require 'risu'
|
41
|
+
|
42
|
+
require 'keigan/cli'
|
43
|
+
require 'keigan/web'
|
44
|
+
|
45
|
+
include Risu::Models
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keigan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-07-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: risu
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.5.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.5.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: sinatra
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.3.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.3.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: haml
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.1.4
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.1.4
|
14
62
|
description: keigan is a set of parsers for NVD CVE / CPE xml files
|
15
63
|
email: keigan@arxopia.com
|
16
64
|
executables:
|
@@ -20,10 +68,31 @@ extra_rdoc_files:
|
|
20
68
|
- README.markdown
|
21
69
|
- LICENSE
|
22
70
|
files:
|
71
|
+
- NEWS.markdown
|
72
|
+
- TODO.markdown
|
23
73
|
- Rakefile
|
24
74
|
- README.markdown
|
25
75
|
- LICENSE
|
26
76
|
- lib/keigan.rb
|
77
|
+
- lib/keigan/web/views/host.haml
|
78
|
+
- lib/keigan/web/views/report.haml
|
79
|
+
- lib/keigan/web/views/hosts.haml
|
80
|
+
- lib/keigan/web/views/reports.haml
|
81
|
+
- lib/keigan/web/views/index.haml
|
82
|
+
- lib/keigan/web/views/layout.haml
|
83
|
+
- lib/keigan/web/views/header.haml
|
84
|
+
- lib/keigan/web/views/items.haml
|
85
|
+
- lib/keigan/web/views/not_implemented.haml
|
86
|
+
- lib/keigan/web/application.rb
|
87
|
+
- lib/keigan/web/public/css/layout.css
|
88
|
+
- lib/keigan/web/public/js/excanvas.js
|
89
|
+
- lib/keigan/web/public/js/bluff-min.js
|
90
|
+
- lib/keigan/web/public/js/bluff-src.js
|
91
|
+
- lib/keigan/web/public/js/js-class.js
|
92
|
+
- lib/keigan/web/public/images/risks_by_severity.png
|
93
|
+
- lib/keigan/cli.rb
|
94
|
+
- lib/keigan/cli/application.rb
|
95
|
+
- lib/keigan/web.rb
|
27
96
|
- keigan.gemspec
|
28
97
|
- bin/keigan
|
29
98
|
homepage: http://www.arxopia.com/projects/keigan
|