From a944762830e71be6e279ba71b19229a1b9330c0d Mon Sep 17 00:00:00 2001 From: simon987 Date: Sun, 31 May 2020 13:50:21 +0000 Subject: [PATCH] Initial commit --- .gitignore | 1 + css/style.css | 338 ++++++++++++++++++++++++++ images/checkup.png | Bin 0 -> 10417 bytes images/degraded.png | Bin 0 -> 1226 bytes images/favicon.png | Bin 0 -> 5135 bytes images/incident.png | Bin 0 -> 980 bytes images/ok.png | Bin 0 -> 569 bytes images/status-gray.png | Bin 0 -> 1596 bytes images/status-green.png | Bin 0 -> 1845 bytes images/status-red.png | Bin 0 -> 1868 bytes images/status-yellow.png | Bin 0 -> 1792 bytes index.html | 48 ++++ js/checkup.js | 231 ++++++++++++++++++ js/config.js | 30 +++ js/d3.v3.min.js | 5 + js/fs.js | 68 ++++++ js/s3.js | 105 ++++++++ js/statuspage.js | 513 +++++++++++++++++++++++++++++++++++++++ 18 files changed, 1339 insertions(+) create mode 100644 .gitignore create mode 100644 css/style.css create mode 100644 images/checkup.png create mode 100644 images/degraded.png create mode 100755 images/favicon.png create mode 100644 images/incident.png create mode 100644 images/ok.png create mode 100755 images/status-gray.png create mode 100755 images/status-green.png create mode 100755 images/status-red.png create mode 100755 images/status-yellow.png create mode 100644 index.html create mode 100644 js/checkup.js create mode 100644 js/config.js create mode 100644 js/d3.v3.min.js create mode 100644 js/fs.js create mode 100644 js/s3.js create mode 100644 js/statuspage.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1269488 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +data diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..5f454ea --- /dev/null +++ b/css/style.css @@ -0,0 +1,338 @@ +* { + padding: 0; + margin: 0; +} + +body { + font-family: 'Source Sans Pro', sans-serif; + font-size: 16px; +} + +header { + margin-bottom: 20px; + box-shadow: 0 2px 100px rgba(0, 0, 0, .15); + transition: background-color 2s ease; + border-bottom: 1px solid #FFF; +} + +main { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + padding: 0 15px; +} + +#chart-grid { + display: flex; + flex-wrap: wrap; + align-content: flex-start; + width: 75%; +} + +.chart-50 { width: 50%; } +.chart-100 { width: 100%; } + +#overall-status-text { + #padding: 50px 10px 10px 10px; + color: #FFF; +} + +#overall-status.green { background-color: #40D24C; } +#overall-status.yellow { background-color: #D2C640; } +#overall-status.red { background-color: #D24040; } +#overall-status.gray { background-color: #B8B8B8; } + +#overall-status-text { + font: bold 42px 'Source Sans Pro', sans-serif; + text-transform: uppercase; + text-align: center; + line-height: 1em; +} + +.infobar { + font-size: 12px; + font-family: sans-serif; + padding: 10px; + background: rgba(255, 255, 255, .8); +} + +.infobar .item { + display: inline-block; + margin-right: 2em; +} + +#timeline { + width: 25%; + position: relative; + z-index: 1; +} + +#timeline > div { + position: relative; + z-index: 2; + margin: 2em 0; +} + +#timeline > div:first-child { + margin-top: 0; +} + +#timeline .message { + font-size: 14px; + border-width: 1px; + border-style: solid; + background: #FFF; + margin-left: 2.25em; +} + +#timeline .message-head, +#timeline .message-body { + padding: 8px; +} + +#timeline .message-head { + color: #FFF; + padding-top: 4px; + padding-bottom: 4px; + font-size: 12px; +} + +#timeline .message.green { border-color: #40D24C; } +#timeline .message.green .message-head { background-color: #40D24C; } +#timeline .message.yellow { border-color: #FFAC3B; } +#timeline .message.yellow .message-head { background-color: #FFAC3B; } +#timeline .message.red { border-color: #D24040; } +#timeline .message.red .message-head { background-color: #D24040; } + +#timeline .event { + line-height: 2em; + background-repeat: no-repeat; + background-size: auto 2em; + padding-left: 3em; +} + +#timeline .event.green { background-image: url('../images/status-green.png'); } +#timeline .event.yellow { background-image: url('../images/status-yellow.png'); } +#timeline .event.red { background-image: url('../images/status-red.png'); } +#timeline .event.gray { background-image: url('../images/status-gray.png'); } + +#timeline .event .time { + margin-right: .25em; + font-weight: bold; +} + +#timeline #bg-line { + position: absolute; + height: 100%; + border-left: 3px solid #EEE; + left: 16px; + top: 0; + margin: 0; + z-index: 0; +} + + + +#big-gap { + display: none; + color: #CC0000; + padding-left: 3em; + font-size: 14px; +} + + + + +.chart { + padding-bottom: 20px; +} + +.chart-title { + font-weight: bold; + text-align: center; +} + +.chart-title a { + color: #2D6F96; + text-decoration: none; +} + +.chart-title a:hover { + text-decoration: underline; +} + +svg { + font: 10px sans-serif; + max-width: 100%; /* thanks for nothin, Safari */ +} + +.chart-container .chart svg { + font-size: 16px; +} + +.axis path, +.axis line { + fill: none; + stroke: #CCC; + stroke-width: 1px; + shape-rendering: crispEdges; + stroke-linecap: square; +} + +.line { + fill: none; + stroke: #CCC; + stroke-width: 1px; +} + +.chart-container .chart .line { + stroke-width: 1px; +} + +.min.line, +.max.line { + stroke-dasharray: 1, 1; +} + +.chart-container .chart .min.line, +.chart-container .chart .max.line { + stroke-width: 2px; + stroke-dasharray: 5, 2; +} + +.chart-container .chart .tolerance.line { + stroke-width: 1px; + stroke-dasharray: 5, 5; +} + +.line.min { + stroke: #B1DC9C; +} + +.line.main { + stroke: #333; + stroke-linecap: round; +} + +.line.max { + stroke: #FFA447; +} + +.line.tolerance { + stroke: #FF7070; +} + +.overlay { + fill: none; + pointer-events: all; +} + +.focus circle { + fill: #333; + stroke: #333; +} + +.focus text { + font-size: 16px; + + /* this nonsense makes it look halfway decent across browsers */ + text-shadow: + 1px 1px 0 #FFF, + -1px -1px 0 #FFF, + 1px -1px 0 #FFF, + -1px 1px 0 #FFF; +} + +footer { + padding: 50px; + font-size: 12px; + color: #AAA; + font-family: sans-serif; + text-align: center; +} + +#checkup-logo { + height: 1.75em; + vertical-align: top; + margin-left: 3px; +} + + + + +@media (max-width: 1200px) { + .focus text { + font-size: 22px; + } + + #chart-grid { width: 70%; } + #timeline { width: 30%; } +} + +@media (max-width: 1050px) { + #chart-grid { width: 70%; } + #timeline { width: 30%; } +} + + +@media (max-width: 899px) { + #chart-grid { width: 60%; } + #timeline { width: 40%; } + .chart-50 { width: 100%; } + + #overall-status-text { + font-size: 34px; + padding: 15px; + } + + #timeline .message { + font-size: 16px; + } + + .infobar .item { + margin-right: 1em; + } + + .message { + font-size: 16px; + } + + .message-head, + .message-body { + padding: 16px; + } + + .message-head { + padding-top: 6px; + padding-bottom: 6px; + font-size: 14px; + } + + svg { + font-size: 20px; + } + + .axis path, + .axis line { + stroke: #DDD; + stroke-width: 2px; + } + + .line { + stroke-width: 1px; + } + + .min.line, + .max.line { + stroke-dasharray: 4, 3; + } + + .focus text { + font-size: 20px; + } +} + +@media (max-width: 600px) { + #chart-grid { width: 100%; } + #timeline { width: 100%; } +} diff --git a/images/checkup.png b/images/checkup.png new file mode 100644 index 0000000000000000000000000000000000000000..861e2543891cd91470e055c79ebf0672dc07162b GIT binary patch literal 10417 zcmW++1yCDL7ssVVf)yzi2*r!L1cJL1DNcdn?ykY1xD*Rs++B-16faPuNO5=n^8aRb zZr;tj-S?B-+q<2MR8^M2ena*K0RaJ9PF7MK0RagDk83cH;n%s2b4&yTWCT@34Jr7o zdq#Ig>okvf7`2u=+m`?(@6?YbfuU6c%*KA+uoe;LSTa>dtN5~r(w?A#4r(ozsEU4r z$b3cbRJV+J&#WdAWm~(HDyPgkuk5Di%05N|?})NqDoqzEO=sJr3dhtMZu4N{$O0v= z6r+fIht%rm@;*6_#1FcjVWqthB|W?rP_{4r9+?e%mZ9)CxTuTAJcL2tE3&MY!!%IJ zC63~glXXHljh35BdM%}fvrb5kpiKm?71S`ikVe}Tjw-ac+b*e+O2b(@IHz)G9p0Dr zvzw&zH%_x4IA9hdUwC6P2@tW3WH$1ZbxTn8N#(Z+g?ACO4$}#NNjQH?t{;>4NYV<< z_Rni=o7shf@qxAIKy%j9COi!uM3(l#iOaaf8%Gwxq1q%? zP=0cP*M$fEd2Mibf%)wKSquHp+}hEN{LXnXhv?+GQDSAg_L*IHqto$#!vJcz!o~Sd z?W{%>pHy0HH&$amWR7z4+t z?*ARGk48X-Lvj_|R=7cMI&cf%vV0E7miI`sj4M_2O4bX7!CA<h!!H??8BWon03($EOL2J&6il|Lb%0C4DuW@$0r z<6wNul4lO21%PA&`9MS&9FrqI3xhNx{ru#3znjay_tQE)%7TdUtTg_}ab`YP`xWlb zLVok-Vjz{3_G)vo4wmKX>|~@Uez!Z*7!?u9zrQg-^nDR#40{msXGWvI7K z<7TqG;ES==&GF&hpTW+iyW88FtF@`Iiid~8gZpQZQ5CMzvYH@`D8FR~v0c9=K6 zWkWy!b;(JJYj`dnEgQ&w`a(W*z8+(Y#fgTB+Rh+u849S#Cys~}Ty-PDtH{5Num`o3 zGBDKV4oBtJ5$BV+b?|Tf2C{M)E&n5=<>Q%~3!`<;CGJa`SS=B;C>G_a+~*J3J@U6-AYQPR5$tER+IOWnr3jk6ng9j%zq)ML4nm^ z0H7lhrJRy%;_Rv+uk;@FK@1z#ef={JDgDx8XD&q{|v! ze;rSxke}WaHolciYaAy!diR!P?&hSb>f{c1n_|MnAe}k3;~#OgF<7u=mhZ&kkE}EI zGW}y1p>4}XoV?tMsTwH1J;Vs&{Jn}JlR>r#PoW2mWkKtd@)?#Fkl*WN2xqVB>gsM! zQH!a8gab6==1I!jYkuF=MONkFAU5?=byUULYc8@+3j$+FwV zbvb6Hiiy_Y*l2K%KEtq!pml&7eFN*!DR2w-_U>7PFNmVEJK`~uJ#EJh z`>Qs#DjA<}=sc9cTG_I6_4qU$ZA02*9*L+d>^;b5$4x}qgCe;K-<-u* zBUl^Ifn801yc}DoZ-47~Bc}6*I&=hz#(1E}F!n(<5%k&l^mcIGP9y}hU*+l}d>b#T zz%Yx?xgx2S%%bx%qpNEu%|5F~SeSv)P0%F|WbbGhKMo+3CdgPes>EDc{g}r5zD_Ed z!$`$iUV%+a?hhbz0!~SBFSqabBfDu{lZSg++AeiaFy=9`&s@$gf$%;x#gb1FVGdNbIS3scE%Y z2F)OIFHDLIu-$ti*@?!)wYe@30YG#KqJ1(Q(!tzVeGfJ{a44!E%2j|fT z?%Hlaf`==sx9Vo4iKoFmk=9X$K0x+Mq?b5iwZ>QT~3^g zn{Co~K7Sr|?{fL~NY7-(y!LaQKF?~Xx;5=rqEEBKx*<|G#w&3@6(g`Cs9OcXx>&`E z>iEhb86ff64SfM(Vt43$WZp)Wr(_hbzVh zk_WcD09i=Q)lAVl$BA)msKA-RS%Bnkx+{9&<#k*KYP0|fR+XG_)LRzc^UVS2_`y!7 zaMx$fne+3lGFK2O^TS`he-3HC*f08@v>Yc&&~Z;h(ve~})%*tTVm{kScYL2$~RiW<@E)O@hrCpF(H;E9$DOK>fuff#}B%!T$> ztADC++@AgA*~oagJz4Jt*VbY-4bgP+3ewcNKe9X%^)0Q{Zyy{_XrsTb>OR ziin^R+-C4D zX%SULoEv0+TuiU#o74WJS9j4XLJEczi|h-dP;p1x&Xp2G|Ky={NR$Ep3n72rq|m-2 zZ!u97dhK!#)Yq=smXH%St7rVNF3cw}j+}VMAN#p;@Rz;Xt0e`2eeou(E3p${Kxnly zxC(}jK7d>j(XGqddjwuBiQqM8akPHdV!kwAuB|ev#J=V$rWheeY8&Z_ft>l3_cRWJ zv#^g^B7GZ>D1+a7$YCx+;fjl<+FzT{EkV@&HIQ1i013+Z=OhV@8*=t=y({#S$21P_ zgSemXKCPQ&@zkv>vaDsv9E&oZb}r>Jr`vl*8i$S?M0)9rwGeBVNYfh-s7m68nz&N* zWGw~Rm+AW5sqi41Vo~7$E9AL80wIkwy9Ou@k7SGTv*Ie20BV1F<@L%L5c99wpryo0 ziR>0ltgL>xazVz#CiZq7qBIN~;E&v5e!oh)cbOD|w|~&~+pQMY+2%QBWEvkL zIt(N3R$>W^k@Ta0+I9~|4jnQj0#4Sw#MUqDGv8u{oyQ~wR=@!LCL`7lvFY~u`9Ha}*>-J4*vE8A?1vc+^ zXneIxLk_QC7YYuyz5+E+1I7r9yzDy^9OgQiJybcA*huU>=NgKGSs@|*T`=JMMRRs) zjdI?HLN`KAw~=R7h~I#e3V<~4j!g%V@lV%Ch*1M2rL&}+aV}W8Ty`e~9Y<0Xn(YnR z8sFXB>9rfVcUN5e-9dL2FpOL}=NCJZ@R;~O07Iq>BH}zRTzf;rzo&jqwX7OJeCv>= z8uo25C@AcfEgn!dC0{6)W3=wo{pV{i_vnMmNjDeol_b%|jDw!X?f%KE<}fzmYs`tJ zE+n;j0$lEZn_gxueOcLbM+7uPu55aME;Q+XY~S<|u5&}m49*Skh4tX~J|FT*&72E_ zG6D(N5&@G%T(c2VurB&VUN%{-Oy6~jYXrwo=dMxws?H0|*IA$LW;y#Zkh5+cAv^N4 zy7*XH71>LYz^v7L_vJx!)exMgV})eL&}D6^!W6jmIDDYXXq}P5 zYU#alYsk$4{L`(hLNpI*@Cpq5KfTF;M1bGRog%>!N@u{KA-WfD*J`r^SBvRt>zm6! zi7(aJ$>vPF-%CTABq>SodqMI|HL9s~7KlLE!aVLE6uU8|4UlA(?Y2Cy{gZ|Y9hN)< z!@v=w!xlj&36RI=Nd_cA*EC8GF;kZ0%bM6=xN zo7s>gVFYIvrzD4Ooh1{l%8ep0b}*pD@`|PDjZmeAJ)_{~A2`k$XE_W_V=kM%9p>6W z{36)$W%5PD$NiKN7b|&=CkjcHpb$y>8`=l8qhymGJ(4|gK^G)QyiGHt>cIHE=z^;Z z<527`VaDJtsI+NwPzN{3f>D=ZTXhOB-a_;~4*x_2k=XN=YSruhVn@6JbG?WJ=>nyQ zrcuaktL{pKU<128l})zn76;@oD>K>xSWw3Ygw?& z#fayTL@+zg&-!Z9&|~#A3P_y@h+=yS(rDD{V!^}{k|G5B(Gf>hyq8|qc@@N#a_V?n zg*nOALMQ8p$;sU!!Xj3)frSkNc+C{$dde3*=S&HUtejo z=-g5G;@7$BGimqeWixcx8J8pE`&;J`cLLjC+Cr%Ly^Z9<Ec_lIeLM@^XmZ+QANxfu$f~J;A;KqJ`Z5F<-w{06K9YZeDgaXk$`-jL3%I6 zXrJ`Kr4TX0qq1dzQCYq_k*GDcESC|uJ*mq6UuJa`s9Ub!y(BsN=@=Pt0=%!OwDpR!u zJWkl@u91*wt6~FJFQ-mpR2%tnC-z0ypNikL%5%zeEuw+1`miCtUiqZ1u#eYdt<#LQ z@Q_~LqXEaQq5%zD=;F+BmHAW2a^iGX>y-090&nFmKiVqyo7B2lS^Og@izp5Qcq32J zzv-L7QPHt9lNPxj{E}|e_U+3Uf65f&0ILuzV46dYIohU!$=FrX0$M2OOO|*kBet$z z>XVV^o%7#>5}51pn-*ig;m~cc?3Y`lRsKsD>)=Z%Fj|s8zC`^A{6TlxU`H6 z(xw=ICkXyb%guLb5k0yA9s{D(NerJ!1QsxD-oN3QPu|Y-$kG@&1aaVM(0(OpJo2=bOx4{L;*7N*fGR^|GAR>#bVyX8nY6CWzvVG zgb8ezEb1xlE47W-KOb|gVzW{pKg`j`5 zDb0^wpFJA>bf12ya0$6Y-!B~sY;&58wu}t>SEK%i((^I3xVTssO~PJ(;1ver8_v}*d#Jrl{UKX z-%l_RECEW2{&?WJXcxzL#)A9~5Q5f-2B1=)`dxDm)|@0%JB)PF!w%y2EZ#RP(JPbo zQX$=T`#)b_FE;E|_s!vXvp$hSszVn(v(@Im*hD+FyJg;iyTudNtHS{I6zH^J?O?RxFg9W-C}p571MT)q=bPRNj0x`z zIiwU8D<6LzXbXOIy*@P*4GoA@FM+W#bmq~x=1x4nvu0pGPfzT4TIzQ3N1*K{yT$91 zk^APz^Hn68&`f@J8ST}6(wPg!zLR+cQJ$Jy_i#wB-NhnZf4KbBCwDq1Lz2t$^#B(w z)E^Ca)Qt_%tPxeQ*DQ@&lP=}ukI&Bb+djBII;lF%U7!Td#u+-SadIQ6oFvi5!Gw!< zFy$zKoJDYAbM~^h4K!vC6sX5FC&WX9&oDx~;4I#Z@1(#hE{rd)$AI34C;DJJ3EU@@)P z!vskpUihK;dwVwKk7kM8Eo6}7=yI4-@gJr=3qbG7RD)c|wHLImP!tKm#PmxL4+jm` zNF-qUXR!Xq%^wu}0nT;OWLe}JU=8WLUyTyQ=4G_5vUli$LpwzxyqkNlq0}a_{I2P5 zoFeXrr~}PK+u9x3#lHH_=P!yFdEL!i@aKviw8lT|EvZzYb+1Qa#voc>q4CZ95%S}x z1+?U;>*(n68XJ1^J|hY_1}A6^JQwm^3S+CHc{aSmQaFpUG%th(QjyM)>v>{84gJEE zGMhU{4!P%!%OK=+J>N|52@esL^vXbIqZF8t^<%Mdb07&;`D-{Z9fjb7NKNoSpbw$vS zZ|gsuJ{Q-}(*$L7m(d;fFuSoYQKgl1c=F$FU`%cd4;&8(sSH-FDx`UFy;H!e1hYZu zN*V3BAMR|6H#-|~T51vzzUt3A6mND?npjVN(n4z|F|OY|zD~ab_Bk{y4hI7Izb$r@ z`|4|ZuJ8L5I{MlqLEP0kn+9<|J?{Hv|6AS|BQcMb z6TpL{I&L>RgaET(8c54)LrxJFh4{|I6b;m$8RD4^tg2Nas~8C&#^N>^_w{Og{gvz) z{KEZ~a)D@EuD>ajjYTH;V>2J#f}UR5f+F;)6=(*P?~sANE|dSkf@A|(Or8TH1!#D< z-INfzH%rzxdzo;=h{lN{v5Zw1+On&~c&JC;0ZVSXIJ%p?u~5mD&A4nlCl0X77s-#! z`A?rDY48-19VmH;;+~&c?d9*~irx}a3Y9)5yIsZGe4DPJ3r!WcAJDLZF27YZ)r9^U z2cmpAt&H8uo1RTyWnxqHr-MROj)EPMI(WwHj>#qqM`XUM%zh7;8c;p-vF{8UJ0Wqo zpXCyHAZPAyu8iK#_}rpD2_7J*g{^lVPJQryC5_(gkB!wEh@F|)uAq_Nm?*Z$-ESqt zgK&idpq)R%8Yn$UnHL{P%cAfhiH+yos~I2d)>N~+@+puJf%a6#fW*n*!IEEZcTEj# z_aX^?d@D}&%D5D6-*bA{RRJ$D)_Obi(zFdu=U1no4~d(;;CVSGB2KCCz$=_0paC&_ z!m#&67&i9PVgh*?fY8awt~s~eR?xo*ov5RIVJNdi8?&?8TFpgIBMa zY4B8mw(Dvh)z^J+_(qDu;%#%9oZAJlb@xZ}@_W;1M}boH3kU7H^D}f-+}Op*D2xQg zon63#IH&1rqPu9dlB75}td504nvIFc^B1)VHPFUP1f$d0J6!v7LX~B>9fXY}BPM8@ruL~do(gy^+2G@f(Cs+6$6~L=aR%_!OOSfHKOLXnC zw=*m)&s*=PHv`YOs^-ro$=Jqa?))(0<7tYXa6{6fpy(wC)736hfme@O7y$y-bZ=d3l z03%>e+;2%QVV96+@_OGCofU#;Z{4SU_^BNP?4n`^-<-YoN3$Ke$xn=03uPPgZQT)f zAaUv{@NX

_h;^`_XdWxO{QjHzGl{SeR;H!A4CEGiLS0%MFQa-E;hWETS`7MiTr= zyBrLB8gXp0R_2aTJs~BBI(b zqmsPUgcqAuD=<0|!KJ}yF2b~&>J$RzycPNd&`LY^O>Joe-o-TC_F-z72V2S zFVr2#-I;HxcAI&d%&&8zPa*XBJKP5_zS>O!_Hpj zewJfVhU7eDzJb}#P7dVBI@I?*3iQ7nXBGAH?-bIID1Tr6d42fF2@S)Rv=F-Pv9^CCG$vLQDZCpdrO^AL5ft+fv*Ia8{ujs;OmbkQ@#76r%23= zb@DpA0W$NvL=THh+yRrlZymel)tDF^eSg2)nzGKk2-KG_?}j|qnfYh6+kzI6O)Xt_~05)6FD2Rd3o)qySv$f@7; zsAJ-f)31d5{s_LCs3Vhu^wWQad_)`8=y>MiHkSP=Uu=+LV+{y+ZxBrl+@u}KKEc@g z>4f||a+e}5X5-p%C4iam?7<)}{dGC+vq9d&8PHJ5?46t6tsw&2n^v^He|VS;m&Pd& zz!gZ2RQH?KMP1=V{(4gkGx)00NtBp)!63=;<)5q)>aRt?+Epp)EB0o@UX`p5Y=0LR z=s^=^Gei&cZlmF`3hzjYA8CqEMs!ZOl1VTHl(=7YoGLU=K|I4N&r8)t-4)fi==g`H z3)SK%H*Yk5d)^2f?*@rmv9NA@ZBRgZ`y6ICX`Lj;^Ig_*)=DH?C3V2+*(Ul05r0{t zw)yZV6U(*FL zuAiv)>Rb#S=@!xZ2>LWy$lEyNs~nc_i;(Z7l~Fr(#Cfvafpjwfe-ZZA(b#i;bC>Q1 z^_yE!QE5@#b*>{w!+yu?Bo!Oc^4sa*XnY#hAbc8gyA1|b$z7BuBaBd429Uk(ao-K1j5oE-%%&l7No7ziip$2=BaP=BSr*47;@(-=32fh_Pn9x6nf+hioa1CU&EHX3ceEM=^U zFHbD4Hm5WlgmJ*MXKu+}#88+d1>iQxj-X+B6O2Pk^BSJ>uixT$^^hg%<3kJVbgj?j z_tT3Z#VnsBWPbwh7?mbZ$G_Zvwh|!8zm$oa3iZC+gyGE+Qwsll+t}{Dc!KZEkJqV> zJpI|1Fl{}v#zlK01klv>91eswmWMwBQOo`QJU#lo{(aj3qtA;J5xs_N-kJ~HjxyCm zY8EV2)8W%RD|R~#SQxEgh&LsER@_AA*Nn+S;P zi+c*=ao+3QEMWWBZ&B+PfiNh|Qj$I{$Hy|C5|+bDLW_t$2I$i|?%B>ezj0Kgn5Puq zdx-Hf4isNfpLn}PAra=;s0^KhB!#blP~9{Fn0lyclVq&}0cOIJU6awYLxlt&?`YZO zLfdsSm=5?&riA5On?XO(KT>~&ibLXVu?xP@dR@HokZv;5YVT(E7?Ei>{ zGLkkzBJE4pn9{%q-*q0z!2yLdC@Peb%4l6)oh_GpeHh&jPo%dK-y+d@sD!H4H*3LY zzP$2-EWRI6mT8?ql402Ve~D<{@NC4dspov{4wa2)(hidAJ*~kHr(O!~5tj>+FJr+Z zg(}W(6kq@fzha@KZt1tazHHK41nbE4X0cSooz85|RyxTYJQDXRTBFXg{}?er<v`%==HRSo|8RhvTos56s-(z+G7=s&c+zP|2h# z3$g8gY#d+l79H1|DpqbOGmT_SMfC=-#-|=Gn<+*68^x%U`KtZR5GARrv;;pnGWEx% zA^}jAhmrv2pHL_{;9jU@hvv_CFR+Tmj-rGK9T`1OwH_ntA5e~QvI?I}rCSV=#bNx8{A zqjepbFJfpv%F8Ao60?+HT47n|&?1VJBQtETFawb-JF2ib$%P7Gf(j2(56Gy@m*Quh zr!i+yuaBV@WR6Hir#v1#4(AhG1G!pzkokubUC*8fHef{U9;Z{V?DjiRUs$m}$qf|hOh@U8B)`s>O*C(%VAwWqni@BJ3lR!b;Ih#=2N}8RlTYkjHlgoNmmR~CfQ`u zynMO3-^x8K?i~=((IxQNI=;|mC1*S0%cTm9{|B=TVu9B;UaltZpAb{Q7Yn|I2(R~( zYZUcO*w8Ns{v!Nzjm0?6sHoUsP^_E`vx6BrJ1OhUBE6r|pOh5B(p@=8aB+0ru6Cj! zjS|L@Sw~r_GlZ&|ddNmc2Ly6mwF@m-YWWR0`Qlo1tP06yv7)To6wLpDtS;@6V&lJH zP)~%&dFg25ygRYRVV%#jL=hy4&bi-qfz{2-6+ZAL%eja0A14^!TqZQTUo z2F#pBkDQ5K2^2gJl!YvP$g=PhU^|VA{7ko3FZ8`6S%Q76V&k24Io^}o-drwL?Hx&- zvM1~>FgzTbg65h}IDlS1_PP#v@z??AYR;tdrW>rSSr8^PO9fZiA?gxkSb6m!rW-`X zr7a{3?H^CD@-WTi>7+m;RSCv9CaU>*NnHzO-jQmey2xAUjOKl6`Us5!4s|HLRkr?B z^<7zg%XF9(eeQrptXm|iwRoN-P@s@A8Jm5PJ(nlh|B_=nc~JEM1^MYOO^iSxzMOfL zHM9Dt@kxoa8aZCN>Nkv??BG^Yp>HOL(hZxR{~ZSk6p+u_F5c06>_vekO0J=^TM)7( zbH?y%S#f|Dg+Q#G%Yk?r)^wLQKeL>kl$OIuduYB1mEP zb05y|lF9b5a&-31C;4Rrm%;9v6Bv&h!yAOV1QO6(&xjOF2dnB|wFK(WL~&V$hC94J zYZtm|j!GVRdIni<2HrFlWcIC)KZuwx=EHvOtY-Qs&XSonY&Z&lJLyF_Z_P(`9?-8f zYRWb#$fe{ooQ@C@!fqTGvU)g@!@BgSFZODf1x+eZh8%^+I1BIrUY30c4(dT9^gp_p z(y~YA9Z>xX*-1GXpxZOwa|LakmTT#QW{S=W=(Y>!KtygAqqUY|C`Bfw-9P0!m$SLa zOUD1zC;b*PbDpqiz7Se~VYj#V_-!?BOrCW(qMWr(JXc_P^k z#UjrI{Ywjym8ylca@e4vA}vmGk(oYaXd4GOnD`?`=wEzBzKcvjSzrs~(rtoW2J$*T z;vUHj+_O?Aa{LbUGm$J2bmt!ev#vC8;6m_jJ`LS#iE z4t>nVIx2|REjUG#E3xaez0}|Z9+i=uRP<4jXQ4RVp{{3_xQfh;v-njiHpY5`P!M;-rb>jo&aE~$>PBxPm z#>_gh)bFBD+Nq#;v17lcro&JjZxL=>sBhbMRBxS#*}g9gmlU+ zP}G86)r9Ns&3*%#WvFcb#aRbkUtcGpT8z*1lr9;@(k}yVo3VfY$VRxqkNYA({L;Un z+z!;BuWf%tsX>X;Fdvt}OI*Wx%YP~jwrfXio9n;zALMZBVh<)g3Pd9M_x&9&Tls5l zL|`64@%+axGFe@i(0+y5SWCR#MC#YQnOW+@zy*Cto0%WuvJm+`gNk?M^HBq+Xt!*~ yVrEp<1zzh$_wW3gZOX)k5$o3Z|5`~6GaS5LZJKkWfi;0Tnxa>D8ANoSDANyq>HbHP$z@#9XH zk2wMj1S+_E9NAbf`=s+FkVRnj3CF9aTtIBF?O<_`8?KxLX}omI;e|tSI?#zGB|(0{ z3_n_INhor+V>8rb#nX7*EO={ZG;R zIV+{^yXS`VlT8lkvCBWD16fgf^-RvJabCgqO(oJ~38$=K zb;`jjC)rXbWxvS$bYvA3{54K>H&(HR(n!aFd;qIIXT+_V5jB@`;IL3FI8=DL2%w6-hf4>g@FR$c# z5`Qn{ZzwUUKWkm>@uhOTaD4O9Nu{&3?{zCajP{vPeLdl1%IWsaoGD^Ho6gG0PdV)0 z?df}B%g+;abxG_3RzZ2pD|MeLd9Z4G@hXNdy~0pr&DFd6M1t2${gjVxf`{GJWW97I z^m=x3ZQ|s8RjhFB>#f@t7pc$Ol(pvfe{H)GmaUCDXZrD^rOJPoKf8VIqxf&P-YOx*afaN`^!^=k(Y`=*|d ziO3fBe0%J4x=xu#cXiFu$|Y5;vinZ$W7~SLJp0?OC29gLj6V#Tq8{pni}zkPdUb7; z;q$-qb*FljO;q5yP*=b5(fN|n?{jv365YnWrQ2*ul;6Us;+m?5B<8O8Jj3~H_zR!2 z*JP3=EfhC3x^ca#abMj=^W@ffX)*_9Et^@VR)(eK(lRcofBvsdh!>Zi3*WJ@H!8?W{@0WBx6im`lstJo=l7ki zwIAGiAD9_NB)jEW2A!NSr%R>Xx7TpNvdxc=rL@j`S+%#)_8i};$GtWO;`3~7^+#?> zx+3yN{ceAfxN5(Yn4HDU+j<#un7JpXY^Xk6^C#Vlck{g^i@Y-?@(6{jX?mKPXr2;b z#dTigXy&}I`pj~E@t!EnUm1($)K%uJJixv>=Y;6iEkS1^Kl1I2tgX0_ZTCsR{8979 zX8UDr3ep$1u^g_RW`1nK?{k-A=lkiT3at2kfqUPI3GqrNrk3tL6IgVOf2(fTvL`G1 z-PsrW9C>Q@eEHLbt1@PFPnuwoWwX)zL~HNwrl>Iclko?)TfUm}@pRmY^-oV;uMqRB zbI?=GRIPXyw{DV=V|G)$;?DLtSEF2hPP^lD?g^jnpDBt*M9lSWRa|39de_hLc9Hgx gIXqVBFaEGSf5&x{-{buxV2)?-boFyt=akR{04rW&egFUf literal 0 HcmV?d00001 diff --git a/images/favicon.png b/images/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..96629469822da83e22c2bcf02d6acfdb06d8aaa7 GIT binary patch literal 5135 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 literal 0 HcmV?d00001 diff --git a/images/incident.png b/images/incident.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2ba6a309ac399b5abb86df559c868a16d3f7b2 GIT binary patch literal 980 zcmeAS@N?(olHy`uVBq!ia0vp^F+d!|!3-qdSvyMssc!*3A+A9BvV+6>w6y1fa?*U6x!DP~`vr|95h8KOQ^w z^ZE0CzkmOD{P^wW&9~FjuLTDF{`m3rs#VYD%y~Xz#X1A;qm9|*I%z* zeL8va{qEf_7A}0;-F?5h`c_iX&BVkj-rnUu@+^TqH!BJ93ugGj%J}2opDb~HjyEqZ z&YPYXWoxdlsqp0Co$IIfENgG5E(ms375;Ga@aFXsyrj8zZd=n^=F8Ux##M*@{;S3e+Soz?7n^a_x>}JUT69E>@ZhX-_QPo|L~c) zmhmS3NwK;HomUo$%_v^5f;GjQDdcdJ!MP37t}|`qb+%l|n#izlDeHm;@r4%k){zJ6 zBmezijdS(B^EOUC-*3lb%RR==a^Jgr^h@hDt>fsHNZ-x8`b*1t*>eY$9TY!*Sg+*F z)qPrzo2|n4aI)XFd0WB3*JkrkM`o+#EmhgRZx(Suyn1|pwjVE;?DZoz|Lx(cJMUNU zyi?k3cYcA1nZ;-E{Dj4e&KqYec8plO+Ii7~=RA{EUhrR{xI}NoTQeQ8`Mll{U#gFM z-^||aAAFc6%rfc^gVx6ve7SBKM;)c4-2=K8Ki+${cf~Q|d-0bzyb3Sf&~UPi+xMx0 zE!6hNMU^ugm2*tYCW&sf$jsUDKzH5r6X_Fd`lJ%wG>#jpo#A-;W8bUJ5-#`qt~H$L zhNpTAbY1>%p1Z_(sK?-L*AFf|sTRq^Uy6^;*ZD2+l+u&y`DPk(wbR(?N9vL16+qjM zEAIH2du0E?yA#ZmThf*H9bn77)gzF1?PE2^l8u4PQ)_Z!4$Tkow^M%6_r$nK@6y!y zjwQ;EdK&(ve-k%yz11`0?Dh5k`Gl?-q`IxiTh=yzf<{2vk-s4`CLcS-Fk5%op{;zK z(=PW+*b)5aDaTRSw3Z{6#RcmdLe3?+ov^8k{ja%w!sh)2(=0&8jY+h!mykqA5Z(r85&V-iP4eK|pfenK&u&;a dCM5l5(B%}*<73+W1eiz}JYD@<);T3K0RSz>({=y= literal 0 HcmV?d00001 diff --git a/images/ok.png b/images/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..4468c2a4cb7370ec124883f4bdf0bffa56fdced1 GIT binary patch literal 569 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 literal 0 HcmV?d00001 diff --git a/images/status-red.png b/images/status-red.png new file mode 100755 index 0000000000000000000000000000000000000000..f5774a59a39904068f067a6383bc5260827a88f3 GIT binary patch literal 1868 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 idD#0~b$fsMJnVmUR?{4HC>&D&0000 + + + Status Page + + + + + + + + + + + + +

+
+ Loading +
+
+
+ checks in the last +
+
+ Last check: +
+
+
+ +
+
+ +   +
+
+
+ There is a big gap of time where no checkups were performed, so some graphs may look distorted. +
+
+
+
+ +
+ Powered by +
+ + diff --git a/js/checkup.js b/js/checkup.js new file mode 100644 index 0000000..e2d0054 --- /dev/null +++ b/js/checkup.js @@ -0,0 +1,231 @@ +// checkup is the global namespace for all checkup variables (except time). +var checkup = checkup || {}; + +// time provides simple nanosecond-based unit measurements. +var time = (function() { + // now gets the current time with millisecond accuracy, + // but as a unit of nanoseconds. + var now = function() { + return new Date().getTime() * 1e6; + }; + var ns = 1, + us = 1000 * ns, + ms = 1000 * us, + second = 1000 * ms, + minute = 60 * second, + hour = 60 * minute, + day = 24 * hour, + week = 7 * day; + + return { + Now: now, + Nanosecond: ns, + Microsecond: us, + Millisecond: ms, + Second: second, + Minute: minute, + Hour: hour, + Day: day, + Week: week + }; +})(); + +// formatDuration formats d (in nanoseconds) with +// a proper unit suffix based on its value. +checkup.formatDuration = function(d) { + if (d == 0) + return d+"ms"; + else if (d < time.Millisecond) + return Math.round(d*1e-3)+"µs"; + else if (d < 10 * time.Second) + return Math.round(d*1e-6)+"ms"; + else if (d < 90 * time.Second) + return Math.round(d*1e-9)+"s"; + else if (d < 90 * time.Minute) + return Math.round(d*1e-9/60)+" minutes"; + else if (d < 48 * time.Hour) + return Math.round(d*1e-9/60/60)+" hours"; + else + return Math.round(d*1e-9 / 60/60/24)+" days"; +}; + +// I'm not even joking +checkup.leftpad = function(str, len, ch) { + str = String(str); + var i = -1; + if (!ch && ch !== 0) ch = ' '; + len = len - str.length; + while (++i < len) str = ch + str; + return str; +} + +// timeSince renders the duration ms (in milliseconds) in human-friendly form. +checkup.timeSince = function(ms) { + var seconds = Math.floor((new Date() - ms) / 1000); + var interval = Math.floor(seconds / 31536000); + if (interval > 1) return interval + " years"; + interval = Math.floor(seconds / 2592000); + if (interval > 1) return interval + " months"; + interval = Math.floor(seconds / 86400); + if (interval > 1) return interval + " days"; + interval = Math.floor(seconds / 3600); + if (interval > 1) return interval + " hours"; + interval = Math.floor(seconds / 60); + if (interval > 1) return interval + " minutes"; + return Math.floor(seconds) + " seconds"; +}; + +// makeTimeTag returns a