From a00d332ade6bc1896161c3a58b2e0cd28c09b4cc Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 14:29:53 -0400 Subject: [PATCH 001/134] Rough in reports views and add Chart.min.js --- web/skins/classic/js/Chart.min.js | 14 ++++ web/skins/classic/views/report.php | 102 ++++++++++++++++++++++++++++ web/skins/classic/views/reports.php | 95 ++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 web/skins/classic/js/Chart.min.js create mode 100644 web/skins/classic/views/report.php create mode 100644 web/skins/classic/views/reports.php diff --git a/web/skins/classic/js/Chart.min.js b/web/skins/classic/js/Chart.min.js new file mode 100644 index 000000000..090a9bde1 --- /dev/null +++ b/web/skins/classic/js/Chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.5.0 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,a,i){function n(r,s){if(!a[r]){if(!e[r]){var l="function"==typeof require&&require;if(!s&&l)return l(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=a[r]={exports:{}};e[r][0].call(d.exports,function(t){var a=e[r][1][t];return n(a?a:t)},d,d.exports,t,e,a,i)}return a[r].exports}for(var o="function"==typeof require&&require,r=0;ra?(e+.05)/(a+.05):(a+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,a=(e[0]+t)%360;return e[0]=a<0?360+a:a,this.setValues("hsl",e),this},mix:function(t,e){var a=this,i=t,n=void 0===e?.5:e,o=2*n-1,r=a.alpha()-i.alpha(),s=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,l=1-s;return this.rgb(s*a.red()+l*i.red(),s*a.green()+l*i.green(),s*a.blue()+l*i.blue()).alpha(a.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,a=new o,i=this.values,n=a.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?n[r]=t.slice(0):"[object Number]"===e?n[r]=t:console.error("unexpected color value:",t));return a}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,a={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var n=.4124*e+.3576*a+.1805*i,o=.2126*e+.7152*a+.0722*i,r=.0193*e+.1192*a+.9505*i;return[100*n,100*o,100*r]}function d(t){var e,a,i,n=u(t),o=n[0],r=n[1],s=n[2];return o/=95.047,r/=100,s/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*r-16,a=500*(o-r),i=200*(r-s),[e,a,i]}function c(t){return z(d(t))}function h(t){var e,a,i,n,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return o=255*l,[o,o,o];a=l<.5?l*(1+s):l+s-l*s,e=2*l-a,n=[0,0,0];for(var u=0;u<3;u++)i=r+1/3*-(u-1),i<0&&i++,i>1&&i--,o=6*i<1?e+6*(a-e)*i:2*i<1?a:3*i<2?e+(a-e)*(2/3-i)*6:e,n[u]=255*o;return n}function f(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,n*=o<=1?o:2-o,a=(o+n)/2,e=2*n/(o+n),[i,100*e,100*a])}function p(t){return o(h(t))}function m(t){return s(h(t))}function v(t){return l(h(t))}function x(t){var e=t[0]/60,a=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-a),s=255*i*(1-a*o),l=255*i*(1-a*(1-o)),i=255*i;switch(n){case 0:return[i,l,r];case 1:return[s,i,r];case 2:return[r,i,l];case 3:return[r,s,i];case 4:return[l,r,i];case 5:return[i,r,s]}}function y(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return a=(2-n)*o,e=n*o,e/=a<=1?a:2-a,e=e||0,a/=2,[i,100*e,100*a]}function k(t){return o(x(t))}function S(t){return s(x(t))}function M(t){return l(x(t))}function w(t){var e,a,i,n,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),a=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),n=s+i*(a-s),e){default:case 6:case 0:r=a,g=n,b=s;break;case 1:r=n,g=a,b=s;break;case 2:r=s,g=a,b=n;break;case 3:r=s,g=n,b=a;break;case 4:r=n,g=s,b=a;break;case 5:r=a,g=s,b=n}return[255*r,255*g,255*b]}function C(t){return i(w(t))}function I(t){return n(w(t))}function D(t){return s(w(t))}function A(t){return l(w(t))}function T(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100,s=t[3]/100;return e=1-Math.min(1,n*(1-s)+s),a=1-Math.min(1,o*(1-s)+s),i=1-Math.min(1,r*(1-s)+s),[255*e,255*a,255*i]}function P(t){return i(T(t))}function _(t){return n(T(t))}function F(t){return o(T(t))}function V(t){return l(T(t))}function R(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*n+o*-1.5372+r*-.4986,a=n*-.9689+1.8758*o+.0415*r,i=.0557*n+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),a=Math.min(Math.max(0,a),1),i=Math.min(Math.max(0,i),1),[255*e,255*a,255*i]}function O(t){var e,a,i,n=t[0],o=t[1],r=t[2];return n/=95.047,o/=100,r/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,a=500*(n-o),i=200*(o-r),[e,a,i]}function L(t){return z(O(t))}function B(t){var e,a,i,n,o=t[0],r=t[1],s=t[2];return o<=8?(a=100*o/903.3,n=7.787*(a/100)+16/116):(a=100*Math.pow((o+16)/116,3),n=Math.pow(a/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+n-16/116)/7.787:95.047*Math.pow(r/500+n,3),i=i/108.883<=.008859?i=108.883*(n-s/200-16/116)/7.787:108.883*Math.pow(n-s/200,3),[e,a,i]}function z(t){var e,a,i,n=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),a=360*e/2/Math.PI,a<0&&(a+=360),i=Math.sqrt(o*o+r*r),[n,i,a]}function W(t){return R(B(t))}function N(t){var e,a,i,n=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),a=o*Math.sin(i),[n,e,a]}function E(t){return B(N(t))}function H(t){return W(N(t))}function j(t){return G[t]}function U(t){return i(j(t))}function q(t){return n(j(t))}function Y(t){return o(j(t))}function X(t){return s(j(t))}function K(t){return d(j(t))}function J(t){return u(j(t))}e.exports={rgb2hsl:i,rgb2hsv:n,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:M,hwb2rgb:w,hwb2hsl:C,hwb2hsv:I,hwb2cmyk:D,hwb2keyword:A,cmyk2rgb:T,cmyk2hsl:P,cmyk2hsv:_,cmyk2hwb:F,cmyk2keyword:V,keyword2rgb:j,keyword2hsl:U,keyword2hsv:q,keyword2hwb:Y,keyword2cmyk:X,keyword2lab:K,keyword2xyz:J,xyz2rgb:R,xyz2lab:O,xyz2lch:L,lab2xyz:B,lab2rgb:W,lab2lch:z,lch2lab:N,lch2xyz:E,lch2rgb:H};var G={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var Q in G)Z[JSON.stringify(G[Q])]=Q},{}],5:[function(t,e,a){var i=t(4),n=function(){return new u};for(var o in i){n[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),s=r[1],l=r[2];n[s]=n[s]||{},n[s][l]=n[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var a=i[t](e);if("string"==typeof a||void 0===a)return a;for(var n=0;n0&&(t[0].yLabel?a=t[0].yLabel:e.labels.length>0&&t[0].index');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],s=o.data[n],l=s&&s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(r.backgroundColor,n,d.backgroundColor),h=l.borderColor?l.borderColor:u(r.borderColor,n,d.borderColor),f=l.borderWidth?l.borderWidth:u(r.borderWidth,n,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;a=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&0<=p||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,M={x:y?-1:Math.min(m.x*(m.x<0?1:S),v.x*(v.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),v.y*(v.y<0?1:S))},w={x:b?1:Math.max(m.x*(m.x>0?1:S),v.x*(v.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),v.y*(v.y>0?1:S))},C={width:.5*(w.x-M.x),height:.5*(w.y-M.y)};u=Math.min(s/C.width,l/C.height),d={x:(w.x+M.x)*-.5,y:(w.y+M.y)*-.5}}i.borderWidth=a.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=a.calculateTotal(),a.outerRadius=i.outerRadius-i.radiusLength*a.getRingIndex(a.index),a.innerRadius=Math.max(a.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){var n=this,o=n.chart,r=o.chartArea,s=o.options,l=s.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=s.rotation,h=s.rotation,f=n.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[a])*(s.circumference/(2*Math.PI)),p=i&&l.animateScale?0:n.innerRadius,m=i&&l.animateScale?0:n.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:n.index,_index:a,_model:{x:u+o.offsetX,y:d+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,a,o.data.labels[a])}});var b=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(0===a?b.startAngle=s.rotation:b.startAngle=n.getMeta().data[a-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,a=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){t=a.data[i],isNaN(t)||e.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,a,i=0,n=this.index,o=t.length,r=0;ri?e:i,i=a>i?a:i;return i}})}},{}],18:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return a.getValueOrDefault(t.showLine,e.showLines)}var a=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,n,o,r=this,s=r.getMeta(),l=s.dataset,u=s.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(s.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(o=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=r.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:o.tension?o.tension:a.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:o.steppedLine?o.steppedLine:a.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:o.cubicInterpolationMode?o.cubicInterpolationMode:a.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode),scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},l.pivot()),i=0,n=u.length;i');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],s=o.data[n],l=s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(r.backgroundColor,n,d.backgroundColor),h=l.borderColor?l.borderColor:u(r.borderColor,n,d.borderColor),f=l.borderWidth?l.borderWidth:u(r.borderWidth,n,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;a0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var a=this,i=a.getMeta(),n=i.dataset,o=i.data,r=n.custom||{},s=a.getDataset(),l=a.chart.options.elements.line,u=a.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),e.extend(i.dataset,{_datasetIndex:a.index,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(s.lineTension,l.tension),backgroundColor:r.backgroundColor?r.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:s.borderWidth||l.borderWidth,borderColor:r.borderColor?r.borderColor:s.borderColor||l.borderColor,fill:r.fill?r.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:r.borderDash?r.borderDash:s.borderDash||l.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle,scaleTop:u.top,scaleBottom:u.bottom,scaleZero:u.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){a.updateElement(e,i,t)},a),a.updateBezierControlPoints()},updateElement:function(t,a,i){var n=this,o=t.custom||{},r=n.getDataset(),s=n.chart.scale,l=n.chart.options.elements.point,u=s.getPointPositionForValue(a,r.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:s,_model:{x:i?s.xCenter:u.x,y:i?s.yCenter:u.y,tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,n.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,a,l.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,a,l.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,a,l.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,a,l.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,a,l.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.hitRadius,a,l.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,a=this.getMeta();e.each(a.data,function(i,n){var o=i._model,r=e.splineCurve(e.previousItem(a.data,n,!0)._model,o,e.nextItem(a.data,n,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var a=this.getMeta(),i=t||1;e.each(a.data,function(t){t.transition(i)}),a.dataset.transition(i).draw(),e.each(a.data,function(t){t.draw()})},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(a.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(a.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(a.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(a.radius,n,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(a.pointBackgroundColor,n,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(a.pointBorderColor,n,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(a.pointBorderWidth,n,r.borderWidth)}})}},{}],21:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,a,i){var n=this;i||(t.animating=!0);for(var o=0;o1&&(a=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;it.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var n=Date.now(),o=(n-e)/t.frameDuration;t.dropFrames+=o,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,a){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,a,i,n,o){var r,s,l,u,d,c;if("object"==typeof a&&(r=a.toString(),"[object HTMLImageElement]"===r||"[object HTMLCanvasElement]"===r))return void e.drawImage(a,n-a.width/2,o-a.height/2);if(!(isNaN(i)||i<=0)){switch(a){default:e.beginPath(),e.arc(n,o,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),s=3*i/Math.sqrt(3),d=s*Math.sqrt(3)/2,e.moveTo(n-s/2,o+d/3),e.lineTo(n+s/2,o+d/3),e.lineTo(n,o-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(n-c,o-c,2*c,2*c),e.strokeRect(n-c,o-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=n-h,g=o-h,p=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,p,p,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(n-c,o),e.lineTo(n,o+c),e.lineTo(n+c,o),e.lineTo(n,o-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(n,o+i),e.lineTo(n,o-i),e.moveTo(n-i,o),e.lineTo(n+i,o),e.closePath();break;case"crossRot":e.beginPath(),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(n-l,o-u),e.lineTo(n+l,o+u),e.moveTo(n-l,o+u),e.lineTo(n+l,o-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(n,o+i),e.lineTo(n,o-i),e.moveTo(n-i,o),e.lineTo(n+i,o),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(n-l,o-u),e.lineTo(n+l,o+u),e.moveTo(n-l,o+u),e.lineTo(n+l,o-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(n-i,o),e.lineTo(n+i,o),e.closePath();break;case"dash":e.beginPath(),e.moveTo(n,o),e.lineTo(n+i,o),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()}}},{}],23:[function(t,e,a){"use strict";e.exports=function(t){function e(e){e=e||{};var a=e.data=e.data||{};return a.datasets=a.datasets||[],a.labels=a.labels||[],e.options=i.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function a(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}var i=t.helpers,n=t.plugins,o=t.platform;t.types={},t.instances={},t.controllers={},t.Controller=function(a,n,r){var s=this;n=e(n);var l=o.acquireContext(a,n),u=l&&l.canvas,d=u&&u.height,c=u&&u.width;return r.ctx=l,r.canvas=u,r.config=n,r.width=c,r.height=d,r.aspectRatio=d?c/d:null,s.id=i.uid(),s.chart=r,s.config=n,s.options=n.options,s._bufferedRender=!1,t.instances[s.id]=s,Object.defineProperty(s,"data",{get:function(){return s.config.data}}),l&&u?(s.initialize(),s.update(),s):(console.error("Failed to create chart: can't acquire context from the given item"),s)},i.extend(t.Controller.prototype,{initialize:function(){var t=this;return n.notify(t,"beforeInit"),i.retinaScale(t.chart),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),n.notify(t,"afterInit"),t},clear:function(){return i.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,a=e.chart,o=e.options,r=a.canvas,s=o.maintainAspectRatio&&a.aspectRatio||null,l=Math.floor(i.getMaximumWidth(r)),u=Math.floor(s?l/s:i.getMaximumHeight(r));if((a.width!==l||a.height!==u)&&(r.width=a.width=l,r.height=a.height=u,r.style.width=l+"px",r.style.height=u+"px",i.retinaScale(a),!t)){var d={width:l,height:u};n.notify(e,"resize",[d]),e.options.onResize&&e.options.onResize(e,d),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},a=t.scale;i.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),i.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),a&&(a.id=a.id||"scale")},buildScales:function(){var e=this,a=e.options,n=e.scales={},o=[];a.scales&&(o=o.concat((a.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(a.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),a.scale&&o.push({options:a.scale,dtype:"radialLinear",isDefault:!0}),i.each(o,function(a){var o=a.options,r=i.getValueOrDefault(o.type,a.dtype),s=t.scaleService.getScaleConstructor(r);if(s){var l=new s({id:o.id,options:o,ctx:e.chart.ctx,chart:e});n[l.id]=l,a.isDefault&&(e.scale=l)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,a=[],n=[];if(i.each(e.data.datasets,function(i,o){var r=e.getDatasetMeta(o);r.type||(r.type=i.type||e.config.type),a.push(r.type),r.controller?r.controller.updateIndex(o):(r.controller=new t.controllers[r.type](e,o),n.push(r.controller))},e),a.length>1)for(var o=1;o0||(n.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,n=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var a=this;a.chart=t,a.index=e,a.linkScales(),a.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),a=t.getDataset();null===e.xAxisID&&(e.xAxisID=a.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=a.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&a(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,a=e.dataElementType;return a&&new a({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,a=this,i=a.getMeta(),n=a.getDataset().data||[],o=i.data;for(t=0,e=n.length;ti&&t.insertElements(i,n-i)},insertElements:function(t,e){for(var a=0;a=0;n--)e.call(a,t[n],n);else for(n=0;n=i[a].length||!i[a][n].type?i[a].push(o.configMerge(s,e)):e.type&&e.type!==i[a][n].type?i[a][n]=o.configMerge(i[a][n],s,e):i[a][n]=o.configMerge(i[a][n],e)}):(i[a]=[],o.each(e,function(e){var n=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear");i[a].push(o.configMerge(t.scaleService.getScaleDefaults(n),e))})):i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=o.configMerge(i[a],e):i[a]=e}),i},o.getValueAtIndexOrDefault=function(t,e,a){return void 0===t||null===t?a:o.isArray(t)?e=0;i--){var n=t[i];if(e(n))return n}},o.inherits=function(t){var e=this,a=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=a};return i.prototype=e.prototype,a.prototype=new i,a.extend=o.inherits,t&&o.extend(a.prototype,t),a.__super__=e.prototype,a},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,a){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var a=e.x-t.x,i=e.y-t.y,n=Math.sqrt(a*a+i*i),o=Math.atan2(i,a);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:n}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,a,i){var n=t.skip?e:t,o=e,r=a.skip?e:a,s=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=s/(s+l),d=l/(s+l);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:o.x-c*(r.x-n.x),y:o.y-c*(r.y-n.y)},next:{x:o.x+h*(r.x-n.x),y:o.y+h*(r.y-n.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,a,i,n,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=r.length;for(e=0;e0?r[e-1]:null,n=e0?r[e-1]:null,n=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,a){return a?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var a,i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return a=e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10,a*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),i0?(a=l[0].clientX,i=l[0].clientY):(a=n.clientX,i=n.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return a=Math.round((a-s.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*r.height/e.currentDevicePixelRatio),{x:a,y:i}},o.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a):t.attachEvent?t.attachEvent("on"+e,a):t["on"+e]=a},o.removeEvent=function(t,e,a){t.removeEventListener?t.removeEventListener(e,a,!1):t.detachEvent?t.detachEvent("on"+e,a):t["on"+e]=o.noop},o.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),n=e.clientWidth-a-i,r=o.getConstraintWidth(t);return isNaN(r)?n:Math.min(n,r)},o.getMaximumHeight=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),n=e.clientHeight-a-i,r=o.getConstraintHeight(t);return isNaN(r)?n:Math.min(n,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var a=t.canvas,i=t.height,n=t.width;a.height=i*e,a.width=n*e,t.ctx.scale(e,e),a.style.height=i+"px",a.style.width=n+"px"}},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,a){return e+" "+t+"px "+a},o.longestText=function(t,e,a,i){i=i||{};var n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var s=0;o.each(a,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?s=o.measureText(t,n,r,s,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(s=o.measureText(t,n,r,s,e))})});var l=r.length/2;if(l>a.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,a,i,n,o){t.beginPath(),t.moveTo(e+o,a),t.lineTo(e+i-o,a),t.quadraticCurveTo(e+i,a,e+i,a+o),t.lineTo(e+i,a+n-o),t.quadraticCurveTo(e+i,a+n,e+i-o,a+n),t.lineTo(e+o,a+n),t.quadraticCurveTo(e,a+n,e,a+n-o),t.lineTo(e,a+o),t.quadraticCurveTo(e,a,e+o,a),t.closePath()},o.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.error("Color.js not found!"),e)},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var a,i,n,r;if(!t||!e||t.length!==e.length)return!1;for(a=0,i=t.length;a0&&(s=t.getDatasetMeta(s[0]._datasetIndex).data),s},"x-axis":function(t,e){return o(t,e,!0)},point:function(t,a){var n=e(a,t.chart);return i(t,n)},nearest:function(t,a,i){var o=e(a,t.chart),r=n(t,o,i.intersect);return r.length>1&&r.sort(function(t,e){var a=t.getArea(),i=e.getArea(),n=a-i;return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),r.slice(0,1)},x:function(t,i,n){var o=e(i,t.chart),r=[],s=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(s=!0)}),n.intersect&&!s&&(r=[]),r},y:function(t,i,n){var o=e(i,t.chart),r=[],s=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(s=!0)}),n.intersect&&!s&&(r=[]),r}}}}},{}],28:[function(t,e,a){"use strict";e.exports=function(){var t=function(e,a){return this.controller=new t.Controller(e,a,this),this.controller};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
    ');for(var a=0;a'),t.data.datasets[a].label&&e.push(t.data.datasets[a].label),e.push("");return e.push("
"),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,a,i){function n(t){var e,a=t.isHorizontal();a?(e=t.update(t.options.fullWidth?x:C,w),I-=e.height):(e=t.update(M,S),C-=e.width),D.push({horizontal:a,minSize:e,box:t})}function o(t){var a=e.findNextWhere(D,function(e){return e.box===t});if(a)if(t.isHorizontal()){var i={left:Math.max(F,A),right:Math.max(V,T),top:0,bottom:0};t.update(t.options.fullWidth?x:C,y/2,i)}else t.update(a.minSize.width,I)}function r(t){var a=e.findNextWhere(D,function(e){return e.box===t}),i={left:0,right:0,top:R,bottom:O};a&&t.update(a.minSize.width,I,i)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?d:F,t.right=t.options.fullWidth?a-c:F+C,t.top=E,t.bottom=E+t.height,E=t.bottom):(t.left=N,t.right=N+t.width,t.top=R,t.bottom=R+I,N=t.right)}if(t){var l=t.options.layout,u=l?l.padding:null,d=0,c=0,h=0,f=0;isNaN(u)?(d=u.left||0,c=u.right||0,h=u.top||0,f=u.bottom||0):(d=u,c=u,h=u,f=u);var g=e.where(t.boxes,function(t){return"left"===t.options.position}),p=e.where(t.boxes,function(t){return"right"===t.options.position}),m=e.where(t.boxes,function(t){return"top"===t.options.position}),v=e.where(t.boxes,function(t){return"bottom"===t.options.position}),b=e.where(t.boxes,function(t){return"chartArea"===t.options.position});m.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),v.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var x=a-d-c,y=i-h-f,k=x/2,S=y/2,M=(a-k)/(g.length+p.length),w=(i-S)/(m.length+v.length),C=x,I=y,D=[];e.each(g.concat(p,m,v),n);var A=0,T=0,P=0,_=0;e.each(m.concat(v),function(t){if(t.getPadding){var e=t.getPadding();A=Math.max(A,e.left),T=Math.max(T,e.right)}}),e.each(g.concat(p),function(t){if(t.getPadding){var e=t.getPadding();P=Math.max(P,e.top),_=Math.max(_,e.bottom)}});var F=d,V=c,R=h,O=f;e.each(g.concat(p),o),e.each(g,function(t){F+=t.width}),e.each(p,function(t){V+=t.width}),e.each(m.concat(v),o),e.each(m,function(t){R+=t.height}),e.each(v,function(t){O+=t.height}),e.each(g.concat(p),r),F=d,V=c,R=h,O=f,e.each(g,function(t){F+=t.width}),e.each(p,function(t){V+=t.width}),e.each(m,function(t){R+=t.height}),e.each(v,function(t){O+=t.height});var L=Math.max(A-F,0);F+=L,V+=Math.max(T-V,0);var B=Math.max(P-R,0);R+=B,O+=Math.max(_-O,0);var z=i-R-O,W=a-F-V;W===C&&z===I||(e.each(g,function(t){t.height=z}),e.each(p,function(t){t.height=z}),e.each(m,function(t){t.options.fullWidth||(t.width=W)}),e.each(v,function(t){t.options.fullWidth||(t.width=W)}),I=z,C=W);var N=d+L,E=h+B;e.each(g.concat(m),s),N+=C,E+=I,e.each(p,s),e.each(v,s),t.chartArea={left:F,top:R,right:F+C,bottom:R+I},e.each(b,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(C,I)})}}}}},{}],30:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function a(e,a){var i=new t.Legend({ctx:e.chart.ctx,options:a,chart:e});e.legend=i,t.layoutService.addBox(e,i)}var i=t.helpers,n=i.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var a=e.datasetIndex,i=this.chart,n=i.getDatasetMeta(a);n.hidden=null===n.hidden?!i.data.datasets[a].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return i.isArray(e.datasets)?e.datasets.map(function(e,a){return{text:e.label,fillStyle:i.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(a),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:a}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){i.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:n,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:n,beforeSetDimensions:n,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:n,beforeBuildLabels:n,buildLabels:function(){var t=this,e=t.options.labels,a=e.generateLabels.call(t,t.chart);e.filter&&(a=a.filter(function(a){return e.filter(a,t.chart.data)})),t.options.reverse&&a.reverse(),t.legendItems=a},afterBuildLabels:n,beforeFit:n,fit:function(){var a=this,n=a.options,o=n.labels,r=n.display,s=a.ctx,l=t.defaults.global,u=i.getValueOrDefault,d=u(o.fontSize,l.defaultFontSize),c=u(o.fontStyle,l.defaultFontStyle),h=u(o.fontFamily,l.defaultFontFamily),f=i.fontString(d,c,h),g=a.legendHitBoxes=[],p=a.minSize,m=a.isHorizontal();if(m?(p.width=a.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=a.maxHeight),r)if(s.font=f,m){var v=a.lineWidths=[0],b=a.legendItems.length?d+o.padding:0;s.textAlign="left",s.textBaseline="top",i.each(a.legendItems,function(t,i){var n=e(o,d),r=n+d/2+s.measureText(t.text).width;v[v.length-1]+r+o.padding>=a.width&&(b+=d+o.padding,v[v.length]=a.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+o.padding}),p.height+=b}else{var x=o.padding,y=a.columnWidths=[],k=o.padding,S=0,M=0,w=d+x;i.each(a.legendItems,function(t,a){var i=e(o,d),n=i+d/2+s.measureText(t.text).width;M+w>p.height&&(k+=S+o.padding,y.push(S),S=0,M=0),S=Math.max(S,n),M+=w,g[a]={left:0,top:0,width:n,height:d}}),k+=S,y.push(S),p.width+=k}a.width=p.width,a.height=p.height},afterFit:n,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,n=a.options,o=n.labels,r=t.defaults.global,s=r.elements.line,l=a.width,u=a.lineWidths;if(n.display){var d,c=a.ctx,h=i.getValueOrDefault,f=h(o.fontColor,r.defaultFontColor),g=h(o.fontSize,r.defaultFontSize),p=h(o.fontStyle,r.defaultFontStyle),m=h(o.fontFamily,r.defaultFontFamily),v=i.fontString(g,p,m);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(o,g),x=a.legendHitBoxes,y=function(e,a,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var o=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),n.labels&&n.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=e+u,f=a+u;t.canvasHelpers.drawPoint(c,i.pointStyle,l,d,f)}else o||c.strokeRect(e,a,b,g),c.fillRect(e,a,b,g);c.restore()}},k=function(t,e,a,i){c.fillText(a.text,b+g/2+t,e),a.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},S=a.isHorizontal();d=S?{x:a.left+(l-u[0])/2,y:a.top+o.padding,line:0}:{x:a.left+o.padding,y:a.top+o.padding,line:0};var M=g+o.padding;i.each(a.legendItems,function(t,e){var i=c.measureText(t.text).width,n=b+g/2+i,r=d.x,s=d.y;S?r+n>=l&&(s=d.y+=M,d.line++,r=d.x=a.left+(l-u[d.line])/2):s+M>a.bottom&&(r=d.x=r+a.columnWidths[d.line]+o.padding,s=d.y=a.top+o.padding,d.line++),y(r,s,t),x[e].left=r,x[e].top=s,k(r,s,t,i),S?d.x+=n+o.padding:d.y+=M})}},handleEvent:function(t){var e=this,a=e.options,i="mouseup"===t.type?"click":t.type,n=!1;if("mousemove"===i){if(!a.onHover)return}else{if("click"!==i)return;if(!a.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){a.onClick.call(e,t.native,e.legendItems[l]),n=!0;break}if("mousemove"===i){a.onHover.call(e,t.native,e.legendItems[l]),n=!0;break}}}return n}}),t.plugins.register({beforeInit:function(t){var e=t.options.legend;e&&a(t,e)},beforeUpdate:function(e){var n=e.options.legend;n?(n=i.configMerge(t.defaults.global.legend,n),e.legend?e.legend.options=n:a(e,n)):(t.layoutService.removeBox(e,e.legend),delete e.legend)},afterEvent:function(t,e){var a=t.legend;a&&a.handleEvent(e)}})}},{}],31:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.plugins={},t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){e.indexOf(t)===-1&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var a=e.indexOf(t);a!==-1&&e.splice(a,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length; +},getAll:function(){return this._plugins},notify:function(t,e,a){var i,n,o,r,s,l=this.descriptors(t),u=l.length;for(i=0;ic&&rt.maxHeight){r--;break}r++,d=s*u}t.labelRotation=r},afterCalculateTickRotation:function(){i.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callCallback(this.options.beforeFit,[this])},fit:function(){var t=this,n=t.minSize={width:0,height:0},o=t.options,r=o.ticks,s=o.scaleLabel,l=o.gridLines,u=o.display,d=t.isHorizontal(),c=a(r),h=1.5*a(s).size,f=o.gridLines.tickMarkLength;if(d?n.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:n.width=u&&l.drawTicks?f:0,d?n.height=u&&l.drawTicks?f:0:n.height=t.maxHeight,s.display&&u&&(d?n.height+=h:n.width+=h),r.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),p=i.numberOfLabelLines(t.ticks),m=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),x=Math.sin(v),y=x*g+c.size*p+m*p;n.height=Math.min(t.maxHeight,n.height+y),t.ctx.font=c.font;var k=t.ticks[0],S=e(t.ctx,k,c.font),M=t.ticks[t.ticks.length-1],w=e(t.ctx,M,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?b*S+3:b*m+3,t.paddingRight="bottom"===o.position?b*m+3:b*w+3):(t.paddingLeft=S/2+3,t.paddingRight=w/2+3)}else r.mirror?g=0:g+=t.options.ticks.padding,n.width+=g,t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=n.width,t.height=n.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var a=this;if(a.isHorizontal()){var i=a.width-(a.paddingLeft+a.paddingRight),n=i/Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),o=n*t+a.paddingLeft;e&&(o+=n/2);var r=a.left+Math.round(o);return r+=a.isFullWidth()?a.margins.left:0}var s=a.height-(a.paddingTop+a.paddingBottom);return a.top+t*(s/(a.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var a=e.width-(e.paddingLeft+e.paddingRight),i=a*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,a=t.max;return t.beginAtZero?0:e<0&&a<0?a:e>0&&a>0?e:0},draw:function(e){var n=this,o=n.options;if(o.display){var r,s,l=n.ctx,u=t.defaults.global,d=o.ticks,c=o.gridLines,h=o.scaleLabel,f=0!==n.labelRotation,g=d.autoSkip,p=n.isHorizontal();d.maxTicksLimit&&(s=d.maxTicksLimit);var m=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=a(d),b=c.drawTicks?c.tickMarkLength:0,x=i.getValueOrDefault(c.borderDash,u.borderDash),y=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset),k=i.getValueOrDefault(h.fontColor,u.defaultFontColor),S=a(h),M=i.toRadians(n.labelRotation),w=Math.cos(M),C=n.longestLabelWidth*w;l.fillStyle=m;var I=[];if(p){if(r=!1,f&&(C/=2),(C+d.autoSkipPadding)*n.ticks.length>n.width-(n.paddingLeft+n.paddingRight)&&(r=1+Math.floor((C+d.autoSkipPadding)*n.ticks.length/(n.width-(n.paddingLeft+n.paddingRight)))),s&&n.ticks.length>s)for(;!r||n.ticks.length/(r||1)>s;)r||(r=1),r+=1;g||(r=!1)}var D="right"===o.position?n.left:n.right-b,A="right"===o.position?n.left+b:n.right,T="bottom"===o.position?n.top:n.bottom-b,P="bottom"===o.position?n.top+b:n.bottom;if(i.each(n.ticks,function(t,a){if(void 0!==t&&null!==t){var s=n.ticks.length===a+1,l=r>1&&a%r>0||a%r===0&&a+r>=n.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var u,h;a===("undefined"!=typeof n.zeroLineIndex?n.zeroLineIndex:0)?(u=c.zeroLineWidth,h=c.zeroLineColor):(u=i.getValueAtIndexOrDefault(c.lineWidth,a),h=i.getValueAtIndexOrDefault(c.color,a));var g,m,v,k,S,w,C,_,F,V,R="middle",O="middle";if(p){"bottom"===o.position?(O=f?"middle":"top",R=f?"right":"center",V=n.top+b):(O=f?"middle":"bottom",R=f?"left":"center",V=n.bottom-b);var L=n.getPixelForTick(a)+i.aliasPixel(u);F=n.getPixelForTick(a,c.offsetGridLines)+d.labelOffset,g=v=S=C=L,m=T,k=P,w=e.top,_=e.bottom}else{var B,z="left"===o.position,W=d.padding;d.mirror?(R=z?"left":"right",B=W):(R=z?"right":"left",B=b+W),F=z?n.right-B:n.left+B;var N=n.getPixelForTick(a);N+=i.aliasPixel(u),V=n.getPixelForTick(a,c.offsetGridLines),g=D,v=A,S=e.left,C=e.right,m=k=w=_=N}I.push({tx1:g,ty1:m,tx2:v,ty2:k,x1:S,y1:w,x2:C,y2:_,labelX:F,labelY:V,glWidth:u,glColor:h,glBorderDash:x,glBorderDashOffset:y,rotation:-1*M,label:t,textBaseline:O,textAlign:R})}}}),i.each(I,function(t){if(c.display&&(l.save(),l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.setLineDash&&(l.setLineDash(t.glBorderDash),l.lineDashOffset=t.glBorderDashOffset),l.beginPath(),c.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke(),l.restore()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=v.font,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var a=0,n=0;a0)i=t.stepSize;else{var o=e.niceNum(a.max-a.min,!1);i=e.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(a.min/i)*i,s=Math.ceil(a.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,s=t.max);var l=(s-r)/i;l=e.almostEquals(l,Math.round(l),i/1e3)?Math.round(l):Math.ceil(l),n.push(void 0!==t.min?t.min:r);for(var u=1;u3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var o=e.log10(Math.abs(n)),r="";if(0!==t){var s=-1*Math.floor(o);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r},logarithmic:function(t,a,i){var n=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===a||a===i.length-1?t.toExponential():""}}}}},{}],35:[function(t,e,a){"use strict";e.exports=function(t){function e(e,a){var i=new t.Title({ctx:e.chart.ctx,options:a,chart:e});e.titleBlock=i,t.layoutService.addBox(e,i)}var a=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var i=a.noop;t.Title=t.Element.extend({initialize:function(t){var e=this;a.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:i,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:i,afterBuildLabels:i,beforeFit:i,fit:function(){var e=this,i=a.getValueOrDefault,n=e.options,o=t.defaults.global,r=n.display,s=i(n.fontSize,o.defaultFontSize),l=e.minSize;e.isHorizontal()?(l.width=e.maxWidth,l.height=r?s+2*n.padding:0):(l.width=r?s+2*n.padding:0,l.height=e.maxHeight),e.width=l.width,e.height=l.height},afterFit:i,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,n=a.getValueOrDefault,o=e.options,r=t.defaults.global;if(o.display){var s,l,u,d=n(o.fontSize,r.defaultFontSize),c=n(o.fontStyle,r.defaultFontStyle),h=n(o.fontFamily,r.defaultFontFamily),f=a.fontString(d,c,h),g=0,p=e.top,m=e.left,v=e.bottom,b=e.right;i.fillStyle=n(o.fontColor,r.defaultFontColor),i.font=f,e.isHorizontal()?(s=m+(b-m)/2,l=p+(v-p)/2,u=b-m):(s="left"===o.position?m+d/2:b-d/2,l=p+(v-p)/2,u=v-p,g=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(s,l),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0,u),i.restore()}}}),t.plugins.register({beforeInit:function(t){var a=t.options.title;a&&e(t,a)},beforeUpdate:function(i){var n=i.options.title;n?(n=a.configMerge(t.defaults.global.title,n),i.titleBlock?i.titleBlock.options=n:e(i,n)):(t.layoutService.removeBox(i,i.titleBlock),delete i.titleBlock)}})}},{}],36:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){var a=l.color(t);return a.alpha(e*a.alpha()).rgbaString()}function a(t,e){return e&&(l.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,a=t._yScale||t._scale,i=t._index,n=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,n):"",yLabel:a?a.getLabelForIndex(i,n):"",index:i,datasetIndex:n,x:t._model.x,y:t._model.y}}function n(e){var a=t.defaults.global,i=l.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,a.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,a.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,a.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,a.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,a.defaultFontStyle),titleFontSize:i(e.titleFontSize,a.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,a.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,a.defaultFontStyle),footerFontSize:i(e.footerFontSize,a.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors}}function o(t,e){var a=t._chart.ctx,i=2*e.yPadding,n=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=s*d,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=r*c,i+=r?(r-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){n=Math.max(n,a.measureText(t).width+f)};return a.font=l.fontString(d,e._titleFontStyle,e._titleFontFamily),l.each(e.title,g),a.font=l.fontString(c,e._bodyFontStyle,e._bodyFontFamily),l.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,l.each(o,function(t){l.each(t.before,g),l.each(t.lines,g),l.each(t.after,g)}),f=0,a.font=l.fontString(h,e._footerFontStyle,e._footerFontFamily),l.each(e.footer,g),n+=2*e.xPadding,{width:n,height:i}}function r(t,e){var a=t._model,i=t._chart,n=t._chartInstance.chartArea,o="center",r="center";a.yi.height-e.height&&(r="bottom");var s,l,u,d,c,h=(n.left+n.right)/2,f=(n.top+n.bottom)/2;"center"===r?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},s(a.x)?(o="left",u(a.x)&&(o="center",r=c(a.y))):l(a.x)&&(o="right",d(a.x)&&(o="center",r=c(a.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function s(t,e,a){var i=t.x,n=t.y,o=t.caretSize,r=t.caretPadding,s=t.cornerRadius,l=a.xAlign,u=a.yAlign,d=o+r,c=s+r;return"right"===l?i-=e.width:"center"===l&&(i-=e.width/2),"top"===u?n+=d:n-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===l?i+=d:"right"===l&&(i-=d):"left"===l?i-=c:"right"===l&&(i+=c),{x:i,y:n}}var l=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,callbacks:{beforeTitle:l.noop,title:function(t,e){var a="",i=e.labels,n=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?a=o.xLabel:n>0&&o.indexl;)o-=2*Math.PI;for(;o=s&&o<=l,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,a=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,a=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},draw:function(){var t=this._chart.ctx,e=this._view,a=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,a,i),t.arc(e.x,e.y,e.innerRadius,i,a,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],38:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:a.defaultColor,borderWidth:3,borderColor:a.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){function t(t,e){var a=e._view;e._view.steppedLine===!0?(l.lineTo(a.x,t._view.y),l.lineTo(a.x,a.y)):0===e._view.tension?l.lineTo(a.x,a.y):l.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,a.controlPointPreviousX,a.controlPointPreviousY,a.x,a.y)}var i=this,n=i._view,o=n.spanGaps,r=n.scaleZero,s=i._loop;s||("top"===n.fill?r=n.scaleTop:"bottom"===n.fill&&(r=n.scaleBottom));var l=i._chart.ctx;l.save();var u=i._children.slice(),d=-1;s&&u.length&&u.push(u[0]);var c,h,f,g;if(u.length&&n.fill){for(l.beginPath(),c=0;ce?1:-1,r=1,s=u.borderSkipped||"left"):(e=u.x-u.width/2,a=u.x+u.width/2,i=u.y,n=u.base,o=1,r=n>i?1:-1,s=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-a),Math.abs(i-n));d=d>c?c:d;var h=d/2,f=e+("left"!==s?h*o:0),g=a+("right"!==s?-h*o:0),p=i+("top"!==s?h*r:0),m=n+("bottom"!==s?-h*r:0);f!==g&&(i=p,n=m),p!==m&&(e=f,a=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,n],[e,i],[a,i],[a,n]],b=["bottom","left","top","right"],x=b.indexOf(s,0);x===-1&&(x=0);var y=t(0);l.moveTo(y[0],y[1]);for(var k=1;k<4;k++)y=t(k),l.lineTo(y[0],y[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var n=a(this);i=t>=n.left&&t<=n.right&&e>=n.top&&e<=n.bottom}return i},inLabelRange:function(t,i){var n=this;if(!n._view)return!1;var o=!1,r=a(n);return o=e(n)?t>=r.left&&t<=r.right:i>=r.top&&i<=r.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,a,i=this._view;return e(this)?(t=i.x,a=(i.y+i.base)/2):(t=(i.x+i.base)/2,a=i.y),{x:t,y:a}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],41:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){var a=l.getStyle(t,e),i=a&&a.match(/(\d+)px/);return i?Number(i[1]):void 0}function a(t,a){var i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t._chartjs={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=e(t,"width");void 0!==r&&(t.width=r)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(a.options.aspectRatio||2);else{var s=e(t,"height");void 0!==r&&(t.height=s)}return t}function i(t,e,a,i,n){return{type:t,chart:e,native:n||null,x:void 0!==a?a:null,y:void 0!==i?i:null}}function n(t,e){ +var a=u[t.type]||t.type,n=l.getRelativePosition(t,e);return i(a,e,n.x,n.y,t)}function o(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,l.addEvent(e,"load",function(){l.addEvent(e.contentWindow||e,"resize",t),t()}),e}function r(t,e,a){var n=t._chartjs={ticking:!1},r=function(){n.ticking||(n.ticking=!0,l.requestAnimFrame.call(window,function(){if(n.resizer)return n.ticking=!1,e(i("resize",a))}))};n.resizer=o(r),t.insertBefore(n.resizer,t.firstChild)}function s(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var l=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){if("string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t instanceof HTMLCanvasElement){var i=t.getContext&&t.getContext("2d");if(i instanceof CanvasRenderingContext2D)return a(t,e),i}return null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var a=e._chartjs.initial;["height","width"].forEach(function(t){var i=a[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),l.each(a.style||{},function(t,a){e.style[a]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,a){var i=t.chart.canvas;if("resize"===e)return void r(i.parentNode,a,t.chart);var o=a._chartjs||(a._chartjs={}),s=o.proxies||(o.proxies={}),u=s[t.id+"_"+e]=function(e){a(n(e,t.chart))};l.addEvent(i,e,u)},removeEventListener:function(t,e,a){var i=t.chart.canvas;if("resize"===e)return void s(i.parentNode,a);var n=a._chartjs||{},o=n.proxies||{},r=o[t.id+"_"+e];r&&l.removeEvent(i,e,r)}}}},{}],42:[function(t,e,a){"use strict";var i=t(41);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{41:41}],43:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,a=t.getLabels();t.minIndex=0,t.maxIndex=a.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(a,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(a,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=a[t.minIndex],t.max=a[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var a=this,i=a.chart.data,n=a.isHorizontal();return i.yLabels&&!n?a.getRightValue(i.datasets[e].data[t]):a.ticks[t-a.minIndex]},getPixelForValue:function(t,e,a,i){var n=this,o=Math.max(n.maxIndex+1-n.minIndex-(n.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&isNaN(e)){var r=n.getLabels(),s=r.indexOf(t);e=s!==-1?s:e}if(n.isHorizontal()){var l=n.width/o,u=l*(e-n.minIndex);return(n.options.gridLines.offsetGridLines&&i||n.maxIndex===n.minIndex&&i)&&(u+=l/2),n.left+Math.round(u)}var d=n.height/o,c=d*(e-n.minIndex);return n.options.gridLines.offsetGridLines&&i&&(c+=d/2),n.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,a=this,i=Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),n=a.isHorizontal(),o=(n?a.width:a.height)/i;return t-=n?a.left:a.top,a.options.gridLines.offsetGridLines&&(t-=o/2),e=t<=0?0:Math.round(t/o)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,a)}},{}],44:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=a.chart,o=n.data,r=o.datasets,s=a.isHorizontal();a.min=null,a.max=null;var l=i.stacked;if(void 0===l&&e.each(r,function(e,a){if(!l){var i=n.getDatasetMeta(a);n.isDatasetVisible(a)&&t(i)&&void 0!==i.stack&&(l=!0)}}),i.stacked||l){var u={};e.each(r,function(o,r){var s=n.getDatasetMeta(r),l=[s.type,void 0===i.stacked&&void 0===s.stack?r:"",s.stack].join(".");void 0===u[l]&&(u[l]={positiveValues:[],negativeValues:[]});var d=u[l].positiveValues,c=u[l].negativeValues;n.isDatasetVisible(r)&&t(s)&&e.each(o.data,function(t,e){var n=+a.getRightValue(t);isNaN(n)||s.data[e].hidden||(d[e]=d[e]||0,c[e]=c[e]||0,i.relativePoints?d[e]=100:n<0?c[e]+=n:d[e]+=n)})}),e.each(u,function(t){var i=t.positiveValues.concat(t.negativeValues),n=e.min(i),o=e.max(i);a.min=null===a.min?n:Math.min(a.min,n),a.max=null===a.max?o:Math.max(a.max,o)})}else e.each(r,function(i,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var a,i=this,n=i.options.ticks;if(i.isHorizontal())a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(n.fontSize,t.defaults.global.defaultFontSize);a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,a=this,i=a.start,n=+a.getRightValue(t),o=a.end-i;return a.isHorizontal()?(e=a.left+a.width/o*(n-i),Math.round(e)):(e=a.bottom-a.height/o*(n-i),Math.round(e))},getValueForPixel:function(t){var e=this,a=e.isHorizontal(),i=a?e.width:e.height,n=(a?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*n},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,a)}},{}],45:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,a=t.options,i=a.ticks;if(i.beginAtZero){var n=e.sign(t.min),o=e.sign(t.max);n<0&&o<0?t.max=0:n>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:a,handleDirectionalChanges:a,buildTicks:function(){var a=this,i=a.options,n=i.ticks,o=a.getTickLimit();o=Math.max(2,o);var r={maxTicks:o,min:n.min,max:n.max,stepSize:e.getValueOrDefault(n.fixedStepSize,n.stepSize)},s=a.ticks=t.Ticks.generators.linear(r,a);a.handleDirectionalChanges(),a.max=e.max(s),a.min=e.min(s),n.reverse?(s.reverse(),a.start=a.max,a.end=a.min):(a.start=a.min,a.end=a.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],46:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=i.ticks,o=a.chart,r=o.data,s=r.datasets,l=e.getValueOrDefault,u=a.isHorizontal();a.min=null,a.max=null,a.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(s,function(e,a){if(!d){var i=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(s,function(n,r){var s=o.getDatasetMeta(r),l=[s.type,void 0===i.stacked&&void 0===s.stack?r:"",s.stack].join(".");o.isDatasetVisible(r)&&t(s)&&(void 0===c[l]&&(c[l]=[]),e.each(n.data,function(t,e){var n=c[l],o=+a.getRightValue(t);isNaN(o)||s.data[e].hidden||(n[e]=n[e]||0,i.relativePoints?n[e]=100:n[e]+=o)}))}),e.each(c,function(t){var i=e.min(t),n=e.max(t);a.min=null===a.min?i:Math.min(a.min,i),a.max=null===a.max?n:Math.max(a.max,n)})}else e.each(s,function(i,n){var r=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i),0!==i&&(null===a.minNotZero||in?{start:e-a-5,end:e}:{start:e,end:e+a+5}}function o(t){var o,r,s,l=a(t),u=Math.min(t.height/2,t.width/2),d={l:t.width,r:0,t:t.height,b:0},c={};t.ctx.font=l.font,t._pointLabelSizes=[];var h=e(t);for(o=0;od.r&&(d.r=m.end,c.r=g),v.startd.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function r(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function s(t){return 0===t||180===t?"center":t<180?"left":"right"}function l(t,e,a,i){if(f.isArray(e))for(var n=a.y,o=1.5*i,r=0;r270||t<90)&&(a.y-=e.h)}function d(t){var i=t.ctx,n=f.getValueOrDefault,o=t.options,r=o.angleLines,d=o.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var c=t.getDistanceFromCenterForValue(o.reverse?t.min:t.max),h=a(t);i.textBaseline="top";for(var p=e(t)-1;p>=0;p--){if(r.display){var m=t.getPointPosition(p,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}var v=t.getPointPosition(p,c+5),b=n(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var x=t.getIndexAngle(p),y=f.toDegrees(x);i.textAlign=s(y),u(y,t._pointLabelSizes[p],v),l(i,t.pointLabels[p]||"",v,h.size)}}function c(t,a,i,n){var o=t.ctx;if(o.strokeStyle=f.getValueAtIndexOrDefault(a.color,n-1),o.lineWidth=f.getValueAtIndexOrDefault(a.lineWidth,n-1),t.options.lineArc)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var r=e(t);if(0===r)return;o.beginPath();var s=t.getPointPosition(0,i);o.moveTo(s.x,s.y);for(var l=1;l0&&a>0?e:0)},draw:function(){var t=this,e=t.options,a=e.gridLines,i=e.ticks,n=f.getValueOrDefault;if(e.display){var o=t.ctx,r=n(i.fontSize,g.defaultFontSize),s=n(i.fontStyle,g.defaultFontStyle),l=n(i.fontFamily,g.defaultFontFamily),u=f.fontString(r,s,l);f.each(t.ticks,function(s,l){if(l>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-d;if(a.display&&0!==l&&c(t,a,d,l),i.display){var f=n(i.fontColor,g.defaultFontColor);if(o.font=u,i.showLabelBackdrop){var p=o.measureText(s).width;o.fillStyle=i.backdropColor,o.fillRect(t.xCenter-p/2-i.backdropPaddingX,h-r/2-i.backdropPaddingY,p+2*i.backdropPaddingX,r+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=f,o.fillText(s,t.xCenter,h)}}}),e.lineArc||d(t)}}});t.scaleService.registerScaleType("radialLinear",m,p)}},{}],48:[function(t,e,a){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,a={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},n={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return null===t||null===e?null:"undefined"!=typeof this.labelMoments[t]?this.labelMoments[t][e]:null},getLabelDiff:function(t,e){var a=this;return null===t||null===e?null:(void 0===a.labelDiffs&&a.buildLabelDiffs(),"undefined"!=typeof a.labelDiffs[t]?a.labelDiffs[t][e]:null)},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),a.push(i))},t),t.firstTick=i.min.call(t,a),t.lastTick=i.max.call(t,a)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(n,o){var r=[],s=t.chart.isDatasetVisible(o);"object"==typeof n.data[0]&&null!==n.data[0]?e.each(n.data,function(e){var a=t.parseTime(t.getRightValue(e));a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),r.push(a),s&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,a):a,t.lastTick=null!==t.lastTick?i.max(t.lastTick,a):a))},t):r=a,t.labelMoments.push(r)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildLabelDiffs:function(){var t=this;t.labelDiffs=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0&&e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),a.push(i.diff(t.firstTick,t.tickUnit,!0)))},t),e.each(t.chart.data.datasets,function(i){var n=[];"object"==typeof i.data[0]&&null!==i.data[0]?e.each(i.data,function(e){var a=t.parseTime(t.getRightValue(e));a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),n.push(a.diff(t.firstTick,t.tickUnit,!0)))},t):n=a,t.labelDiffs.push(n)},t)},buildTicks:function(){var i=this;i.ctx.save();var n=e.getValueOrDefault(i.options.ticks.fontSize,t.defaults.global.defaultFontSize),o=e.getValueOrDefault(i.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),r=e.getValueOrDefault(i.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(n,o,r);if(i.ctx.font=s,i.ticks=[],i.unitScale=1,i.scaleSizeInUnits=0,i.options.time.unit)i.tickUnit=i.options.time.unit||"day",i.displayFormat=i.options.time.displayFormats[i.tickUnit],i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,1);else{var l=i.isHorizontal()?i.width:i.height,u=i.tickFormatFunction(i.firstTick,0,[]),d=i.ctx.measureText(u).width,c=Math.cos(e.toRadians(i.options.ticks.maxRotation)),h=Math.sin(e.toRadians(i.options.ticks.maxRotation));d=d*c+n*h;var f=l/d;i.tickUnit=i.options.time.minUnit,i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.displayFormat=i.options.time.displayFormats[i.tickUnit];for(var g=0,p=a.units[g];g=Math.ceil(i.scaleSizeInUnits/f)){i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,p.steps[m]);break}break}if(p.maxStep===!1||Math.ceil(i.scaleSizeInUnits/f)=0&&(i.lastTick=y),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0)}i.options.time.displayFormat&&(i.displayFormat=i.options.time.displayFormat),i.ticks.push(i.firstTick.clone());for(var S=i.unitScale;S<=i.scaleSizeInUnits;S+=i.unitScale){var M=x.clone().add(S,i.tickUnit);if(i.options.time.max&&M.diff(i.lastTick,i.tickUnit,!0)>=0)break;i.ticks.push(M)}var w=i.ticks[i.ticks.length-1].diff(i.lastTick,i.tickUnit);0===w&&0!==i.scaleSizeInUnits||(i.options.time.max?(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.ticks[0],i.tickUnit,!0)):(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0))),i.ctx.restore(),i.labelDiffs=void 0},getLabelForIndex:function(t,e){var a=this,i=a.chart.data.labels&&t +
+ +
+ + + + + +
+ + + + +
+ diff --git a/web/skins/classic/views/reports.php b/web/skins/classic/views/reports.php new file mode 100644 index 000000000..4d80a10ec --- /dev/null +++ b/web/skins/classic/views/reports.php @@ -0,0 +1,95 @@ + +
+ +
+ + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+
+ From e27e1c099137ee62c39102b9175109601c3eeb1f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 12:28:39 -0400 Subject: [PATCH 002/134] Add backtrace to invalid value for width --- web/includes/Monitor.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index 2deac9be5..92f342c4a 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -876,7 +876,10 @@ public static function getStatuses() { if ( $scale < $options['scale'] ) $options['scale'] = $scale; } else { - Warning('Invalid value for width: '.$options['width']); + $backTrace = debug_backtrace(); + $file = $backTrace[1]['file']; + $line = $backTrace[1]['line']; + Warning('Invalid value for width: '.$options['width']. ' from '.$file.':'.$line); } } } From 6c292dd0e322c6276fa3f76911fd6c65770bece2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 13:38:56 -0400 Subject: [PATCH 003/134] Improve adding parenthesis, rename function to snake case --- web/js/MonitorLinkExpression.js | 40 ++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/web/js/MonitorLinkExpression.js b/web/js/MonitorLinkExpression.js index 2f391d6e3..e5a5c1814 100644 --- a/web/js/MonitorLinkExpression.js +++ b/web/js/MonitorLinkExpression.js @@ -79,22 +79,26 @@ function expr_to_ui(expr, container) { if (!tokens.length) return; // Every monitorlink should have possible parenthesis on either side of it - if (tokens[0].type != '(') { - tokens.unshift({type: '(', value: ''}); - } - if (tokens[tokens.length-1].type != ')') { - tokens.push({type: ')', value: ''}); - } - if (tokens.length > 2) { + if (tokens.length > 3) { + if (tokens[0].type != '(') { + tokens.unshift({type: '(', value: ''}); + } + if (tokens[tokens.length-1].type != ')') { + tokens.push({type: ')', value: ''}); + } for (let token_index = 1; token_index < tokens.length-1; token_index++) { const token = tokens[token_index]; if (token.type == 'link') { if (tokens[token_index-1].type != '(' && tokens[token_index-1].type != ')') { - tokens.splice(token_index-1, {type: '()', value: ''}); + console.log("Adding () before ", token, token_index); + tokens.splice(token_index, 0, {type: '()', value: ''}); + token_index ++; } if (tokens[token_index+1].type != '(' && tokens[token_index+1].type != ')') { - tokens.splice(token_index+1, {type: '()', value: ''}); + console.log("Adding () after ", token, token_index); + tokens.splice(token_index+1, 0, {type: '()', value: ''}); + token_index ++; } brackets++; used_monitorlinks.push(token.value); @@ -119,7 +123,7 @@ function expr_to_ui(expr, container) { } // end foreach zone } // end foreach monitor select.val(token.value); - select.on('change', updateExpr); + select.on('change', update_expr); token.html = select; } else if (token.type == '(' || token.type == ')') { const select = $j(''); @@ -128,7 +132,7 @@ function expr_to_ui(expr, container) { select.append(''); } select.val(token.value); - select.on('change', updateExpr); + select.on('change', update_expr); token.html = select; } else if (token.type == '()') { const select = $j(''); @@ -140,14 +144,14 @@ function expr_to_ui(expr, container) { select.append(''); } select.val(token.value); - select.on('change', updateExpr); + select.on('change', update_expr); token.html = select; } else { const select = $j(''); select.append(''); select.append(''); select.val(token.type); - select.on('change', updateExpr); + select.on('change', update_expr); token.html = select; } container.append(token.html); @@ -167,7 +171,7 @@ function expr_to_ui(expr, container) { } } // end foreach zone } // end foreach monitor - select.on('change', addToExpr); + select.on('change', add_to_expr); container.append(select); } // end expr_to_ui @@ -178,13 +182,13 @@ function array_search(needle, haystack) { return false; } -function addToExpr() { +function add_to_expr() { $j('[name="newMonitor[LinkedMonitors]"]').val($j('[name="newMonitor[LinkedMonitors]"]').val() + '|' + $j('#monitorLinks').val()); - ui_to_expr( $j('#LinkedMonitorsUI'), $j('[name="newMonitor[LinkedMonitors]"]')); + expr_to_ui($j('[name="newMonitor[LinkedMonitors]"]').val(), $j('#LinkedMonitorsUI')); } -function updateExpr(ev) { - ui_to_expr( $j('#LinkedMonitorsUI'), $j('[name="newMonitor[LinkedMonitors]"]')); +function update_expr(ev) { + ui_to_expr($j('#LinkedMonitorsUI'), $j('[name="newMonitor[LinkedMonitors]"]')); } function ui_to_expr(container, expr_input) { From 4587d0576d787afde68f1854dcaa10584e38a2b8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 13:40:08 -0400 Subject: [PATCH 004/134] Remove unused code --- web/skins/classic/views/js/monitor.js | 82 --------------------------- 1 file changed, 82 deletions(-) diff --git a/web/skins/classic/views/js/monitor.js b/web/skins/classic/views/js/monitor.js index bf5f5b7ef..f36f3e2b3 100644 --- a/web/skins/classic/views/js/monitor.js +++ b/web/skins/classic/views/js/monitor.js @@ -499,88 +499,6 @@ function Model_onchange(input) { select_by_value_case_insensitive(input.form.elements['newMonitor[ModelId]'], input.value); } -function addMonitorLinkTerm( element ) { - var row = $j(element).closest('tr'); - row.find('select').chosen('destroy'); - var newRow = row.clone().insertAfter(row); - row.find('select').chosen({width: '101%'}); - newRow.find('select').each( function() { //reset new row to default - this[0].selected = 'selected'; - }).chosen({width: '101%'}); - newRow[0].querySelectorAll("button[data-on-click-this]").forEach(function(el) { - var fnName = el.getAttribute("data-on-click-this"); - el.onclick = window[fnName].bind(el, el); - }); - - newRow[0].querySelectorAll('select[data-on-change-this]').forEach(function(el) { - var fnName = el.getAttribute('data-on-change-this'); - el.onchange = window[fnName].bind(el, el); - }); - - var rows = $j(row).parent().children(); - parseRows(rows); -} - -function delMonitorLinkTerm( element ) { - var row = $j(element).closest('tr'); - var rowParent = $j(row).parent(); - row.remove(); - var rows = rowParent.children(); - parseRows(rows); -} - -function parseRows(rows) { - for ( var rowNum = 0; rowNum < rows.length; rowNum++ ) { //Each row is a term - var queryPrefix = 'Monitor[LinkedMonitors][terms]['; - var inputTds = rows.eq(rowNum).children(); - - if ( rowNum == 0 ) inputTds.eq(0).html(' '); //Remove and from first term - if ( rowNum > 0 ) { //add and/or to 1+ - var cnjVal = inputTds.eq(0).children().val(); - var conjSelect = $j('').attr('name', queryPrefix + rowNum + '][cnj]').attr('id', queryPrefix + rowNum + '][cnj]'); - $j.each(conjTypes, function(i) { - conjSelect.append(''); - }); - inputTds.eq(0).html(conjSelect).children().val(cnjVal === undefined ? 'and' : cnjVal); - }var brackets = rows.length - 2; - if ( brackets > 0 ) { // add bracket select to all rows - const obrSelect = $j('').attr('name', queryPrefix + rowNum + '][obr]').attr('id', queryPrefix + rowNum + '][obr]'); - const cbrSelect = $j('').attr('name', queryPrefix + rowNum + '][cbr]').attr('id', queryPrefix + rowNum + '][cbr]'); - obrSelect.append(''); - cbrSelect.append(''); - for ( var i = 1; i <= brackets; i++ ) { // build bracket options - obrSelect.append(''); - cbrSelect.append(''); - } - var obrVal = inputTds.eq(1).children().val() != undefined ? inputTds.eq(1).children().val() : 0; // Save currently selected bracket option - var cbrVal = inputTds.eq(5).children().val() != undefined ? inputTds.eq(5).children().val() : 0; - inputTds.eq(1).html(obrSelect).children().val(obrVal); // Set bracket contents and assign saved value - inputTds.eq(5).html(cbrSelect).children().val(cbrVal); - } else { - inputTds.eq(1).html(' '); // Blank if there aren't enough terms for brackets - inputTds.eq(5).html(' '); - } - - if ( rows.length == 1 ) { - inputTds.eq(6).find('button[data-on-click-this="delTerm"]').prop('disabled', true); // enable/disable remove row button - } else { - inputTds.eq(6).find('button[data-on-click-this="delTerm"]').prop('disabled', false); - } - - var zoneSelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); - for ( monitor_id in monitors ) { - for ( zone_id in zones ) { - var zone = zones[zone_id]; - if ( monitor_id == zone.MonitorId ) { - zoneSelect.append(''); - } - } // end foreach zone - } // end foreach monitor - var zoneVal = inputTds.eq(4).children().val(); - inputTds.eq(4).html(zoneSelect).children().val(zoneVal).chosen({width: "101%"}); - } -} - function updateLinkedMonitorsUI() { expr_to_ui($j('[name="newMonitor[LinkedMonitors]"]').val(), $j('#LinkedMonitorsUI')); } From dc52105c8f759fc8ae3f64584910eb42fa5b6940 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 14:44:44 -0400 Subject: [PATCH 005/134] Allow to link to ourself --- web/js/MonitorLinkExpression.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/js/MonitorLinkExpression.js b/web/js/MonitorLinkExpression.js index e5a5c1814..6e1620f6c 100644 --- a/web/js/MonitorLinkExpression.js +++ b/web/js/MonitorLinkExpression.js @@ -161,8 +161,8 @@ function expr_to_ui(expr, container) { select.append(''); for (monitor_id in monitors) { const monitor = monitors[monitor_id]; - if (!array_search(monitor.Id, used_monitorlinks)) - select.append(''); + //if (!array_search(monitor.Id, used_monitorlinks)) + //select.append(''); for ( zone_id in zones ) { const zone = zones[zone_id]; if ( monitor.Id == zone.MonitorId ) { From 23c2546cb6fbc361e043cfefc6d5b2c840de08f2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 18:01:47 -0400 Subject: [PATCH 006/134] Record an Amcrest mac vendor but don't implement probe yet --- web/skins/classic/views/monitorprobe.php | 1 + 1 file changed, 1 insertion(+) diff --git a/web/skins/classic/views/monitorprobe.php b/web/skins/classic/views/monitorprobe.php index 1bb629bf0..900245c1e 100644 --- a/web/skins/classic/views/monitorprobe.php +++ b/web/skins/classic/views/monitorprobe.php @@ -344,6 +344,7 @@ function probeNetwork() { $macBases = array( '00:0f:7c' => array('type'=>'ACTi','probeFunc'=>'probeACTi'), + #'9c:8e:cd' => array('type'=>'Amcrest', 'probeFunc'=>'probeAmcrest'), '00:40:8c' => array('type'=>'Axis', 'probeFunc'=>'probeAxis'), '2c:a5:9c' => array('type'=>'Hikvision', 'probeFunc'=>'probeHikvision'), '00:80:f0' => array('type'=>'Panasonic','probeFunc'=>'probePana'), From ca1ad2e2e46f2f36a971526c6d95bb09ccd5c332 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:07:33 -0400 Subject: [PATCH 007/134] Fix use of filter instead of this --- web/includes/Filter.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/includes/Filter.php b/web/includes/Filter.php index 5be6c252a..c57f034c1 100644 --- a/web/includes/Filter.php +++ b/web/includes/Filter.php @@ -42,7 +42,7 @@ class Filter extends ZM_Object { protected $_Terms; public function sql() { - if ( ! isset($this->_sql) ) { + if (!isset($this->_sql)) { $this->_sql = ''; foreach ( $this->FilterTerms() as $term ) { #if ( ! ($term->is_pre_sql() or $term->is_post_sql()) ) { @@ -196,12 +196,12 @@ class Filter extends ZM_Object { // The following three fields are actually stored in the Query public function sort_field( ) { - if ( func_num_args( ) ) { + if (func_num_args()) { $Query = $this->Query(); $Query['sort_field'] = func_get_arg(0); $this->Query($Query); } - if ( isset( $this->Query()['sort_field'] ) ) { + if (isset($this->Query()['sort_field'])) { return $this->{'Query'}['sort_field']; } return ZM_WEB_EVENT_SORT_FIELD; @@ -674,11 +674,11 @@ class Filter extends ZM_Object { } $where = $this->sql() ? ' WHERE ('.$this->sql().')' : ''; - $sort = $this->sort_field() ? $this->sort_field() .' '.$this->sort_asc() : ''; + $sort = $this->sort_field() ? $this->sort_field() .' '.($this->sort_asc() ? 'ASC' : 'DESC') : ''; $col_str = 'E.*, M.Name AS Monitor'; $sql = 'SELECT ' .$col_str. ' FROM `Events` AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id'.$where.($sort?' ORDER BY '.$sort:''); - if ($filter->limit() and !count($this->pre_sql_conditions()) and !count($this->post_sql_conditions())) { + if ($this->limit() and !count($this->pre_sql_conditions()) and !count($this->post_sql_conditions())) { $sql .= ' LIMIT '.$this->limit(); } @@ -687,7 +687,7 @@ class Filter extends ZM_Object { if (!$query) return $events; while ($row = dbFetchNext($query)) { - $event = new ZM\Event($row); + $event = new Event($row); $event->remove_from_cache(); if (!$this->test_post_sql_conditions($event)) { continue; From f6a7698e43b0cb3ed93f7f177a47d9cad3a7a9b8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:07:46 -0400 Subject: [PATCH 008/134] Add Reports menu option --- web/skins/classic/includes/functions.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web/skins/classic/includes/functions.php b/web/skins/classic/includes/functions.php index 66e1dda62..0a9e4ecb7 100644 --- a/web/skins/classic/includes/functions.php +++ b/web/skins/classic/includes/functions.php @@ -234,6 +234,7 @@ function getNormalNavBarHTML($running, $user, $bandwidth_options, $view, $skin) echo getMontageHTML($view); echo getMontageReviewHTML($view); echo getSnapshotsHTML($view); + echo getReportsHTML($view); echo getRprtEvntAuditHTML($view); echo getHeaderFlipHTML(); echo ''; @@ -368,6 +369,7 @@ function getCollapsedNavBarHTML($running, $user, $bandwidth_options, $view, $ski echo getMontageHTML($view); echo getMontageReviewHTML($view); echo getSnapshotsHTML($view); + echo getReportsHTML($view); echo getRprtEvntAuditHTML($view); echo ''; } @@ -764,6 +766,17 @@ function getSnapshotsHTML($view) { return $result; } +function getReportsHTML($view) { + $result = ''; + + if (canView('Events')) { + $class = ($view == 'reports' or $view == 'report') ? ' selected' : ''; + $result .= ''.PHP_EOL; + } + + return $result; +} + // Returns the html representing the Audit Events Report menu item function getRprtEvntAuditHTML($view) { $result = ''; From d9b077d792cbe1e5ff9dbc88ca51d38b50aa2389 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:08:11 -0400 Subject: [PATCH 009/134] rough in editing and timeline graphing --- web/skins/classic/views/report.php | 126 ++++++++++++++++++++++------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/web/skins/classic/views/report.php b/web/skins/classic/views/report.php index c7e141379..f368e2c12 100644 --- a/web/skins/classic/views/report.php +++ b/web/skins/classic/views/report.php @@ -25,66 +25,135 @@ #$view = 'console'; #return; #} +# require_once('includes/Event.php'); require_once('includes/Filter.php'); -#require_once('includes/Report.php'); +require_once('includes/Report.php'); + +$report_id = isset($_REQUEST['id']) ? validInt($_REQUEST['id']) : ''; +$report = new ZM\Report($report_id); xhtmlHeaders(__FILE__, translate('Reports')); getBodyTopHTML(); echo getNavBarHTML(); ?>
- -
- - - - - +
+
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+Id()] = $F; + } +echo htmlSelect('Report[FilterId]', array(''=>translate('select')) + $FiltersById, $report->FilterId()) +?>
+
-
From ce1f3a8ac6fb973d3623d6247222d83c31afa7f6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:11:03 -0400 Subject: [PATCH 010/134] Further roughing in of reports listing --- web/skins/classic/views/reports.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/web/skins/classic/views/reports.php b/web/skins/classic/views/reports.php index 4d80a10ec..0d36d0c29 100644 --- a/web/skins/classic/views/reports.php +++ b/web/skins/classic/views/reports.php @@ -37,17 +37,16 @@ getBodyTopHTML();
- - - - - + + + +
- - - - + + + + + From ad764ca0bb7ba1a03d19ac826651bc7f00b8a17a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:11:24 -0400 Subject: [PATCH 011/134] rough in major actions for reports --- web/ajax/reports.php | 209 ++++++++++++++++++++++++++++++++ web/includes/actions/report.php | 52 ++++++++ 2 files changed, 261 insertions(+) create mode 100644 web/ajax/reports.php create mode 100644 web/includes/actions/report.php diff --git a/web/ajax/reports.php b/web/ajax/reports.php new file mode 100644 index 000000000..15daecace --- /dev/null +++ b/web/ajax/reports.php @@ -0,0 +1,209 @@ +'; + +if (empty($_REQUEST['task'])) { + $message = 'Must specify a task
'; +} else { + $task = $_REQUEST['task']; +} + +if (empty($_REQUEST['ids'])) { + if (isset($_REQUEST['task']) && $_REQUEST['task'] != 'query') + $message = 'No id(s) supplied
'; +} else { + $ids = $_REQUEST['ids']; +} + +if ($message) { + ajaxError($message); + return; +} + +require_once('includes/Filter.php'); +require_once('includes/Report.php'); + +// Search contains a user entered string to search on +$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : ''; + +// Advanced search contains an array of "column name" => "search text" pairs +// Bootstrap table sends json_ecoded array, which we must decode +$advsearch = isset($_REQUEST['advsearch']) ? json_decode($_REQUEST['advsearch'], JSON_OBJECT_AS_ARRAY) : array(); + +// Order specifies the sort direction, either asc or desc +if (isset($_REQUEST['order'])) { + if (strtolower($_REQUEST['order']) == 'asc') { + $order = 'ASC'; + } else if (strtolower($_REQUEST['order']) == 'desc') { + $order = 'DESC'; + } else { + Warning('Invalid value for order ' . $_REQUEST['order']); + } +} + +// Sort specifies the name of the column to sort on +$sort = (isset($_REQUEST['sort'])) ? $_REQUEST['sort'] : ''; + +// Offset specifies the starting row to return, used for pagination +$offset = 0; +if (isset($_REQUEST['offset'])) { + if ((!is_int($_REQUEST['offset']) and !ctype_digit($_REQUEST['offset']))) { + ZM\Error('Invalid value for offset: ' . $_REQUEST['offset']); + } else { + $offset = $_REQUEST['offset']; + } +} + +// Limit specifies the number of rows to return +// Set the default to 0 for reports view, to prevent an issue with ALL pagination +$limit = 0; +if (isset($_REQUEST['limit'])) { + if ((!is_int($_REQUEST['limit']) and !ctype_digit($_REQUEST['limit']))) { + ZM\Error('Invalid value for limit: ' . $_REQUEST['limit']); + } else { + $limit = $_REQUEST['limit']; + } +} + +// +// MAIN LOOP +// + +switch ($task) { + case 'delete' : + if (!canEdit('Events')) { + ajaxError('Insufficient permissions for user '.$user['Username']); + return; + } + foreach ($ids as $id) { + $message = deleteRequest($id); + if (count($message)) { + $data[] = $message; + } + } + break; + case 'query' : + $data = queryRequest($search, $advsearch, $sort, $offset, $order, $limit); + break; + default : + ZM\Fatal("Unrecognised task '$task'"); +} // end switch task + +ajaxResponse($data); + +// +// FUNCTION DEFINITIONS +// + +function deleteRequest($id) { + $message = array(); + $report = new ZM\Report($id); + if ( !$report->Id() ) { + $message[] = array($id=>'Report not found.'); + } else if (!$report->canEdit()) { + $message[] = array($id=>'You do not have permission to delete report '.$report->Id()); + } else { + $report->delete(); + } + + return $message; +} + +function queryRequest($search, $advsearch, $sort, $offset, $order, $limit) { + global $dateTimeFormatter; + $data = array( + 'total' => 0, + 'totalNotFiltered' => 0, + 'rows' => array(), + 'updated' => $dateTimeFormatter->format(time()) + ); + + // Put server pagination code here + // The table we want our data from + $table = 'Reports'; + + // The names of the dB columns in the reports table we are interested in + $columns = array('Id', 'Name', 'FilterId', 'StartDateTime', 'EndDateTime', 'Interval'); + + if ($sort != '') { + if (!in_array($sort, $columns)) { + ZM\Error('Invalid sort field: ' . $sort); + $sort = ''; + } else if ($sort == 'EndDateTime') { + if ($order == 'ASC') { + $sort = 'EndDateTime IS NULL, E.EndDateTime'; + } else { + $sort = 'EndDateTime IS NOT NULL, E.EndDateTime'; + } + } + } + + $values = array(); + $likes = array(); + $where = ''; + + $col_str = '*'; + $sql = 'SELECT ' .$col_str. ' FROM `Reports` '.$where.($sort?' ORDER BY '.$sort.' '.$order:''); + if ($limit) $sql .= ' LIMIT '.$limit; + + $unfiltered_rows = array(); + $ids = array(); + + ZM\Debug('Calling the following sql query: ' .$sql); + $query = dbQuery($sql, $values); + if (!$query) { + ajaxError(dbError($sql)); + return; + } + while ($row = dbFetchNext($query)) { + $request = new ZM\Report($row); + $request->remove_from_cache(); + $ids[] = $request->Id(); + $unfiltered_rows[] = $row; + } # end foreach row + + # Filter limits come before pagination limits. + if ($limit and ($limit > count($unfiltered_rows))) { + ZM\Debug('Filtering rows due to filter->limit '.count($unfiltered_rows).' limit: '.$limit); + $unfiltered_rows = array_slice($unfiltered_rows, 0, $limit); + } + + ZM\Debug('Have ' . count($unfiltered_rows) . ' reports matching base filter.'); + $filtered_rows = $unfiltered_rows; + + if ($limit) { + ZM\Debug("Filtering rows due to limit " . count($filtered_rows)." offset: $offset limit: $limit"); + $filtered_rows = array_slice($filtered_rows, $offset, $limit); + } + + $returned_rows = array(); + foreach ($filtered_rows as $row) { + $report = new ZM\Report($row); + + $row['Name'] = validHtmlStr($row['Name']); + $row['StartDateTime'] = $dateTimeFormatter->format(strtotime($row['StartDateTime'])); + $row['EndDateTime'] = $row['EndDateTime'] ? $dateTimeFormatter->format(strtotime($row['EndDateTime'])) : null; + $returned_rows[] = $row; + } # end foreach row matching search + + $data['rows'] = $returned_rows; + + # totalNotFiltered must equal total, except when either search bar has been used + $data['totalNotFiltered'] = count($unfiltered_rows); + if ( $search != '' || count($advsearch) ) { + $data['total'] = count($filtered_rows); + } else { + $data['total'] = $data['totalNotFiltered']; + } + + return $data; +} +?> diff --git a/web/includes/actions/report.php b/web/includes/actions/report.php new file mode 100644 index 000000000..27b2fb85a --- /dev/null +++ b/web/includes/actions/report.php @@ -0,0 +1,52 @@ +changes($_REQUEST['Report']); + + if (count($changes)) { + if (!$report->save($changes)) { + $error_message .= "Error saving report: " . $report->get_last_error().'
'; + } else { + $redirect = '?view=report&id='.$report->Id(); + } + } +} else if ($action == 'delete') { + $report->delete(); + $redirect = '?view=reports'; +} else { + ZM\Error("Unknown action $action in saving Report"); +} +?> From 715694138c0e420d2af4f39c3c5c00c8c794f3ab Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:12:45 -0400 Subject: [PATCH 012/134] More reports rough in, css and js --- web/skins/classic/css/base/views/reports.css | 39 ++++ web/skins/classic/views/js/reports.js | 188 +++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 web/skins/classic/css/base/views/reports.css create mode 100644 web/skins/classic/views/js/reports.js diff --git a/web/skins/classic/css/base/views/reports.css b/web/skins/classic/css/base/views/reports.css new file mode 100644 index 000000000..356f7731d --- /dev/null +++ b/web/skins/classic/css/base/views/reports.css @@ -0,0 +1,39 @@ +#reportsTable.major .colTime { + white-space: nowrap; +} + +#reportsTable [data-field="Id"], +#reportsTable [data-field="Interval"] { + text-align: center; +} +#reportsTable [data-field="Name"] { + text-align: left; +} + +#header { + display: flex; + justify-content: space-between; +} + +#header h2, #header a { + line-height: 1.1; + margin:5px 0 0 0; +} + +#header #info, #header #pagination, #header #controls { + display: flex; + flex-direction: column; +} + +#header #controls { + align-items: flex-end; +} + +#header #pagination { + align-items: center; +} + +/* Dirty hack to fix up/down buttons on pagination number input */ +input[type="number"].form-control { + padding: 5px; +} diff --git a/web/skins/classic/views/js/reports.js b/web/skins/classic/views/js/reports.js new file mode 100644 index 000000000..e7a1adc19 --- /dev/null +++ b/web/skins/classic/views/js/reports.js @@ -0,0 +1,188 @@ +var backBtn = $j('#backBtn'); +var viewBtn = $j('#viewBtn'); +var editBtn = $j('#editBtn'); +var deleteBtn = $j('#deleteBtn'); +var table = $j('#reportsTable'); + +/* +This is the format of the json object sent by bootstrap-table + +var params = +{ +"type":"get", +"data": + { + "search":"some search text", + "sort":"StartDateTime", + "order":"asc", + "offset":0, + "limit":25 + "filter": + { + "Name":"some advanced search text" + "StartDateTime":"some more advanced search text" + } + }, +"cache":true, +"contentType":"application/json", +"dataType":"json" +}; +*/ + +// Called by bootstrap-table to retrieve zm event data +function ajaxRequest(params) { + if (params.data && params.data.filter) { + params.data.advsearch = params.data.filter; + delete params.data.filter; + } + $j.getJSON(thisUrl + '?view=request&request=reports&task=query', params.data) + .done(function(data) { + if (data.result == 'Error') { + alert(data.message); + return; + } + var rows = processRows(data.rows); + // rearrange the result into what bootstrap-table expects + params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: rows}); + }) + .fail(function(jqXHR) { + logAjaxFail(jqXHR); + $j('#reportsTable').bootstrapTable('refresh'); + }); +} + +function processRows(rows) { + $j.each(rows, function(ndx, row) { + const id = row.Id; + + row.Id = '' + id + ''; + row.Name = '' + row.Name + ''; + }); + + return rows; +} + +// Returns the event id's of the selected rows +function getIdSelections() { + var table = $j('#reportsTable'); + + return $j.map(table.bootstrapTable('getSelections'), function(row) { + return row.Id.replace(/(<([^>]+)>)/gi, ''); // strip the html from the element before sending + }); +} + +// Load the Delete Confirmation Modal HTML via Ajax call +function getDelConfirmModal() { + $j.getJSON(thisUrl + '?request=modal&modal=delconfirm') + .done(function(data) { + insertModalHtml('deleteConfirm', data.html); + manageDelConfirmModalBtns(); + }) + .fail(logAjaxFail); +} + +// Manage the DELETE CONFIRMATION modal button +function manageDelConfirmModalBtns() { + document.getElementById("delConfirmBtn").addEventListener('click', function onDelConfirmClick(evt) { + if ( ! canEdit.Events ) { + enoperm(); + return; + } + evt.preventDefault(); + + const selections = getIdSelections(); + if (!selections.length) { + alert('Please select reports to delete.'); + } else { + deleteReports(selections); + } + }); + + // Manage the CANCEL modal button + document.getElementById("delCancelBtn").addEventListener('click', function onDelCancelClick(evt) { + $j('#deleteConfirm').modal('hide'); + }); +} + +function deleteReports(ids) { + const ticker = document.getElementById('deleteProgressTicker'); + const chunk = ids.splice(0, 10); + console.log("Deleting " + chunk.length + " selections. " + ids.length); + + $j.getJSON(thisUrl + '?request=reports&task=delete&ids[]='+chunk.join('&ids[]=')) + .done( function(data) { + if (!ids.length) { + $j('#reportsTable').bootstrapTable('refresh'); + $j('#deleteConfirm').modal('hide'); + } else { + if (ticker.innerHTML.length < 1 || ticker.innerHTML.length > 10) { + ticker.innerHTML = '.'; + } else { + ticker.innerHTML = ticker.innerHTML + '.'; + } + deleteReports(ids); + } + }) + .fail( function(jqxhr) { + logAjaxFail(jqxhr); + $j('#reportsTable').bootstrapTable('refresh'); + $j('#deleteConfirm').modal('hide'); + }); +} + +function initPage() { + // Load the delete confirmation modal into the DOM + getDelConfirmModal(); + + // Init the bootstrap-table + table.bootstrapTable({icons: icons}); + + // enable or disable buttons based on current selection and user rights + table.on('check.bs.table uncheck.bs.table ' + + 'check-all.bs.table uncheck-all.bs.table', + function() { + selections = table.bootstrapTable('getSelections'); + + viewBtn.prop('disabled', !(selections.length && canView.Events)); + deleteBtn.prop('disabled', !(selections.length && canEdit.Events)); + }); + + // Don't enable the back button if there is no previous zm page to go back to + backBtn.prop('disabled', !document.referrer.length); + + // Manage the BACK button + document.getElementById("backBtn").addEventListener('click', function onBackClick(evt) { + evt.preventDefault(); + window.history.back(); + }); + + // Manage the REFRESH Button + document.getElementById("refreshBtn").addEventListener('click', function onRefreshClick(evt) { + evt.preventDefault(); + window.location.reload(true); + }); + + document.getElementById("newBtn").addEventListener('click', function (evt) { + evt.preventDefault(); + window.location = '?view=report'; + }); + + // Manage the DELETE button + document.getElementById("deleteBtn").addEventListener('click', function onDeleteClick(evt) { + if (!canEdit.Events) { + enoperm(); + return; + } + + evt.preventDefault(); + $j('#deleteConfirm').modal('show'); + }); + + table.bootstrapTable('resetSearch'); + // The table is initially given a hidden style, so now that we are done rendering, show it + table.show(); +} + +$j(document).ready(function() { + initPage(); +}); From b4000ef0c7d660ae33cc356ad256b6ef03d1eef7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:34:06 -0400 Subject: [PATCH 013/134] Add Reports table creation --- db/zm_update-1.37.21.sql | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 db/zm_update-1.37.21.sql diff --git a/db/zm_update-1.37.21.sql b/db/zm_update-1.37.21.sql new file mode 100644 index 000000000..ae23ff9a4 --- /dev/null +++ b/db/zm_update-1.37.21.sql @@ -0,0 +1,25 @@ +-- +-- This adds the Reports Table +-- + +SET @s = (SELECT IF( + (SELECT COUNT(*) + FROM INFORMATION_SCHEMA.TABLES + WHERE table_name = 'Reports' + AND table_schema = DATABASE() + ) > 0, + "SELECT 'Reports table exists'", + " +CREATE TABLE Reports ( + Id INT(10) UNSIGNED auto_increment, + Name varchar(30), + FilterId int(10) UNSIGNED, + `StartDateTime` datetime default NULL, + `EndDateTime` datetime default NULL, + `Interval` INT(10) UNSIGNED, + PRIMARY KEY(Id) +) ENGINE=InnoDB;" + )); + +PREPARE stmt FROM @s; +EXECUTE stmt; From 6bc0ec6aab44a586a6072302f77604f6286cd8ff Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:35:25 -0400 Subject: [PATCH 014/134] Add Report ORM --- web/includes/Report.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 web/includes/Report.php diff --git a/web/includes/Report.php b/web/includes/Report.php new file mode 100644 index 000000000..ed3499ad7 --- /dev/null +++ b/web/includes/Report.php @@ -0,0 +1,26 @@ + null, + 'Name' => '', + 'FilterId' => null, + 'StartDateTime' => null, + 'EndDateTime' => null, + 'Interval' => '86400', + ); + + public static function find( $parameters = array(), $options = array() ) { + return ZM_Object::_find(get_class(), $parameters, $options); + } + + public static function find_one( $parameters = array(), $options = array() ) { + return ZM_Object::_find_one(get_class(), $parameters, $options); + } +} # end class Report +?> From f794077d71cffce3361dba7dc4b25c9b4ae7e9f3 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 8 Aug 2022 10:02:20 -0400 Subject: [PATCH 015/134] Only add or operator if monitorlinks has content --- web/js/MonitorLinkExpression.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/js/MonitorLinkExpression.js b/web/js/MonitorLinkExpression.js index 6e1620f6c..e56ea7cac 100644 --- a/web/js/MonitorLinkExpression.js +++ b/web/js/MonitorLinkExpression.js @@ -183,7 +183,11 @@ function array_search(needle, haystack) { } function add_to_expr() { - $j('[name="newMonitor[LinkedMonitors]"]').val($j('[name="newMonitor[LinkedMonitors]"]').val() + '|' + $j('#monitorLinks').val()); + let value = $j('[name="newMonitor[LinkedMonitors]"]').val(); + if (value != '') value += '|'; + value += $j('#monitorLinks').val(); + + $j('[name="newMonitor[LinkedMonitors]"]').val(value); expr_to_ui($j('[name="newMonitor[LinkedMonitors]"]').val(), $j('#LinkedMonitorsUI')); } From 294fd9b3c71446f35703324aa938dbbee4dd0cbc Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 8 Aug 2022 10:05:15 -0400 Subject: [PATCH 016/134] Always populate add MonitorLink dropdown. --- web/js/MonitorLinkExpression.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web/js/MonitorLinkExpression.js b/web/js/MonitorLinkExpression.js index e56ea7cac..a3a97f456 100644 --- a/web/js/MonitorLinkExpression.js +++ b/web/js/MonitorLinkExpression.js @@ -76,8 +76,6 @@ function expr_to_ui(expr, container) { let brackets = 0; let used_monitorlinks = []; - if (!tokens.length) return; - // Every monitorlink should have possible parenthesis on either side of it if (tokens.length > 3) { if (tokens[0].type != '(') { @@ -162,7 +160,7 @@ function expr_to_ui(expr, container) { for (monitor_id in monitors) { const monitor = monitors[monitor_id]; //if (!array_search(monitor.Id, used_monitorlinks)) - //select.append(''); + select.append(''); for ( zone_id in zones ) { const zone = zones[zone_id]; if ( monitor.Id == zone.MonitorId ) { From fcd673a018b3292cc2904bba6ce03ad071af6722 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 19 Aug 2022 13:32:07 -0400 Subject: [PATCH 017/134] Improve adding parenthesis, rename function to snake case --- dep/RtspServer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dep/RtspServer b/dep/RtspServer index 1b40f1661..eab328514 160000 --- a/dep/RtspServer +++ b/dep/RtspServer @@ -1 +1 @@ -Subproject commit 1b40f1661f93f50fd5805f239d1e466a3bcf888f +Subproject commit eab32851421ffe54fec0229c3efc44c642bc8d46 From e2ebccc9aa60cad4026455a65c2367667cdfd243 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 3 Aug 2022 13:52:01 -0400 Subject: [PATCH 018/134] fix eslint --- web/js/MonitorLinkExpression.js | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/web/js/MonitorLinkExpression.js b/web/js/MonitorLinkExpression.js index a3a97f456..f605d775e 100644 --- a/web/js/MonitorLinkExpression.js +++ b/web/js/MonitorLinkExpression.js @@ -27,13 +27,13 @@ function tokenize(expr) { if (character == '&' || character == '|' || character == ',') { if (first_index != second_index) { - tokens[tokens.length] = { type: 'link', value: expr.substring(first_index, second_index) }; + tokens[tokens.length] = {type: 'link', value: expr.substring(first_index, second_index)}; } - tokens[tokens.length] = { type: character, value: character }; + tokens[tokens.length] = {type: character, value: character}; first_index = second_index+1; } else if (character == '(' || character == ')') { if (first_index != second_index) { - tokens[tokens.length] = { type: 'link', value: expr.substring(first_index, second_index) }; + tokens[tokens.length] = {type: 'link', value: expr.substring(first_index, second_index)}; } // Now check for repeats let third = second_index+1; @@ -42,18 +42,18 @@ function tokenize(expr) { if (expr.at(i) != character) break; } if (third != second_index+1) { - tokens[tokens.length] = { type: character, value: expr.substring(second_index, third) }; + tokens[tokens.length] = {type: character, value: expr.substring(second_index, third)}; } else { - tokens[tokens.length] = { type: character, value: character }; + tokens[tokens.length] = {type: character, value: character}; } first_index = third; } - second_index ++; + second_index++; } // end for second_index if (second_index) { if (second_index != first_index) { - tokens[tokens.length] = { type: 'link', value: expr.substring(first_index, second_index) }; + tokens[tokens.length] = {type: 'link', value: expr.substring(first_index, second_index)}; } } return tokens; @@ -71,10 +71,9 @@ function expr_to_ui(expr, container) { container.html(''); var tokens = tokenize(expr); console.log(tokens); - let term_count = count_terms(tokens); - let div; + //const term_count = count_terms(tokens); let brackets = 0; - let used_monitorlinks = []; + const used_monitorlinks = []; // Every monitorlink should have possible parenthesis on either side of it if (tokens.length > 3) { @@ -148,7 +147,7 @@ function expr_to_ui(expr, container) { const select = $j(''); select.append(''); select.append(''); - select.val(token.type); + select.val(token.type); select.on('change', update_expr); token.html = select; } @@ -164,8 +163,9 @@ function expr_to_ui(expr, container) { for ( zone_id in zones ) { const zone = zones[zone_id]; if ( monitor.Id == zone.MonitorId ) { - if (!array_search(monitor.Id+':'+zone.Id, used_monitorlinks)) + if (!array_search(monitor.Id+':'+zone.Id, used_monitorlinks)) { select.append(''); + } } } // end foreach zone } // end foreach monitor @@ -205,7 +205,7 @@ function ui_to_expr(container, expr_input) { function parse_expression(tokens) { if (tokens.length == 1) { - return { token: tokens[0] }; + return {token: tokens[0]}; } let left = parse_and(tokens); @@ -214,7 +214,7 @@ function parse_expression(tokens) { } while (token_index < tokens.length && ( tokens[token_index] == '|' || tokens[token_index] == ',')) { - var logical_or = { type: '|' }; + var logical_or = {type: '|'}; token_index++; var right = parse_and(tokens); @@ -222,7 +222,7 @@ function parse_expression(tokens) { return null; } - logical_or.left = left; + logical_or.left = left; logical_or.right = right; left = logical_or; } @@ -240,14 +240,14 @@ function parse_and(tokens) { while ((token_index < tokens.length) && (tokens[token_index] == '&')) { ++token_index; - var logical_and = { type: '&' }; + var logical_and = {type: '&'}; right = parse_parentheses(tokens); if (right == null) { return null; } - logical_and.left = left; + logical_and.left = left; logical_and.right = right; left = logical_and; } @@ -268,11 +268,11 @@ function parse_parentheses(tokens) { // Because we are parsing a left, there SHOULD be a remaining right. If not, invalid. if (token_index == tokens.length) return null; - if (tokens[ token_index++ ] == ')') { + if (tokens[token_index++] == ')') { return expression; } } else if (tokens[token_index].type == MONITORLINK) { - var link = { token: tokens[token_index] }; + var link = {token: tokens[token_index]}; token_index++; return link; } From 0d2be2683d580360e60e904fe59b6a218570531b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 09:22:30 -0400 Subject: [PATCH 019/134] Set button padding to 0 for ptz buttons --- web/skins/classic/css/base/views/control.css | 1 + 1 file changed, 1 insertion(+) diff --git a/web/skins/classic/css/base/views/control.css b/web/skins/classic/css/base/views/control.css index 915694109..cdecca331 100644 --- a/web/skins/classic/css/base/views/control.css +++ b/web/skins/classic/css/base/views/control.css @@ -18,6 +18,7 @@ .ptzControls .pantiltPanel button { border: none; margin: 0; + padding: 0; } .ptzControls .controlsPanel { From 6b1e2cbff25adb8d651c4bace756d462699ef25a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 13:41:14 -0400 Subject: [PATCH 020/134] Fix loading info from ControlAddress. Fix path used when testing auth. --- .../lib/ZoneMinder/Control/Trendnet.pm | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm index 666350f31..b1ba74a39 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm @@ -25,22 +25,43 @@ our $ADDRESS = ''; use ZoneMinder::Logger qw(:all); use ZoneMinder::Config qw(:all); +use URI; + +sub credentials { + my $self = shift; + ($USERNAME, $PASSWORD) = @_; + Debug("Setting credentials to $USERNAME/$PASSWORD"); +} sub open { my $self = shift; $self->loadMonitor(); - if ( ( $self->{Monitor}->{ControlAddress} =~ /^(?https?:\/\/)?(?[^:@]+)?:?(?[^\/@]+)?@?(?
.*)$/ ) ) { + if ($self->{Monitor}{ControlAddress} + and + $self->{Monitor}{ControlAddress} ne 'user:pass@ip' + and + $self->{Monitor}{ControlAddress} ne 'user:port@ip' + and + ($self->{Monitor}->{ControlAddress} =~ /^(?https?:\/\/)?(?[^:@]+)?:?(?[^\/@]+)?@?(?
.*)$/) + ) { $PROTOCOL = $+{PROTOCOL} if $+{PROTOCOL}; $USERNAME = $+{USERNAME} if $+{USERNAME}; $PASSWORD = $+{PASSWORD} if $+{PASSWORD}; $ADDRESS = $+{ADDRESS} if $+{ADDRESS}; + } elsif ($self->{Monitor}{Path}) { + Debug("Using Path for credentials: $self->{Monitor}{Path}"); + + my $uri = URI->new($self->{Monitor}{Path}); + Debug("Using Path for credentials: $self->{Monitor}{Path}" . $uri->userinfo()); + ( $USERNAME, $PASSWORD ) = split(/:/, $uri->userinfo()) if $uri->userinfo(); + $ADDRESS = $uri->host(); } else { Error('Failed to parse auth from address ' . $self->{Monitor}->{ControlAddress}); $ADDRESS = $self->{Monitor}->{ControlAddress}; } if ( !($ADDRESS =~ /:/) ) { - Error('You generally need to also specify the port. I will append :80'); + Debug('You generally need to also specify the port. I will append :80'); $ADDRESS .= ':80'; } @@ -58,7 +79,7 @@ sub open { $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); # Detect REALM - my $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/cgi/ptdc.cgi'); + my $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/'); if ( $res->is_success ) { $self->{state} = 'open'; @@ -79,7 +100,7 @@ sub open { $REALM = $1; Debug("Changing REALM to $REALM"); $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); - $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/cgi/ptdc.cgi'); + $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/'); if ( $res->is_success() ) { $self->{state} = 'open'; return !undef; From 49f8c9defa223c8c0bebf01d249d87ec6603440b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 13:41:43 -0400 Subject: [PATCH 021/134] If monitor has Control configured and control supports rebooting, reboot camera on fail to capture. --- scripts/zmwatch.pl.in | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/zmwatch.pl.in b/scripts/zmwatch.pl.in index bf5120e41..5bba0e33c 100644 --- a/scripts/zmwatch.pl.in +++ b/scripts/zmwatch.pl.in @@ -78,7 +78,7 @@ $SIG{TERM} = \&TermHandler; $SIG{INT} = \&TermHandler; Info('Watchdog starting, pausing for '.START_DELAY.' seconds'); -sleep(START_DELAY); +#sleep(START_DELAY); my $dbh = zmDbConnect(); @@ -127,6 +127,12 @@ while (!$zm_terminate) { # We can't get the last capture time so can't be sure it's died, it might just be starting up. my $startup_time = zmGetStartupTime($monitor); if (($now - $startup_time) > $Config{ZM_WATCH_MAX_DELAY}) { + if ($monitor->ControlId()) { + my $control = $monitor->Control(); + if ($control->CanReboot() and $control->open()) { + $control->reboot(); + } + } $log->logPrint(ZoneMinder::Logger::WARNING+$monitor->ImportanceNumber(), "Restarting capture daemon for $$monitor{Name}, no image since startup. ". "Startup time was $startup_time - now $now > $Config{ZM_WATCH_MAX_DELAY}" @@ -146,9 +152,9 @@ while (!$zm_terminate) { my $image_delay = $now - $capture_time; Debug("Monitor $monitor->{Id} last captured $image_delay seconds ago, max is $max_image_delay"); if ($image_delay > $max_image_delay) { - $log->logPrint(ZoneMinder::Logger::WARNING+$monitor->ImportanceNumber(), - 'Restarting capture daemon for '.$monitor->{Name}. - ", time since last capture $image_delay seconds ($now-$capture_time)"); + $log->logPrint(ZoneMinder::Logger::WARNING+$monitor->ImportanceNumber(), + 'Restarting capture daemon for '.$monitor->{Name}. + ", time since last capture $image_delay seconds ($now-$capture_time)"); $monitor->control('restart'); next; } From 8b4472b75361e950234f84c0c0effa0382d978d3 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 15:01:25 -0400 Subject: [PATCH 022/134] Don't use array_keys_first as it doesn't exist in php < 7.3. --- web/skins/classic/views/monitor.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 01a231c18..9dbf4fbb0 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -629,7 +629,7 @@ $localMethods = array( if (!ZM_HAS_V4L2) unset($localMethods['v4l2']); echo htmlSelect('newMonitor[Method]', $localMethods, - ((count($localMethods)<=1) ? array_key_first($localMethods) : $monitor->Method()), + ((count($localMethods)==1) ? array_keys($localMethods)[0] : $monitor->Method()), array('data-on-change'=>'submitTab', 'data-tab-name'=>$tab) ); ?> @@ -1125,6 +1125,7 @@ $videowriter_encoders = array( 'hevc_vaapi' => 'hevc_vaapi', 'libvpx-vp9' => 'libvpx-vp9', 'libsvtav1' => 'libsvtav1', + 'libaom-av1' => 'libaom-av1' ); echo htmlSelect('newMonitor[Encoder]', $videowriter_encoders, $monitor->Encoder());?>
From 2240f0813d2635ff02cd3bc4ddbfc5f1512a9ba2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 15:47:39 -0400 Subject: [PATCH 023/134] Provide support for libaom-av1 --- src/zm_videostore.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index fe771160c..210d80f03 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -53,6 +53,7 @@ VideoStore::CodecData VideoStore::codec_data[] = { { AV_CODEC_ID_MJPEG, "mjpeg", "mjpeg", AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ422P, AV_HWDEVICE_TYPE_NONE }, { AV_CODEC_ID_VP9, "vp9", "libvpx-vp9", AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P, AV_HWDEVICE_TYPE_NONE }, { AV_CODEC_ID_AV1, "av1", "libsvtav1", AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P, AV_HWDEVICE_TYPE_NONE }, + { AV_CODEC_ID_AV1, "av1", "libaom-av1", AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P, AV_HWDEVICE_TYPE_NONE }, #else { AV_CODEC_ID_H265, "h265", "libx265", AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P }, From 512509af150d6329fafff272f5dde5f46c544949 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 4 Aug 2022 12:13:53 -0400 Subject: [PATCH 024/134] Setting padding to 0 for ptz buttons --- web/skins/classic/css/base/views/control.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/skins/classic/css/base/views/control.css b/web/skins/classic/css/base/views/control.css index cdecca331..ffb9c03d2 100644 --- a/web/skins/classic/css/base/views/control.css +++ b/web/skins/classic/css/base/views/control.css @@ -32,6 +32,7 @@ .ptzControls .controlsPanel .arrowControl { width: 60px; margin: 0 4px; + padding: 0; } .ptzControls .controlsPanel .arrowControl button.longArrowBtn { @@ -42,6 +43,7 @@ width: 32px; height: 48px; margin: 0 auto; + padding: 0; cursor: pointer; } From f35d4a4dbbd1a234e33a8cec9bac0d5d1b69c5b7 Mon Sep 17 00:00:00 2001 From: Robert Jacobson Date: Wed, 3 Aug 2022 09:57:57 -0400 Subject: [PATCH 025/134] Make zoom buttons work for Axis P5655-E --- .../lib/ZoneMinder/Control/AxisV2.pm | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm index e50449927..8292de593 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm @@ -303,6 +303,44 @@ sub moveRelDownLeft { $self->sendCmd($cmd); } +sub zoomConTele { + my $self = shift; + my $params = shift; + my $speed = 20; + Debug('Zoom ConTele'); + my $cmd = "/axis-cgi/com/ptz.cgi?continuouszoommove=$speed"; + $self->sendCmd($cmd); +} + +sub zoomConWide { + my $self = shift; + my $params = shift; + #my $step = $self->getParam($params, 'step'); + my $speed = -20; + Debug('Zoom ConWide'); + my $cmd = "/axis-cgi/com/ptz.cgi?continuouszoommove=$speed"; + $self->sendCmd($cmd); +} + +sub zoomStop { + my $self = shift; + my $params = shift; + my $speed = 0; + Debug('Zoom Stop'); + my $cmd = "/axis-cgi/com/ptz.cgi?continuouszoommove=$speed"; + $self->sendCmd($cmd); +} + +sub moveStop { + my $self = shift; + my $params = shift; + my $speed = 0; + Debug('Move Stop'); + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$speed,$speed"; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouszoommove=$speed"; + $self->sendCmd($cmd); +} + sub zoomRelTele { my $self = shift; my $params = shift; From dae1d43fb146a3942a31bf3e8126defe45632214 Mon Sep 17 00:00:00 2001 From: Robert Jacobson Date: Thu, 4 Aug 2022 12:40:31 -0400 Subject: [PATCH 026/134] Make proportional and continuous movement actually work --- .../lib/ZoneMinder/Control/AxisV2.pm | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm index 8292de593..61f35452b 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/AxisV2.pm @@ -163,57 +163,81 @@ sub cameraReset { sub moveConUp { my $self = shift; + my $params = shift; + my $panspeed = 0; # purely moving vertically + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ); Debug('Move Up'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=up'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConDown { my $self = shift; + my $params = shift; + my $panspeed = 0; # purely moving vertically + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ) * -1 ; Debug('Move Down'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=down'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConLeft { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ) * -1 ; + my $tiltspeed = 0; # purely moving horizontally Debug('Move Left'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=left'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConRight { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ); + my $tiltspeed = 0; # purely moving horizontally Debug('Move Right'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=right'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConUpRight { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ); + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ); Debug('Move Up/Right'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=upright'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConUpLeft { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ) * -1; + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ); Debug('Move Up/Left'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=upleft'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } sub moveConDownRight { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ); + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ) * -1; Debug('Move Down/Right'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=downright'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd( $cmd ); } sub moveConDownLeft { my $self = shift; + my $params = shift; + my $panspeed = $self->getParam( $params, 'panspeed', 30 ) * -1; + my $tiltspeed = $self->getParam( $params, 'tiltspeed', 30 ) * -1; Debug('Move Down/Left'); - my $cmd = '/axis-cgi/com/ptz.cgi?move=downleft'; + my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$panspeed,$tiltspeed"; $self->sendCmd($cmd); } @@ -248,7 +272,7 @@ sub moveRelDown { sub moveRelLeft { my $self = shift; my $params = shift; - my $step = $self->getParam($params, 'panstep'); + my $step = abs($self->getParam($params, 'panstep')); Debug("Step Left $step"); my $cmd = '/axis-cgi/com/ptz.cgi?rpan=-'.$step; $self->sendCmd($cmd); @@ -276,8 +300,8 @@ sub moveRelUpRight { sub moveRelUpLeft { my $self = shift; my $params = shift; - my $panstep = $self->getParam($params, 'panstep'); - my $tiltstep = $self->getParam($params, 'tiltstep'); + my $panstep = abs($self->getParam($params, 'panstep')); + my $tiltstep = abs($self->getParam($params, 'tiltstep')); Debug("Step Up/Left $tiltstep/$panstep"); my $cmd = "/axis-cgi/com/ptz.cgi?rpan=-$panstep&rtilt=$tiltstep"; $self->sendCmd($cmd); @@ -336,11 +360,14 @@ sub moveStop { my $params = shift; my $speed = 0; Debug('Move Stop'); + # we have to stop both pans and zooms my $cmd = "/axis-cgi/com/ptz.cgi?continuouspantiltmove=$speed,$speed"; + $self->sendCmd($cmd); my $cmd = "/axis-cgi/com/ptz.cgi?continuouszoommove=$speed"; $self->sendCmd($cmd); } + sub zoomRelTele { my $self = shift; my $params = shift; @@ -463,20 +490,15 @@ __END__ =head1 NAME -ZoneMinder::Database - Perl extension for blah blah blah +ZoneMinder::Control::Axis - Zoneminder control for Axis Cameras using the V2 API =head1 SYNOPSIS - use ZoneMinder::Database; - blah blah blah + use ZoneMinder::Control::AxisV2 ; place this in /usr/share/perl5/ZoneMinder/Control =head1 DESCRIPTION -Stub documentation for ZoneMinder, created by h2xs. It looks like the -author of the extension was negligent enough to leave the stub -unedited. - -Blah blah blah. +This module is an implementation of the Axis V2 API =head2 EXPORT @@ -486,14 +508,8 @@ None by default. =head1 SEE ALSO -Mention other useful documentation such as the documentation of -related modules or operating system documentation (such as man pages -in UNIX), or any relevant external documentation such as RFCs or -standards. - -If you have a mailing list set up for your module, mention it here. - -If you have a web site set up for your module, mention it here. +AXIS VAPIX Library Documentation; e.g.: +https://www.axis.com/vapix-library/subjects/t10175981/section/t10036011/display =head1 AUTHOR From 17d4d44af1d25774f1479cf27ed2482a7cf4a540 Mon Sep 17 00:00:00 2001 From: ovargasp Date: Thu, 4 Aug 2022 20:31:12 -0600 Subject: [PATCH 027/134] Modify zmu Adds option to get monitor triggered status. --- src/zmu.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/zmu.cpp b/src/zmu.cpp index b081673a1..41fb0cbb0 100644 --- a/src/zmu.cpp +++ b/src/zmu.cpp @@ -81,7 +81,7 @@ Options for use with monitors: -U, --username - When running in authenticated mode the username and -P, --password - password combination of the given user -A, --auth - Pass authentication hash string instead of user details - + -x, --xtrigger - Output the current monitor trigger state, 0 = not triggered, 1 = triggered =cut */ @@ -137,7 +137,9 @@ void Usage(int status=-1) { " -U, --username : When running in authenticated mode the username and\n" " -P, --password : password combination of the given user\n" " -A, --auth : Pass authentication hash string instead of user details\n" - " -T, --token : Pass JWT token string instead of user details\n" + " -T, --token : Pass JWT token string instead of user details\n" + " -x, --xtrigger : Output the current monitor trigger state, 0 = not triggered, 1 = triggered\n" + "", stderr ); exit(status); @@ -167,11 +169,12 @@ typedef enum { ZMU_SUSPEND = 0x00400000, ZMU_RESUME = 0x00800000, ZMU_LIST = 0x10000000, + ZMU_TRIGGER = 0x20000000, } Function; bool ValidateAccess(User *user, int mon_id, int function) { bool allowed = true; - if ( function & (ZMU_STATE|ZMU_IMAGE|ZMU_TIME|ZMU_READ_IDX|ZMU_WRITE_IDX|ZMU_FPS) ) { + if ( function & (ZMU_STATE|ZMU_IMAGE|ZMU_TIME|ZMU_READ_IDX|ZMU_WRITE_IDX|ZMU_FPS|ZMU_TRIGGER) ) { if ( user->getStream() < User::PERM_VIEW ) allowed = false; } @@ -246,6 +249,7 @@ int main(int argc, char *argv[]) { {"version", 1, nullptr, 'V'}, {"help", 0, nullptr, 'h'}, {"list", 0, nullptr, 'l'}, + {"xtrigger", 0, nullptr, 'x'}, {nullptr, 0, nullptr, 0} }; @@ -278,7 +282,7 @@ int main(int argc, char *argv[]) { while (1) { int option_index = 0; - int c = getopt_long(argc, argv, "d:m:vsEDLurwei::S:t::fz::ancqhlB::C::H::O::RWU:P:A:V:T:", long_options, &option_index); + int c = getopt_long(argc, argv, "d:m:vsEDLurweix::S:t::fz::ancqhlB::C::H::O::RWU:P:A:V:T:", long_options, &option_index); if (c == -1) { break; } @@ -297,6 +301,9 @@ int main(int argc, char *argv[]) { case 's': function |= ZMU_STATE; break; + case 'x': + function |= ZMU_TRIGGER; + break; case 'i': function |= ZMU_IMAGE; if (optarg) @@ -523,6 +530,15 @@ int main(int argc, char *argv[]) { have_output = true; } } + if ( function & ZMU_TRIGGER ) { + int trgstate = monitor->GetTriggerState(); + if ( verbose ) { + printf("Current Triggered state: %s\n", trgstate==0?"Not Triggered":(trgstate==1?"Triggered":"NA")); + } else { + printf("%d", trgstate); + have_output = true; + } + } if ( function & ZMU_TIME ) { SystemTimePoint timestamp = monitor->GetTimestamp(image_idx); if (verbose) { From 336e65761b4b6e7e568c4ea9283ea55b34a4c94a Mon Sep 17 00:00:00 2001 From: ovargasp Date: Fri, 5 Aug 2022 06:40:23 -0600 Subject: [PATCH 028/134] Modify config.php.in Modifies config.php to use ZM_TIMEZONE if defined by user --- web/includes/config.php.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/includes/config.php.in b/web/includes/config.php.in index de03da809..c18205b5f 100644 --- a/web/includes/config.php.in +++ b/web/includes/config.php.in @@ -150,9 +150,9 @@ require_once('database.php'); require_once('logger.php'); loadConfig(); if (ZM_LOCALE_DEFAULT) { - $dateFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::SHORT, IntlDateFormatter::NONE); - $dateTimeFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::SHORT, IntlDateFormatter::LONG); - $timeFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::NONE, IntlDateFormatter::LONG); + $dateFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::SHORT, IntlDateFormatter::NONE,ZM_TIMEZONE); + $dateTimeFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::SHORT, IntlDateFormatter::LONG,ZM_TIMEZONE); + $timeFormatter = new IntlDateFormatter(ZM_LOCALE_DEFAULT, IntlDateFormatter::NONE, IntlDateFormatter::LONG,ZM_TIMEZONE); } if (ZM_DATE_FORMAT_PATTERN) { $dateFormatter->setPattern(ZM_DATE_FORMAT_PATTERN); From 129abf02d5ee8013c05a4e01e4c4c570754dd641 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 5 Aug 2022 09:07:22 -0400 Subject: [PATCH 029/134] Replace the Event index with an eventId,ZoneId index, which mysql will actually use to speed up the subquery for AlarmedZone --- db/zm_create.sql.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index da9544989..659064fe3 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -667,7 +667,7 @@ CREATE TABLE `Stats` ( `MaxY` smallint(5) unsigned NOT NULL default '0', `Score` smallint(5) unsigned NOT NULL default '0', PRIMARY KEY (`Id`), - KEY `EventId` (`EventId`), + KEY `EventId_ZoneId` (`EventId`, `ZoneId`), KEY `MonitorId` (`MonitorId`), KEY `ZoneId` (`ZoneId`) ) ENGINE=@ZM_MYSQL_ENGINE@; From 3501fa4f8ef27a8042709acda46754ff51964383 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 6 Aug 2022 09:22:38 -0400 Subject: [PATCH 030/134] Fix memleak due to not deleting okpt in VideoStore destructor --- src/zm_videostore.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index 210d80f03..971cf3d1d 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -748,6 +748,7 @@ VideoStore::~VideoStore() { avformat_free_context(oc); delete[] next_dts; next_dts = nullptr; + delete opkt; } // VideoStore::~VideoStore() bool VideoStore::setup_resampler() { From 1c870d82134c74451de3aab56b32a3e3d2eeb42f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 6 Aug 2022 09:54:23 -0400 Subject: [PATCH 031/134] Revert "Fix memleak due to not deleting okpt in VideoStore destructor" This reverts commit 896a05c65d03bea0303e6a9ba35adcf4db90e261. --- src/zm_videostore.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index 971cf3d1d..210d80f03 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -748,7 +748,6 @@ VideoStore::~VideoStore() { avformat_free_context(oc); delete[] next_dts; next_dts = nullptr; - delete opkt; } // VideoStore::~VideoStore() bool VideoStore::setup_resampler() { From a5e730ff01c2646b02a8b9f86c011fbb2258f212 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 8 Aug 2022 13:57:09 -0400 Subject: [PATCH 032/134] Ignore errors decoding log message --- web/skins/classic/views/js/log.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/log.js b/web/skins/classic/views/js/log.js index 8bad64bf1..d3824ab0d 100644 --- a/web/skins/classic/views/js/log.js +++ b/web/skins/classic/views/js/log.js @@ -42,7 +42,11 @@ function ajaxRequest(params) { } function processRows(rows) { $j.each(rows, function(ndx, row) { - row.Message = decodeURIComponent(row.Message); + try { + row.Message = decodeURIComponent(row.Message); + } catch(e) { + // ignore errors + } }); return rows; } From 7cfa529eb64196bb10f3d111f988844614c9d575 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 8 Aug 2022 13:58:22 -0400 Subject: [PATCH 033/134] keyframe_interval gets reset so can give erroneous logs. Use a second variable to start the actual found keyframe interval. Use a const ref to prevent copying in notify_all --- src/zm_packetqueue.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index de545d166..6f77c5ec5 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -262,7 +262,9 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { return; } - int keyframe_interval = 1; + int max_keyframe_interval = 1; + int keyframe_interval_count = 1; + ZMLockedPacket *lp = new ZMLockedPacket(zm_packet); if (!lp->trylock()) { Debug(4, "Failed getting lock on first packet"); @@ -297,11 +299,13 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { if (zm_packet->packet->stream_index == video_stream_id) { if (zm_packet->keyframe) { - Debug(4, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval); - keyframe_interval = 1; + Debug(4, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval_count); + + if (max_keyframe_interval < keyframe_interval_count) max_keyframe_interval = keyframe_interval_count; + keyframe_interval_count = 1; next_front = it; } else { - keyframe_interval++; + keyframe_interval_count++; } ++video_packets_to_delete; if (packet_counts[video_stream_id] - video_packets_to_delete <= pre_event_video_packet_count + tail_count) { @@ -313,7 +317,7 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { ++it; } // end while - if ((keyframe_interval == 1) and max_video_packet_count) { + if ((max_keyframe_interval == 1) and max_video_packet_count) { Warning("Did not find a second keyframe in the packet queue. It may be that" " the Max Image Buffer setting is lower than the keyframe interval. We" " need it to be greater than the keyframe interval."); @@ -321,7 +325,7 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { Debug(1, "Resulting it pointing at latest packet? %d, next front points to begin? %d, Keyframe interval %d", ( *it == add_packet ), ( next_front == pktQueue.begin() ), - keyframe_interval + keyframe_interval_count ); if (next_front != pktQueue.begin()) { while (pktQueue.begin() != next_front) { @@ -350,7 +354,7 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { void PacketQueue::stop() { deleting = true; condition.notify_all(); - for (const auto p : pktQueue) p->notify_all(); + for (const auto &p : pktQueue) p->notify_all(); } void PacketQueue::clear() { From ce35b40c601574eceb9dd3da76018d4ac27e1fd5 Mon Sep 17 00:00:00 2001 From: ovargasp Date: Fri, 5 Aug 2022 15:59:42 -0600 Subject: [PATCH 034/134] Adds Alarm Server for NETSurveillance WEB IP cameras --- scripts/zmalarm-server.py | 185 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100755 scripts/zmalarm-server.py diff --git a/scripts/zmalarm-server.py b/scripts/zmalarm-server.py new file mode 100755 index 000000000..891efba5a --- /dev/null +++ b/scripts/zmalarm-server.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# ========================================================================== +# +# ZoneMinder Alarm Server Script for Netsurveillence Software cameras, $Date$, $Revision$ +# Copyright (C) 2022 +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# ========================================================================== + + + +# Adds pyzm support +import pyzm.api as zmapi +import pyzm.ZMLog as zmlog +import pyzm.helpers.utils as utils + +import os, sys, struct, json +from time import sleep +#import time +from socket import * +# from datetime import * +# telnet +from telnetlib import Telnet +# multi threading +from threading import Thread + +def writezmlog(m,s): + zmlog.init() + zmlog.Info(m+s) +# zmlog.close() + +def alarm_thread(m, monid,eventlenght): + import subprocess + print("Monitor " + str(monid)+" entered alarm_thread...") + result = subprocess.run(['zmu','-m', str(monid), '-s'] ,stdout=subprocess.PIPE) + if result.stdout.decode('utf-8') != '3\n': + print('Changing monitor '+ str(monid) + ' status to Alarm...') + m.arm() + sleep(eventlenght) + m.disarm() + else: + print('Monitor '+ str(monid) + ' already in status Alarm...') + print('Finishing thread...') + + +def event_thread(m_id,eventlenght): + import subprocess + print("Monitor " + str(m_id)+" entered event_thread...") + result = subprocess.run(['zmu','-m', str(m_id), '-x'] ,stdout=subprocess.PIPE) + if result.stdout.decode('utf-8') == '0\n': + print('Firing monitor '+ str(m_id) + ' trigger...') + telbuff = str(m_id) + '|on+'+str(eventlenght)+'|1|Human Motion Detected|' + with Telnet('localhost', 6802) as tn: + tn.write(telbuff.encode('ascii') + alarm_desc.encode('ascii') + b'\n') + tn.read_until(b'off') + else: + print('Monitor '+ str(m_id) + ' already triggered, doing nothing...') + print('Finishing thread...') + + + +def tolog(s): + logfile = open(datetime.now().strftime('%Y_%m_%d_') + log, 'a+') + logfile.write(s) + logfile.close() + + +def GetIP(s): + return inet_ntoa(struct.pack(' 1: + keys = ["--log=","-l=","--alarm=","-a=","--port=","-p=","--event=","-e="] + for i in range(1,len(sys.argv)): + for key in keys: + if sys.argv[i].find(key) == 0: + if key == "--log=" or key == "-l=": + wrzmlog=sys.argv[i][len(key):] + elif key == "--alarm=" or key == "-a=": + rsealm=sys.argv[i][len(key):] + elif key == "--port=" or key == "-p=": + port=sys.argv[i][len(key):] + elif key == "--event=" or key == "-e=": + wrzmevent=sys.argv[i][len(key):] + break + +else: + print('Usage: %s [--port|-p= --log|-l= --alarm|-a= --event|-e=]' % os.path.basename(sys.argv[0])) + sys.exit() + +print ('Create log entry: ', wrzmlog) +print ('Trigger event: ', wrzmlog) +print ('Raise Alarm: ', rsealm) + +server = socket(AF_INET, SOCK_STREAM) +server.bind(('0.0.0.0', int(port))) +# server.settimeout(0.5) +server.listen(1) + +log = "AlarmServer.log" + +conf = utils.read_config('/etc/zm/secrets.ini') +api_options = { + 'apiurl': utils.get(key='ZM_API_PORTAL', section='secrets', conf=conf), + 'portalurl':utils.get(key='ZM_PORTAL', section='secrets', conf=conf), + 'user': utils.get(key='ZM_USER', section='secrets', conf=conf), + #'disable_ssl_cert_check': True +} + +zmapi = zmapi.ZMApi(options=api_options) + +# importing the regex to get ip out of path +import re +#define regex pattern for IP addresses +pattern =re.compile('''((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)''') +# store the response of URL +#process monitors create dict of monitors +list_monit = {} +zm_monitors = zmapi.monitors() +for m in zm_monitors.list(): + ip_v4=pattern.search(m.get()['Path']) + list_monit[ip_v4.group()]=m.id() + +writezmlog('Listening on port: '+port,' AlarmServer.py') +print ('Listening on port: '+port) +#run Alarm Server +while True: + try: + conn, addr = server.accept() + head, version, session, sequence_number, msgid, len_data = struct.unpack( + 'BB2xII2xHI', conn.recv(20) + ) + sleep(0.1) # Just for recive whole packet + data = conn.recv(len_data) + conn.close() + # make the json a Dictionary + reply = json.loads(data) + # get ip + ip_v4 = GetIP(reply.get('Address')) + # get alarm_event_desc + alarm_desc = reply.get('Event') +# print(datetime.now().strftime('[%Y-%m-%d %H:%M:%S]>>>')) + print ('Ip Address: ',ip_v4) + print ("Alarm Description: ", alarm_desc) + print('<<<') +# tolog(repr(data) + "\r\n") + if alarm_desc == 'HumanDetect': + if wrzmlog == 'y': + writezmlog(alarm_desc+' in monitor ',str(list_monit[ip_v4])) + if rsealm == 'y': + print ("Triggering Alarm...") + mthread = Thread(target=alarm_thread, args=(zm_monitors.find(list_monit[ip_v4]),list_monit[ip_v4],eventlenght)) + mthread.start() + elif wrzmevent == 'y': + print ("Triggering Event Rec on zmtrigger...") + mthread = Thread(target=event_thread, args=(list_monit[ip_v4],eventlenght)) + mthread.start() + except (KeyboardInterrupt, SystemExit): + break +server.close() +# needs to be closed again... otherwise it will crash on exit. +zmlog.close() +sys.exit(1) From 96f7cd7a4e3fabb68953db203cc68618d458c538 Mon Sep 17 00:00:00 2001 From: ovargasp Date: Fri, 5 Aug 2022 16:46:11 -0600 Subject: [PATCH 035/134] Latest version of zmAlarmServer --- .../lib/ZoneMinder/ConfigData.pm.in | 47 +++++++++++++++++++ scripts/zmalarm-server.py | 2 +- scripts/zmdc.pl.in | 3 +- scripts/zmpkg.pl.in | 24 ++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 6e3242894..3b975c5a2 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3834,6 +3834,53 @@ our @options = ( type => $types{string}, category => 'config', }, +# Add options for Alarm Server + { + name => 'ZM_OPT_USE_ALARMSERVER', + default => 'no', + description => 'Enable NETSurveillance WEB Camera ALARM SERVER', + help => q` + Alarm Server that works with cameras that use Netsurveillance Web Server, + and has the Alarm Server option it receives alarms sent by this cameras + (once enabled), and pass to Zoneminder the events. + It requires pyzm installed, visit https://pyzm.readthedocs.io/en/latest/ + for installation instructions. + `, + type => $types{boolean}, + category => 'system', + }, + { + name => 'ZM_OPT_ALS_LOGENTRY', + default => 'no', + description => 'Makes ALARM SERVER create a log entry in ZoneMinder on Human Detected', + help => '', + type => $types{boolean}, + category => 'system', + }, + { + name => 'ZM_OPT_ALS_ALARM', + default => 'no', + description => 'Send the Human Detected alarm from ALARM SERVER to ZoneMinder, It does not work along with OPT_ALS_TRIGGEREVENT', + help => '', + type => $types{boolean}, + category => 'system', + }, + { + name => 'ZM_OPT_ALS_TRIGGEREVENT', + default => 'no', + description => 'Trigger an event on Human Detected alarm from ALARM SERVER to ZoneMinder. Requires the zmTrigger option Enabled', + help => '', + type => $types{boolean}, + category => 'system', + }, + { + name => 'ZM_OPT_ALS_PORT', + default => '15002', + description => 'Port Number to receive alarms from Alarm Server', + help => '', + type => $types{integer}, + category => 'system', + }, ); our %options_hash = map { ( $_->{name}, $_ ) } @options; diff --git a/scripts/zmalarm-server.py b/scripts/zmalarm-server.py index 891efba5a..4a3717cbe 100755 --- a/scripts/zmalarm-server.py +++ b/scripts/zmalarm-server.py @@ -108,7 +108,7 @@ if len(sys.argv) > 1: else: print('Usage: %s [--port|-p= --log|-l= --alarm|-a= --event|-e=]' % os.path.basename(sys.argv[0])) - sys.exit() + sys.exit(1) print ('Create log entry: ', wrzmlog) print ('Trigger event: ', wrzmlog) diff --git a/scripts/zmdc.pl.in b/scripts/zmdc.pl.in index 911ac57dc..c4e7bd1a6 100644 --- a/scripts/zmdc.pl.in +++ b/scripts/zmdc.pl.in @@ -102,7 +102,8 @@ my @daemons = ( 'zmtrack.pl', 'zmcontrol.pl', 'zm_rtsp_server', - 'zmtelemetry.pl' + 'zmtelemetry.pl', + 'zmalarm-server.py' ); if ( $Config{ZM_OPT_USE_EVENTNOTIFICATION} ) { diff --git a/scripts/zmpkg.pl.in b/scripts/zmpkg.pl.in index 08b36f536..651966bf9 100644 --- a/scripts/zmpkg.pl.in +++ b/scripts/zmpkg.pl.in @@ -288,6 +288,30 @@ if ( $command =~ /^(?:start|restart)$/ ) { if ( $Config{ZM_MIN_RTSP_PORT} ) { runCommand('zmdc.pl start zm_rtsp_server'); } + # run and pass parameters to AlarmServer.py + if ($Config{ZM_OPT_USE_ALARMSERVER} ) { + my $cmd='zmdc.pl start zmalarm-server.py '. $Config{ZM_OPT_ALS_PORT}; + if ($Config{ZM_OPT_ALS_LOGENTRY} ) { + $cmd = $cmd . ' --log=y'; + } + else { + $cmd = $cmd . ' --log=n'; + } + if ($Config{ZM_OPT_ALS_TRIGGEREVENT} ) { + $cmd = $cmd . ' --event=y'; + } + else { + $cmd = $cmd . ' --event=n'; + } + + if ($Config{ZM_OPT_ALS_ALARM} ) { + $cmd = $cmd . ' --alarm=y'; + } + else { + $cmd = $cmd . ' --alarm=n'; + } + runCommand($cmd); + } } else { $retval = 1; } From 18152f82a271b436b00fc04834548143a067f144 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 14:35:17 -0400 Subject: [PATCH 036/134] Fix eslint --- web/skins/classic/views/js/log.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/log.js b/web/skins/classic/views/js/log.js index d3824ab0d..b29153051 100644 --- a/web/skins/classic/views/js/log.js +++ b/web/skins/classic/views/js/log.js @@ -44,7 +44,7 @@ function processRows(rows) { $j.each(rows, function(ndx, row) { try { row.Message = decodeURIComponent(row.Message); - } catch(e) { + } catch (e) { // ignore errors } }); From 65952668ce86713359f475cd7a87ca72e0f4952b Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 9 Aug 2022 15:04:09 -0500 Subject: [PATCH 037/134] Update ZM_MIN_RTSP_PORT description --- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 3b975c5a2..34bfbf900 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -978,13 +978,12 @@ our @options = ( { name => 'ZM_MIN_RTSP_PORT', default => '', - description => 'Start of port range to contact for RTSP streaming video.', + description => 'Port used for RTSP streaming video.', help => q` - The beginng of a port range that will be used to offer + The port that will be used to offer RTSP streaming of live captured video. - Each monitor will use this value plus the Monitor Id to stream - content. So a value of 2000 here will cause a stream for Monitor 1 to - hit port 2001.`, + Each camera to be streamed must be enabled + under its misc tab.`, type => $types{integer}, category => 'network', }, From 71c5339c2b5fbf44790875206ebdde5a760b59a9 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 8 Aug 2022 23:45:53 -0500 Subject: [PATCH 038/134] Adds Janus options Profile-ID Override and Use RTSP Restream to work around camera issues --- db/zm_create.sql.in | 2 ++ db/zm_update-1.37.20.sql | 37 ++++++++++++++++++++++++ src/zm_monitor.cpp | 9 ++++-- src/zm_monitor.h | 4 +++ src/zm_monitor_janus.cpp | 45 +++++++++++++++++++---------- web/includes/Monitor.php | 2 ++ web/includes/actions/monitor.php | 1 + web/lang/en_gb.php | 10 +++++++ web/skins/classic/views/monitor.php | 22 ++++++++++++++ 9 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 db/zm_update-1.37.20.sql diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 659064fe3..75f264a0a 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -465,6 +465,8 @@ CREATE TABLE `Monitors` ( `Decoding` enum('None','Ondemand','KeyFrames','KeyFrames+Ondemand', 'Always') NOT NULL default 'Always', `JanusEnabled` BOOLEAN NOT NULL default false, `JanusAudioEnabled` BOOLEAN NOT NULL default false, + `Janus_Profile_Override` VARCHAR(30) NOT NULL DEFAULT '', + `Janus_Use_RTSP_Restream` BOOLEAN NOT NULL default false, `LinkedMonitors` varchar(255), `Triggers` set('X10') NOT NULL default '', `EventStartCommand` VARCHAR(255) NOT NULL DEFAULT '', diff --git a/db/zm_update-1.37.20.sql b/db/zm_update-1.37.20.sql new file mode 100644 index 000000000..b74e9d064 --- /dev/null +++ b/db/zm_update-1.37.20.sql @@ -0,0 +1,37 @@ +-- +-- Update Monitors Table to include Janus_Profile_Override +-- + +SELECT 'Checking for Janus_Profile_Override in Monitors'; +SET @s = (SELECT IF( + (SELECT COUNT(*) + FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'Monitors' + AND table_schema = DATABASE() + AND column_name = 'Janus_Profile_Override' + ) > 0, +"SELECT 'Column Janus_Profile_Override already exists in Monitors'", +"ALTER TABLE Monitors ADD Janus_Profile_Override varchar(30) DEFAULT '' AFTER `JanusAudioEnabled`" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; + +-- +-- Update Monitors Table to include Janus_Use_RTSP_Restream +-- + +SELECT 'Checking for Janus_Use_RTSP_Restream in Monitors'; +SET @s = (SELECT IF( + (SELECT COUNT(*) + FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'Monitors' + AND table_schema = DATABASE() + AND column_name = 'Janus_Use_RTSP_Restream' + ) > 0, +"SELECT 'Column Janus_Use_RTSP_Restream already exists in Monitors'", +"ALTER TABLE Monitors ADD Janus_Use_RTSP_Restream BOOLEAN NOT NULL DEFAULT false AFTER `Janus_Profile_Override`" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 420551071..fb88a5a39 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -82,7 +82,7 @@ struct Namespace namespaces[] = std::string load_monitor_sql = "SELECT `Id`, `Name`, `ServerId`, `StorageId`, `Type`, `Capturing`+0, `Analysing`+0, `AnalysisSource`+0, `AnalysisImage`+0," "`Recording`+0, `RecordingSource`+0, `Decoding`+0, " -"`JanusEnabled`, `JanusAudioEnabled`, " +"`JanusEnabled`, `JanusAudioEnabled`, `Janus_Profile_Override`, `Janus_Use_RTSP_Restream`," "`LinkedMonitors`, `EventStartCommand`, `EventEndCommand`, `AnalysisFPSLimit`, `AnalysisUpdateDelay`, `MaxFPS`, `AlarmMaxFPS`," "`Device`, `Channel`, `Format`, `V4LMultiBuffer`, `V4LCapturesPerFrame`, " // V4L Settings "`Protocol`, `Method`, `Options`, `User`, `Pass`, `Host`, `Port`, `Path`, `SecondPath`, `Width`, `Height`, `Colours`, `Palette`, `Orientation`+0, `Deinterlacing`, " @@ -166,6 +166,8 @@ Monitor::Monitor() decoding(DECODING_ALWAYS), janus_enabled(false), janus_audio_enabled(false), + janus_profile_override(""), + janus_use_rtsp_restream(false), //protocol //method //options @@ -313,8 +315,7 @@ Monitor::Monitor() /* std::string load_monitor_sql = "SELECT `Id`, `Name`, `ServerId`, `StorageId`, `Type`, `Capturing`+0, `Analysing`+0, `AnalysisSource`+0, `AnalysisImage`+0," - "`Recording`+0, `RecordingSource`+0, - `Decoding`+0, JanusEnabled, JanusAudioEnabled, " + "`Recording`+0, `RecordingSource`+0, `Decoding`+0, JanusEnabled, JanusAudioEnabled, Janus_Profile_Override, Janus_Use_RTSP_Restream" "LinkedMonitors, `EventStartCommand`, `EventEndCommand`, " "AnalysisFPSLimit, AnalysisUpdateDelay, MaxFPS, AlarmMaxFPS," "Device, Channel, Format, V4LMultiBuffer, V4LCapturesPerFrame, " // V4L Settings @@ -375,6 +376,8 @@ void Monitor::Load(MYSQL_ROW dbrow, bool load_zones=true, Purpose p = QUERY) { // See below after save_jpegs for a recalculation of decoding_enabled janus_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++; janus_audio_enabled = dbrow[col] ? atoi(dbrow[col]) : false; col++; + janus_profile_override = std::string(dbrow[col] ? dbrow[col] : ""); col++; + janus_use_rtsp_restream = dbrow[col] ? atoi(dbrow[col]) : false; col++; linked_monitors_string = dbrow[col] ? dbrow[col] : ""; col++; event_start_command = dbrow[col] ? dbrow[col] : ""; col++; diff --git a/src/zm_monitor.h b/src/zm_monitor.h index 29d80ec77..0635516f8 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -338,6 +338,7 @@ protected: //helper class for CURL static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp); bool Janus_Healthy; + bool Use_RTSP_Restream; std::string janus_session; std::string janus_handle; std::string janus_endpoint; @@ -345,6 +346,7 @@ protected: std::string rtsp_username; std::string rtsp_password; std::string rtsp_path; + std::string profile_override; public: explicit JanusManager(Monitor *parent_); @@ -375,6 +377,8 @@ protected: DecodingOption decoding; // Whether the monitor will decode h264/h265 packets bool janus_enabled; // Whether we set the h264/h265 stream up on janus bool janus_audio_enabled; // Whether we tell Janus to try to include audio. + std::string janus_profile_override; // The Profile-ID to force the stream to use. + bool janus_use_rtsp_restream; // Point Janus at the ZM RTSP output, rather than the camera directly. std::string protocol; std::string method; diff --git a/src/zm_monitor_janus.cpp b/src/zm_monitor_janus.cpp index 0994b014f..d4c4d007f 100644 --- a/src/zm_monitor_janus.cpp +++ b/src/zm_monitor_janus.cpp @@ -25,7 +25,9 @@ Monitor::JanusManager::JanusManager(Monitor *parent_) : Janus_Healthy(false) { //constructor takes care of init and calls add_to - parent = parent_; + //parent = parent_; + Use_RTSP_Restream = parent->janus_use_rtsp_restream; + profile_override = parent->janus_profile_override; if ((config.janus_path != nullptr) && (config.janus_path[0] != '\0')) { janus_endpoint = config.janus_path; //remove the trailing slash if present @@ -33,22 +35,29 @@ Monitor::JanusManager::JanusManager(Monitor *parent_) : } else { janus_endpoint = "127.0.0.1:8088/janus"; } - std::size_t at_pos = parent->path.find("@", 7); - if (at_pos != std::string::npos) { - //If we find an @ symbol, we have a username/password. Otherwise, passwordless login. - std::size_t colon_pos = parent->path.find(":", 7); //Search for the colon, but only after the rtsp:// text. - if (colon_pos == std::string::npos) { - //Looks like an invalid url - throw std::runtime_error("Cannot Parse URL for Janus."); - } - rtsp_username = parent->path.substr(7, colon_pos-7); - rtsp_password = parent->path.substr(colon_pos+1, at_pos - colon_pos - 1); - rtsp_path = "rtsp://"; - rtsp_path += parent->path.substr(at_pos + 1); - } else { + if (Use_RTSP_Restream) { + int restream_port = config.min_rtsp_port; rtsp_username = ""; rtsp_password = ""; - rtsp_path = parent->path; + rtsp_path = "rtsp://127.0.0.1:" + std::to_string(restream_port) + "/" + parent->rtsp_streamname; + } else { + std::size_t at_pos = parent->path.find("@", 7); + if (at_pos != std::string::npos) { + //If we find an @ symbol, we have a username/password. Otherwise, passwordless login. + std::size_t colon_pos = parent->path.find(":", 7); //Search for the colon, but only after the rtsp:// text. + if (colon_pos == std::string::npos) { + //Looks like an invalid url + throw std::runtime_error("Cannot Parse URL for Janus."); + } + rtsp_username = parent->path.substr(7, colon_pos-7); + rtsp_password = parent->path.substr(colon_pos+1, at_pos - colon_pos - 1); + rtsp_path = "rtsp://"; + rtsp_path += parent->path.substr(at_pos + 1); + } else { + rtsp_username = ""; + rtsp_password = ""; + rtsp_path = parent->path; + } } } @@ -108,7 +117,7 @@ int Monitor::JanusManager::check_janus() { curl_easy_cleanup(curl); if (res != CURLE_OK) { //may mean an error code thrown by Janus, because of a bad session - Warning("Attempted %s got %s", endpoint.c_str(), curl_easy_strerror(res)); + Warning("Attempted to send %s to %s and got %s", postData.c_str(), endpoint.c_str(), curl_easy_strerror(res)); janus_session = ""; janus_handle = ""; return -1; @@ -151,6 +160,10 @@ int Monitor::JanusManager::add_to_janus() { postData += "\", \"type\" : \"rtsp\", \"rtsp_quirk\" : true, "; postData += "\"url\" : \""; postData += rtsp_path; + if (profile_override[0] != '\0') { + postData += "\", \"videofmtp\" : \""; + postData += profile_override; + } if (rtsp_username != "") { postData += "\", \"rtsp_user\" : \""; postData += rtsp_username; diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index 92f342c4a..655a1e6c2 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -146,6 +146,8 @@ public static function getStatuses() { 'Decoding' => 'Always', 'JanusEnabled' => array('type'=>'boolean','default'=>0), 'JanusAudioEnabled' => array('type'=>'boolean','default'=>0), + 'Janus_Profile_Override' => '', + 'Janus_Use_RTSP_Restream' => array('type'=>'boolean','default'=>0), 'LinkedMonitors' => array('type'=>'set', 'default'=>null), 'Triggers' => array('type'=>'set','default'=>''), 'EventStartCommand' => '', diff --git a/web/includes/actions/monitor.php b/web/includes/actions/monitor.php index b27ff4443..f22221bcb 100644 --- a/web/includes/actions/monitor.php +++ b/web/includes/actions/monitor.php @@ -91,6 +91,7 @@ if ($action == 'save') { 'DecodingEnabled' => 0, 'JanusEnabled' => 0, 'JanusAudioEnabled' => 0, + 'Janus_Use_RTSP_Restream' => 0, 'Exif' => 0, 'RTSPDescribe' => 0, 'V4LMultiBuffer' => '', diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php index d93207f5d..d1a3d7b1e 100644 --- a/web/lang/en_gb.php +++ b/web/lang/en_gb.php @@ -891,6 +891,16 @@ None: No frames will be decoded, live view and thumbnails will not be available~ Attempt to enable audio in the Janus stream. Has no effect for cameras without audio support, but can prevent a stream playing if your camera sends an audio format unsupported by the browser.' ), + 'FUNCTION_JANUS_PROFILE_OVERRIDE' => array( + 'Help' => ' + Manually set a Profile-ID, which can force a browser to try to play a given stream. Try "42e01f" + for a universally supported value, or leave this blank to use the Profile-ID specified by the source.' + ), + 'FUNCTION_JANUS_USE_RTSP_RESTREAM' => array( + 'Help' => ' + If your camera will not work under Janus with any other options, enable this to use the ZoneMinder + RTSP restream as the Janus source.' + ), 'ImageBufferCount' => array( 'Help' => ' Number of raw images available in /dev/shm. Currently should be set in the 3-5 range. Used for live viewing.' diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 9dbf4fbb0..43e640c31 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -1181,6 +1181,7 @@ echo htmlSelect('newMonitor[OutputContainer]', $videowriter_containers, $monitor ?> +
+ + + + + + + + + From 4b5db75d901670b2657071cff3501e29c0557627 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 9 Aug 2022 15:17:40 -0500 Subject: [PATCH 039/134] Properly hide Janus options when Janus is disabled for a given monitor. --- web/skins/classic/views/js/monitor.js | 10 +++++++++- web/skins/classic/views/monitor.php | 2 -- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/web/skins/classic/views/js/monitor.js b/web/skins/classic/views/js/monitor.js index f36f3e2b3..a80ea031f 100644 --- a/web/skins/classic/views/js/monitor.js +++ b/web/skins/classic/views/js/monitor.js @@ -262,18 +262,26 @@ function initPage() { window.location.assign('?view=console'); }); - //manage the Janus audio check + //manage the Janus settings div if (document.getElementsByName("newMonitor[JanusEnabled]")[0].checked) { document.getElementById("FunctionJanusAudioEnabled").hidden = false; + document.getElementById("FunctionJanusProfileOverride").hidden = false; + document.getElementById("FunctionJanusUseRTSPRestream").hidden = false; } else { document.getElementById("FunctionJanusAudioEnabled").hidden = true; + document.getElementById("FunctionJanusProfileOverride").hidden = true; + document.getElementById("FunctionJanusUseRTSPRestream").hidden = true; } document.getElementsByName("newMonitor[JanusEnabled]")[0].addEventListener('change', function() { if (this.checked) { document.getElementById("FunctionJanusAudioEnabled").hidden = false; + document.getElementById("FunctionJanusProfileOverride").hidden = false; + document.getElementById("FunctionJanusUseRTSPRestream").hidden = false; } else { document.getElementById("FunctionJanusAudioEnabled").hidden = true; + document.getElementById("FunctionJanusProfileOverride").hidden = true; + document.getElementById("FunctionJanusUseRTSPRestream").hidden = true; } }); diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 43e640c31..d34372d0e 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -1181,7 +1181,6 @@ echo htmlSelect('newMonitor[OutputContainer]', $videowriter_containers, $monitor ?> -
- From 3c38f5d3f9ea26862ecf32a7d4ee7bda35534d41 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 9 Aug 2022 18:52:31 -0400 Subject: [PATCH 040/134] Test for existence of monitors[i] before trying to kill it just to reduce javascript errors --- web/skins/classic/views/js/montage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/montage.js b/web/skins/classic/views/js/montage.js index 4806c2ed4..6fc5522f0 100644 --- a/web/skins/classic/views/js/montage.js +++ b/web/skins/classic/views/js/montage.js @@ -265,8 +265,8 @@ function initPage() { // If you click on the navigation links, shut down streaming so the browser can process it document.querySelectorAll('#main-header-nav a').forEach(function(el) { el.onclick = function() { - for (var i = 0, length = monitors.length; i < length; i++) { - monitors[i].kill(); + for (let i = 0, length = monitors.length; i < length; i++) { + if (monitors[i]) monitors[i].kill(); } }; }); From e55dfe4d4c1029e12c443ee7acc7d7f6a48b79f5 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 10 Aug 2022 03:59:18 -0500 Subject: [PATCH 041/134] Fix typo in field name --- web/skins/classic/views/monitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index d34372d0e..b25b06cbc 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -1193,7 +1193,7 @@ echo htmlSelect('newMonitor[OutputContainer]', $videowriter_containers, $monitor - +
JanusAudioEnabled() ? ' checked="checked"' : '' ?>/> @@ -1191,6 +1192,27 @@ echo htmlSelect('newMonitor[OutputContainer]', $videowriter_containers, $monitor ?>
+'.$OLANG['FUNCTION_JANUS_PROFILE_OVERRIDE']['Help'].''; + } +?> +
Janus_Use_RTSP_Restream() ? ' checked="checked"' : '' ?>/> +'.$OLANG['FUNCTION_JANUS_USE_RTSP_RESTREAM']['Help'].''; + } +?> +
DefaultRate()); ?>
JanusAudioEnabled() ? ' checked="checked"' : '' ?>/> @@ -1212,7 +1211,6 @@ echo htmlSelect('newMonitor[OutputContainer]', $videowriter_containers, $monitor ?>
DefaultRate()); ?>
+ '.$OLANG['FUNCTION_JANUS_PROFILE_OVERRIDE']['Help'].''; From 4514ceddd553643607cd02ff45022e8f70112073 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 08:55:06 -0400 Subject: [PATCH 042/134] Rework code to be smaller. Don't require SystemView permission to post a log entry. Default to ERR if invalid err code provided instead of PANIC so that the log entry still gets saved --- web/ajax/log.php | 84 ++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/web/ajax/log.php b/web/ajax/log.php index 513c9f63f..0d371d52c 100644 --- a/web/ajax/log.php +++ b/web/ajax/log.php @@ -6,39 +6,33 @@ $message = ''; // INITIALIZE AND CHECK SANITY // -if ( !canView('System') ) - $message = 'Insufficient permissions to view log entries for user '.$user['Username']; // task must be set -if ( !isset($_REQUEST['task']) ) { +if (!isset($_REQUEST['task'])) { $message = 'This request requires a task to be set'; -} else if ( $_REQUEST['task'] != 'query' && $_REQUEST['task'] != 'create' ) { +} else if ($_REQUEST['task'] == 'query') { + if (!canView('System')) { + $message = 'Insufficient permissions to view log entries for user '.$user['Username']; + } else { + $data = queryRequest(); + } +} else if ($_REQUEST['task'] == 'create' ) { + global $user; + if (!$user) { + // We allow any logged in user to create logs. This opens us up to DOS by malicious user + $message = 'Insufficient permissions to view log entries for user '.$user['Username']; + } else { + createRequest(); + } +} else { // Only the query and create tasks are supported at the moment $message = 'Unrecognised task '.$_REQUEST['task']; -} else { - $task = $_REQUEST['task']; } -if ( $message ) { +if ($message) { ajaxError($message); return; } - -// -// MAIN LOOP -// - -switch ( $task ) { - case 'create' : - createRequest(); - break; - case 'query' : - $data = queryRequest(); - break; - default : - ZM\Fatal('Unrecognised task '.$task); -} // end switch task - ajaxResponse($data); // @@ -46,35 +40,29 @@ ajaxResponse($data); // function createRequest() { - if ( !empty($_POST['level']) && !empty($_POST['message']) ) { + if (!empty($_POST['level']) && !empty($_POST['message'])) { ZM\logInit(array('id'=>'web_js')); - $string = $_POST['message']; - $file = !empty($_POST['file']) ? preg_replace('/\w+:\/\/[\w.:]+\//', '', $_POST['file']) : ''; - if ( !empty($_POST['line']) ) { - $line = validInt($_POST['line']); - } else { - $line = NULL; - } + $line = empty($_POST['line']) ? NULL : validInt($_POST['line']); $levels = array_flip(ZM\Logger::$codes); - if ( !isset($levels[$_POST['level']]) ) { - ZM\Panic('Unexpected logger level '.$_POST['level']); + if (!isset($levels[$_POST['level']])) { + ZM\Error('Unexpected logger level '.$_POST['level']); + $_POST['level'] = 'ERR'; } $level = $levels[$_POST['level']]; - ZM\Logger::fetch()->logPrint($level, $string, $file, $line); + ZM\Logger::fetch()->logPrint($level, $_POST['message'], $file, $line); } else { ZM\Error('Invalid log create: '.print_r($_POST, true)); } } function queryRequest() { - // Offset specifies the starting row to return, used for pagination $offset = 0; - if ( isset($_REQUEST['offset']) ) { - if ( ( !is_int($_REQUEST['offset']) and !ctype_digit($_REQUEST['offset']) ) ) { + if (isset($_REQUEST['offset'])) { + if ((!is_int($_REQUEST['offset']) and !ctype_digit($_REQUEST['offset']))) { ZM\Error('Invalid value for offset: ' . $_REQUEST['offset']); } else { $offset = $_REQUEST['offset']; @@ -83,8 +71,8 @@ function queryRequest() { // Limit specifies the number of rows to return $limit = 100; - if ( isset($_REQUEST['limit']) ) { - if ( ( !is_int($_REQUEST['limit']) and !ctype_digit($_REQUEST['limit']) ) ) { + if (isset($_REQUEST['limit'])) { + if ((!is_int($_REQUEST['limit']) and !ctype_digit($_REQUEST['limit']))) { ZM\Error('Invalid value for limit: ' . $_REQUEST['limit']); } else { $limit = $_REQUEST['limit']; @@ -100,11 +88,11 @@ function queryRequest() { $col_alt = array('DateTime', 'Server'); $sort = 'TimeKey'; - if ( isset($_REQUEST['sort']) ) { + if (isset($_REQUEST['sort'])) { $sort = $_REQUEST['sort']; - if ( $sort == 'DateTime' ) $sort = 'TimeKey'; + if ($sort == 'DateTime') $sort = 'TimeKey'; } - if ( !in_array($sort, array_merge($columns, $col_alt)) ) { + if (!in_array($sort, array_merge($columns, $col_alt))) { ZM\Error('Invalid sort field: ' . $sort); return; } @@ -127,10 +115,9 @@ function queryRequest() { $advsearch = isset($_REQUEST['filter']) ? json_decode($_REQUEST['filter'], JSON_OBJECT_AS_ARRAY) : array(); // Search contains a user entered string to search on $search = isset($_REQUEST['search']) ? $_REQUEST['search'] : ''; - if ( count($advsearch) ) { - - foreach ( $advsearch as $col=>$text ) { - if ( !in_array($col, array_merge($columns, $col_alt)) ) { + if (count($advsearch)) { + foreach ($advsearch as $col=>$text) { + if (!in_array($col, array_merge($columns, $col_alt))) { ZM\Error("'$col' is not a searchable column name"); continue; } @@ -142,8 +129,7 @@ function queryRequest() { $wherevalues = $query['values']; $where = ' WHERE (' .implode(' OR ', $likes). ')'; - } else if ( $search != '' ) { - + } else if ($search != '') { $search = '%' .$search. '%'; foreach ( $columns as $col ) { array_push($likes, $col.' LIKE ?'); @@ -167,7 +153,7 @@ function queryRequest() { $results = dbFetchAll($query['sql'], NULL, $query['values']); global $dateTimeFormatter; - foreach ( $results as $row ) { + foreach ($results as $row) { $row['DateTime'] = $dateTimeFormatter->format($row['TimeKey']); $Server = ZM\Server::find_one(array('Id'=>$row['ServerId'])); From 38b37ff39bc8fad14514ddac8338fd1c7b0727f0 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 09:18:15 -0400 Subject: [PATCH 043/134] Fix deprecation warning due to implicit conversion to integer. Make it explicit. --- web/ajax/watch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ajax/watch.php b/web/ajax/watch.php index 0642d4bfa..9229c99ac 100644 --- a/web/ajax/watch.php +++ b/web/ajax/watch.php @@ -65,7 +65,7 @@ foreach ( $rows as $row ) { $row['imgHtml'] = 'Event '.$event->Id().''; $row['Name'] = validHtmlStr($row['Name']); $row['StartDateTime'] = $dateTimeFormatter->format(strtotime($row['StartDateTime'])); - $row['Length'] = gmdate('H:i:s', $row['Length'] ); + $row['Length'] = gmdate('H:i:s', intval($row['Length'])); $returned_rows[] = $row; } # end foreach row matching search From 11bfc74cff98712e7d02ba249a50bc740c029141 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 09:18:32 -0400 Subject: [PATCH 044/134] Log entire backtrace when invalid value for width --- web/includes/Monitor.php | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index 655a1e6c2..f703d4d34 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -843,12 +843,10 @@ public static function getStatuses() { */ function getStreamHTML($options) { if (isset($options['scale']) and $options['scale'] != '' and $options['scale'] != 'fixed') { - Debug("Have scale:" . $options['scale']); - if ( $options['scale'] != 'auto' && $options['scale'] != '0' ) { - #ZM\Warning('Setting dimensions from scale:'.$options['scale']); + if ($options['scale'] != 'auto' && $options['scale'] != '0') { $options['width'] = reScale($this->ViewWidth(), $options['scale']).'px'; $options['height'] = reScale($this->ViewHeight(), $options['scale']).'px'; - } else if ( ! ( isset($options['width']) or isset($options['height']) ) ) { + } else if (!(isset($options['width']) or isset($options['height']))) { $options['width'] = '100%'; $options['height'] = 'auto'; } @@ -856,41 +854,35 @@ public static function getStatuses() { $options['scale'] = 100; # scale is empty or 100 # There may be a fixed width applied though, in which case we need to leave the height empty - if ( ! ( isset($options['width']) and $options['width'] ) ) { + if (!(isset($options['width']) and $options['width'])) { # Havn't specified width. If we specified height, then we should # use a width that keeps the aspect ratio, otherwise no scaling, # no dimensions, so assume the dimensions of the Monitor - if ( ! (isset($options['height']) and $options['height']) ) { + if (!(isset($options['height']) and $options['height'])) { # If we havn't specified any scale or dimensions, then we must be using CSS to scale it in a dynamic way. Can't make any assumptions. - #$options['width'] = $monitor->ViewWidth().'px'; - #$options['height'] = $monitor->ViewHeight().'px'; } } else { - #ZM\Warning("Have width ".$options['width']); - if ( preg_match('/^(\d+)px$/', $options['width'], $matches) ) { + if (preg_match('/^(\d+)px$/', $options['width'], $matches)) { $scale = intval(100*$matches[1]/$this->ViewWidth()); - #ZM\Warning("Scale is $scale"); - if ( $scale < $options['scale'] ) + if ($scale < $options['scale']) $options['scale'] = $scale; - } else if ( preg_match('/^(\d+)%$/', $options['width'], $matches) ) { + } else if (preg_match('/^(\d+)%$/', $options['width'], $matches)) { $scale = intval($matches[1]); - if ( $scale < $options['scale'] ) + if ($scale < $options['scale']) $options['scale'] = $scale; } else { $backTrace = debug_backtrace(); - $file = $backTrace[1]['file']; - $line = $backTrace[1]['line']; - Warning('Invalid value for width: '.$options['width']. ' from '.$file.':'.$line); + Warning('Invalid value for width: '.$options['width']. ' from '.print_r($backTrace, true)); } } } - if ( ! isset($options['mode'] ) ) { + if (!isset($options['mode'])) { $options['mode'] = 'stream'; } - if ( ! isset($options['width'] ) ) + if (!isset($options['width'])) $options['width'] = 0; - if ( ! isset($options['height'] ) ) + if (!isset($options['height'])) $options['height'] = 0; if (!isset($options['maxfps'])) { From 0fa41c4aae539ec53b8729b742173a1e7ba79677 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 10:31:57 -0400 Subject: [PATCH 045/134] Fix warnings about keyframe interval and maximagebuffer count on jpeg streams. --- src/zm_packetqueue.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 6f77c5ec5..01869c0dc 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -298,14 +298,13 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { #endif if (zm_packet->packet->stream_index == video_stream_id) { + keyframe_interval_count++; if (zm_packet->keyframe) { Debug(4, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval_count); if (max_keyframe_interval < keyframe_interval_count) max_keyframe_interval = keyframe_interval_count; keyframe_interval_count = 1; next_front = it; - } else { - keyframe_interval_count++; } ++video_packets_to_delete; if (packet_counts[video_stream_id] - video_packets_to_delete <= pre_event_video_packet_count + tail_count) { From ac9f5c210c7c7469e9d624f7c8c1c93448630ab5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 11:33:35 -0400 Subject: [PATCH 046/134] Add bionic and focal builds --- .github/workflows/create-packages.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/create-packages.yml b/.github/workflows/create-packages.yml index 5e7754e2d..7993d00b8 100644 --- a/.github/workflows/create-packages.yml +++ b/.github/workflows/create-packages.yml @@ -13,6 +13,10 @@ jobs: dist: buster - os: debian dist: bullseye + - os: bionic + dist: focal + - os: ubuntu + dist: focal runs-on: ubuntu-latest steps: From 5f9f7861d74c7586d2ca327f07940bf656d11963 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 11:53:05 -0400 Subject: [PATCH 047/134] Bump version to 1.37.20 to pickup Janus db changes --- distros/redhat/zoneminder.spec | 2 +- version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/distros/redhat/zoneminder.spec b/distros/redhat/zoneminder.spec index b7a0ef948..a25094ead 100644 --- a/distros/redhat/zoneminder.spec +++ b/distros/redhat/zoneminder.spec @@ -37,7 +37,7 @@ %global _hardened_build 1 Name: zoneminder -Version: 1.37.19 +Version: 1.37.20 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons diff --git a/version b/version index b49b97a4b..6373bf824 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.37.19 +1.37.20 From a5f7495874f05c1d21659dbd58b9539abe2479af Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 11:56:34 -0400 Subject: [PATCH 048/134] Fix bionic-focal --- .github/workflows/create-packages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-packages.yml b/.github/workflows/create-packages.yml index 7993d00b8..57e911363 100644 --- a/.github/workflows/create-packages.yml +++ b/.github/workflows/create-packages.yml @@ -13,8 +13,8 @@ jobs: dist: buster - os: debian dist: bullseye - - os: bionic - dist: focal + - os: ubuntu + dist: bionic - os: ubuntu dist: focal runs-on: ubuntu-latest From 29222023558b58d5de3e424c5505c36a87b73ac2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 17:57:11 -0400 Subject: [PATCH 049/134] Detect out of order packets --- src/zm_packetqueue.cpp | 22 +++++++++++++++++++++- src/zm_packetqueue.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 01869c0dc..18d836c11 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -33,7 +33,8 @@ PacketQueue::PacketQueue(): packet_counts(nullptr), deleting(false), keep_keyframes(false), - warned_count(0) + warned_count(0), + has_out_of_order_packets_(false) { } @@ -87,6 +88,24 @@ bool PacketQueue::queuePacket(std::shared_ptr add_packet) { { std::unique_lock lck(mutex); if (deleting or zm_terminate) return false; + + if (!has_out_of_order_packets_ and (add_packet->packet->dts != AV_NOPTS_VALUE)) { + auto rit = pktQueue.rbegin(); + // Find the previous packet for the stream, and check dts + while (rit != pktQueue.rend()) { + if ((*rit)->packet->stream_index == add_packet->packet->stream_index) { + if ((*rit)->packet->dts >= add_packet->packet->dts) { + Debug(1, "Have out of order packets"); + ZM_DUMP_PACKET((*rit)->packet, "queued_packet"); + ZM_DUMP_PACKET(add_packet->packet, "add_packet"); + has_out_of_order_packets_ = true; + } + break; + } + rit++; + } // end while + } + pktQueue.push_back(add_packet); for ( auto iterators_it = iterators.begin(); @@ -358,6 +377,7 @@ void PacketQueue::stop() { void PacketQueue::clear() { deleting = true; + // Why are we notifying? condition.notify_all(); if (!packet_counts) // special case, not initialised return; diff --git a/src/zm_packetqueue.h b/src/zm_packetqueue.h index 340af7ddf..e468e2369 100644 --- a/src/zm_packetqueue.h +++ b/src/zm_packetqueue.h @@ -47,6 +47,7 @@ class PacketQueue { std::mutex mutex; std::condition_variable condition; int warned_count; + bool has_out_of_order_packets_; public: PacketQueue(); @@ -65,6 +66,7 @@ class PacketQueue { void dumpQueue(); unsigned int size(); unsigned int get_packet_count(int stream_id) const { return packet_counts[stream_id]; }; + bool has_out_of_order_packets() const { return has_out_of_order_packets_; }; void clearPackets(const std::shared_ptr &packet); int packet_count(int stream_id); From fcccf33cf666a359204fa924cbe2523b96bb8d7a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 10 Aug 2022 15:30:36 -0400 Subject: [PATCH 050/134] Don't call format on an empty string and only pass the integer part of it --- web/ajax/log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ajax/log.php b/web/ajax/log.php index 0d371d52c..68fe41a25 100644 --- a/web/ajax/log.php +++ b/web/ajax/log.php @@ -154,7 +154,7 @@ function queryRequest() { global $dateTimeFormatter; foreach ($results as $row) { - $row['DateTime'] = $dateTimeFormatter->format($row['TimeKey']); + $row['DateTime'] = empty($row['TimeKey']) ? '' : $dateTimeFormatter->format(intval($row['TimeKey'])); $Server = ZM\Server::find_one(array('Id'=>$row['ServerId'])); $row['Server'] = $Server ? $Server->Name() : ''; From 11846ed2086f71772561116206aec06e2f2f0087 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 11 Aug 2022 12:56:11 -0400 Subject: [PATCH 051/134] Don't need max_keyframe_interval. Whether our it is still pointing at the front is enough. Only log the warning if the packetqueue is full and we couldn't find another keyframe. --- src/zm_packetqueue.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 18d836c11..8bfcad42a 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -281,7 +281,6 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { return; } - int max_keyframe_interval = 1; int keyframe_interval_count = 1; ZMLockedPacket *lp = new ZMLockedPacket(zm_packet); @@ -321,7 +320,6 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { if (zm_packet->keyframe) { Debug(4, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval_count); - if (max_keyframe_interval < keyframe_interval_count) max_keyframe_interval = keyframe_interval_count; keyframe_interval_count = 1; next_front = it; } @@ -335,11 +333,6 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { ++it; } // end while - if ((max_keyframe_interval == 1) and max_video_packet_count) { - Warning("Did not find a second keyframe in the packet queue. It may be that" - " the Max Image Buffer setting is lower than the keyframe interval. We" - " need it to be greater than the keyframe interval."); - } Debug(1, "Resulting it pointing at latest packet? %d, next front points to begin? %d, Keyframe interval %d", ( *it == add_packet ), ( next_front == pktQueue.begin() ), @@ -364,6 +357,12 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { pktQueue.pop_front(); packet_counts[zm_packet->packet->stream_index] -= 1; } + } else { + if (max_video_packet_count >= packet_counts[video_stream_id]) { + Warning("Did not find a second keyframe in the packet queue. It may be that" + " the Max Image Buffer setting is lower than the keyframe interval. We" + " need it to be greater than the keyframe interval + pre event count."); + } } // end if have at least max_video_packet_count video packets remaining return; From 765714d976229fedff00011b33b68e1fc081b652 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 11 Aug 2022 13:23:13 -0400 Subject: [PATCH 052/134] Keep track of max_keyframe_interval and log it when complaining --- src/zm_packetqueue.cpp | 12 +++++++----- src/zm_packetqueue.h | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 8bfcad42a..25fe58eb5 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -34,7 +34,8 @@ PacketQueue::PacketQueue(): deleting(false), keep_keyframes(false), warned_count(0), - has_out_of_order_packets_(false) + has_out_of_order_packets_(false), + max_keyframe_interval_(0) { } @@ -134,8 +135,8 @@ bool PacketQueue::queuePacket(std::shared_ptr add_packet) { warned_count++; Warning("You have set the max video packets in the queue to %u." " The queue is full. Either Analysis is not keeping up or" - " your camera's keyframe interval is larger than this setting." - , max_video_packet_count); + " your camera's keyframe interval %d is larger than this setting." + , max_video_packet_count, max_keyframe_interval_); } for ( @@ -318,8 +319,9 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { if (zm_packet->packet->stream_index == video_stream_id) { keyframe_interval_count++; if (zm_packet->keyframe) { - Debug(4, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval_count); - + Debug(3, "Have a video keyframe so setting next front to it. Keyframe interval so far is %d", keyframe_interval_count); + if (keyframe_interval_count > max_keyframe_interval_) + max_keyframe_interval_ = keyframe_interval_count; keyframe_interval_count = 1; next_front = it; } diff --git a/src/zm_packetqueue.h b/src/zm_packetqueue.h index e468e2369..e4405ba3a 100644 --- a/src/zm_packetqueue.h +++ b/src/zm_packetqueue.h @@ -48,6 +48,7 @@ class PacketQueue { std::condition_variable condition; int warned_count; bool has_out_of_order_packets_; + int max_keyframe_interval_; public: PacketQueue(); @@ -67,6 +68,7 @@ class PacketQueue { unsigned int size(); unsigned int get_packet_count(int stream_id) const { return packet_counts[stream_id]; }; bool has_out_of_order_packets() const { return has_out_of_order_packets_; }; + int get_max_keyframe_interval() const { return max_keyframe_interval_; }; void clearPackets(const std::shared_ptr &packet); int packet_count(int stream_id); From f028e764baf6129a48b6a3d89dbae24f4b242995 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 11 Aug 2022 15:10:49 -0400 Subject: [PATCH 053/134] Add bool stopping() to packetqueue. --- src/zm_packetqueue.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_packetqueue.h b/src/zm_packetqueue.h index e4405ba3a..52ec531f1 100644 --- a/src/zm_packetqueue.h +++ b/src/zm_packetqueue.h @@ -63,6 +63,7 @@ class PacketQueue { bool queuePacket(std::shared_ptr packet); void stop(); + bool stopping() const { return deleting; }; void clear(); void dumpQueue(); unsigned int size(); From d40ab068e441d49df42e3e35f5990ab8f848c84e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 11 Aug 2022 15:23:35 -0400 Subject: [PATCH 054/134] Use new packetqueue.stopping() to not wait when the packetqueue is stopping --- src/zm_monitor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index fb88a5a39..d9f6dd35d 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -1919,13 +1919,13 @@ bool Monitor::Analyse() { /* try to stay behind the decoder. */ if (decoding != DECODING_NONE) { - while (!snap->decoded and !zm_terminate and !analysis_thread->Stopped()) { + while (!snap->decoded and !zm_terminate and !analysis_thread->Stopped() and !packetqueue.stopping()) { // Need to wait for the decoder thread. packetqueue.notify_all(); Debug(1, "Waiting for decode"); packet_lock->wait(); } // end while ! decoded - if (zm_terminate or analysis_thread->Stopped()) { + if (zm_terminate or analysis_thread->Stopped() or packetqueue.stopping()) { delete packet_lock; return false; } From de3ffa72c81f1d43baf6af0415ab3eb56e93852c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 11 Aug 2022 20:40:03 -0400 Subject: [PATCH 055/134] set decoded=true and notify when deleting packets from queue. Analysing might be waiting on the packet. --- src/zm_packetqueue.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 25fe58eb5..41c65e18c 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -172,6 +172,9 @@ bool PacketQueue::queuePacket(std::shared_ptr add_packet) { } } // end foreach iterator + zm_packet->decoded = true; // Have to in case analysis is waiting on it + zm_packet->notify_all(); + it = pktQueue.erase(it); packet_counts[zm_packet->packet->stream_index] -= 1; Debug(1, @@ -246,12 +249,8 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { // If not doing passthrough, we don't care about starting with a keyframe so logic is simpler while ((*pktQueue.begin() != add_packet) and (packet_counts[video_stream_id] > pre_event_video_packet_count + tail_count)) { std::shared_ptr zm_packet = *pktQueue.begin(); - ZMLockedPacket *lp = new ZMLockedPacket(zm_packet); - if (!lp->trylock()) { - delete lp; - break; - } - delete lp; + ZMLockedPacket lp(zm_packet); + if (!lp.trylock()) break; if (is_there_an_iterator_pointing_to_packet(zm_packet)) { Warning("Found iterator at beginning of queue. Some thread isn't keeping up"); @@ -373,7 +372,9 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { void PacketQueue::stop() { deleting = true; condition.notify_all(); - for (const auto &p : pktQueue) p->notify_all(); + for (const auto &p : pktQueue) { + p->notify_all(); + } } void PacketQueue::clear() { From 85795c30eea0076997ffe5fe39d1c39a9b6989c4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 12 Aug 2022 11:05:23 -0400 Subject: [PATCH 056/134] Remove warning about maxImageBuffer. It will be handled in queuePacket as it was before, only now we actually tell about the keyframe interval. It is entirely common to not get to another keyframe due to locked packets during event writing. --- src/zm_packetqueue.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 41c65e18c..fcad7b0ef 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -358,12 +358,6 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { pktQueue.pop_front(); packet_counts[zm_packet->packet->stream_index] -= 1; } - } else { - if (max_video_packet_count >= packet_counts[video_stream_id]) { - Warning("Did not find a second keyframe in the packet queue. It may be that" - " the Max Image Buffer setting is lower than the keyframe interval. We" - " need it to be greater than the keyframe interval + pre event count."); - } } // end if have at least max_video_packet_count video packets remaining return; From 494077eee7d6add3f43343a710953651af8eb67e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 12 Aug 2022 18:21:58 -0400 Subject: [PATCH 057/134] Don't set AVFMT_TS_NONSTRICT. Crashes on ffmpeg 5. Fixes #3497 --- src/zm_videostore.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index 210d80f03..2255595cf 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -155,7 +155,10 @@ bool VideoStore::open() { oc->metadata = pmetadata; // Dirty hack to allow us to set flags. Needed for ffmpeg5 out_format = const_cast(oc->oformat); + // ffmpeg 5 crashes if we do this +#if !LIBAVFORMAT_VERSION_CHECK(59, 16,100, 9, 0) out_format->flags |= AVFMT_TS_NONSTRICT; // allow non increasing dts +#endif const AVCodec *video_out_codec = nullptr; From 27808888a642505bd26b2f56f2ee464cdb7a2c8b Mon Sep 17 00:00:00 2001 From: Ratchanan Srirattanamet Date: Mon, 8 Aug 2022 03:13:08 +0700 Subject: [PATCH 058/134] db: start the processing thread after all fields are initialized Initializing `zmDbQueue::mThread` with initializer list makes the thread start in the middle of object initialization. This means `zmDbQueue:: process()` could start and reach mCondition.wait(lock); before `std:: wait_condition`'s constructor, which causes deadlock. To make sure thread won't start before object initialize, move `mThread`'s initialization to constructor's body. This _at last_ solves the random zmu deadlock issue that has plagued my setup for almost a year. --- src/zm_db.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zm_db.cpp b/src/zm_db.cpp index eda0b3166..29e805a65 100644 --- a/src/zm_db.cpp +++ b/src/zm_db.cpp @@ -227,9 +227,10 @@ zmDbRow::~zmDbRow() { } zmDbQueue::zmDbQueue() : - mThread(&zmDbQueue::process, this), mTerminate(false) -{ } +{ + mThread = std::thread(&zmDbQueue::process, this); +} zmDbQueue::~zmDbQueue() { stop(); From 331e3f483abd1561fb444e0550082e1fb117e7ac Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 13:01:49 -0400 Subject: [PATCH 059/134] Handle width=100% and remove code that worked around montage layouts with width=%. --- web/js/MonitorStream.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/web/js/MonitorStream.js b/web/js/MonitorStream.js index 48bf113bd..6578c89f8 100644 --- a/web/js/MonitorStream.js +++ b/web/js/MonitorStream.js @@ -114,7 +114,13 @@ function MonitorStream(monitorData) { } } else if (parseInt(width) || parseInt(height)) { if (width) { - newscale = parseInt(100*parseInt(width)/this.width); + if (width.search('px') != -1) { + newscale = parseInt(100*parseInt(width)/this.width); + } else { // % + // Set it, then get the calculated width + monitor_frame.css('width', width); + newscale = parseInt(100*parseInt(monitor_frame.width())/this.width); + } } else if (height) { newscale = parseInt(100*parseInt(height)/this.height); width = parseInt(this.width * newscale / 100)+'px'; @@ -124,10 +130,11 @@ function MonitorStream(monitorData) { width = Math.round(parseInt(this.width) * newscale / 100)+'px'; height = Math.round(parseInt(this.height) * newscale / 100)+'px'; } - if (width && (width != '0px') && - ((monitor_frame[0].style.width===undefined) || (-1 == monitor_frame[0].style.width.search('%'))) + if (width && (width != '0px') + // This next is for montage layouts where we use things like 33% + //&& ((monitor_frame[0].style.width===undefined) || (-1 == monitor_frame[0].style.width.search('%'))) ) { - monitor_frame.css('width', width); + monitor_frame.css('width', parseInt(width)); } if (height && height != '0px') img.style.height = height; @@ -143,6 +150,7 @@ function MonitorStream(monitorData) { const stream_frame = $j('#monitor'+this.id); if (!newscale) { newscale = parseInt(100*parseInt(stream_frame.width())/this.width); + console.log("Calculated stream scale from ", stream_frame.width(), '/', this.width, '=', newscale); } if (img.nodeName == 'IMG') { if (newscale > 100) newscale = 100; // we never request a larger image, as it just wastes bandwidth From 71024dabb189b4f8fd936ba57a32a8ef27939c6b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 13:02:55 -0400 Subject: [PATCH 060/134] Don't setScale after layout, just do setSteamScale because setScale will alter widths and heights --- web/skins/classic/views/js/montage.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/web/skins/classic/views/js/montage.js b/web/skins/classic/views/js/montage.js index 6fc5522f0..beb37a61c 100644 --- a/web/skins/classic/views/js/montage.js +++ b/web/skins/classic/views/js/montage.js @@ -1,3 +1,4 @@ +const monitors = new Array(); const VIEWING = 0; const EDITING = 1; @@ -65,14 +66,9 @@ function selectLayout(new_layout_id) { //$j('#height').val('auto'); } - var width = $j('#width').val(); - var height = $j('#height').val(); - var scale = $j('#scale').val(); - for (var i = 0, length = monitors.length; i < length; i++) { - var monitor = monitors[i]; - monitor.setScale(scale, width, height); + for (let i = 0, length = monitors.length; i < length; i++) { + monitors[i].setStreamScale(); } // end foreach monitor - console.log("Done selectLayout"); } // end function selectLayout(element) function changeHeight() { @@ -235,7 +231,6 @@ function handleClick(evt) { } } -const monitors = new Array(); function initPage() { $j("#hdrbutton").click(function() { $j("#flipMontageHeader").slideToggle("slow"); From f202e82b7890bd09a08f381686ad610f0a975709 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 13:04:50 -0400 Subject: [PATCH 061/134] Remove no longer used code to protect percentage widths --- web/js/MonitorStream.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/web/js/MonitorStream.js b/web/js/MonitorStream.js index 6578c89f8..c61c3e55d 100644 --- a/web/js/MonitorStream.js +++ b/web/js/MonitorStream.js @@ -130,10 +130,7 @@ function MonitorStream(monitorData) { width = Math.round(parseInt(this.width) * newscale / 100)+'px'; height = Math.round(parseInt(this.height) * newscale / 100)+'px'; } - if (width && (width != '0px') - // This next is for montage layouts where we use things like 33% - //&& ((monitor_frame[0].style.width===undefined) || (-1 == monitor_frame[0].style.width.search('%'))) - ) { + if (width && (width != '0px')) { monitor_frame.css('width', parseInt(width)); } if (height && height != '0px') img.style.height = height; From 7b39b3f7a664a872242e0be7f68c0d549a73947b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 17:58:56 -0400 Subject: [PATCH 062/134] Make checkCommandQueue it's own thread, meaning we use blocking I/O and will still respond when it takes forever to send a jpeg. Make warning about broken stream into a Debug. The signal doesn't set zm_terminate fast enough. --- src/zm_eventstream.cpp | 28 ++++++++++---------- src/zm_monitorstream.cpp | 36 +++++++++++++------------- src/zm_stream.cpp | 55 +++++++++++++++++++++------------------- src/zm_stream.h | 4 ++- 4 files changed, 63 insertions(+), 60 deletions(-) diff --git a/src/zm_eventstream.cpp b/src/zm_eventstream.cpp index 9dafae3cd..09dd2554c 100644 --- a/src/zm_eventstream.cpp +++ b/src/zm_eventstream.cpp @@ -842,25 +842,17 @@ void EventStream::runStream() { SystemTimePoint::duration last_frame_offset = Seconds(0); SystemTimePoint::duration time_to_event = Seconds(0); + std::thread command_processor; + if (connkey) { + command_processor = std::thread(&EventStream::checkCommandQueue, this); + } + while ( !zm_terminate ) { now = std::chrono::steady_clock::now(); Microseconds delta = Microseconds(0); send_frame = false; - if ( connkey ) { - // commands may set send_frame to true - while ( checkCommandQueue() && !zm_terminate ) { - // The idea is to loop here processing all commands before proceeding. - } - - // Update modified time of the socket .lock file so that we can tell which ones are stale. - if (now - last_comm_update > Hours(1)) { - touch(sock_path_lock); - last_comm_update = now; - } - } - // Get current frame data FrameData *frame_data = &event_data->frames[curr_frame_id-1]; @@ -1075,7 +1067,15 @@ void EventStream::runStream() { delete vid_stream; } - closeComms(); + if (connkey) { + if (command_processor.joinable()) { + Debug(1, "command_processor is joinable"); + command_processor.join(); + } else { + Debug(1, "command_processor is not joinable"); + } + command_processor.join(); + } } // end void EventStream::runStream() bool EventStream::send_file(const std::string &filepath) { diff --git a/src/zm_monitorstream.cpp b/src/zm_monitorstream.cpp index 9b6b4a0dd..0007fe292 100644 --- a/src/zm_monitorstream.cpp +++ b/src/zm_monitorstream.cpp @@ -429,7 +429,8 @@ bool MonitorStream::sendFrame(Image *image, SystemTimePoint timestamp) { ) { if (!zm_terminate) { // If the pipe was closed, we will get signalled SIGPIPE to exit, which will set zm_terminate - Warning("Unable to send stream frame: %s", strerror(errno)); + // ICON: zm_terminate might not get set yet. Make it a debug + Debug(1, "Unable to send stream frame: %s", strerror(errno)); } return false; } @@ -532,6 +533,12 @@ void MonitorStream::runStream() { } else { Debug(2, "Not using playback_buffer"); } // end if connkey && playback_buffer + + std::thread command_processor; + if (connkey) { + command_processor = std::thread(&MonitorStream::checkCommandQueue, this); + } + while (!zm_terminate) { if (feof(stdout)) { @@ -546,23 +553,6 @@ void MonitorStream::runStream() { monitor->setLastViewed(); bool was_paused = paused; - bool got_command = false; // commands like zoom should output a frame even if paused - if (connkey) { - while (checkCommandQueue() && !zm_terminate) { - Debug(2, "checking command Queue for connkey: %d", connkey); - // Loop in here until all commands are processed. - Debug(2, "Have checking command Queue for connkey: %d", connkey); - got_command = true; - } - if (zm_terminate) break; - // Update modified time of the socket .lock file so that we can tell which ones are stale. - if (now - last_comm_update > Hours(1)) { - touch(sock_path_lock); - last_comm_update = now; - } - } else { - Debug(1, "No connkey"); - } // end if connkey if (!checkInitialised()) { if (!loadMonitor(monitor_id)) { if (!sendTextFrame("Not connected")) { @@ -868,7 +858,15 @@ void MonitorStream::runStream() { if (zm_terminate) Debug(1, "zm_terminate"); - closeComms(); + if (connkey) { + if (command_processor.joinable()) { + Debug(1, "command_processor is joinable"); + command_processor.join(); + } else { + Debug(1, "command_processor is not joinable"); + } + command_processor.join(); + } } // end MonitorStream::runStream void MonitorStream::SingleImage(int scale) { diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index 7f6337a18..16f30795a 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -21,6 +21,8 @@ #include "zm_box.h" #include "zm_monitor.h" +#include "zm_signal.h" + #include #include #include @@ -108,34 +110,35 @@ void StreamBase::updateFrameRate(double fps) { } } // void StreamBase::updateFrameRate(double fps) -bool StreamBase::checkCommandQueue() { - if ( sd >= 0 ) { - CmdMsg msg; - memset(&msg, 0, sizeof(msg)); - int nbytes = recvfrom(sd, &msg, sizeof(msg), MSG_DONTWAIT, 0, 0); - if ( nbytes < 0 ) { - if ( errno != EAGAIN ) { - Error("recvfrom(), errno = %d, error = %s", errno, strerror(errno)); - return false; +void StreamBase::checkCommandQueue() { + while (!zm_terminate) { + // Update modified time of the socket .lock file so that we can tell which ones are stale. + if (now - last_comm_update > Hours(1)) { + touch(sock_path_lock); + last_comm_update = now; + } + + if (sd >= 0) { + CmdMsg msg; + memset(&msg, 0, sizeof(msg)); + int nbytes = recvfrom(sd, &msg, sizeof(msg), 0, /*MSG_DONTWAIT*/ 0, 0); + if (nbytes < 0) { + if (errno != EAGAIN) { + Error("recvfrom(), errno = %d, error = %s", errno, strerror(errno)); + } + } else { + Debug(2, "Message length is (%d)", nbytes); + processCommand(&msg); + got_command = true; } + } else if (connkey) { + Warning("No sd in checkCommandQueue, comms not open for connkey %06d?", connkey); + } else { + // Perfectly valid if only getting a snapshot + Debug(1, "No sd in checkCommandQueue, comms not open."); } - //else if ( (nbytes != sizeof(msg)) ) - //{ - //Error( "Partial message received, expected %d bytes, got %d", sizeof(msg), nbytes ); - //} - else { - Debug(2, "Message length is (%d)", nbytes); - processCommand(&msg); - return true; - } - } else if ( connkey ) { - Warning("No sd in checkCommandQueue, comms not open for connkey %06d?", connkey); - } else { - // Perfectly valid if only getting a snapshot - Debug(1, "No sd in checkCommandQueue, comms not open."); - } - return false; -} // end bool StreamBase::checkCommandQueue() + } // end while !zm_terminate +} // end void StreamBase::checkCommandQueue() Image *StreamBase::prepareImage(Image *image) { /* zooming should happen before scaling to preserve quality diff --git a/src/zm_stream.h b/src/zm_stream.h index fd5a27a3e..d46e89893 100644 --- a/src/zm_stream.h +++ b/src/zm_stream.h @@ -146,6 +146,7 @@ protected: VideoStream *vid_stream; CmdMsg msg; + bool got_command = false; // commands like zoom should output a frame even if paused unsigned char *temp_img_buffer; // Used when encoding or sending file data size_t temp_img_buffer_size; @@ -155,7 +156,7 @@ protected: bool checkInitialised(); void updateFrameRate(double fps); Image *prepareImage(Image *image); - bool checkCommandQueue(); + void checkCommandQueue(); virtual void processCommand(const CmdMsg *msg)=0; public: @@ -189,6 +190,7 @@ public: frame_count(0), last_frame_count(0), frame_mod(1), + got_command(false), temp_img_buffer(nullptr), temp_img_buffer_size(0) { From b17ce950a9824e20f82fc600bec6c0d2beed3005 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 17:59:17 -0400 Subject: [PATCH 063/134] Quote and spacing --- web/ajax/stream.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/ajax/stream.php b/web/ajax/stream.php index 492d8d8bd..3fc91c7c8 100644 --- a/web/ajax/stream.php +++ b/web/ajax/stream.php @@ -19,14 +19,14 @@ $semaphore_tries = 10; $have_semaphore = false; while ($semaphore_tries) { - if ( version_compare( phpversion(), '5.6.1', '<') ) { + if (version_compare( phpversion(), '5.6.1', '<')) { # don't have support for non-blocking $have_semaphore = sem_acquire($semaphore); } else { $have_semaphore = sem_acquire($semaphore, 1); } if ($have_semaphore !== false) break; - ZM\Debug("Failed to get semaphore, trying again"); + ZM\Debug('Failed to get semaphore, trying again'); usleep(100000); $semaphore_tries -= 1; } @@ -114,7 +114,7 @@ if ($have_semaphore !== false) { } else if ( $numSockets < 0 ) { ajaxError("Socket closed $remSockFile"); } else if ( $numSockets == 0 ) { - ZM\Error("Timed out waiting for msg $remSockFile"); + ZM\Error("Timed out waiting for msg $remSockFile after waiting $timeout seconds"); socket_set_nonblock($socket); #ajaxError("Timed out waiting for msg $remSockFile"); } else if ( $numSockets > 0 ) { @@ -123,7 +123,7 @@ if ($have_semaphore !== false) { } } - switch( $nbytes = @socket_recvfrom($socket, $msg, MSG_DATA_SIZE, 0, $remSockFile) ) { + switch ($nbytes = @socket_recvfrom($socket, $msg, MSG_DATA_SIZE, 0, $remSockFile)) { case -1 : ajaxError("socket_recvfrom( $remSockFile ) failed: ".socket_strerror(socket_last_error())); break; @@ -180,7 +180,7 @@ if ($have_semaphore !== false) { } sem_release($semaphore); } else { - ajaxError("Unable to get semaphore."); + ajaxError('Unable to get semaphore.'); } ajaxError('Unrecognised action or insufficient permissions in ajax/stream'); From 394e518722700614ed8cee27fae92231c06ac2a7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 15 Aug 2022 17:59:25 -0400 Subject: [PATCH 064/134] Remove debug --- web/includes/functions.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 165c8f2c3..03a2727d8 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -720,7 +720,6 @@ function canStreamIframe() { } function canStreamNative() { - ZM\Debug("ZM_WEB_CAN_STREAM:".ZM_WEB_CAN_STREAM.' isInternetExplorer: ' . isInternetExplorer() . ' isOldChrome:' . isOldChrome()); // Old versions of Chrome can display the stream, but then it blocks everything else (Chrome bug 5876) return ( ZM_WEB_CAN_STREAM == 'yes' || ( ZM_WEB_CAN_STREAM == 'auto' && (!isInternetExplorer() && !isOldChrome()) ) ); } From 087be403374134824e56931d4aeb9bafcd7faade Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 13:19:29 -0400 Subject: [PATCH 065/134] Split out realm detection and use it in sendCmdPost. Our initial query on / doesn't fail as the camera doesn't require authorization for /. --- .../lib/ZoneMinder/Control/Trendnet.pm | 123 ++++++++++-------- 1 file changed, 70 insertions(+), 53 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm index b1ba74a39..fa51eced5 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/Trendnet.pm @@ -26,6 +26,7 @@ our $ADDRESS = ''; use ZoneMinder::Logger qw(:all); use ZoneMinder::Config qw(:all); use URI; +use LWP::UserAgent; sub credentials { my $self = shift; @@ -65,64 +66,73 @@ sub open { $ADDRESS .= ':80'; } - use LWP::UserAgent; $self->{ua} = LWP::UserAgent->new; $self->{ua}->agent('ZoneMinder Control Agent/'.ZoneMinder::Base::ZM_VERSION); $self->{state} = 'closed'; # credentials: ("ip:port" (no prefix!), realm (string), username (string), password (string) - Debug ( "sendCmd credentials control address:'".$ADDRESS + Debug("sendCmd credentials control address:'".$ADDRESS ."' realm:'" . $REALM . "' username:'" . $USERNAME . "' password:'".$PASSWORD ."'" ); - $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); # Detect REALM - my $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/'); - - if ( $res->is_success ) { - $self->{state} = 'open'; + $REALM = $self->detect_realm($PROTOCOL, $ADDRESS, $REALM, $USERNAME, $PASSWORD, '/'); + if (defined($REALM)) { return !undef; } - - if ( $res->status_line() eq '401 Unauthorized' ) { - - my $headers = $res->headers(); - foreach my $k ( keys %$headers ) { - Debug("Initial Header $k => $$headers{$k}"); - } - - if ( $$headers{'www-authenticate'} ) { - my ( $auth, $tokens ) = $$headers{'www-authenticate'} =~ /^(\w+)\s+(.*)$/; - if ( $tokens =~ /\w+="([^"]+)"/i ) { - if ( $REALM ne $1 ) { - $REALM = $1; - Debug("Changing REALM to $REALM"); - $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); - $res = $self->{ua}->get($PROTOCOL.$ADDRESS.'/'); - if ( $res->is_success() ) { - $self->{state} = 'open'; - return !undef; - } - Error('Authentication still failed after updating REALM' . $res->status_line); - $headers = $res->headers(); - foreach my $k ( keys %$headers ) { - Debug("Initial Header $k => $$headers{$k}"); - } # end foreach - } else { - Error('Authentication failed, not a REALM problem'); - } - } else { - Error('Failed to match realm in tokens'); - } # end if - } else { - Debug('No headers line'); - } # end if headers - } # end if $res->status_line() eq '401 Unauthorized' return undef; } # end sub open +sub detect_realm { + my ($self, $protocol, $address, $realm, $username, $password, $url) = @_; + + $self->{ua}->credentials($address, $realm, $username, $password); + my $res = $self->{ua}->get($protocol.$address.$url); + + if ($res->is_success) { + Debug(1, 'Success opening without realm detection for '.$url); + return $realm; + } + + if ($res->status_line() ne '401 Unauthorized') { + return $realm; + } + + my $headers = $res->headers(); + foreach my $k ( keys %$headers ) { + Debug("Initial Header $k => $$headers{$k}"); + } + + if ($$headers{'www-authenticate'}) { + my ( $auth, $tokens ) = $$headers{'www-authenticate'} =~ /^(\w+)\s+(.*)$/; + if ( $tokens =~ /\w+="([^"]+)"/i ) { + if ($realm ne $1) { + $realm = $1; + Debug("Changing REALM to $realm"); + $self->{ua}->credentials($address, $realm, $username, $password); + $res = $self->{ua}->get($protocol.$address.$url); + if ($res->is_success()) { + return $realm; + } + Error('Authentication still failed after updating REALM' . $res->status_line); + $headers = $res->headers(); + foreach my $k ( keys %$headers ) { + Debug("Initial Header $k => $$headers{$k}"); + } # end foreach + } else { + Error('Authentication failed, not a REALM problem'); + } + } else { + Error('Failed to match realm in tokens'); + } # end if + } else { + Debug('No headers line'); + } # end if headers + return undef; +} + sub sendCmd { # This routine is used for all moving, which are all GET commands... my $self = shift; @@ -158,17 +168,14 @@ sub sendCmdPost { my $url = shift; my $form = shift; - my $result = undef; - - if ( $url eq undef ) { + if ($url eq undef) { Error('url passed to sendCmdPost is undefined.'); return -1; } - #Debug('sendCmdPost url: ' . $url . ' cmd: ' . $cmd); + Debug('sendCmdPost url: ' . $PROTOCOL.$ADDRESS.$url); - my $res; - $res = $self->{ua}->post( + my $res = $self->{ua}->post( $PROTOCOL.$ADDRESS.$url, Referer=>$PROTOCOL.$ADDRESS.$url, Content=>$form @@ -176,13 +183,19 @@ sub sendCmdPost { Debug("sendCmdPost credentials control to: $PROTOCOL$ADDRESS$url realm:'" . $REALM . "' username:'" . $USERNAME . "' password:'".$PASSWORD."'"); - if ( $res->is_success ) { - Debug($res->content); - return !undef; + if (!$res->is_success) { + Error("sendCmdPost Error check failed: '".$res->status_line()."' cmd:"); + my $new_realm = $self->detect_realm($PROTOCOL, $ADDRESS, $REALM, $USERNAME, $PASSWORD, $url); + if (defined($new_realm) and ($new_realm ne $REALM)) { + Debug("Success after re-detecting realm. New realm is $new_realm"); + return !undef; + } + Warning('Failed to reboot'); + return undef; } - Error("sendCmdPost Error check failed: '".$res->status_line()."' cmd:"); + Debug($res->content); - return $result; + return !undef; } # end sub sendCmdPost sub move { @@ -399,6 +412,10 @@ sub reset { sub reboot { my $self = shift; Debug('Camera Reboot'); + if (!$$self{open}) { + Warning("Not open. opening. Should call ->open() before calling reboot()"); + return if !$self->open(); + } $self->sendCmdPost('/eng/admin/reboot.cgi', { reboot => 'true' }); #$referer = 'http://'.$HI->ip().'/eng/admin/tools_default.cgi'; #$initial_url = $HI->ip().'/eng/admin/tools_default.cgi'; From 788bb603e12e89b4d2c4583610d550f417dd4419 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 15:15:01 -0400 Subject: [PATCH 066/134] Fix crash due to deplicated join. Don't output BOUNDARY unless image loading suceeds --- src/zm_eventstream.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/zm_eventstream.cpp b/src/zm_eventstream.cpp index 09dd2554c..d3076c170 100644 --- a/src/zm_eventstream.cpp +++ b/src/zm_eventstream.cpp @@ -717,9 +717,8 @@ bool EventStream::sendFrame(Microseconds delta_us) { } else { bool send_raw = (type == STREAM_JPEG) && ((scale >= ZM_SCALE_BASE) && (zoom == ZM_SCALE_BASE)) && !filepath.empty(); - fprintf(stdout, "--" BOUNDARY "\r\n"); - if (send_raw) { + fprintf(stdout, "--" BOUNDARY "\r\n"); if (!send_file(filepath)) { Error("Can't send %s: %s", filepath.c_str(), strerror(errno)); return false; @@ -784,6 +783,7 @@ bool EventStream::sendFrame(Microseconds delta_us) { int img_buffer_size = 0; uint8_t *img_buffer = temp_img_buffer; + fprintf(stdout, "--" BOUNDARY "\r\n"); switch ( type ) { case STREAM_JPEG : send_image->EncodeJpeg(img_buffer, &img_buffer_size); @@ -1074,7 +1074,6 @@ void EventStream::runStream() { } else { Debug(1, "command_processor is not joinable"); } - command_processor.join(); } } // end void EventStream::runStream() From 03707ed88e64d8fcedbc3b4840ea74309c694f85 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 15:16:22 -0400 Subject: [PATCH 067/134] Handle case where time_base is not set in the codec. Fixes h265 not playing right. Don't eek until a significant difference in time. Lots more debug output. Pass codec when initialising codec context. Mostly this fixes playback of h265 --- src/zm_ffmpeg_input.cpp | 90 ++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/src/zm_ffmpeg_input.cpp b/src/zm_ffmpeg_input.cpp index ab2429adb..314f45ecf 100644 --- a/src/zm_ffmpeg_input.cpp +++ b/src/zm_ffmpeg_input.cpp @@ -13,7 +13,7 @@ FFmpeg_Input::FFmpeg_Input() { } FFmpeg_Input::~FFmpeg_Input() { - if ( input_format_context ) { + if (input_format_context) { Close(); } } // end ~FFmpeg_Input() @@ -26,9 +26,9 @@ int FFmpeg_Input::Open( const AVStream * audio_in_stream, const AVCodecContext * audio_in_ctx ) { - int max_stream_index = video_stream_id = video_in_stream->index; + int max_stream_index = video_stream_id = video_in_stream->index; - if ( audio_in_stream ) { + if (audio_in_stream) { max_stream_index = video_in_stream->index > audio_in_stream->index ? video_in_stream->index : audio_in_stream->index; audio_stream_id = audio_in_stream->index; } @@ -61,17 +61,17 @@ int FFmpeg_Input::Open(const char *filepath) { streams = new stream[input_format_context->nb_streams]; Debug(2, "Have %d streams", input_format_context->nb_streams); - for ( unsigned int i = 0; i < input_format_context->nb_streams; i += 1 ) { - if ( is_video_stream(input_format_context->streams[i]) ) { + for (unsigned int i = 0; i < input_format_context->nb_streams; i += 1) { + if (is_video_stream(input_format_context->streams[i])) { zm_dump_stream_format(input_format_context, i, 0, 0); - if ( video_stream_id == -1 ) { + if (video_stream_id == -1) { video_stream_id = i; // if we break, then we won't find the audio stream } else { Warning("Have another video stream."); } - } else if ( is_audio_stream(input_format_context->streams[i]) ) { - if ( audio_stream_id == -1 ) { + } else if (is_audio_stream(input_format_context->streams[i])) { + if (audio_stream_id == -1) { Debug(2, "Audio stream is %d", i); audio_stream_id = i; } else { @@ -82,10 +82,8 @@ int FFmpeg_Input::Open(const char *filepath) { } streams[i].frame_count = 0; - streams[i].context = avcodec_alloc_context3(nullptr); - avcodec_parameters_to_context(streams[i].context, input_format_context->streams[i]->codecpar); - if ( !(streams[i].codec = avcodec_find_decoder(streams[i].context->codec_id)) ) { + if (!(streams[i].codec = avcodec_find_decoder(input_format_context->streams[i]->codecpar->codec_id))) { Error("Could not find input codec"); avformat_close_input(&input_format_context); return AVERROR_EXIT; @@ -93,8 +91,15 @@ int FFmpeg_Input::Open(const char *filepath) { Debug(1, "Using codec (%s) for stream %d", streams[i].codec->name, i); } + Debug(1, "Allocating"); + streams[i].context = avcodec_alloc_context3(streams[i].codec); + Debug(1, "Parameters"); + avcodec_parameters_to_context(streams[i].context, input_format_context->streams[i]->codecpar); + Debug(1, "Dumping codec"); + zm_dump_codec(streams[i].context); + error = avcodec_open2(streams[i].context, streams[i].codec, nullptr); - if ( error < 0 ) { + if (error < 0) { Error("Could not open input codec (error '%s')", av_make_error_string(error).c_str()); avcodec_free_context(&streams[i].context); @@ -102,19 +107,25 @@ int FFmpeg_Input::Open(const char *filepath) { input_format_context = nullptr; return error; } + zm_dump_codec(streams[i].context); + if (!(streams[i].context->time_base.num && streams[i].context->time_base.den)) { + Warning("Setting to default time base"); + streams[i].context->time_base.num = 1; + streams[i].context->time_base.den = 90000; + } } // end foreach stream - if ( video_stream_id == -1 ) + if (video_stream_id == -1) Debug(1, "Unable to locate video stream in %s", filepath); - if ( audio_stream_id == -1 ) + if (audio_stream_id == -1) Debug(3, "Unable to locate audio stream in %s", filepath); return 1; } // end int FFmpeg_Input::Open( const char * filepath ) int FFmpeg_Input::Close( ) { - if ( streams ) { - for ( unsigned int i = 0; i < input_format_context->nb_streams; i += 1 ) { + if (streams) { + for (unsigned int i = 0; i < input_format_context->nb_streams; i += 1) { avcodec_close(streams[i].context); avcodec_free_context(&streams[i].context); streams[i].context = nullptr; @@ -123,7 +134,7 @@ int FFmpeg_Input::Close( ) { streams = nullptr; } - if ( input_format_context ) { + if (input_format_context) { avformat_close_input(&input_format_context); input_format_context = nullptr; } @@ -131,7 +142,7 @@ int FFmpeg_Input::Close( ) { } // end int FFmpeg_Input::Close() AVFrame *FFmpeg_Input::get_frame(int stream_id) { - int frameComplete = false; + bool frameComplete = false; av_packet_ptr packet{av_packet_alloc()}; if (!packet) { @@ -139,9 +150,9 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) { return nullptr; } - while ( !frameComplete ) { + while (!frameComplete) { int ret = av_read_frame(input_format_context, packet.get()); - if ( ret < 0 ) { + if (ret < 0) { if ( // Check if EOF. (ret == AVERROR_EOF || (input_format_context->pb && input_format_context->pb->eof_reached)) || @@ -159,7 +170,7 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) { av_packet_guard pkt_guard{packet}; - if ( (stream_id >= 0) && (packet->stream_index != stream_id) ) { + if ((stream_id >= 0) && (packet->stream_index != stream_id)) { Debug(1,"Packet is not for our stream (%d)", packet->stream_index ); continue; } @@ -178,22 +189,36 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) { frame = nullptr; continue; } else { - if ( is_video_stream(input_format_context->streams[packet->stream_index]) ) { + if (is_video_stream(input_format_context->streams[packet->stream_index])) { zm_dump_video_frame(frame.get(), "resulting video frame"); } else { zm_dump_frame(frame.get(), "resulting frame"); } } - frameComplete = 1; + frameComplete = true; + if (context->time_base.num && context->time_base.den) { // Convert timestamps to stream timebase instead of codec timebase frame->pts = av_rescale_q(frame->pts, context->time_base, input_format_context->streams[stream_id]->time_base ); + } else { + Warning("No timebase set in context!"); + } + if (is_video_stream(input_format_context->streams[packet->stream_index])) { + zm_dump_video_frame(frame.get(), "resulting video frame"); + } else { + zm_dump_frame(frame.get(), "resulting frame"); + } } // end while !frameComplete + if (is_video_stream(input_format_context->streams[packet->stream_index])) { + zm_dump_video_frame(frame.get(), "resulting video frame"); + } else { + zm_dump_frame(frame.get(), "resulting frame"); + } return frame.get(); } // end AVFrame *FFmpeg_Input::get_frame @@ -252,7 +277,8 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id, double at) { last_seek_request = seek_target; - if (frame->pts + frame->pkt_duration < seek_target) { + // Normally it is likely just the next packet. Need a heuristic for seeking, something like duration * keyframe interval + if (frame->pts + 10*frame->pkt_duration < seek_target) { Debug(1, "Jumping ahead"); if (( ret = av_seek_frame(input_format_context, stream_id, seek_target, AVSEEK_FLAG_FRAME @@ -264,14 +290,14 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id, double at) { get_frame(stream_id); } // Seeking seems to typically seek to a keyframe, so then we have to decode until we get the frame we want. - if ( frame->pts <= seek_target ) { - if ( is_video_stream(input_format_context->streams[stream_id]) ) { - zm_dump_video_frame(frame, "pts <= seek_target"); - } else { - zm_dump_frame(frame, "pts <= seek_target"); - } - while ( frame && (frame->pts < seek_target) ) { - if ( !get_frame(stream_id) ) { + if (frame->pts <= seek_target) { + while (frame && (frame->pts + frame->pkt_duration < seek_target)) { + if (is_video_stream(input_format_context->streams[stream_id])) { + zm_dump_video_frame(frame, "pts <= seek_target"); + } else { + zm_dump_frame(frame, "pts <= seek_target"); + } + if (!get_frame(stream_id)) { Warning("Got no frame. returning nothing"); return frame.get(); } From c0da19e8ed7d4201fee0ec7b2a7405d3718a375a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 15:16:37 -0400 Subject: [PATCH 068/134] Fix crash due to deplicated join. --- src/zm_monitorstream.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/zm_monitorstream.cpp b/src/zm_monitorstream.cpp index 0007fe292..f8e7de132 100644 --- a/src/zm_monitorstream.cpp +++ b/src/zm_monitorstream.cpp @@ -865,7 +865,6 @@ void MonitorStream::runStream() { } else { Debug(1, "command_processor is not joinable"); } - command_processor.join(); } } // end MonitorStream::runStream From d6ed2f65a10e063d8ca5d95dc268539a0aeae034 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 16:32:33 -0400 Subject: [PATCH 069/134] Don't update notes from this frame on continuous recording. Fixes #3550 --- src/zm_monitor.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index d9f6dd35d..9202d2fcc 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -2132,11 +2132,12 @@ bool Monitor::Analyse() { shared_data->state = state = ((shared_data->recording == RECORDING_ALWAYS) ? IDLE : TAPE); } else { Debug(1, - "State %d %s because analysis_image_count(%d)-last_alarm_count(%d) > post_event_count(%d) and timestamp.tv_sec(%" PRIi64 ") - recording.tv_src(%" PRIi64 ") >= min_section_length(%" PRIi64 ")", + "State %d %s because analysis_image_count(%d)-last_alarm_count(%d) = %d > post_event_count(%d) and timestamp.tv_sec(%" PRIi64 ") - recording.tv_src(%" PRIi64 ") >= min_section_length(%" PRIi64 ")", state, State_Strings[state].c_str(), analysis_image_count, last_alarm_count, + analysis_image_count - last_alarm_count, post_event_count, static_cast(std::chrono::duration_cast(snap->timestamp.time_since_epoch()).count()), static_cast(std::chrono::duration_cast(GetVideoWriterStartTime().time_since_epoch()).count()), @@ -2155,8 +2156,6 @@ bool Monitor::Analyse() { Event::AddPreAlarmFrame(snap->image, snap->timestamp, score, nullptr); } else if (state == ALARM) { if (event) { - if (noteSetMap.size() > 0) - event->updateNotes(noteSetMap); if (section_length >= Seconds(min_section_length) && (event->Duration() >= section_length)) { Warning("%s: %03d - event %" PRIu64 ", has exceeded desired section length. %" PRIi64 " - %" PRIi64 " = %" PRIi64 " >= %" PRIi64, name.c_str(), analysis_image_count, event->Id(), @@ -2166,6 +2165,8 @@ bool Monitor::Analyse() { static_cast(Seconds(section_length).count())); closeEvent(); event = openEvent(snap, cause, noteSetMap); + } else if (noteSetMap.size() > 0) { + event->updateNotes(noteSetMap); } } else if (shared_data->recording != RECORDING_NONE) { event = openEvent(snap, cause, noteSetMap); From fe2452f4c928d7633ea07a2bd77c5941cb95c4e2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 16 Aug 2022 16:37:45 -0400 Subject: [PATCH 070/134] Add SetVideoWriterStartTime(starting_packet->timestamp);. We use shared->data->recording.tv_sec etc... but since we don't set it, it is always 0. --- src/zm_monitor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 9202d2fcc..b4da839dd 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -2805,6 +2805,7 @@ Event * Monitor::openEvent( event = new Event(this, starting_packet->timestamp, cause, noteSetMap); shared_data->last_event_id = event->Id(); + SetVideoWriterStartTime(starting_packet->timestamp); strncpy(shared_data->alarm_cause, cause.c_str(), sizeof(shared_data->alarm_cause)-1); if (!event_start_command.empty()) { From 9e2d31c574cf13290ba1d839313942e9a7217990 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 14:58:18 -0400 Subject: [PATCH 071/134] Test for success loading Control --- scripts/zmwatch.pl.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/zmwatch.pl.in b/scripts/zmwatch.pl.in index 5bba0e33c..aae549b23 100644 --- a/scripts/zmwatch.pl.in +++ b/scripts/zmwatch.pl.in @@ -129,7 +129,7 @@ while (!$zm_terminate) { if (($now - $startup_time) > $Config{ZM_WATCH_MAX_DELAY}) { if ($monitor->ControlId()) { my $control = $monitor->Control(); - if ($control->CanReboot() and $control->open()) { + if ($control and $control->CanReboot() and $control->open()) { $control->reboot(); } } From ef82d1c9a14a75ed1376e3e2601e992582bfceed Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 14:59:02 -0400 Subject: [PATCH 072/134] Add a Control file for Grandstream cameras --- .../lib/ZoneMinder/Control/Grandstream.pm | 281 ++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 scripts/ZoneMinder/lib/ZoneMinder/Control/Grandstream.pm diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/Grandstream.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/Grandstream.pm new file mode 100644 index 000000000..a59c1ab09 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/Grandstream.pm @@ -0,0 +1,281 @@ +# ========================================================================== +# +# ZoneMinder GrandSteam Control Protocol Module +# Copyright (C) 2021 ZoneMinder Inc +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# ========================================================================== +# +# This module contains the implementation of the Vivotek ePTZ camera control +# protocol +# +package ZoneMinder::Control::Grandstream; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Control; + +our @ISA = qw(ZoneMinder::Control); + +# ========================================================================== +# +# Vivotek ePTZ Control Protocol +# +# ========================================================================== + +use ZoneMinder::Logger qw(:all); +use ZoneMinder::Config qw(:all); +use ZoneMinder::General qw(:all); + +use Time::HiRes qw( usleep ); +use URI::Encode qw(uri_encode); +use XML::LibXML; +use Digest::MD5 qw(md5 md5_hex md5_base64); + + +our $REALM = ''; +our $PROTOCOL = 'https://'; +our $USERNAME = 'admin'; +our $PASSWORD = ''; +our $ADDRESS = ''; +our $BASE_URL = ''; + +my %config_types = ( + upgrade => { + P6767 => { default_value=>1, desc=>'Firmware Upgrade Method http' }, + P192 => { desc=>'Firmware Server Path' }, + }, + date => { + P64 => { desc=>'Timezone' }, + P5006 => { default_value=>1, desc=>'Enable NTP' }, + P30 => { desc=>'NTP Server', }, + }, + access => { + P12053 => {default_value=>1, desc=>'Enable UPnP Search' }, + }, + cmos => { + #P12314=> { value=>0, desc=>'Power Frequency' }, + }, + video => { + #P12306 => { value=>'26', desc=>'primary codec' },# 26: h264, 96: mjpeg, 98: h265 + P12313 => { desc=>'primary profile' },# 0: baseline, 1: main, 2: high + P12307 => { desc=>'primary resolution' }, # 1025: 1920x1080 1023: 1280x960, 1022: 1280x720 + P12904 => { desc=>'primary fps', }, # fps 5,10,15,20,25,30 + P12311 => { desc=>'Image quality', }, # 0 very high, 4 very low + P12312 => { desc=>'Iframe interval', }, # i-frame interval 5-100 + }, + osd => { + P10044 => { default_value=> 1, desc=>'Display Time' }, + #P10045 => { value=> 1, desc=>'Display Text' }, + P10001 => { default_value=> 1, desc=>'OSD Date Format' }, + #P10040 => { value=>'', desc=> 'OSD Text' }, + }, + audio => { + P14000 => { default_value=>1, desc=>'Audio codec' }, # 1,2 + P14003 => { default_value=>0, desc=>'Audio out volume' }, # 0-6 + P14002 => { default_value=>0, desc=>'Audio in volume' }, # 0-6 + }, + debug => { + P8042 => { default_value=>0, desc=>'Debug log protocol' }, # 0: UDP 1: SSL/TLS + P207 => { desc=>'Debug Log Server' }, + P208 => { desc=>'Debug Log Level' }, + }, + ); + +sub open { + my $self = shift; + $self->loadMonitor(); + + if ($self->{Monitor}{ControlAddress} + and + $self->{Monitor}{ControlAddress} ne 'user:pass@ip' + and + $self->{Monitor}{ControlAddress} ne 'user:port@ip' + ) { + Debug("Getting connection details from Path " . $self->{Monitor}->{ControlAddress}); + if (($self->{Monitor}->{ControlAddress} =~ /^(?https?:\/\/)?(?[^:@]+)?:?(?[^\/@]+)?@?(?
.*)$/)) { + $PROTOCOL = $+{PROTOCOL} if $+{PROTOCOL}; + $USERNAME = $+{USERNAME} if $+{USERNAME}; + $PASSWORD = $+{PASSWORD} if $+{PASSWORD}; + $ADDRESS = $+{ADDRESS} if $+{ADDRESS}; + } + } elsif ($self->{Monitor}->{Path}) { + Debug("Getting connection details from Path " . $self->{Monitor}->{Path}); + if (($self->{Monitor}->{Path} =~ /^(?(https?|rtsp):\/\/)?(?[^:@]+)?:?(?[^\/@]+)?@?(?
[^:\/]+)/)) { + $USERNAME = $+{USERNAME} if $+{USERNAME}; + $PASSWORD = $+{PASSWORD} if $+{PASSWORD}; + $ADDRESS = $+{ADDRESS} if $+{ADDRESS}; + } + Debug("username:$USERNAME password:$PASSWORD address:$ADDRESS"); + } else { + Error('Failed to parse auth from address ' . $self->{Monitor}->{ControlAddress}); + $ADDRESS = $self->{Monitor}->{ControlAddress}; + } + $BASE_URL = $PROTOCOL.$ADDRESS; + + use LWP::UserAgent; + $self->{ua} = LWP::UserAgent->new; + $self->{ua}->agent('ZoneMinder Control Agent/'.ZoneMinder::Base::ZM_VERSION); + $self->{ua}->ssl_opts(verify_hostname => 0, SSL_verify_mode => 0x00); + $self->{ua}->cookie_jar( {} ); + + + my $rescode = ''; + my $url = $BASE_URL.'/goform/login?cmd=login&type=0&user='.$USERNAME; + my $response = $self->get($url); + if ($response->is_success()) { + my $dom = XML::LibXML->load_xml(string => $response->content); + my $challengeString = $dom->getElementsByTagName('ChallengeCode')->string_value(); + Debug('challengstring: '.$challengeString); + my $authcode = md5_hex($challengeString.':GSC36XXlZpRsFzCbM:'.$PASSWORD); + $url .= '&authcode='.$authcode; + $response = $self->get($url); + $dom = XML::LibXML->load_xml(string => $response->content); + $rescode = $dom->getElementsByTagName('ResCode'); + } else { + Warning("Falling back to old style"); + $PROTOCOL = 'http://'; + $BASE_URL = $PROTOCOL.$USERNAME.':'.$PASSWORD.'@'.$ADDRESS; + } + + $self->{state} = 'open'; +} + +sub get { + my $self = shift; + my $url = shift; + Debug("Getting $url"); + my $response = $self->{ua}->get($url); + Debug('Response: '. $response->status_line . ' ' . $response->content); + return $response; +} + +sub close { + my $self = shift; + $self->{state} = 'closed'; +} + +sub sendCmd { + my ($self, $cmd, $speedcmd) = @_; + + $self->printMsg( $speedcmd, 'Tx' ); + $self->printMsg( $cmd, 'Tx' ); + + my $req = HTTP::Request->new( GET => $BASE_URL."/cgi-bin/camctrl/eCamCtrl.cgi?stream=0&$speedcmd&$cmd"); + my $res = $self->{ua}->request($req); + + if (!$res->is_success) { + Error('Request failed: '.$res->status_line().' (URI: '.$req->as_string().')'); + } + return $res->is_success; +} + +sub get_config { + my $self = shift; + + my %config; + foreach my $category ( @_ ? @_ : keys %config_types ) { + my $response = $self->get($BASE_URL.'/goform/config?cmd=get&type='.$category); + my $dom = XML::LibXML->load_xml(string => $response->content); + if (!$dom) { + Error("No document from :".$response->content()); + return; + } + Debug($dom->toString(1)); + $config{$category} = {}; + my $Configuration = $dom->getElementsByTagName('Configuration'); + my $xml = $Configuration->get_node(0); + if (!$xml) { + Warning("UNable to get Configuration node from ".$response->content()); + return \%config; + } + foreach my $node ($xml->childNodes()) { + $config{$category}{$node->nodeName} = { + value=>$node->textContent + }; + } + } # end foreach category + return \%config; +} # end sub get_config + +sub set_config { + my $self = shift; + my $updates = shift; + + my $url = join('&', $BASE_URL.'/goform/config?cmd=set', + map { $_.'='.uri_encode(uri_encode($$updates{$_}{value}, { encode_reserved=>1} )) } keys %$updates ); + my $response = $self->get($url); + return 0 if !$response->is_success(); + return 0 if ($response->content !~ /Successful/i); + return 1; +} + +sub reboot { + my $self = shift; + $self->get($BASE_URL.'/goform/config?cmd=reboot'); +} + +sub ping { + return -1 if ! $ADDRESS; + + require Net::Ping; + + my $p = Net::Ping->new(); + my $rv = $p->ping($ADDRESS); + $p->close(); + return $rv; +} + +1; +__END__ + +=head1 NAME + +ZoneMinder::Control::Grandstream - ZoneMinder Perl extension for Grandstream +camera control protocol + +=head1 SYNOPSIS + + use ZoneMinder::Control::Grandstream; + +=head1 DESCRIPTION + +This module implements the protocol used in various Grandstream IP cameras. + +=head2 EXPORT + +None. + +=head1 SEE ALSO + +I would say, see ZoneMinder::Control documentation. But it is a stub. + +=head1 AUTHOR + +Isaac Connor Eisaac@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2021 by ZoneMinder Inc + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + +=cut From a0008a6a6c725b925eed67db93dfd8d7e8db4d86 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 15:00:01 -0400 Subject: [PATCH 073/134] Set auto_relay as well as auth_hash. getNavBar uses it --- web/ajax/stream.php | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/web/ajax/stream.php b/web/ajax/stream.php index 3fc91c7c8..059f390c7 100644 --- a/web/ajax/stream.php +++ b/web/ajax/stream.php @@ -38,7 +38,7 @@ if ($have_semaphore !== false) { $localSocketFile = ZM_PATH_SOCKS.'/zms-'.sprintf('%06d',$_REQUEST['connkey']).'w.sock'; if ( file_exists($localSocketFile) ) { ZM\Warning("sock file $localSocketFile already exists?! Is someone else talking to zms?"); - // They could be. We can maybe have concurrent requests from a browser. + // They could be. We can maybe have concurrent requests from a browser. } if ( !socket_bind($socket, $localSocketFile) ) { ajaxError("socket_bind( $localSocketFile ) failed: ".socket_strerror(socket_last_error())); @@ -85,8 +85,8 @@ if ($have_semaphore !== false) { $max_socket_tries = 1000; // FIXME This should not exceed web_ajax_timeout while ( !file_exists($remSockFile) && $max_socket_tries-- ) { - //sometimes we are too fast for our own good, if it hasn't been setup yet give it a second. - // WHY? We will just send another one... + //sometimes we are too fast for our own good, if it hasn't been setup yet give it a second. + // WHY? We will just send another one... // ANSWER: Because otherwise we get a log of errors logged //ZM\Debug("$remSockFile does not exist, waiting, current " . (time() - $start_time) . ' seconds' ); @@ -146,14 +146,17 @@ if ($have_semaphore !== false) { $data['rate'] /= RATE_BASE; $data['delay'] = round( $data['delay'], 2 ); $data['zoom'] = round( $data['zoom']/SCALE_BASE, 1 ); - if (ZM_OPT_USE_AUTH && (ZM_AUTH_RELAY == 'hashed')) { - $auth_hash = generateAuthHash(ZM_AUTH_HASH_IPS); - if (isset($_REQUEST['auth']) and ($_REQUEST['auth'] != $auth_hash)) { - $data['auth'] = $auth_hash; - ZM\Debug('including new auth hash '.$data['auth'].'because doesnt match request auth hash '.$_REQUEST['auth']); - } else { - ZM\Debug('Not including new auth hash becase it hasn\'t changed '.$auth_hash); - } + if (ZM_OPT_USE_AUTH) { + if (ZM_AUTH_RELAY == 'hashed') { + $auth_hash = generateAuthHash(ZM_AUTH_HASH_IPS); + if (isset($_REQUEST['auth']) and ($_REQUEST['auth'] != $auth_hash)) { + $data['auth'] = $auth_hash; + ZM\Debug('including new auth hash '.$data['auth'].'because doesnt match request auth hash '.$_REQUEST['auth']); + } else { + ZM\Debug('Not including new auth hash becase it hasn\'t changed '.$auth_hash); + } + } + $data['auth_relay'] = get_auth_relay(); } ajaxResponse(array('status'=>$data)); break; @@ -167,11 +170,14 @@ if ($have_semaphore !== false) { } $data['rate'] /= RATE_BASE; $data['zoom'] = round($data['zoom']/SCALE_BASE, 1); - if ( ZM_OPT_USE_AUTH && (ZM_AUTH_RELAY == 'hashed') ) { - $auth_hash = generateAuthHash(ZM_AUTH_HASH_IPS); - if ( isset($_REQUEST['auth']) and ($_REQUEST['auth'] != $auth_hash) ) { - $data['auth'] = $auth_hash; - } + if ( ZM_OPT_USE_AUTH ) { + if (ZM_AUTH_RELAY == 'hashed') { + $auth_hash = generateAuthHash(ZM_AUTH_HASH_IPS); + if ( isset($_REQUEST['auth']) and ($_REQUEST['auth'] != $auth_hash) ) { + $data['auth'] = $auth_hash; + } + } + $data['auth_relay'] = get_auth_relay(); } ajaxResponse(array('status'=>$data)); break; From e42fd15e449e2955fb15b5fd08b77ee55683393a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 15:00:42 -0400 Subject: [PATCH 074/134] Use const instead of var to flush out duplicates for things that shouldn't change in javascript land --- web/skins/classic/js/skin.js.php | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 0ad7b9566..945165821 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -25,24 +25,24 @@ global $user; ?> -var AJAX_TIMEOUT = ; -var navBarRefresh = ; -var currentView = ''; +const AJAX_TIMEOUT = ; +const navBarRefresh = ; +const currentView = ''; -var exportProgressString = ''; -var exportFailedString = ''; -var exportSucceededString = ''; -var cancelString = ''; +const exportProgressString = ''; +const exportFailedString = ''; +const exportSucceededString = ''; +const cancelString = ''; -var thisUrl = ''; -var skinPath = ''; -var serverId = ''; +const thisUrl = ''; +const skinPath = ''; +const serverId = ''; -var canView = {}; -var canEdit = {}; +const canView = {}; +const canEdit = {}; -var ANIMATE_THUMBS = ; -var SCALE_BASE = ; +const ANIMATE_THUMBS = ; +const SCALE_BASE = ; var refreshParent = ; -var imagePrefix = ""; +const imagePrefix = ''; var auth_hash = ''; var auth_relay = ''; @@ -121,7 +121,7 @@ const CMD_QUERY = ; const CMD_QUIT = ; const CMD_MAXFPS = ; -var stateStrings = new Array(); +const stateStrings = new Array(); stateStrings[STATE_UNKNOWN] = ""; stateStrings[STATE_IDLE] = ""; stateStrings[STATE_PREALARM] = ""; From 4ec1187056d03ce66ab09142b3d62b923ea3da88 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 15:01:04 -0400 Subject: [PATCH 075/134] Remove SCALE_BASE as it is defined globally already --- web/skins/classic/views/js/watch.js.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index f78b58f47..49f45a851 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -55,7 +55,6 @@ monitorData[monitorData.length] = { } // end foreach monitor ?> -var SCALE_BASE = ; var scale = ''; var statusRefreshTimeout = ; From 3feb0897408fbf9d91fc2502c9be37e705fc1c0f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Aug 2022 15:34:39 -0400 Subject: [PATCH 076/134] Clear out width=auto and height=auto to prevent warnings in logs --- web/includes/Monitor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index f703d4d34..4f167312b 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -880,9 +880,9 @@ public static function getStatuses() { if (!isset($options['mode'])) { $options['mode'] = 'stream'; } - if (!isset($options['width'])) + if (!isset($options['width']) or $options['width'] == 'auto') $options['width'] = 0; - if (!isset($options['height'])) + if (!isset($options['height']) or $options['height'] == 'auto') $options['height'] = 0; if (!isset($options['maxfps'])) { From 8b73e3311d9b7306a49e33898eadc804fcee6375 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 18 Aug 2022 09:54:27 -0400 Subject: [PATCH 077/134] SCALE BASE is already deifned --- web/skins/classic/views/js/event.js.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/skins/classic/views/js/event.js.php b/web/skins/classic/views/js/event.js.php index 5807d8d47..b881dcd65 100644 --- a/web/skins/classic/views/js/event.js.php +++ b/web/skins/classic/views/js/event.js.php @@ -13,8 +13,6 @@ global $popup; ?> -var SCALE_BASE = ; - // // PHP variables to JS // From 0681a199c37dc2eb9987d3cb2b1d22dcfe78da09 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 18 Aug 2022 10:25:32 -0400 Subject: [PATCH 078/134] Update material icons to v1.11.10 --- web/fonts/MaterialIcons-Regular.eot | Bin 143258 -> 0 bytes web/fonts/MaterialIcons-Regular.ttf | Bin 128180 -> 0 bytes web/fonts/MaterialIcons-Regular.woff | Bin 57620 -> 0 bytes web/fonts/MaterialIcons-Regular.woff2 | Bin 44300 -> 0 bytes web/fonts/material-icons.woff | Bin 0 -> 164812 bytes web/fonts/material-icons.woff2 | Bin 0 -> 128552 bytes web/skins/classic/css/base/skin.css | 34 +++++++++----------------- 7 files changed, 11 insertions(+), 23 deletions(-) delete mode 100644 web/fonts/MaterialIcons-Regular.eot delete mode 100644 web/fonts/MaterialIcons-Regular.ttf delete mode 100644 web/fonts/MaterialIcons-Regular.woff delete mode 100644 web/fonts/MaterialIcons-Regular.woff2 create mode 100644 web/fonts/material-icons.woff create mode 100644 web/fonts/material-icons.woff2 diff --git a/web/fonts/MaterialIcons-Regular.eot b/web/fonts/MaterialIcons-Regular.eot deleted file mode 100644 index 70508ebabc9992e64f1314f866b2d7ab90438c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143258 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 Hzx)3OGG_Ot diff --git a/web/fonts/MaterialIcons-Regular.ttf b/web/fonts/MaterialIcons-Regular.ttf deleted file mode 100644 index 7015564ad166a3e9d88c82f17829f0cc01ebe29a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> diff --git a/web/fonts/MaterialIcons-Regular.woff b/web/fonts/MaterialIcons-Regular.woff deleted file mode 100644 index b648a3eea2d16b6ce783906d6b7d5f251b9eb56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG diff --git a/web/fonts/MaterialIcons-Regular.woff2 b/web/fonts/MaterialIcons-Regular.woff2 deleted file mode 100644 index 9fa211252080046a23b2449dbdced6abc2b0bb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 diff --git a/web/fonts/material-icons.woff b/web/fonts/material-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..7ba51f8e7ee204c9a497388ed7cee883d6862ba4 GIT binary patch literal 164812 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

1t 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

aXw4_7p$uUaN!zD-2lL%i%KR;-*3Zc^x#I;c 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 literal 0 HcmV?d00001 diff --git a/web/fonts/material-icons.woff2 b/web/fonts/material-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3d95fdfd6d9d6fdbb3650a9e7739ed5f5874537c GIT binary patch literal 128552 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

0@Fqs*TLtpDs9T42 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 Date: Thu, 18 Aug 2022 10:35:47 -0400 Subject: [PATCH 079/134] Add a button to jump this event time in montage review --- web/skins/classic/views/event.php | 1 + 1 file changed, 1 insertion(+) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index c024aa423..6f108f18d 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -173,6 +173,7 @@ if ( $Event->Id() and !file_exists($Event->Path()) ) + grid_view

@@ -115,12 +117,12 @@ for (event_index=0; event_index < events.length; event_index++) { const event_start = new Date(event.StartDateTime); const day = event_start.getDate(); const date_key = months[event_start.getMonth()] + ' ' + day; - if (!dataset_indexes[date_key]) { + if (! (date_key in dataset_indexes)) { dataset_indexes[date_key] = datasets.length; } const dataset_index = dataset_indexes[date_key]; - if (!datasets[dataset_index]) { + if (!(dataset_index in datasets)) { datasets[dataset_index] = { label: date_key, fill: false, From f610cd5e1ba8ddd2980503d64e09799a5b1e7fc0 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 1 Sep 2022 13:04:40 +0200 Subject: [PATCH 098/134] Don't trust zm_packet->packet to not be null --- src/zm_packetqueue.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/zm_packetqueue.cpp b/src/zm_packetqueue.cpp index 77b0e41ae..12238fb07 100644 --- a/src/zm_packetqueue.cpp +++ b/src/zm_packetqueue.cpp @@ -238,8 +238,18 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { packetqueue_iterator it = pktQueue.end(); --it; while (*it != add_packet) { - if ((*it)->packet->stream_index == video_stream_id) + if (!(*it)) { + Error("null packet"); + break; + } + if (!((*it)->packet)) { + Error("null av packet"); ++tail_count; + } else { + if ((*it)->packet->stream_index == video_stream_id) + ++tail_count; + } + --it; } } @@ -258,10 +268,11 @@ void PacketQueue::clearPackets(const std::shared_ptr &add_packet) { } pktQueue.pop_front(); - packet_counts[zm_packet->packet->stream_index] -= 1; + int stream_index = zm_packet->packet ? zm_packet->packet->stream_index : 0; + packet_counts[stream_index] -= 1; Debug(1, "Deleting a packet with stream index:%d image_index:%d with keyframe:%d, video frames in queue:%d max: %d, queuesize:%zu", - zm_packet->packet->stream_index, + stream_index, zm_packet->image_index, zm_packet->keyframe, packet_counts[video_stream_id], From 1e3b26e1787cba849a77ced46e8e637c968c8184 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Sep 2022 11:50:16 -0400 Subject: [PATCH 099/134] Add time ticks to progressbar with a mouseover highlight --- web/skins/classic/css/base/views/event.css | 31 ++++++- web/skins/classic/views/event.php | 3 +- web/skins/classic/views/js/event.js | 102 ++++++++++++++++++--- 3 files changed, 118 insertions(+), 18 deletions(-) diff --git a/web/skins/classic/css/base/views/event.css b/web/skins/classic/css/base/views/event.css index 851638632..7efffb9b4 100644 --- a/web/skins/classic/css/base/views/event.css +++ b/web/skins/classic/css/base/views/event.css @@ -10,23 +10,35 @@ display: inline-block; } +#alarmCues, .alarmCue { + position: relative; + background: none; + + /* background-color: #222222; - height: 1.25em; + */ + height: 16px; text-align: left; margin: 0 auto 0 auto; - border-radius: 0 0 .3em .3em; + z-index: 10; } -.alarmCue span { - background-color:red; +#alarmCues span { height: 100%; display: inline-block; border-radius: 0; + z-index: 11; +} + +span.alarmCue { + background-color:red; + z-index: 9; } span.noneCue { background: none; + z-index: 9; } #header { @@ -150,16 +162,27 @@ height: 100%; #progressBar { position: relative; + /* top: -1.25em; + */ height: 1.25em; + /* margin: 0 auto -1.25em auto; + */ + margin: 0; + z-index: 5; } #progressBar .progressBox { transition: width .1s; height: 100%; + position: absolute; + top: 0; background: rgba(170, 170, 170, .7); + /* border-radius: 0 0 .3em .3em; + */ + z-index: 5; } #eventStills { diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 6f108f18d..a884fc723 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -245,9 +245,10 @@ if ( (ZM_WEB_STREAM_METHOD == 'mpeg') && ZM_MPEG_LIVE_FORMAT ) { } } // end if stream method ?> -
+
+
'; + } + + if (!(cueFrames && cueFrames.length)) { console.log('No cue frames for event'); - return; + return html; } // This uses the Delta of the last frame to get the length of the event. I can't help but wonder though // if we shouldn't just use the event length endtime-starttime @@ -125,10 +153,10 @@ function renderAlarmCues(containerEl) { var pixSkew = 0; var skip = 0; var num_cueFrames = cueFrames.length; - for ( var i = 0; i < num_cueFrames; i++ ) { + for (let i=0; i < num_cueFrames; i++) { skip = 0; frame = cueFrames[i]; - if ( (frame.Type == 'Alarm') && (alarmed == 0) ) { //From nothing to alarm. End nothing and start alarm. + if ((frame.Type == 'Alarm') && (alarmed == 0)) { //From nothing to alarm. End nothing and start alarm. alarmed = 1; if (frame.Delta == 0) continue; //If event starts with an alarm or too few for a nonespan spanTimeEnd = frame.Delta * 100; @@ -140,7 +168,9 @@ function renderAlarmCues(containerEl) { pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - alarmHtml += ''; + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; spanTimeStart = spanTimeEnd; } else if ( (frame.Type !== 'Alarm') && (alarmed == 1) ) { //from alarm to nothing. End alarm and start nothing. futNone = 0; @@ -170,7 +200,9 @@ function renderAlarmCues(containerEl) { pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - alarmHtml += ''; + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; spanTimeStart = spanTimeEnd; } else if ( (frame.Type == 'Alarm') && (alarmed == 1) && (i + 1 >= cueFrames.length) ) { //event ends on an alarm spanTimeEnd = frame.Delta * 100; @@ -178,10 +210,13 @@ function renderAlarmCues(containerEl) { alarmed = 0; pix = Math.round(cueRatio * spanTime); if (pixSkew >= .5 || pixSkew <= -.5) pix += Math.round(pixSkew); - alarmHtml += ''; + + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; } } - return alarmHtml; + return html + alarmHtml; } function changeCodec() { @@ -194,13 +229,14 @@ function changeScale() { var newHeight; var autoScale; var eventViewer = $j(vid ? '#videoobj' : '#videoFeed'); - var alarmCue = $j('div.alarmCue'); + var alarmCue = $j('#alarmCues'); var bottomEl = $j('#replayStatus'); if (scale == '0') { var newSize = scaleToFit(eventData.Width, eventData.Height, eventViewer, bottomEl); newWidth = newSize.width; newHeight = newSize.height; + newHeight = 'auto'; autoScale = newSize.autoScale; } else { $j(window).off('resize', endOfResize); //remove resize handler when Scale to Fit is not active @@ -766,8 +802,14 @@ function updateProgressBar() { if (!(eventData && streamStatus)) { return; } // end if ! eventData && streamStatus - var curWidth = (streamStatus.progress / parseFloat(eventData.Length)) * 100; - $j("#progressBox").css('width', curWidth + '%'); + const curWidth = (streamStatus.progress / parseFloat(eventData.Length)) * 100; + + const progressDate = new Date(eventData.StartDateTime); + progressDate.setTime(progressDate.getTime() + (streamStatus.progress*1000)); + + const progressBox = $j("#progressBox"); + progressBox.css('width', curWidth + '%'); + progressBox.attr('title', progressDate.toLocaleTimeString()); } // end function updateProgressBar() // Handles seeking when clicking on the progress bar. @@ -777,6 +819,40 @@ function progressBarNav() { var seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); streamSeek(seekTime); }); + $j('#progressBar').mouseover(function(e) { + let x = e.pageX - $j(this).offset().left; + if (x<0) x=0; + console.log(x); + const seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); + const indicator = document.getElementById('indicator'); + indicator.style.display = 'block'; + indicator.style.left = x + 'px'; + indicator.setAttribute('title', seekTime); + }); + $j('#progressBar').mouseout(function(e) { + const indicator = document.getElementById('indicator'); + indicator.style.display = 'none'; + }); + $j('#progressBar').mousemove(function(e) { + const bar = $j(this); + + let x = e.pageX - bar.offset().left; + if (x<0) x=0; + if (x > bar.width()) x = bar.width(); + + console.log(x); + let seekTime = (x / bar.width()) * parseFloat(eventData.Length); + + console.log(seekTime); + const indicator = document.getElementById('indicator'); + + const date = new Date(eventData.StartDateTime); + date.setTime(date.getTime() + (seekTime*1000)); + + indicator.innerHTML = date.toLocaleTimeString(); + indicator.style.left = x+'px'; + indicator.setAttribute('title', seekTime); + }); } function handleClick(event) { @@ -932,7 +1008,7 @@ function initPage() { if ($j('#videoobj').length) { vid = videojs('videoobj'); addVideoTimingTrack(vid, LabelFormat, eventData.MonitorName, eventData.Length, eventData.StartDateTime); - $j('.vjs-progress-control').append('
');//add a place for videojs only on first load + $j('.vjs-progress-control').append('
');//add a place for videojs only on first load vid.on('ended', vjsReplay); vid.on('play', vjsPlay); vid.on('pause', pauseClicked); From ce4dd065ff0d5930bdd5d15911ed9ee710907349 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 4 Sep 2022 13:53:19 -0400 Subject: [PATCH 100/134] Use y instead of Y for path generation when using Deep scheme. Fixes #3583 --- web/includes/Event.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/Event.php b/web/includes/Event.php index 02a95ece3..a3eb8025e 100644 --- a/web/includes/Event.php +++ b/web/includes/Event.php @@ -112,7 +112,7 @@ class Event extends ZM_Object { $event_path = ''; if ( $this->{'Scheme'} == 'Deep' ) { - $event_path = $this->{'MonitorId'}.'/'.date('Y/m/d/H/i/s', $this->Time()); + $event_path = $this->{'MonitorId'}.'/'.date('y/m/d/H/i/s', $this->Time()); } else if ( $this->{'Scheme'} == 'Medium' ) { $event_path = $this->{'MonitorId'}.'/'.date('Y-m-d', $this->Time()).'/'.$this->{'Id'}; } else { From e088e88e13bb707779d23cf4e8b715a386fea173 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 4 Sep 2022 13:54:18 -0400 Subject: [PATCH 101/134] Make monitor rows in event stats a link if user can view monitors. Include path to event. --- web/skins/classic/views/js/event.js | 14 ++++++++++++++ web/skins/classic/views/js/event.js.php | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index a4399b9b1..3973d66df 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -849,6 +849,20 @@ function getStat() { case 'AlarmFrames': tdString = '' + eventData[key] + ''; break; + case 'MonitorId': + if (canView["Monitors"]) { + tdString = ''+eventData.MonitorId+''; + } else { + tdString = eventData[key]; + } + break; + case 'MonitorName': + if (canView["Monitors"]) { + tdString = ''+eventData.MonitorName+''; + } else { + tdString = eventData[key]; + } + break; case 'MaxScore': tdString = '' + eventData[key] + ''; break; diff --git a/web/skins/classic/views/js/event.js.php b/web/skins/classic/views/js/event.js.php index b881dcd65..647d7f092 100644 --- a/web/skins/classic/views/js/event.js.php +++ b/web/skins/classic/views/js/event.js.php @@ -41,7 +41,8 @@ var eventData = { DiskSpace: 'DiskSpace(null)) ?>', Storage: 'Storage()->Name()).( $Event->SecondaryStorageId() ? ', '.validHtmlStr($Event->SecondaryStorage()->Name()) : '' ) ?>', Archived: Archived?'true':'false' ?>, - Emailed: Emailed?'true':'false' ?> + Emailed: Emailed?'true':'false' ?>, + Path: 'Path() ?>' }; @@ -65,6 +66,7 @@ var eventDataStrings = { MaxScore: '', DiskSpace: '', Storage: '', + Path: '', Archived: '', Emailed: '' }; From 813434e0f44b5eaf667832f4beb0028b5214f18a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 11:22:04 -0400 Subject: [PATCH 102/134] Fix saving monitor due to MQTT being empty --- web/includes/Monitor.php | 2 +- web/includes/actions/monitor.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index 40dc38ea3..17ca28cd2 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -245,7 +245,7 @@ public static function getStatuses() { 'RTSPServer' => array('type'=>'boolean', 'default'=>0), 'RTSPStreamName' => '', 'Importance' => 'Normal', - 'MQTT_Enabled' => false, + 'MQTT_Enabled' => array('type'=>'boolean','default'=>0), 'MQTT_Subscriptions' => '', ); private $status_fields = array( diff --git a/web/includes/actions/monitor.php b/web/includes/actions/monitor.php index 04ea5e0ef..b6528d0b4 100644 --- a/web/includes/actions/monitor.php +++ b/web/includes/actions/monitor.php @@ -101,6 +101,7 @@ if ($action == 'save') { 'Method' => 'raw', 'GroupIds' => array(), 'LinkedMonitors' => array(), + 'MQTT_Enabled' => 0, 'RTSPServer' => 0 ); From 1fe3d52c962f7e3423c736d3ab90f3a2c9cac44e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 25 May 2021 11:19:50 -0400 Subject: [PATCH 103/134] remove extra spacing, move dropdown option own to where they are used --- web/ajax/modals/donate.php | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/web/ajax/modals/donate.php b/web/ajax/modals/donate.php index 374d4e0d2..e0bb1449d 100644 --- a/web/ajax/modals/donate.php +++ b/web/ajax/modals/donate.php @@ -1,6 +1,6 @@ translate('DonateYes'), - 'hour' => translate('DonateRemindHour'), - 'day' => translate('DonateRemindDay'), - 'week' => translate('DonateRemindWeek'), - 'month' => translate('DonateRemindMonth'), - 'never' => translate('DonateRemindNever'), - 'already' => translate('DonateAlready'), -); - +if (!canEdit('System')) return; ?>
- From eb9ac11d21423d65b1ab2507a3b79ed0c6100887 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 25 May 2021 11:20:23 -0400 Subject: [PATCH 104/134] fix updating donation reminder. I would always be a month or more --- web/includes/actions/donate.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/includes/actions/donate.php b/web/includes/actions/donate.php index e0f71d688..bcd1983c2 100644 --- a/web/includes/actions/donate.php +++ b/web/includes/actions/donate.php @@ -18,7 +18,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // -if ( !canEdit('System') ) { +if (!canEdit('System')) { ZM\Warning('Need System permissions to update donation'); return; } @@ -34,10 +34,16 @@ if ( $action == 'donate' && isset($_REQUEST['option']) ) { return; case 'hour' : $nextReminder += 60*60; + dbQuery("UPDATE Config SET Value = '".$nextReminder."' WHERE Name = 'ZM_DYN_DONATE_REMINDER_TIME'"); + break; case 'day' : $nextReminder += 24*60*60; + dbQuery("UPDATE Config SET Value = '".$nextReminder."' WHERE Name = 'ZM_DYN_DONATE_REMINDER_TIME'"); + break; case 'week' : $nextReminder += 7*24*60*60; + dbQuery("UPDATE Config SET Value = '".$nextReminder."' WHERE Name = 'ZM_DYN_DONATE_REMINDER_TIME'"); + break; case 'month' : $nextReminder += 30*24*60*60; dbQuery("UPDATE Config SET Value = '".$nextReminder."' WHERE Name = 'ZM_DYN_DONATE_REMINDER_TIME'"); From 6452f8127a2b4431fd8d78bfae2dd23236bbd5b6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 11:18:21 -0400 Subject: [PATCH 105/134] Convert password fields to hidden fields on submit so that browser doesn't offer to remember passwords --- web/skins/classic/views/js/monitor.js.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/web/skins/classic/views/js/monitor.js.php b/web/skins/classic/views/js/monitor.js.php index 1e2ef5c00..3368b332b 100644 --- a/web/skins/classic/views/js/monitor.js.php +++ b/web/skins/classic/views/js/monitor.js.php @@ -182,6 +182,16 @@ function validateForm( form ) { } } + /* because of success here, we will submit the form. Before we do that, + * convert all password fields to hidden fields so that + * browsers don't offer to save them + */ + + for (let i=0; i < form.elements.length; i++) { + if (form.elements[i].type == 'password') { + form.elements[i].type = 'hidden'; + } + } return true; } From f9fddcb6ee1dbd81cb0d12a37f2b727d68594431 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 11:41:53 -0400 Subject: [PATCH 106/134] format filesize into human_readable in generate video view --- web/skins/classic/views/video.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/web/skins/classic/views/video.php b/web/skins/classic/views/video.php index 597897936..fc5ece0b1 100644 --- a/web/skins/classic/views/video.php +++ b/web/skins/classic/views/video.php @@ -18,7 +18,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // -if ( !canView('Events') ) { +if (!canView('Events')) { $view = 'error'; return; } @@ -29,7 +29,7 @@ $eid = validInt($_REQUEST['eid']); $event = new ZM\Event($eid); -if ( ! canView('Monitors', $event->MonitorId() ) ) { +if (!canView('Monitors', $event->MonitorId())) { $view = 'error'; return; } @@ -61,11 +61,11 @@ foreach ( $ffmpegFormats as $ffmpegFormat ) { } $videoFiles = array(); -if ( $dir = opendir($event_path) ) { - while ( ($file = readdir($dir)) !== false ) { +if ($dir = opendir($event_path)) { + while (($file = readdir($dir)) !== false) { $file = $event_path.'/'.$file; - if ( is_file($file) ) { - if ( preg_match('/\.(?:'.join('|', $videoFormats).')$/', $file) ) { + if (is_file($file)) { + if (preg_match('/\.(?:'.join('|', $videoFormats).')$/', $file)) { $videoFiles[] = $file; } } @@ -73,17 +73,17 @@ if ( $dir = opendir($event_path) ) { closedir($dir); } -if ( isset($_REQUEST['deleteIndex']) ) { +if (isset($_REQUEST['deleteIndex'])) { $deleteIndex = validInt($_REQUEST['deleteIndex']); unlink($videoFiles[$deleteIndex]); unset($videoFiles[$deleteIndex]); } -if ( isset($_REQUEST['downloadIndex']) ) { +if (isset($_REQUEST['downloadIndex'])) { // can't be output buffering, as this file might be large ob_end_clean(); $downloadIndex = validInt($_REQUEST['downloadIndex']); - ZM\Error("Download $downloadIndex, file: " . $videoFiles[$downloadIndex]); + ZM\Debug("Download $downloadIndex, file: " . $videoFiles[$downloadIndex]); header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); @@ -195,7 +195,7 @@ if ( isset($_REQUEST['showIndex']) ) { ?> - + From 7f627cc2537c80e6ce160c0bb9d8f6c83cfb4cf1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 13:44:53 -0400 Subject: [PATCH 107/134] Make GenearteVideo code handle more options for generating video, including transforms like=hue=s=0 --- scripts/ZoneMinder/lib/ZoneMinder/Event.pm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm index ed904431d..7725d0bcc 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm @@ -264,7 +264,7 @@ sub createIdFile { } sub GenerateVideo { - my ( $self, $rate, $fps, $scale, $size, $overwrite, $format ) = @_; + my ( $self, $rate, $fps, $scale, $size, $overwrite, $format, $transforms ) = @_; my $event_path = $self->Path(); chdir($event_path); @@ -277,14 +277,14 @@ sub GenerateVideo { $file_rate =~ s/_00//; $file_rate =~ s/(_\d+)0+$/$1/; $file_rate = 'r'.$file_rate; - push( @file_parts, $file_rate ); + push @file_parts, $file_rate; } elsif ( $fps ) { my $file_fps = $fps; $file_fps =~ s/\./_/; $file_fps =~ s/_00//; $file_fps =~ s/(_\d+)0+$/$1/; $file_fps = 'R'.$file_fps; - push( @file_parts, $file_fps ); + push @file_parts, $file_fps; } if ( $scale ) { @@ -298,7 +298,11 @@ sub GenerateVideo { my $file_size = 'S'.$size; push @file_parts, $file_size; } - my $video_file = join('-', $video_name, $file_parts[0], $file_parts[1] ).'.'.$format; + my @transforms = split(',', $transforms); + foreach (@transforms) { + push @file_parts, $_; + } + my $video_file = join('-', $video_name, @file_parts).'.'.$format; if ( $overwrite || !-s $video_file ) { Info("Creating video file $video_file for event $self->{Id}"); @@ -329,7 +333,10 @@ sub GenerateVideo { .$Config{ZM_FFMPEG_INPUT_OPTIONS} .' -i ' . ( $$self{DefaultVideo} ? $$self{DefaultVideo} : '%0'.$Config{ZM_EVENT_IMAGE_DIGITS} .'d-capture.jpg' ) #. " -f concat -i /tmp/event_files.txt" - ." -s $video_size " + # + .join(' ', map { ' -vf '.$_ } @transforms) + ." -s $video_size " + .$Config{ZM_FFMPEG_OUTPUT_OPTIONS} ." '$video_file' > ffmpeg.log 2>&1" ; From e98fb98181e4dec5426b290c3312cebb470753a1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 13:45:16 -0400 Subject: [PATCH 108/134] Add -t option to zmvideo.pl to add transforms like hue=s=0 support --- scripts/zmvideo.pl.in | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/scripts/zmvideo.pl.in b/scripts/zmvideo.pl.in index c676eb164..382aee9be 100644 --- a/scripts/zmvideo.pl.in +++ b/scripts/zmvideo.pl.in @@ -42,18 +42,19 @@ This script is used to create MPEG videos of events for the web pages or as email attachments. =head1 OPTIONS - -c[=filename], --concat[=filename] - When creating videos for multiple events, create a concatenated video as well. - - If not specified, filename is taken from filter name. - -e, --event= - What event to create the video for - --filter_name= - The name of a saved filter to generate a video for all events returned by it. - --filter_id= - The id of a saved filter to generate a video for all events returned by it. - -f, --format= - What format to create the video in, default is mpg. For ffmpeg only. - -r, --rate= - Relative rate, 1 = realtime, 2 = double speed, 0.5 = half speed etc. - -s, --scale= - Scale, 1 = normal, 2 = double size, 0.5 = half size etc. - -F, --fps= - Absolute frame rate, in frames per second - -S, --size= - Absolute video size, WxH or other specification supported by ffmpeg - -o, --overwrite - Whether to overwrite an existing file, off by default. - -v, --version - Outputs the currently installed version of ZoneMinder + -c[=filename], --concat[=filename] - When creating videos for multiple events, create a concatenated video as well. + - If not specified, filename is taken from filter name. + -e, --event= - What event to create the video for + --filter_name= - The name of a saved filter to generate a video for all events returned by it. + --filter_id= - The id of a saved filter to generate a video for all events returned by it. + -f, --format= - What format to create the video in, default is mpg. For ffmpeg only. + -r, --rate= - Relative rate, 1 = realtime, 2 = double speed, 0.5 = half speed etc. + -s, --scale= - Scale, 1 = normal, 2 = double size, 0.5 = half size etc. + -t, --transform= - Transform video. Applies -vf option to ffmpeg. + -F, --fps= - Absolute frame rate, in frames per second + -S, --size= - Absolute video size, WxH or other specification supported by ffmpeg + -o, --overwrite - Whether to overwrite an existing file, off by default. + -v, --version - Outputs the currently installed version of ZoneMinder =cut use strict; @@ -93,6 +94,7 @@ my $rate = ''; my $scale = ''; my $fps = ''; my $size = ''; +my $transforms = ''; my $overwrite = 0; my $version = 0; @@ -106,6 +108,7 @@ GetOptions( 'scale|s=f' =>\$scale, 'fps|F=f' =>\$fps, 'size|S=s' =>\$size, + 'transforms|t=s'=>\$transforms, 'overwrite' =>\$overwrite, 'version' =>\$version ) or pod2usage(-exitstatus => -1); @@ -166,6 +169,7 @@ $rate = $detaint_rate; $scale = $detaint_scale; $fps = $detaint_fps; $size = $detaint_size; +($transforms) = $transforms =~ /^([,\w=]+)$/; my $dbh = zmDbConnect(); @@ -191,8 +195,8 @@ if ( $event_id ) { Fatal("Filter $filter_name $filter_id not found."); } @event_ids = map { $_->{Id} } $Filter->Execute(); - if ( ! @event_ids ) { - Fatal( "No events found for $filter_name") + if (!@event_ids) { + Fatal("No events found for $filter_name") } else { Debug(@event_ids . " events found for $filter_name"); } @@ -218,7 +222,7 @@ foreach my $event_id ( @event_ids ) { my $event = $sth->fetchrow_hashref(); my $Event = new ZoneMinder::Event( $$event{Id}, $event ); - my $video_file = $Event->GenerateVideo( $rate, $fps, $scale, $size, $overwrite, $format ); + my $video_file = $Event->GenerateVideo( $rate, $fps, $scale, $size, $overwrite, $format, $transforms ); if ( $video_file ) { push @video_files, $video_file; print( STDOUT $video_file."\n" ); From 4d2f9568270b7dabb119c947fe0fe7b1fcd0b239 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 13:46:41 -0400 Subject: [PATCH 109/134] Move createVideo from functions to Event --- web/includes/Event.php | 23 +++++++++++++++++++++++ web/includes/functions.php | 17 ----------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/web/includes/Event.php b/web/includes/Event.php index a3eb8025e..b77954932 100644 --- a/web/includes/Event.php +++ b/web/includes/Event.php @@ -661,6 +661,29 @@ class Event extends ZM_Object { } return true; } + + function createVideo($format, $rate, $scale, $transform, $overwrite=false) { + $command = ZM_PATH_BIN.'/zmvideo.pl -e '.$this->{'Id'}.' -f '.$format.' -r '.sprintf('%.2F', ($rate/RATE_BASE)); + if (preg_match('/\d+x\d+/', $scale)) { + $command .= ' -S '.$scale; + } else { + if ( version_compare(phpversion(), '4.3.10', '>=') ) + $command .= ' -s '.sprintf('%.2F', ($scale/SCALE_BASE)); + else + $command .= ' -s '.sprintf('%.2f', ($scale/SCALE_BASE)); + } + if ($transform != '') { + $transform = preg_replace('/[^\w=]/', '', $transform); + $command .= ' -t '.$transform; + } + if ($overwrite) + $command .= ' -o'; + $command = escapeshellcmd($command); + $result = exec($command, $output, $status); + Debug("generating Video $command: result($result outptu:(".implode("\n", $output )." status($status"); + return $status ? '' : rtrim($result); + } + } # end class ?> diff --git a/web/includes/functions.php b/web/includes/functions.php index fa0628dee..449e45d47 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -853,23 +853,6 @@ function createListThumbnail($event, $overwrite=false) { return $thumbData; } -function createVideo($event, $format, $rate, $scale, $overwrite=false) { - $command = ZM_PATH_BIN.'/zmvideo.pl -e '.$event['Id'].' -f '.$format.' -r '.sprintf('%.2F', ($rate/RATE_BASE)); - if ( preg_match('/\d+x\d+/', $scale) ) - $command .= ' -S '.$scale; - else - if ( version_compare(phpversion(), '4.3.10', '>=') ) - $command .= ' -s '.sprintf('%.2F', ($scale/SCALE_BASE)); - else - $command .= ' -s '.sprintf('%.2f', ($scale/SCALE_BASE)); - if ( $overwrite ) - $command .= ' -o'; - $command = escapeshellcmd($command); - $result = exec($command, $output, $status); - ZM\Debug("generating Video $command: result($result outptu:(".implode("\n", $output )." status($status"); - return $status ? '' : rtrim($result); -} - # This takes more than one scale amount, so it runs through each and alters dimension. # I can't imagine why you would want to do that. function reScale($dimension, $dummy) { From 37dac7d3a6ee05f5bcb0e6c7aeb4bacd9ecc9e6e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 13:46:54 -0400 Subject: [PATCH 110/134] Add transform support and use Event::createVideo --- web/ajax/event.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/ajax/event.php b/web/ajax/event.php index 14ba7c74e..b6ff1de59 100644 --- a/web/ajax/event.php +++ b/web/ajax/event.php @@ -19,7 +19,10 @@ if ( canView('Events') or canView('Snapshots') ) { if ( !($event = dbFetchOne($sql, NULL, array( $_REQUEST['id']))) ) { ajaxError('Video Generation Failure, Unable to load event'); } else { - if ( $videoFile = createVideo($event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $_REQUEST['scale'], !empty($_REQUEST['overwrite'])) ) + require_once('includes/Event.php'); + $Event = new ZM\Event($event); + + if ( $videoFile = $Event->createVideo($_REQUEST['videoFormat'], $_REQUEST['rate'], $_REQUEST['scale'], $_REQUEST['transform'], !empty($_REQUEST['overwrite'])) ) ajaxResponse(array('response'=>$videoFile)); else ajaxError('Video Generation Failed'); From dbcf32080841b91a4f36ce6db7a8a7dd816c30dd Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:41:42 -0400 Subject: [PATCH 111/134] For mp4, use video tag, with videojs instead of embed --- web/includes/functions.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 449e45d47..0521ed2d8 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -213,7 +213,25 @@ function getVideoStreamHTML($id, $src, $width, $height, $format, $title='') { '; } # end switch } # end if use object tags - return '= 0 ? true : false;} + ))).']}\' + > + + Your browser does not support the video tag. + '; + default: + return ' '; + } } function outputImageStream( $id, $src, $width, $height, $title='' ) { From 867660942583b6a2436d86c470316be4d44f2615 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:41:55 -0400 Subject: [PATCH 112/134] Center video obj --- web/skins/classic/css/base/views/video.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/skins/classic/css/base/views/video.css b/web/skins/classic/css/base/views/video.css index 7e9708f2c..96eca6954 100644 --- a/web/skins/classic/css/base/views/video.css +++ b/web/skins/classic/css/base/views/video.css @@ -17,3 +17,11 @@ #videoFile { margin-bottom: 6px; } + +video[poster]{ + object-fit: fill; +} + +#videoobj { + margin: 0 auto; +} From fdbe950640d6e0169b53cfbf02873983efcc01fd Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:42:11 -0400 Subject: [PATCH 113/134] include video.js for video view as well as event --- web/skins/classic/includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/includes/functions.php b/web/skins/classic/includes/functions.php index 76bfd5b17..79adf2337 100644 --- a/web/skins/classic/includes/functions.php +++ b/web/skins/classic/includes/functions.php @@ -958,7 +958,7 @@ function xhtmlFooter() { ), true ); ?> From d3e3807263d60925f53b9a4812c075faeaa10ce9 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:42:49 -0400 Subject: [PATCH 114/134] setup video.js on the video tag if it exists --- web/skins/classic/views/js/video.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/skins/classic/views/js/video.js b/web/skins/classic/views/js/video.js index c764f33b5..32ae4f6c8 100644 --- a/web/skins/classic/views/js/video.js +++ b/web/skins/classic/views/js/video.js @@ -46,6 +46,11 @@ function initPage() { // Don't enable the back button if there is no previous zm page to go back to backBtn.prop('disabled', !document.referrer.length); + + videoobj = $j('#videoobj'); + if (videoobj.length) { + vid = videojs('videoobj'); + } } $j(document).ready(initPage); From 60d01376c593fe28d372f966bad306fec43de2a2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:44:09 -0400 Subject: [PATCH 115/134] clean up, give generation options even if viewing. Fix viewing. Add transform option. --- web/skins/classic/views/video.php | 84 ++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/web/skins/classic/views/video.php b/web/skins/classic/views/video.php index fc5ece0b1..a5e6ea31d 100644 --- a/web/skins/classic/views/video.php +++ b/web/skins/classic/views/video.php @@ -77,9 +77,7 @@ if (isset($_REQUEST['deleteIndex'])) { $deleteIndex = validInt($_REQUEST['deleteIndex']); unlink($videoFiles[$deleteIndex]); unset($videoFiles[$deleteIndex]); -} - -if (isset($_REQUEST['downloadIndex'])) { +} else if (isset($_REQUEST['downloadIndex'])) { // can't be output buffering, as this file might be large ob_end_clean(); $downloadIndex = validInt($_REQUEST['downloadIndex']); @@ -116,16 +114,32 @@ xhtmlHeaders(__FILE__, translate('Video'));
Width(); + $height = $event->Height(); + + foreach (explode('-', $path_parts['filename']) as $option) { + if ( preg_match('/^s(.+)$/', $option, $temp_matches) ) { + $scale = (int)(preg_replace('/_/', '.', $temp_matches[1]) ); + $width = $width * $scale; + $height = $height * $scale; + } elseif ( preg_match('/^S(\d+)x(\d+)$/', $option, $temp_matches) ) { + $width = $temp_matches[1]; + $height = $temp_matches[2]; + } + } ?> -

-
+

+
@@ -143,6 +157,18 @@ if ( isset($_REQUEST['showIndex']) ) { + + + +translate('None'), + 'hue=s=0'=>translate('Grayscale'), + ); + echo buildSelect('transform', $transforms); +?> + + checked="checked"/> @@ -159,7 +185,7 @@ if ( isset($_REQUEST['showIndex']) ) { - + @@ -177,24 +203,25 @@ if ( isset($_REQUEST['showIndex']) ) { $index = 0; foreach ( $videoFiles as $file ) { if ( filesize($file) > 0 ) { - preg_match('/^(.+)-((?:r[_\d]+)|(?:F[_\d]+))-((?:s[_\d]+)|(?:S[0-9a-z]+))\.([^.]+)$/', $file, $matches); - if ( preg_match('/^r(.+)$/', $matches[2], $temp_matches) ) { - $rate = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); - $rateText = isset($rates[$rate])?$rates[$rate]:($rate."x"); - } elseif ( preg_match('/^F(.+)$/', $matches[2], $temp_matches) ) { - $rateText = $temp_matches[1].'fps'; - } - if ( preg_match('/^s(.+)$/', $matches[3], $temp_matches) ) { - $scale = (int)(100 * preg_replace('/_/', '.', $temp_matches[1]) ); - $scaleText = isset($scales[$scale])?$scales[$scale]:($scale.'x'); - } elseif ( preg_match('/^S(.+)$/', $matches[3], $temp_matches) ) { - $scaleText = $temp_matches[1]; - } - $width = $scale?reScale($event->Width(), $scale):$event->Width(); - $height = $scale?reScale($event->Height(), $scale):$event->Height(); + $path_parts = pathinfo($file); + + foreach (explode('-', $path_parts['filename']) as $option) { + if ( preg_match('/^r(.+)$/', $option, $temp_matches) ) { + $rate = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); + $rateText = isset($rates[$rate])?$rates[$rate]:($rate."x"); + } elseif ( preg_match('/^F(.+)$/', $option, $temp_matches) ) { + $rateText = $temp_matches[1].'fps'; + } else if ( preg_match('/^s(.+)$/', $option, $temp_matches) ) { + $scale = (int)(100 * preg_replace('/_/', '.', $temp_matches[1]) ); + $scaleText = isset($scales[$scale])?$scales[$scale]:($scale.'x'); + } elseif ( preg_match('/^S(.+)$/', $option, $temp_matches) ) { + $scaleText = $temp_matches[1]; + } + } # end foreach option in filename ?> - + @@ -212,9 +239,6 @@ if ( isset($_REQUEST['showIndex']) ) { ?>
+
-
From c22007e8ee17decf2f385180c27f49cbdeed4e14 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 15:44:41 -0400 Subject: [PATCH 116/134] Allow viewing a specific video file instead of DefaultVideo --- web/views/view_video.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/views/view_video.php b/web/views/view_video.php index 4717e5f96..37807c5ff 100644 --- a/web/views/view_video.php +++ b/web/views/view_video.php @@ -44,7 +44,11 @@ if ( ! empty($_REQUEST['eid']) ) { $path = $Event->Path().'/'.$Event->DefaultVideo(); } else if ( ! empty($_REQUEST['event_id']) ) { $Event = new ZM\Event($_REQUEST['event_id']); - $path = $Event->Path().'/'.$Event->DefaultVideo(); + if (!empty($_REQUEST['file'])) { + $path = $Event->Path().'/'.preg_replace('/\//', '', $_REQUEST['file']); + } else { + $path = $Event->Path().'/'.$Event->DefaultVideo(); + } } else { $errorText = 'No video path'; } From e9ab7f2f26502f25999bed6dc20f1ffac479a9ed Mon Sep 17 00:00:00 2001 From: megasaturnv Date: Fri, 2 Sep 2022 11:58:02 +0100 Subject: [PATCH 117/134] Added option ZM_AUTH_CASE_INSENSITIVE_USERNAMES to match mixed case usernames to lower case usernames in database ZoneMinder/zoneminder#3516 --- docs/userguide/options/options_system.rst | 2 ++ .../lib/ZoneMinder/ConfigData.pm.in | 14 ++++++++++++++ web/includes/auth.php | 19 ++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/docs/userguide/options/options_system.rst b/docs/userguide/options/options_system.rst index 33c59cf1c..f69c2f132 100644 --- a/docs/userguide/options/options_system.rst +++ b/docs/userguide/options/options_system.rst @@ -16,6 +16,8 @@ OPT_USE_AUTH - ZoneMinder can run in two modes. The simplest is an entirely unau AUTH_TYPE - ZoneMinder can use two methods to authenticate users when running in authenticated mode. The first is a builtin method where ZoneMinder provides facilities for users to log in and maintains track of their identity. The second method allows interworking with other methods such as http basic authentication which passes an independently authenticated 'remote' user via http. In this case ZoneMinder would use the supplied user without additional authentication provided such a user is configured in ZoneMinder. +AUTH_CASE_INSENSITIVE_USERNAMES - This option makes usernames case insensitive when authenticating. Matches against lower-case usernames in the database. May be used with "remote" AUTH_TYPE and LDAP authentication. + AUTH_RELAY - When ZoneMinder is running in authenticated mode it can pass user details between the web pages and the back end processes. There are two methods for doing this. This first is to use a time limited hashed string which contains no direct username or password details, the second method is to pass the username and passwords around in plaintext. This method is not recommend except where you do not have the md5 libraries available on your system or you have a completely isolated system with no external access. You can also switch off authentication relaying if your system is isolated in other ways. AUTH_HASH_SECRET - When ZoneMinder is running in hashed authenticated mode it is necessary to generate hashed strings containing encrypted sensitive information such as usernames and passwords. Although these strings are reasonably secure the addition of a random secret increases security substantially. Note that if you are using the new token based APIs, then this field is mandatory with ZM 1.34 and above. diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index aeea796d0..6f9ec0c11 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -313,6 +313,20 @@ our @options = ( }, category => 'system', }, + { + name => 'ZM_AUTH_CASE_INSENSITIVE_USERNAMES', + default => 'no', + description => 'Case insensitive username authentication', + help => q` + This option makes usernames case insensitive when + authenticating. Matches against lower-case usernames in the + database. May be used with "remote" AUTH_TYPE and LDAP + authentication. + `, + requires => [ { name=>'ZM_OPT_USE_AUTH', value=>'yes' } ], + type => $types{boolean}, + category => 'system', + }, { name => 'ZM_AUTH_RELAY', default => 'hashed', diff --git a/web/includes/auth.php b/web/includes/auth.php index 7e85e4ba2..258bf5854 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -60,7 +60,12 @@ function migrateHash($user, $pass) { function validateUser($username='', $password='') { $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; // local user, shouldn't affect the global user - $user = dbFetchOne($sql, NULL, array($username)); + $user = null; // Not global + if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + $user = dbFetchOne($sql, NULL, array(strtolower($username))); + } else { + $user = dbFetchOne($sql, NULL, array($username)); + } if (!$user) { return array(false, "Could not retrieve user $username details"); } @@ -268,7 +273,11 @@ function userFromSession() { } else { # Need to refresh permissions and validate that the user still exists $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; - $user = dbFetchOne($sql, NULL, array($_SESSION['username'])); + if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + $user = dbFetchOne($sql, NULL, array(strtolower($_SESSION['username']))); + } else { + $user = dbFetchOne($sql, NULL, array(c)); + } } } return $user; @@ -318,7 +327,11 @@ if (ZM_OPT_USE_AUTH) { } else if ((ZM_AUTH_TYPE == 'remote') and !empty($_SERVER['REMOTE_USER'])) { $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; // local user, shouldn't affect the global user - $user = dbFetchOne($sql, NULL, array($_SERVER['REMOTE_USER'])); + if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + $user = dbFetchOne($sql, NULL, array(strtolower($_SERVER['REMOTE_USER']))); + } else { + $user = dbFetchOne($sql, NULL, array($_SERVER['REMOTE_USER'])); + } } else { $user = userFromSession(); } From c90e2f78982ae17e35e2897fa93d29fd80c79571 Mon Sep 17 00:00:00 2001 From: megasaturnv Date: Fri, 2 Sep 2022 12:03:47 +0100 Subject: [PATCH 118/134] Renamed ZM_AUTH_CASE_INSENSITIVE_USERNAMES to ZM_CASE_INSENSITIVE_USERNAMES as name was too long ZoneMinder/zoneminder#3516 --- docs/userguide/options/options_system.rst | 2 +- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 2 +- web/includes/auth.php | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/userguide/options/options_system.rst b/docs/userguide/options/options_system.rst index f69c2f132..b6a1f01ff 100644 --- a/docs/userguide/options/options_system.rst +++ b/docs/userguide/options/options_system.rst @@ -16,7 +16,7 @@ OPT_USE_AUTH - ZoneMinder can run in two modes. The simplest is an entirely unau AUTH_TYPE - ZoneMinder can use two methods to authenticate users when running in authenticated mode. The first is a builtin method where ZoneMinder provides facilities for users to log in and maintains track of their identity. The second method allows interworking with other methods such as http basic authentication which passes an independently authenticated 'remote' user via http. In this case ZoneMinder would use the supplied user without additional authentication provided such a user is configured in ZoneMinder. -AUTH_CASE_INSENSITIVE_USERNAMES - This option makes usernames case insensitive when authenticating. Matches against lower-case usernames in the database. May be used with "remote" AUTH_TYPE and LDAP authentication. +CASE_INSENSITIVE_USERNAMES - This option makes usernames case insensitive when authenticating. Matches against lower-case usernames in the database. May be used with "remote" AUTH_TYPE and LDAP authentication. AUTH_RELAY - When ZoneMinder is running in authenticated mode it can pass user details between the web pages and the back end processes. There are two methods for doing this. This first is to use a time limited hashed string which contains no direct username or password details, the second method is to pass the username and passwords around in plaintext. This method is not recommend except where you do not have the md5 libraries available on your system or you have a completely isolated system with no external access. You can also switch off authentication relaying if your system is isolated in other ways. diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 6f9ec0c11..092a1d8fa 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -314,7 +314,7 @@ our @options = ( category => 'system', }, { - name => 'ZM_AUTH_CASE_INSENSITIVE_USERNAMES', + name => 'ZM_CASE_INSENSITIVE_USERNAMES', default => 'no', description => 'Case insensitive username authentication', help => q` diff --git a/web/includes/auth.php b/web/includes/auth.php index 258bf5854..07956b7a4 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -61,7 +61,7 @@ function validateUser($username='', $password='') { $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; // local user, shouldn't affect the global user $user = null; // Not global - if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + if (ZM_CASE_INSENSITIVE_USERNAMES) { $user = dbFetchOne($sql, NULL, array(strtolower($username))); } else { $user = dbFetchOne($sql, NULL, array($username)); @@ -273,7 +273,7 @@ function userFromSession() { } else { # Need to refresh permissions and validate that the user still exists $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; - if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + if (ZM_CASE_INSENSITIVE_USERNAMES) { $user = dbFetchOne($sql, NULL, array(strtolower($_SESSION['username']))); } else { $user = dbFetchOne($sql, NULL, array(c)); @@ -327,7 +327,7 @@ if (ZM_OPT_USE_AUTH) { } else if ((ZM_AUTH_TYPE == 'remote') and !empty($_SERVER['REMOTE_USER'])) { $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; // local user, shouldn't affect the global user - if (ZM_AUTH_CASE_INSENSITIVE_USERNAMES) { + if (ZM_CASE_INSENSITIVE_USERNAMES) { $user = dbFetchOne($sql, NULL, array(strtolower($_SERVER['REMOTE_USER']))); } else { $user = dbFetchOne($sql, NULL, array($_SERVER['REMOTE_USER'])); From 143a00cccc1ae9605f9f122d1edfbb7b8b1b94ae Mon Sep 17 00:00:00 2001 From: megasaturnv Date: Mon, 5 Sep 2022 15:29:23 +0100 Subject: [PATCH 119/134] Fix typo --- web/includes/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/auth.php b/web/includes/auth.php index 07956b7a4..df03ed539 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -276,7 +276,7 @@ function userFromSession() { if (ZM_CASE_INSENSITIVE_USERNAMES) { $user = dbFetchOne($sql, NULL, array(strtolower($_SESSION['username']))); } else { - $user = dbFetchOne($sql, NULL, array(c)); + $user = dbFetchOne($sql, NULL, array($_SESSION['username'])); } } } From 8fc60fef1256863eca93ecdeac107251caf6ab31 Mon Sep 17 00:00:00 2001 From: megasaturnv Date: Mon, 5 Sep 2022 15:43:53 +0100 Subject: [PATCH 120/134] Moved case-insensitive username checks to SQL --- web/includes/auth.php | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/web/includes/auth.php b/web/includes/auth.php index df03ed539..14fc4af9d 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -58,14 +58,13 @@ function migrateHash($user, $pass) { // core function used to load a User record by username and password function validateUser($username='', $password='') { - $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; - // local user, shouldn't affect the global user - $user = null; // Not global if (ZM_CASE_INSENSITIVE_USERNAMES) { - $user = dbFetchOne($sql, NULL, array(strtolower($username))); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND LOWER(Username)=LOWER(?)'; } else { - $user = dbFetchOne($sql, NULL, array($username)); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; } + // local user, shouldn't affect the global user + $user = dbFetchOne($sql, NULL, array($username)); // Not global if (!$user) { return array(false, "Could not retrieve user $username details"); } @@ -137,7 +136,11 @@ function validateToken($token, $allowed_token_type='access') { } $username = $jwt_payload['user']; - $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; + if (ZM_CASE_INSENSITIVE_USERNAMES) { + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND LOWER(Username)=LOWER(?)'; + } else { + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; + } $saved_user_details = dbFetchOne($sql, NULL, array($username)); if ($saved_user_details) { @@ -192,7 +195,11 @@ function getAuthUser($auth) { if (isset($_SESSION['username'])) { # In a multi-server case, we might be logged in as another user and so the auth hash didn't work - $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND Username != ?'; + if (ZM_CASE_INSENSITIVE_USERNAMES) { + $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND LOWER(Username) != LOWER(?)'; + } else { + $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND Username != ?'; + } foreach (dbFetchAll($sql, NULL, $values) as $user) { $now = time(); @@ -272,12 +279,12 @@ function userFromSession() { ZM\Debug('No auth hash in session, there should have been'); } else { # Need to refresh permissions and validate that the user still exists - $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; if (ZM_CASE_INSENSITIVE_USERNAMES) { - $user = dbFetchOne($sql, NULL, array(strtolower($_SESSION['username']))); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND LOWER(Username)=LOWER(?)'; } else { - $user = dbFetchOne($sql, NULL, array($_SESSION['username'])); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; } + $user = dbFetchOne($sql, NULL, array($_SESSION['username'])); } } return $user; @@ -325,13 +332,13 @@ if (ZM_OPT_USE_AUTH) { } $user = $ret[0]; } else if ((ZM_AUTH_TYPE == 'remote') and !empty($_SERVER['REMOTE_USER'])) { - $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; - // local user, shouldn't affect the global user if (ZM_CASE_INSENSITIVE_USERNAMES) { - $user = dbFetchOne($sql, NULL, array(strtolower($_SERVER['REMOTE_USER']))); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND LOWER(Username)=LOWER(?)'; } else { - $user = dbFetchOne($sql, NULL, array($_SERVER['REMOTE_USER'])); + $sql = 'SELECT * FROM Users WHERE Enabled=1 AND Username=?'; } + // local user, shouldn't affect the global user + $user = dbFetchOne($sql, NULL, array($_SERVER['REMOTE_USER'])); } else { $user = userFromSession(); } From f094a2c76bd1573ce4ed328f3deecb9ad6a675a4 Mon Sep 17 00:00:00 2001 From: megasaturnv Date: Mon, 5 Sep 2022 15:49:26 +0100 Subject: [PATCH 121/134] Modified description for ZM_CASE_INSENSITIVE_USERNAMES --- docs/userguide/options/options_system.rst | 2 +- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/userguide/options/options_system.rst b/docs/userguide/options/options_system.rst index b6a1f01ff..5e6c58c12 100644 --- a/docs/userguide/options/options_system.rst +++ b/docs/userguide/options/options_system.rst @@ -16,7 +16,7 @@ OPT_USE_AUTH - ZoneMinder can run in two modes. The simplest is an entirely unau AUTH_TYPE - ZoneMinder can use two methods to authenticate users when running in authenticated mode. The first is a builtin method where ZoneMinder provides facilities for users to log in and maintains track of their identity. The second method allows interworking with other methods such as http basic authentication which passes an independently authenticated 'remote' user via http. In this case ZoneMinder would use the supplied user without additional authentication provided such a user is configured in ZoneMinder. -CASE_INSENSITIVE_USERNAMES - This option makes usernames case insensitive when authenticating. Matches against lower-case usernames in the database. May be used with "remote" AUTH_TYPE and LDAP authentication. +CASE_INSENSITIVE_USERNAMES - This option makes usernames case insensitive when authenticating. AUTH_RELAY - When ZoneMinder is running in authenticated mode it can pass user details between the web pages and the back end processes. There are two methods for doing this. This first is to use a time limited hashed string which contains no direct username or password details, the second method is to pass the username and passwords around in plaintext. This method is not recommend except where you do not have the md5 libraries available on your system or you have a completely isolated system with no external access. You can also switch off authentication relaying if your system is isolated in other ways. diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 092a1d8fa..9c8164a9b 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -319,9 +319,7 @@ our @options = ( description => 'Case insensitive username authentication', help => q` This option makes usernames case insensitive when - authenticating. Matches against lower-case usernames in the - database. May be used with "remote" AUTH_TYPE and LDAP - authentication. + authenticating. `, requires => [ { name=>'ZM_OPT_USE_AUTH', value=>'yes' } ], type => $types{boolean}, From f431ab9e45d2e469ae0d88a179bc0ff2d5372698 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 7 Sep 2022 09:31:50 -0400 Subject: [PATCH 122/134] Slightly smarted UriEncode, which doens't include numbers and a few other valid characters. Needs more work and tests. --- src/zm_utils.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/zm_utils.cpp b/src/zm_utils.cpp index d7fbe4a92..6c03c0578 100644 --- a/src/zm_utils.cpp +++ b/src/zm_utils.cpp @@ -22,6 +22,7 @@ #include "zm_config.h" #include "zm_logger.h" #include +#include #include #include #include /* Definition of AT_* constants */ @@ -385,14 +386,15 @@ std::string UriEncode(const std::string &value) { retbuf.reserve(value.length() * 3); // at most all characters get replaced with the escape char tmp[5] = ""; - while(*src) { - if ( *src == ' ' ) { + while (*src) { + std::string::value_type c = *src; + if (c == ' ') { retbuf.append("%%20"); - } else if ( !( (*src >= 'a' && *src <= 'z') || (*src >= 'A' && *src <= 'Z') ) ) { - sprintf(tmp, "%%%02X", *src); - retbuf.append(tmp); + } else if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { + retbuf.push_back(c); } else { - retbuf.push_back(*src); + sprintf(tmp, "%%%02X", c); + retbuf.append(tmp); } src++; } From e2bd72b6a0c93ac4f4bd28fbfc156b4d4ae05d7b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 6 Sep 2022 16:12:54 -0400 Subject: [PATCH 123/134] Fix eslint --- web/skins/classic/views/js/events.js | 30 ++++++++++++++-------------- web/skins/classic/views/js/log.js | 18 ++++++++--------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/web/skins/classic/views/js/events.js b/web/skins/classic/views/js/events.js index 42dca1aa5..c5b32c956 100644 --- a/web/skins/classic/views/js/events.js +++ b/web/skins/classic/views/js/events.js @@ -44,19 +44,19 @@ function ajaxRequest(params) { data: params.data, timeout: 0, success: function(data) { - if (data.result == 'Error') { - alert(data.message); - return; - } - var rows = processRows(data.rows); - // rearrange the result into what bootstrap-table expects - params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: rows}); - }, + if (data.result == 'Error') { + alert(data.message); + return; + } + var rows = processRows(data.rows); + // rearrange the result into what bootstrap-table expects + params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: rows}); + }, error: function(jqXHR) { console.log("error", jqXHR); - //logAjaxFail(jqXHR); - //$j('#eventTable').bootstrapTable('refresh'); - } + //logAjaxFail(jqXHR); + //$j('#eventTable').bootstrapTable('refresh'); + } }); } @@ -116,8 +116,8 @@ function getDelConfirmModal() { manageDelConfirmModalBtns(); }) .fail(function(jqXHR) { - console.log("error getting delconfirm", jqXHR); - logAjaxFail(jqXHR); + console.log("error getting delconfirm", jqXHR); + logAjaxFail(jqXHR); }); } @@ -182,7 +182,7 @@ function getEventDetailModal(eid) { $j('#eventDetailForm').submit(); }); }) - .fail(function(jqxhr){ + .fail(function(jqxhr) { console.log("Fail get event details"); logAjaxFail(jqxhr); }); @@ -194,7 +194,7 @@ function getObjdetectModal(eid) { insertModalHtml('objdetectModal', data.html); $j('#objdetectModal').modal('show'); }) - .fail(function(jqxhr){ + .fail(function(jqxhr) { console.log("Fail get objdetect details"); logAjaxFail(jqxhr); }); diff --git a/web/skins/classic/views/js/log.js b/web/skins/classic/views/js/log.js index b6166cd15..3188ca37f 100644 --- a/web/skins/classic/views/js/log.js +++ b/web/skins/classic/views/js/log.js @@ -32,15 +32,15 @@ function ajaxRequest(params) { data: params.data, timeout: 0, success: function(data) { - //console.log('Ajax parameters: ' + JSON.stringify(params)); - // rearrange the result into what bootstrap-table expects - params.success({ - total: data.total, - totalNotFiltered: data.totalNotFiltered, - rows: processRows(data.rows) - }); - updateHeaderStats(data); - }, + //console.log('Ajax parameters: ' + JSON.stringify(params)); + // rearrange the result into what bootstrap-table expects + params.success({ + total: data.total, + totalNotFiltered: data.totalNotFiltered, + rows: processRows(data.rows) + }); + updateHeaderStats(data); + }, error: function(jqxhr) { logAjaxFail(jqxhr); } From fd52e7326885825a8e55d8b5a9eeea87f75f2a4c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 8 Sep 2022 11:50:16 -0400 Subject: [PATCH 124/134] Add time ticks to progressbar with a mouseover highlight --- web/skins/classic/css/base/views/event.css | 31 ++++++- web/skins/classic/views/event.php | 3 +- web/skins/classic/views/js/event.js | 102 ++++++++++++++++++--- 3 files changed, 118 insertions(+), 18 deletions(-) diff --git a/web/skins/classic/css/base/views/event.css b/web/skins/classic/css/base/views/event.css index 851638632..7efffb9b4 100644 --- a/web/skins/classic/css/base/views/event.css +++ b/web/skins/classic/css/base/views/event.css @@ -10,23 +10,35 @@ display: inline-block; } +#alarmCues, .alarmCue { + position: relative; + background: none; + + /* background-color: #222222; - height: 1.25em; + */ + height: 16px; text-align: left; margin: 0 auto 0 auto; - border-radius: 0 0 .3em .3em; + z-index: 10; } -.alarmCue span { - background-color:red; +#alarmCues span { height: 100%; display: inline-block; border-radius: 0; + z-index: 11; +} + +span.alarmCue { + background-color:red; + z-index: 9; } span.noneCue { background: none; + z-index: 9; } #header { @@ -150,16 +162,27 @@ height: 100%; #progressBar { position: relative; + /* top: -1.25em; + */ height: 1.25em; + /* margin: 0 auto -1.25em auto; + */ + margin: 0; + z-index: 5; } #progressBar .progressBox { transition: width .1s; height: 100%; + position: absolute; + top: 0; background: rgba(170, 170, 170, .7); + /* border-radius: 0 0 .3em .3em; + */ + z-index: 5; } #eventStills { diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 6f108f18d..a884fc723 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -245,9 +245,10 @@ if ( (ZM_WEB_STREAM_METHOD == 'mpeg') && ZM_MPEG_LIVE_FORMAT ) { } } // end if stream method ?> -
+
+
'; + } + + if (!(cueFrames && cueFrames.length)) { console.log('No cue frames for event'); - return; + return html; } // This uses the Delta of the last frame to get the length of the event. I can't help but wonder though // if we shouldn't just use the event length endtime-starttime @@ -125,10 +153,10 @@ function renderAlarmCues(containerEl) { var pixSkew = 0; var skip = 0; var num_cueFrames = cueFrames.length; - for ( var i = 0; i < num_cueFrames; i++ ) { + for (let i=0; i < num_cueFrames; i++) { skip = 0; frame = cueFrames[i]; - if ( (frame.Type == 'Alarm') && (alarmed == 0) ) { //From nothing to alarm. End nothing and start alarm. + if ((frame.Type == 'Alarm') && (alarmed == 0)) { //From nothing to alarm. End nothing and start alarm. alarmed = 1; if (frame.Delta == 0) continue; //If event starts with an alarm or too few for a nonespan spanTimeEnd = frame.Delta * 100; @@ -140,7 +168,9 @@ function renderAlarmCues(containerEl) { pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - alarmHtml += ''; + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; spanTimeStart = spanTimeEnd; } else if ( (frame.Type !== 'Alarm') && (alarmed == 1) ) { //from alarm to nothing. End alarm and start nothing. futNone = 0; @@ -170,7 +200,9 @@ function renderAlarmCues(containerEl) { pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - alarmHtml += ''; + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; spanTimeStart = spanTimeEnd; } else if ( (frame.Type == 'Alarm') && (alarmed == 1) && (i + 1 >= cueFrames.length) ) { //event ends on an alarm spanTimeEnd = frame.Delta * 100; @@ -178,10 +210,13 @@ function renderAlarmCues(containerEl) { alarmed = 0; pix = Math.round(cueRatio * spanTime); if (pixSkew >= .5 || pixSkew <= -.5) pix += Math.round(pixSkew); - alarmHtml += ''; + + const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. + date.setSeconds(spanTimeStart); + alarmHtml += ''+date.toISOString().substr(11, 8)+''; } } - return alarmHtml; + return html + alarmHtml; } function changeCodec() { @@ -194,13 +229,14 @@ function changeScale() { var newHeight; var autoScale; var eventViewer = $j(vid ? '#videoobj' : '#videoFeed'); - var alarmCue = $j('div.alarmCue'); + var alarmCue = $j('#alarmCues'); var bottomEl = $j('#replayStatus'); if (scale == '0') { var newSize = scaleToFit(eventData.Width, eventData.Height, eventViewer, bottomEl); newWidth = newSize.width; newHeight = newSize.height; + newHeight = 'auto'; autoScale = newSize.autoScale; } else { $j(window).off('resize', endOfResize); //remove resize handler when Scale to Fit is not active @@ -766,8 +802,14 @@ function updateProgressBar() { if (!(eventData && streamStatus)) { return; } // end if ! eventData && streamStatus - var curWidth = (streamStatus.progress / parseFloat(eventData.Length)) * 100; - $j("#progressBox").css('width', curWidth + '%'); + const curWidth = (streamStatus.progress / parseFloat(eventData.Length)) * 100; + + const progressDate = new Date(eventData.StartDateTime); + progressDate.setTime(progressDate.getTime() + (streamStatus.progress*1000)); + + const progressBox = $j("#progressBox"); + progressBox.css('width', curWidth + '%'); + progressBox.attr('title', progressDate.toLocaleTimeString()); } // end function updateProgressBar() // Handles seeking when clicking on the progress bar. @@ -777,6 +819,40 @@ function progressBarNav() { var seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); streamSeek(seekTime); }); + $j('#progressBar').mouseover(function(e) { + let x = e.pageX - $j(this).offset().left; + if (x<0) x=0; + console.log(x); + const seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); + const indicator = document.getElementById('indicator'); + indicator.style.display = 'block'; + indicator.style.left = x + 'px'; + indicator.setAttribute('title', seekTime); + }); + $j('#progressBar').mouseout(function(e) { + const indicator = document.getElementById('indicator'); + indicator.style.display = 'none'; + }); + $j('#progressBar').mousemove(function(e) { + const bar = $j(this); + + let x = e.pageX - bar.offset().left; + if (x<0) x=0; + if (x > bar.width()) x = bar.width(); + + console.log(x); + let seekTime = (x / bar.width()) * parseFloat(eventData.Length); + + console.log(seekTime); + const indicator = document.getElementById('indicator'); + + const date = new Date(eventData.StartDateTime); + date.setTime(date.getTime() + (seekTime*1000)); + + indicator.innerHTML = date.toLocaleTimeString(); + indicator.style.left = x+'px'; + indicator.setAttribute('title', seekTime); + }); } function handleClick(event) { @@ -932,7 +1008,7 @@ function initPage() { if ($j('#videoobj').length) { vid = videojs('videoobj'); addVideoTimingTrack(vid, LabelFormat, eventData.MonitorName, eventData.Length, eventData.StartDateTime); - $j('.vjs-progress-control').append('
');//add a place for videojs only on first load + $j('.vjs-progress-control').append('
');//add a place for videojs only on first load vid.on('ended', vjsReplay); vid.on('play', vjsPlay); vid.on('pause', pauseClicked); From f3e04ca212832d0c88e4de6dd9ebd86e69a75e00 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 12 Sep 2022 16:05:30 -0400 Subject: [PATCH 125/134] shorten and move up the indicator --- web/skins/classic/views/event.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index a884fc723..49b785919 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -248,7 +248,7 @@ if ( (ZM_WEB_STREAM_METHOD == 'mpeg') && ZM_MPEG_LIVE_FORMAT ) {
- +
Date: Mon, 12 Sep 2022 16:05:53 -0400 Subject: [PATCH 126/134] don't let position go negative in onclick progressbar --- web/skins/classic/views/js/event.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 0ad922cc7..c665ab590 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -815,8 +815,10 @@ function updateProgressBar() { // Handles seeking when clicking on the progress bar. function progressBarNav() { $j('#progressBar').click(function(e) { - var x = e.pageX - $j(this).offset().left; - var seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); + let x = e.pageX - $j(this).offset().left; + if (x<0) x=0; + const seekTime = (x / $j('#progressBar').width()) * parseFloat(eventData.Length); + console.log("clicked at ", x, seekTime); streamSeek(seekTime); }); $j('#progressBar').mouseover(function(e) { From 4624a53a90944f55ea93775a126c01d1406e2668 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 13 Sep 2022 17:58:30 -0400 Subject: [PATCH 127/134] Show time segments in progress bar. Fix alarm cues. --- dep/RtspServer | 2 +- web/skins/classic/css/base/views/event.css | 27 +++++++++++----- web/skins/classic/views/event.php | 2 +- web/skins/classic/views/js/event.js | 36 +++++++++++++--------- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/dep/RtspServer b/dep/RtspServer index 1b40f1661..eab328514 160000 --- a/dep/RtspServer +++ b/dep/RtspServer @@ -1 +1 @@ -Subproject commit 1b40f1661f93f50fd5805f239d1e466a3bcf888f +Subproject commit eab32851421ffe54fec0229c3efc44c642bc8d46 diff --git a/web/skins/classic/css/base/views/event.css b/web/skins/classic/css/base/views/event.css index 7efffb9b4..56ae5dce5 100644 --- a/web/skins/classic/css/base/views/event.css +++ b/web/skins/classic/css/base/views/event.css @@ -12,7 +12,7 @@ #alarmCues, .alarmCue { - position: relative; + position: absolute; background: none; /* @@ -22,18 +22,25 @@ text-align: left; margin: 0 auto 0 auto; z-index: 10; + border: none; + border-right: 1px solid black; } #alarmCues span { - height: 100%; - display: inline-block; - border-radius: 0; - z-index: 11; + border-left: 1px solid black; + top: 0; + position: absolute; + height: 100%; + display: inline-block; + border-radius: 0; + z-index: 11; + font-size: 8px; } span.alarmCue { - background-color:red; - z-index: 9; + background-color:red; + z-index: 9; + opacity: 0.33; } span.noneCue { @@ -311,3 +318,9 @@ svg.zones { #toggleZonesButton span.material-icons { font-size: 18px; } +#indicator { + height: 2.75em; + position: absolute; + border-left: 1px solid blue; + margin-top: -1.25em; +} diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 49b785919..8f37d1526 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -248,7 +248,7 @@ if ( (ZM_WEB_STREAM_METHOD == 'mpeg') && ZM_MPEG_LIVE_FORMAT ) {
- +
cueFrames[cueFrames.length - 1].Delta) ? eventData.Length : cueFrames[cueFrames.length - 1].Delta; + let span_count = 10; + let span_seconds = parseInt(event_length / span_count); + let span_width = parseInt(containerEl.width() / span_count); + console.log(span_width, containerEl.width(), span_count); + //let span_width = const date = new Date(eventData.StartDateTime); - for (let i=0; i< eventData.Length; i++) { - date.setTime(date.getTime() + 1000); - html += ''; + for (let i=0; i < span_count; i += 1) { + html += ''+date.toLocaleTimeString()+''; + date.setTime(date.getTime() + span_seconds*1000); } if (!(cueFrames && cueFrames.length)) { @@ -144,7 +149,7 @@ function renderAlarmCues(containerEl) { } // This uses the Delta of the last frame to get the length of the event. I can't help but wonder though // if we shouldn't just use the event length endtime-starttime - var cueRatio = containerEl.width() / (cueFrames[cueFrames.length - 1].Delta * 100); + var cueRatio = containerEl.width() / (event_length * 100); var minAlarm = Math.ceil(1/cueRatio); var spanTimeStart = 0; var spanTimeEnd = 0; @@ -153,24 +158,28 @@ function renderAlarmCues(containerEl) { var pixSkew = 0; var skip = 0; var num_cueFrames = cueFrames.length; + let left = 0; + for (let i=0; i < num_cueFrames; i++) { skip = 0; frame = cueFrames[i]; + if ((frame.Type == 'Alarm') && (alarmed == 0)) { //From nothing to alarm. End nothing and start alarm. alarmed = 1; if (frame.Delta == 0) continue; //If event starts with an alarm or too few for a nonespan spanTimeEnd = frame.Delta * 100; spanTime = spanTimeEnd - spanTimeStart; - var pix = cueRatio * spanTime; + let pix = cueRatio * spanTime; pixSkew += pix - Math.round(pix);//average out the rounding errors. pix = Math.round(pix); if ((pixSkew > 1 || pixSkew < -1) && pix + Math.round(pixSkew) > 0) { //add skew if it's a pixel and won't zero out span. pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. - date.setSeconds(spanTimeStart); - alarmHtml += ''+date.toISOString().substr(11, 8)+''; + + alarmHtml += ''; + left = parseInt((frame.Delta / event_length) * containerEl.width()); + console.log(left, frame.Delta, event_length, containerEl.width()); spanTimeStart = spanTimeEnd; } else if ( (frame.Type !== 'Alarm') && (alarmed == 1) ) { //from alarm to nothing. End alarm and start nothing. futNone = 0; @@ -200,9 +209,8 @@ function renderAlarmCues(containerEl) { pix += Math.round(pixSkew); pixSkew = pixSkew - Math.round(pixSkew); } - const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. - date.setSeconds(spanTimeStart); - alarmHtml += ''+date.toISOString().substr(11, 8)+''; + alarmHtml += ''; + left = parseInt((frame.Delta / event_length) * containerEl.width()); spanTimeStart = spanTimeEnd; } else if ( (frame.Type == 'Alarm') && (alarmed == 1) && (i + 1 >= cueFrames.length) ) { //event ends on an alarm spanTimeEnd = frame.Delta * 100; @@ -211,9 +219,7 @@ function renderAlarmCues(containerEl) { pix = Math.round(cueRatio * spanTime); if (pixSkew >= .5 || pixSkew <= -.5) pix += Math.round(pixSkew); - const date = new Date(0); // Have to init it fresh. setSeconds seems to add time, not set it. - date.setSeconds(spanTimeStart); - alarmHtml += ''+date.toISOString().substr(11, 8)+''; + alarmHtml += ''; } } return html + alarmHtml; From b4fc5abe9561afbe22f18b8f75f8c8180932b6c8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 12 Sep 2022 09:22:24 -0400 Subject: [PATCH 128/134] Failure to auth by hash is common, the end result is a redirect to login page. Change the log level to INF --- web/includes/auth.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/auth.php b/web/includes/auth.php index 14fc4af9d..d7933a0ee 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -196,7 +196,7 @@ function getAuthUser($auth) { if (isset($_SESSION['username'])) { # In a multi-server case, we might be logged in as another user and so the auth hash didn't work if (ZM_CASE_INSENSITIVE_USERNAMES) { - $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND LOWER(Username) != LOWER(?)'; + $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND LOWER(Username) != LOWER(?)'; } else { $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND Username != ?'; } @@ -216,7 +216,7 @@ function getAuthUser($auth) { } // end if } // end if using auth hash - ZM\Error("Unable to authenticate user from auth hash '$auth'"); + ZM\Info("Unable to authenticate user from auth hash '$auth'"); return null; } // end getAuthUser($auth) From 6936a3547c023b6bb2b6ffdb00d95d9e3238d28c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 12 Sep 2022 13:06:03 -0400 Subject: [PATCH 129/134] shared data is frequently not valid or zmc not running. These shouldn't be errors as they generated too much noise. We can generate errors higher up. --- scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in | 2 +- scripts/ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in index f1c5972c9..78c374159 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in @@ -275,7 +275,7 @@ sub zmMemVerify { } $valid = zmMemRead($monitor, 'shared_data:valid', 1); if (!$valid) { - Error("Shared data not valid for monitor $$monitor{Id}"); + Debug(1, "Shared data not valid for monitor $$monitor{Id}"); return undef; } } else { diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm b/scripts/ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm index d76bbae9a..8bcece8c8 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm @@ -87,7 +87,7 @@ sub zmMemAttach { my $mmap_file = $Config{ZM_PATH_MAP}.'/zm.mmap.'.$monitor->{Id}; if ( ! -e $mmap_file ) { - Error("Memory map file '$mmap_file' does not exist in zmMemAttach. zmc might not be running."); + Debug(1, "Memory map file '$mmap_file' does not exist in zmMemAttach. zmc might not be running."); return undef; } my $mmap_file_size = -s $mmap_file; From 715122e93a971a178192df804f0b93db3b884bc1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 14 Sep 2022 17:02:05 +0000 Subject: [PATCH 130/134] Spacing, ignore auth_relay, clean up clickLogout a bit --- web/skins/classic/js/skin.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index 098b5be53..8a1cf9500 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -334,7 +334,7 @@ if ( currentView != 'none' && currentView != 'login' ) { function insertModalHtml(name, html) { var modal = $j('#' + name); - if ( modal.length ) { + if (modal.length) { modal.replaceWith(html); } else { $j("body").append(html); @@ -360,13 +360,13 @@ if ( currentView != 'none' && currentView != 'login' ) { if (error == 'Unauthorized') { window.location.reload(true); } - if ( ! jqxhr.responseText ) { + if (!jqxhr.responseText) { console.log("No responseText in jqxhr"); console.log(jqxhr); return; } console.log("Response Text: " + jqxhr.responseText.replace(/(<([^>]+)>)/gi, '')); - if ( textStatus != "timeout" ) { + if (textStatus != "timeout") { // The idea is that this should only fail due to auth, so reload the page // which should go to login if it can't stay logged in. window.location.reload(true); @@ -375,29 +375,30 @@ if ( currentView != 'none' && currentView != 'login' ) { } function setNavBar(data) { - if ( !data ) { + if (!data) { console.error("No data in setNavBar"); return; } - if ( data.auth ) { - if ( data.auth != auth_hash ) { + if (data.auth) { + if (data.auth != auth_hash) { console.log("Update auth_hash to "+data.auth); // Update authentication token. auth_hash = data.auth; } } - if ( data.auth_relay ) { + if (data.auth_relay) { auth_relay = data.auth_relay; } // iterate through all the keys then update each element id with the same name for (var key of Object.keys(data)) { if ( key == "auth" ) continue; + if ( key == "auth_relay" ) continue; if ( $j('#'+key).hasClass("show") ) continue; // don't update if the user has the dropdown open if ( $j('#'+key).length ) $j('#'+key).replaceWith(data[key]); if ( key == 'getBandwidthHTML' ) bwClickFunction(); } } -} +} // end if ( currentView != 'none' && currentView != 'login' ) //Shows a message if there is an error in the streamObj or the stream doesn't exist. Returns true if error, false otherwise. function checkStreamForErrors(funcName, streamObj) { @@ -441,7 +442,7 @@ function secsToTime( seconds ) { } timeString = timeHours+":"+timeMins+":"+timeSecs; } - return ( timeString ); + return timeString; } function submitTab(evt) { @@ -712,11 +713,13 @@ function getLogoutModal() { .fail(logAjaxFail); } function clickLogout() { - if ( ! $j('#modalLogout').length ) { + const modalLogout = $j('#modalLogout'); + + if (!modalLogout.length) { getLogoutModal(); return; } - $j('#modalLogout').modal('show'); + modalLogout.modal('show'); } function getStateModal() { From 46de7afb0f235cd113e5611d249ddc4ddfd7ebe1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 14 Sep 2022 17:00:59 +0000 Subject: [PATCH 131/134] Add fade to the logout modal which for some reason fixes it not showing after a hide --- web/ajax/modals/logout.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ajax/modals/logout.php b/web/ajax/modals/logout.php index c9df1a586..72958079f 100644 --- a/web/ajax/modals/logout.php +++ b/web/ajax/modals/logout.php @@ -19,7 +19,7 @@ // global $CLANG; ?> -