#!/usr/bin/perl
#EDIT THE ABOVE LINE TO REFLECT THE LOCATION OF PERL ON YOUR SERVER

##### DO NOT EDIT ANYTHING BELOW THIS LINE #####
use strict;use utf8;use lib qw(.);use version;my$iv='1.37';my$fname="servercheck.pl";$|=1;if(!defined $ENV{GATEWAY_INTERFACE}){print "The MIDAS Server Readiness Tool is not designed to be run from the command line\n\nPlease access this tool via your web browser instead\n\n\nPress ENTER to exit\n";<STDIN>;exit}$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;my$cwd=$ENV{SCRIPT_FILENAME};if($cwd){$cwd=~s!(?:[^/\\]*)$!!}else{($_=$0)=~s![\\/][^\\/]+$!!;unshift@INC,$_;$cwd=$_};$cwd=~s/\\/\//g;$cwd=~s!\.\./|[%\$\|]!!g;$cwd=$1 if $cwd=~m!^([-\@\w./:~ ]+)\z!;my%in=parse();my$act=$in{act};my$proxy=$in{proxy}||'';my$user=$in{user}||'';my$pass=$in{pass}||'';my$nolog=$in{nolog}||'';if($in{debug}){require CGI::Carp;CGI::Carp->import('fatalsToBrowser','set_message');set_message('For help, please refer to the <a href="https://mid.as/kb" target=_blank>MIDAS Knowledge Base</a>')}if(($proxy)&&($user)&&($pass)){$ENV{HTTPS_PROXY}=$proxy;$ENV{HTTPS_PROXY_USERNAME}=$user;$ENV{HTTPS_PROXY_PASSWORD}=$pass}my$protocol=(lc($ENV{HTTPS})=~m/on|yes|1/)?"https://":"http://";my$pv;if($^V=~m/\d/){$pv=$^V}else{if($]=~m/(\d\.\d{3})/){$pv=$1;$pv=~s/\.0+/\./}else{$pv=$]}}my$pvn=$pv;$pv=~s/[^\d|\.]//img;$pv=version->declare($pv)->numify;if(!$act){splash()}elsif($act eq "starttests"){starttests()}elsif($act eq "runtest"){runtest()}elsif($act eq "ssltest"){print "content-type:text/html;charset=UTF-8\n\n1"}elsif($act eq "getmod"){getmod()}elsif($act eq "getlog"){getlog()}sub pagehead {print "content-type:text/html;charset=UTF-8\n\n";print qq~<!doctype html><html><head> <title>MIDAS Server Readiness Check v$iv</title> <LINK REL="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACZ0lEQVR42mNkgAKLiAo1FhaWvWxsbKv3zasrYkACeX3rxFhZWS2AeEdHhscvZDlGGMMmpiYGqGAxBwfHf6AhGhsnFt4Cief0rFEBGnyCnZ1dGCie3ZzsPA2rAU5JTWVAAzqBBjAAFbas7s6uBYnn969fCeSHgcSBhmyoibEJxGqAR0ZHJ1BhGVARSOHJJS0pFoUTN4oxMzM/AfJZoQbcKQszU8VqgG9u73KgggiQAUDFf4GGSfDw8EQDXTUBKPYTKMYOEgfyebO8tL5jGBBcPPkgUKEdED8HKpQEGhDNxcXVAOSrAtk5nJycU0CuABqgn+KicgnDgMjKmTeBitWAOAuocBoQvwUFHBDfBWpSB7rmBZAtAmQHxdnJrUcxILZ2LjMTE9NnoAJOoAIDoM0noU4G2TgB6O/COXvu7AfKOwBdUxRuLt6PYkBCwwJzUFSBNABpOaBtu4CKNaB818JAwz2LDz+eB9ScCBSfG2AgkIJiQGrr0iqgZCsoAIEuYefn518P5HsBDfgO5Ivl+up+WXXqVS3QNU1AfNpHh8cMxYCsrlUbgJr9gfgDMKUJdqw44QFkdwIVz8rx0ZkKUrPhwocYoGsW//nz5+OvX7+EwszE/sENKJiw4RJQgy4Qv2tKchJmwAK2Xv1qC9R86OfPnwy/f//WibaWvgo3oGzatj6g5kKgs8/UxtqaYjMA6AIRoMbXIAOALkhMclJaADegZs4eJqDz1IBOvlcdbf2LAQdYevTp7R8/fqgADZiZ6amZgZIOiAHz9t2bDXRBChDfKQgwUCXZgOnbr+sDvbEY6IL1JSEm9SAxAMzPxxEuAL/aAAAAAElFTkSuQmCC"> <LINK REL="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACZ0lEQVR42mNkgAKLiAo1FhaWvWxsbKv3zasrYkACeX3rxFhZWS2AeEdHhscvZDlGGMMmpiYGqGAxBwfHf6AhGhsnFt4Cief0rFEBGnyCnZ1dGCie3ZzsPA2rAU5JTWVAAzqBBjAAFbas7s6uBYnn969fCeSHgcSBhmyoibEJxGqAR0ZHJ1BhGVARSOHJJS0pFoUTN4oxMzM/AfJZoQbcKQszU8VqgG9u73KgggiQAUDFf4GGSfDw8EQDXTUBKPYTKMYOEgfyebO8tL5jGBBcPPkgUKEdED8HKpQEGhDNxcXVAOSrAtk5nJycU0CuABqgn+KicgnDgMjKmTeBitWAOAuocBoQvwUFHBDfBWpSB7rmBZAtAmQHxdnJrUcxILZ2LjMTE9NnoAJOoAIDoM0noU4G2TgB6O/COXvu7AfKOwBdUxRuLt6PYkBCwwJzUFSBNABpOaBtu4CKNaB818JAwz2LDz+eB9ScCBSfG2AgkIJiQGrr0iqgZCsoAIEuYefn518P5HsBDfgO5Ivl+up+WXXqVS3QNU1AfNpHh8cMxYCsrlUbgJr9gfgDMKUJdqw44QFkdwIVz8rx0ZkKUrPhwocYoGsW//nz5+OvX7+EwszE/sENKJiw4RJQgy4Qv2tKchJmwAK2Xv1qC9R86OfPnwy/f//WibaWvgo3oGzatj6g5kKgs8/UxtqaYjMA6AIRoMbXIAOALkhMclJaADegZs4eJqDz1IBOvlcdbf2LAQdYevTp7R8/fqgADZiZ6amZgZIOiAHz9t2bDXRBChDfKQgwUCXZgOnbr+sDvbEY6IL1JSEm9SAxAMzPxxEuAL/aAAAAAElFTkSuQmCC"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta charset="utf-8"><style> :root{--theme-background-color:#FFF;--theme-border-color:#264666;--theme-box-color-dark:rgba(38,70,102,.5);--theme-button-color-1:rgba(137,176,215,.5);--theme-button-color-2:rgba(38,70,102,.7);--theme-carat-color:#3B99FC;--theme-color-1:#FFF;--theme-color-2:#264666;--theme-color-h2:#264666;--theme-gradient-color-1:#FFF;--theme-gradient-color-2:rgba(38,70,102,1)} ::-webkit-scrollbar{width:16px} ::-webkit-scrollbar-corner{background:rgba(38,70,102,.4);border-radius:20px} ::-webkit-scrollbar-thumb{background:rgba(38,70,102,.5);border-radius:20px;cursor:pointer} html{height:100%} body{margin:0;padding:10px;font-family:'Open Sans',Calibri,Tahoma,sans-serif;font-size:16px;text-align:center;cursor:default;background:var(--theme-background-color);background:radial-gradient(at bottom right,var(--theme-gradient-color-1) 70%,var(--theme-gradient-color-2) 100%);background-attachment:fixed} form{padding:0;margin:0} input[type=text],input[type=email],input[type=password]{font-size:1em;border:none;box-shadow:5px 5px 10px 3px var(--theme-box-color-dark);border-radius:20px;padding:6px 10px;caret-color:var(--theme-carat-color);margin:0 5px 5px 5px;width:-webkit-fill-available} select{cursor:pointer;font-size:1em;display:inline-block;padding:0.6em 1.4em 0.5em 0.8em;box-sizing:border-box;margin:0 5px 2px 5px;border:none;box-shadow:5px 5px 10px 3px var(--theme-box-color-dark);border-radius:20px;appearance:none;-moz-appearance:none;-webkit-appearance:none;background-color:#fff;background-image:url(data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%2389b0d7%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E);background-repeat:no-repeat, repeat;background-position:right 0.5em top 50%, 0 0;background-size:0.65em auto, 100%} input[type=checkbox]{background-color:#FFF;cursor:pointer;vertical-align:middle;width:24px;appearance:none;-webkit-appearance:none;-moz-appearance:none;height:24px;box-shadow:5px 5px 10px 3px var(--theme-box-color-dark);margin-right:10px;margin-bottom:5px} input[type=checkbox]:checked:after{margin-left:7px;margin-top:1px;width:6px;height:14px;border:solid white;border-width:0 4px 4px 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);content:'';display:inline-block} input[type=radio]{background-color:#FFF;cursor:pointer;vertical-align:middle;width:24px;appearance:none;-webkit-appearance:none;-moz-appearance:none;height:24px;border-radius:12px;box-shadow:5px 5px 10px 3px var(--theme-box-color-dark);margin-right:10px;margin-bottom:5px} input[type=radio]:checked:after{margin-left:5px;margin-top:5px;width:0;height:0;border:solid white;border-width:7px;border-radius:12px;content:'';display:inline-block} input[type=checkbox]:checked,input[type=radio]:checked{background-color:var(--theme-color-2)} h2{color:var(--theme-color-h2);font-weight:400;font-size:1.5em;margin:5px} button{cursor:pointer;color:var(--theme-color-1);font-size:1.2em;margin:5px;padding:10px 15px;background:linear-gradient(to bottom,var(--theme-button-color-1) 0%,var(--theme-button-color-2) 100%);border:1px outset #1C2E40;border-radius:1.5em;box-shadow:5px 5px 10px rgba(0,0,0,.4)} button:hover{border:1px inset #1C2E40;box-shadow:0 0 0 rgba(0,0,0,0)} button[disabled]{opacity:.5}button[disabled]:hover{cursor:not-allowed;border:1px outset #1C2E40;box-shadow:2px 2px 6px rgba(0,0,0,0.6)}footer{color:var(--theme-color2)}.arrow_left{background-image:URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAABjUlEQVR4XnWSv07CUBjFixYSTXQxsgGDJDq6+SZicBAWSXwAFwdIkDhQEhcZXRxcfAAJA6EwEZ0oQwNC0tbEGKPGXkos4PEjoS3XxpylveeXc+/3RwCnVpJVoEJllVaSdxagxwT6sFjPrJt11oOFPp38BdPipA50JCnuGFK8IwGTelpcAHMitLFRjkHgVY6NdWjkOuBUHhszYy3gIN7f2JjKc1A9Aq4ifFZi2cHJAREzEFr7wkv7OEUbd5frXiq5GoFKBkPJzTNzAL6Le4vpUhRD5ViAzDouVgbwUtui8kJZMRvMzytmCmQBhlmZQfuB0S1AeoOKZxikVzyUVmYeEYYDkkb3AOkL7xjBIv3gqbTqgTJT3KtvAGi1nVQoF85uZsP5DffqhleM98rP4jZXTISKyfjbcwYF1yeirz0Q1JS/4btLXMNTzgibtv7fCG192nRnfR6EbuvlqG8pohSgk+utWSFoy0CnyK1ZEbAbhaB/cQ8wgMW6Zs2ssS4sDOiEX1xP7UNU0SVV6YtzfgHPGNrJ915RvwAAAABJRU5ErkJggg==');display:inline-block;width:24px;height:24px;background-size:cover;vertical-align:middle}.arrow_right{background-image:URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAABj0lEQVR4XnWSMUvDYBCGo6YFBV3Ebm0HCzq6+U9UdLBdLPgDXBxSUHFoBBczuji4+AMsHUrSTkWnJkNobSGJICJWTJpi2vp6VJP0M8ot9937cMfd93Jgor7tlKBDd0r1bVaZSO830YbrtGzZlp0WXLSp8hvM8UMZ0EQx4wtiRhOBoZzjJ8ACD2NgSmlwbEjpgQWDVB8cKVSgbH7KR8LXwBopP6C+C1wkfXlzhu1KCogYdzQap2G38wXcoNE9CLuSahCo7qEnpiZ7FNfxAdiFYK0kemqeg+Ko38ARL8QEvhAHV1nGE6GSjzoaFA6WXQJhZ7O4wzMsikfoeAGA/vXGeCEirBCcwwM+4VL08Yr3MXgLLgSrwehFISEsFRLZeGUVBmBfBaNVGq3maZkks8wK3giT2GUi59nncQm1exg5Dzg9O3nwtek/Dp71v7Dmmf99oWeOaoEpjmMwPVNKRUyRogYmqaHNTmJeFdCKjM2KgKecxKLG3UIHrtO0K3bFacJFhyqsccNo7KCMJkWZMkb5Akay2skmcKkDAAAAAElFTkSuQmCC');display:inline-block;width:24px;height:24px;background-size:cover;vertical-align:middle}.box{background:rgba(38,70,102,.5);border:1px solid #264666;border-radius:10px;box-shadow: 1px 1px 8px 1px rgb(134,161,213) inset;padding: 5px 10px 5px 10px;margin-left:auto;margin-right:auto;color:#FFF}.box_red{background:rgba(255,0,0,0.3)}.l{text-align:left}.c{text-align:center}.r{text-align:right}.b{font-weight:bold}.dn{display:none}.cp{cursor:pointer}label{cursor:pointer}a{color:#eabe0e;text-decoration:none}a:hover{text-decoration:underline}hr{color:var(--theme-border-color);background-color:var(--theme-border-color);border:0;margin:5px;height:2px} h3{color:gold;margin:5px;font-weight:400} .logo{width:180px;height:110px;margin-left:auto;margin-right:auto;background-image:URL('data:image/png;base64,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');background-size:180px 110px;background-repeat:no-repeat} .logo div{text-align:right;padding-top:6px;padding-right:5px;font-style:italic;font-size:10px} .color1{color:#FFFFFF} .color2{color:#264666} .color3{color:#264666} .color4{color:#FF0000} .color5{color:#66FF00} .color6{color:gold} .color7{color:#000000}progress{width:100%;height:40px}.icon0{height:22px;width:22px;background-image:URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAAilBMVEUAAAC4t63bkZHbj4/bjo7bjIzbiorbh4fbhYXbg4PbfHzbdXXbdHTbamrbZ2fbYWH/X1//YmL/WFj/bm7/cHD/cnL/dXX/enr/e3v/gID/jo7/mJj/qKj/q6v/tbX/uLj/ubn/v7//y8v/zMz/z8//2dn/29v/3Nz/5ub/5+f/6en/8vL/8/PBRkaL6mB7AAAAAnRSTlMAgJsrThgAAACtSURBVHherc83DsJAAERRFpxzzjmnuf/1wFj2LnRITPX1urn9bwAtRu930Lr0sa3c28Gt2+N08Ms0Cy+HME8LfzKBOPaDBEhDP4ogt8vlrmnatmk6eVfqSl2VZVUrh1Iv8izLi0Pp4FuOY/n4UtO1Lct2zQ+HEXmu77teZDAOPQ4iEzCjINYvh5aEsQFCYMRhop0ONU30/QWBnqQqfalqIEdpKvsShK3LCVO/7wnVFRLHRvPhcwAAAABJRU5ErkJggg==');display:inline-block;vertical-align:middle}.icon1{height:22px;width:22px;background-image:URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADW0lEQVR4XqWSW2gcVRiAv3PmbGZ30p3ZTbqbELIVaoyuBqmRWFRDAaVKpGitUPBabAGtN8DGbAX6qi+CiqgiIPhWfBEKeAMErCggouCLb9JimzbZdHPZy9zOccihWJGYtP3gYwbOzPf/DCMAfv5QoBND6IEbgdRYUpAGOhEqL3kP6HiV2rGodRZtwAggEwUASQpSCqaOGiRboFLb/en4wdMvjB347jXgXTZnS+H7K5ONp4rDYwQ7Jtg++dYrwB3XHS7W9jX84Z3o9pnMvyjv2EWhOjV3veE95Zsff8CRIUZ3MWkb1Scp1Z8/CNx+zeFgdO/xYHgU4kWcvMZxNSZqZltP0D+0a+5aw9OlG2ceVKpLc6nJ11/9xOnvfyEKV8i5kmD88BPAxFWH/eHpRlCtQrrIuXPneWj/cab3vkq3uwpxk4Fanf7KrbNXG76ndMOeGYdl0Ks4MgTg7rvqCNOFdJlcn6Y09uwzQH3LYb862fAHA3Q0D1kI08OibThTxy2C6iCez+xWw7v9kTv3KS6BboNZszFAoMG0wW6NbH2LV6ocAsY3DfvbxxtBOY+OLyLogF6zIcAYDSZaH6YXvyFtniTwA+Ft81/fLDyVhR91ZGv9ZbtxmzSx4R/POpjoPDS/wKx8jshBn1zAKxYPAWMbhkfUaMMvKUzSRNDL7ELaplpOOfHyTXzyUptC5wPo/IBQAqkAs4zfHzuel5/dKDzpDvQ/ptKLmGQJ4uwanoH276ws/EYcR4RRjzB0QYLAZNpCzmlR8NzngJ1YUFjIe7m5gvyTuPUHTh8IBdIBCnDylOLNjxL7y91WYbLewRjWJdOkEdsKSrVcdSyO06NXho8UPfGIQ4TRrKszAXQPnp7xGSobRockt9S6JB17rq94VokeRc95cmmZU8CXCkBI90ChkHd10sKCHSAhiWDEX+LIw4CBMIL48tAUawIm0RS8wGdlbT/ENpyTvfdjPXivFwwVpdAIB6QEMiWQkplgcUA6/9wLnalAG0m0tDyvxKWPAQQWPnvDua9UrL4YpmogTsgj6LMZhPVfGEDbmYT5nOi4KlyYv3DhncNv86sN/we/CGIQ8EF4YFy7k5FYUiABekAbaIFehNUQiwCM4H8pKxsVTqYAc/nrp5kJtFI24G8rjV26nVE/FAAAAABJRU5ErkJggg==');display:inline-block;vertical-align:middle}.icon2{height:20px;width:22px;background-image:URL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAABMElEQVR4XuXRS0vDQBQF4P5ftwIKCCIg4raCKKjW90ZBQRLf7mwebURQEBGBJqlqUlPTltpQjz0K2Qw61k5XvTAcTm7yMZDMYM7MzhD6gp47W2AqRzkprhDlqMGJnjkbaLdb3+cj6fRNotC17fF/o6fFNbSSGt6TmNnp67+jXMrQk8IKGs0Q9WbAZJehvMkqmD+hx/YyqnUfUc1lsstQfrSEasPDkb0o4OyH1gLC+B4vb3dM9r+gOVTiBzxHNzzQzfkUZ+rmHJ6ia5Rfr5g44F72o7gkwpf9ShGlwIAbmNjPZ4kz2fkcXmhDM2cFVIrv5idw+TgNyxuD4Y2mh53PuRfQbnCnPAXDHcFFaZjJLkG7vHnB/8peUBHfMyZxG+aYAtozrllZAVWCC6hKPDMw8wlBVbsPzqUrcgAAAABJRU5ErkJggg==');display:inline-block;vertical-align:middle} .bash{width:100%;height:300px;background-color:black;color:white;font-family:monospace;resize:vertical;display:none} </style></head><body><div class="logo color3"><div>Server Check v$iv</div></div>~}sub pagefoot {print qq~<hr><footer>For further assistance, please visit our <a href="https://mid.as/kb/00198/how-to-use-server-readiness-tool" target="_blank">Knowledge Base</a> or <a href="https://mid.as/contact" target="_blank">contact us</a></footer><hr></body></html>~}sub splash {pagehead();if(${^TAINT}!=1){print qq~<form name=f method=post action="$fname"><input type=hidden name=act value="starttests"><input type=hidden name=nolog value="$nolog"><input type=hidden name=proxy value="$proxy"><input type=hidden name=user value="$user"><input type=hidden name=pass value="$pass">~}print qq~<h2>IS YOUR SERVER READY FOR MIDAS?</h2><div class="box color1" style="width:100%;max-width:600px;margin-left:auto;margin-right:auto"><div style="width:100%;height:350px;overflow:auto;font-family:Arial;font-size:1em;text-align:justify;padding-right:5px">This tool will check your server setup to determine whether you're able to install and run MIDAS on this server.<br><br>Anonymous usage statistics are collected to allow us to improve our software. No personally identifiable information is collected during this process.<br><br>THIS TOOL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL THE AUTHOR BE LIABLE TO YOU FOR INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, ARISING OUT OF ANY USE THEREOF OR BREACH OF ANY WARRANTY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.<br><br>Click "Begin Test" to begin. This process may take a moment or so to complete. Please do not worry if your browser appears unresponsive during this process - this is normal!</div>~;if(${^TAINT}!=1){print qq~<button>Begin Test <span class=arrow_right></span></button></form>~}else{print qq~<hr><div class=color4><b>ERROR: TAINT MODE DETECTED</b><br>Perl appears to be running in "Taint" mode.<br>You will need to disable this before proceeding - [<a href="https://mid.as/kb/00233/how-to-disable-perl-taint-mode">More information</a>]</div><hr><button DISABLED>Begin Test <span class=arrow_right></span></button>~}print qq~</div>~;pagefoot()}sub starttests{pagehead();my$button=(-e "$cwd/install.pl")?qq~<button onClick=\\"top.location.href='install.pl';return false\\">Install MIDAS Now! <span class=arrow_right></span></button>~:qq~<button onClick=\\"top.location.href='https://mid.as/pricing';return false\\">Get MIDAS Now! <span class=arrow_right></span></button>~;print qq~<script>var teststotal=36;var testsdone=0;var imods='';function midastest(){testsdone++;document.getElementById('progress').innerHTML="<progress value='"+testsdone+"' max='"+teststotal+"'></progress><div class=color2 style='position:relative;top:-32px;margin-bottom:-20px'>Performing Test "+testsdone+" of "+teststotal+"</div>";xmlhttpc=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");xmlhttpc.onreadystatechange=function(){if(xmlhttpc.readyState==4 && xmlhttpc.status==200){result=xmlhttpc.responseText.split("|");if(result.length>1){count=document.getElementById('pfw'+result[0]).innerHTML;count++;document.getElementById('pfw'+result[0]).innerHTML=count;if(result[2]){document.getElementById('pfwi'+result[0]).innerHTML+="<div onMouseOver=\\"document.getElementById('advice"+testsdone+"').style.backgroundColor='rgba(255,215,0,.3)'\\" onMouseOut=\\"document.getElementById('advice"+testsdone+"').style.backgroundColor=''\\"><span class=icon"+result[0]+"></span> "+result[1]+"</div>";document.getElementById('nextsteps').innerHTML+="<li id='advice"+testsdone+"'> "+result[2]}else{document.getElementById('pfwi'+result[0]).innerHTML+="<div><span class=icon"+result[0]+"></span> "+result[1]+"</div>"}if(result[3]){imods+=result[3]+","}}(testsdone<teststotal)?setTimeout(function(){midastest()},100):testoutcome()}};xmlhttpc.open("GET","$fname?act=runtest&number="+testsdone+"&nocache="+Math.random()+"&proxy=$proxy&user=$user&pass=$pass");xmlhttpc.send()}function testrestart(){document.getElementById('cpanlog').style.display="none";testsdone=0;document.getElementById('pfw0').innerHTML=document.getElementById('pfw1').innerHTML=document.getElementById('pfw2').innerHTML="0";document.getElementById('pfwi0').innerHTML=document.getElementById('pfwi1').innerHTML=document.getElementById('pfwi2').innerHTML='';document.getElementById('nextsteps').innerHTML=document.getElementById('proceed').innerHTML='';midastest()}function testoutcome(){document.getElementById('progress').innerHTML='';if(document.getElementById('pfw0').innerHTML=="0"){document.getElementById('proceed').innerHTML="<div class='color5 b' style='font-size:1.5em'><span class=icon2 style='vertical-align:baseline'></span> Success!</div><p>";if(document.getElementById('pfw1').innerHTML>0){document.getElementById('proceed').innerHTML+="You can install MIDAS on this server, but please take note of the above warnings<hr><button onClick='testrestart();return false'><span class=arrow_left></span> Run Tests Again</button> $button"}else{document.getElementById('proceed').innerHTML+="All looks good for you to install MIDAS on this server!<p>$button"}}else{document.getElementById('proceed').innerHTML="<hr><div class=color6>Note: You won't be able to install MIDAS on this server until the above issues have been resolved.</div><p><div class=color1>If you are unable to correct the above issues, why not consider a cloud-hosted MIDAS system instead?</span> <a href='https://mid.as/pricing' class=color6>Learn more...</a></div><hr><button onClick='testrestart();return false'><span class=arrow_left></span> Run Tests Again</button>"}var xmlhttpc=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");xmlhttpc.onreadystatechange=function(){if(xmlhttpc.readyState==4 && xmlhttpc.status==200){cpan=JSON.parse(xmlhttpc.responseText);var x=document.getElementsByClassName("modv");var i;for(i=0;i<x.length;i++){xid=x[i].id;if(cpan[xid]>x[i].innerHTML){x[i].innerHTML+=" <small class=color6>&uarr; "+cpan[xid]+" available</small>";cid=xid.replace(/_/g,"::");imods+=cid+","}}if(imods){document.getElementById('proceed').innerHTML+="<button onClick='installmod()' id=docpan>Install / Update Perl Modules <span class=arrow_right></span></button>"}}};xmlhttpc.open("GET","https://u.mid.as/cpanmods.pl");xmlhttpc.send();~;if(!$nolog){my$server=$ENV{SERVER_SOFTWARE};$server=~s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;my$os=$^O;$os=~s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;my$url=$ENV{HTTP_HOST}.$ENV{REQUEST_URI};print qq~var fd=document.getElementById('pfwi0').innerHTML;fd=fd.replace(/<\\/div>/ig,"\\n");fd=fd.replace(/<[^>]*>/g,"");var wd=document.getElementById('pfwi1').innerHTML;wd=wd.replace(/<\\/div>/ig,"\\n");wd=wd.replace(/<[^>]*>/g,"");var pd=document.getElementById('pfwi2').innerHTML;pd=pd.replace(/<\\/div>/ig,"\\n");pd=pd.replace(/<[^>]*>/g,"");var xmlhttpcB=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");xmlhttpcB.open("POST","https://u.mid.as/servercheck.pl",true);var params="iv=$iv&url=$url&path=$cwd&server=$server&os=$os&perl=$pv&passed="+escape(pd)+"&failed="+escape(fd)+"&warnings="+escape(wd);xmlhttpcB.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttpcB.send(params);~}print qq~}var reflog;function installmod(){if(imods){document.getElementById('docpan').remove();var logta=document.getElementById('cpanlog');logta.style.display="inline";logta.innerHTML="Attempting to install Perl modules\\n*** WARNING: THIS COULD TAKE SEVERAL MINUTES ***";reflog=setInterval(function(){loadcpanlog()},3000);var xmlhttpc=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");xmlhttpc.onreadystatechange=function(){if(xmlhttpc.readyState==4 && xmlhttpc.status==200){clearInterval(reflog);loadcpanlog()}};xmlhttpc.open("GET","$fname?act=getmod&module="+imods);xmlhttpc.send()}}function loadcpanlog(){var xmlhttpc=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");xmlhttpc.onreadystatechange=function(){if(xmlhttpc.readyState==4 && xmlhttpc.status==200){var logta=document.getElementById('cpanlog');logta.innerHTML=xmlhttpc.responseText;logta.scrollTop=logta.scrollHeight}};xmlhttpc.open("GET","$fname?act=getlog");xmlhttpc.send()}</script><div class="box color3" style="max-width:1040px"><h2 class=color3>Your Server:</h2>$ENV{SERVER_SOFTWARE} $^O (Perl: $pv)</div><div class=box style="max-width:1040px;display:grid;grid-gap:10px;grid-template-columns: repeat(auto-fill, minmax(500px, 1fr));"><div><h2 class=color3>Server Test Results:</h2><div style="display:grid;grid-template-columns:1fr 1fr 1fr;font-size:1.5em"><div class=color5>Passed: <span class=b id=pfw2>0</span></div><div class=color4>Failed: <span class=b id=pfw0>0</span></div><div class=color6>Warnings: <span class=b id=pfw1>0</span></div></div><hr><div id=progress></div><div class="l color4" id=pfwi0></div><div class="l color6" id=pfwi1></div><div class="l color5" id=pfwi2></div></div><div><h2 class=color3 style="margin-top:39px">Next Steps:</h2><hr><ul class=l id=nextsteps style="margin-left:-10px"></ul><div id=proceed></div><textarea class=bash id=cpanlog spellcheck=false></textarea></div></div><script>testrestart()</script>~;pagefoot()}sub geturl{my($url,$p)=@_;require LWP::UserAgent;LWP::UserAgent->import();eval{require IO::Socket::SSL};if($@){$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0}my$ua;if($url=~m/https:/i){$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;require IO::Socket::SSL;IO::Socket::SSL->import('SSL_VERIFY_NONE');my$svm=$IO::Socket::SSL::SSL_VERIFY_NONE;$ua=LWP::UserAgent->new(env_proxy=>0,keep_alive=>0,timeout=>30,agent =>"MIDAS i$iv",ssl_opts=>{verify_hostname=>0, SSL_verify_mode=>$svm})}else{$ua=LWP::UserAgent->new(env_proxy=>0,keep_alive=>0,timeout=>30,agent =>"MIDAS i$iv")}if(($p)&&($proxy)){$ENV{HTTPS_PROXY}=$proxy;$ua->proxy(['http','https'],$proxy)}my$r=$ua->get($url);return ($r->is_success)?($r->code,$r->status_line,$r->header("Content-Type"),$r->content):($r->code,$r->status_line)}sub runtest{my$test=$in{number};print "content-type:text/html;charset=UTF-8\n\n";if($test==1){if($pv lt '5.010'){print qq~0|Perl too old ($pv)|Your server appears to be running Perl $pv. Perl 5 (version 5.10 or later) is required. Please update your Perl 5 installation.~}else{print qq~2|Perl version OK ($pvn)~}}elsif($test==2){if($cwd=~m/xampp/i){print qq~0|Server appears to be XAMPP|Your server appears to be an XAMPP server. XAMPP is a development server, and not a stable/production web server. XAMPP is know to cause issues with MIDAS, and therefore should not be used. Please refer to our <a href="https://mid.as/kb/article/00066">Knowledge Base</a> for alternatives~}else{print qq~2|Didn't detect an XAMPP server~}}elsif($test==3){if(($ENV{SERVER_SOFTWARE}=~m/mod_perl/i)||($ENV{MOD_PERL})){my$modpv=($ENV{MOD_PERL})?" ($ENV{MOD_PERL})":'';print qq~0|mod_perl$modpv appears to be running on this server|Your server appears to be running the "mod_perl" extension. This is known to cause issues with MIDAS. Please disable "mod_perl" and restart your server in order to install MIDAS. Details on how to do this may be found <a href="https://mid.as/kb/article/00042">here</a>~}else{print qq~2|mod_perl was not detected on this server~}}elsif($test==4){eval{require POSIX};if($@){print qq~0|POSIX not available|POSIX does not appear to be supported on your server~}else{eval{POSIX::tzset()};if($@){eval{require DateTime};if($@){print qq~0|Neither POSIX::tzset or DateTime is available|Your server does not appear to support POSIX::tzset. In such instances, MIDAS will fallback to use DateTime, however this module doesn't appear to be currently installed. Please install DateTime which may be freely obtained from <a href="https://metacpan.org/pod/DateTime" target="_blank" rel=noopener>MetaCPAN</a>|DateTime~}else{print qq~2|DateTime (<span class=modv id=DateTime>$DateTime::VERSION</span>) is present and will be used in place of POSIX::tzset~}}else{print qq~2|POSIX::tzset is available~}}}elsif($test==5){eval{require Archive::Tar};if($@){print qq~0|The required Perl module Archive::Tar was not found|A required Perl module (<b>Archive::Tar</b>) does not appear to be installed on this server. This module may be freely obtained from <a href="https://metacpan.org/pod/Archive::Tar" target="_blank" rel=noopener>MetaCPAN</a>|Archive::Tar~}else{my$tarver=$Archive::Tar::VERSION;if($tarver<1.24){print qq~0|Version 1.24 or later of the Perl module Archive::Tar is required|Version 1.24 or later of the Perl module <b>Archive::Tar</b> is required to be installed on this server. The version currently installed is <b>$tarver</b>. An updated module can be freely downloaded from <a href="https://metacpan.org/pod/Archive::Tar" target="_blank" rel=noopener>MetaCPAN</a>|Archive::Tar~}else{print qq~2|The Perl module Archive::Tar is present (<span class=modv id=Archive_Tar>$tarver</span>)~}}}elsif($test==6){eval{require Authen::SASL};if($@){print qq~1|The Perl module Authen::SASL was not found|The Perl module (<b>Authen::SASL</b>) does not appear to be installed on your server. This module is only required if you intend to configure MIDAS to send email through an SMTP server that requires SSL, and may be freely obtained from <a href="https://metacpan.org/pod/Authen::SASL" target="_blank" rel=noopener>MetaCPAN</a>|Authen::SASL~}else{print qq~2|The Perl module Authen::SASL is present (<span class=modv id=Authen_SASL>$Authen::SASL::VERSION</span>)~}}elsif($test==7){eval{require CGI};if($@){print qq~0|The required Perl module CGI was not found|A required Perl module (<b>CGI</b>) does not appear to be installed on this server. This module may be freely obtained from <a href="https://metacpan.org/pod/CGI" target="_blank" rel=noopener>MetaCPAN</a>|CGI~}else{my$cgiver=$CGI::VERSION;if($cgiver<4.08){print qq~1|Version 4.08 or later of the Perl module CGI is recommended|The currently installed version of the CGI Perl module is <b>$cgiver</b>. Version 4.08 or later of this module is strongly recommended for increased security and to ensure full functionality of your MIDAS system. An updated module can be freely downloaded from <a href="https://metacpan.org/pod/CGI" target="_blank" rel=noopener>MetaCPAN</a>|CGI~}else{print qq~2|The Perl module CGI is present (<span class=modv id=CGI>$cgiver</span>)~}}}elsif($test==8){eval{require Crypt::Eksblowfish::Bcrypt};if($@){eval{require Digest::SHA};my$digestver=$Digest::SHA::VERSION;if($@){print qq~0|The Perl module Crypt::Eksblowfish was not found|The Perl module (<b>Crypt::Eksblowfish</b>) does not appear to be installed on your server. This module is required for running MIDAS v4.15 (or later), and may be freely obtained from <a href="https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt" target="_blank" rel=noopener>MetaCPAN</a>|Crypt::Eksblowfish~}else{print qq~1|The Perl module Crypt::Eksblowfish was not found|The Perl module (<b>Crypt::Eksblowfish</b>) does not appear to be installed on your server, however, the module Digest::SHA ($digestver) was found. MIDAS will fallback to Digest::SHA when Crypt::Eksblowfish::Bcrypt is not available. For greater security however, we strongly recommend installing Crypt::Eksblowfish::Bcrypt. This module may be freely obtained from <a href="https://metacpan.org/pod/Crypt::Eksblowfish::Bcrypt" target="_blank" rel=noopener>MetaCPAN</a>|Crypt::Eksblowfish~}}else{print qq~2|The Perl module Crypt::Eksblowfish is present (<span class=modv id=Crypt_Eksblowfish>$Crypt::Eksblowfish::Bcrypt::VERSION</span>)~}}elsif($test==9){eval{require Crypt::PRNG};if($@){print qq~1|The Perl module Crypt::PRNG was not found|The Perl module (<b>Crypt::PRNG</b>) does not appear to be installed on your server. For greater security, we recommend installing Crypt::PRNG. This module may be freely obtained from <a href="https://metacpan.org/pod/Crypt::PRNG" target="_blank" rel=noopener>MetaCPAN</a>|Crypt::PRNG~}else{print qq~2|The Perl module Crypt::PRNG is present (<span class=modv id=CryptX>$Crypt::PRNG::VERSION</span>)~}}elsif($test==10){eval{require DBD::MariaDB};if($@){eval{require DBD::mysql};if($@){print qq~0|The Perl module DBD::MariaDB was not found|The Perl module (<b>DBD::MariaDB</b>) does not appear to be installed on your server. This module (or alternatively DBD::mysql) is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/DBD::MariaDB" target="_blank" rel=noopener>MetaCPAN</a>|DBD::MariaDB~}else{print qq~2|The Perl module DBD::MariaDB was not found, but DBD::mysql is present (<span class=modv id=DBD_mysql>$DBD::mysql::VERSION</span>)~}}else{print qq~2|The Perl module DBD::MariaDB is present (<span class=modv id=DBD_MariaDB>$DBD::MariaDB::VERSION</span>)~}}elsif($test==11){eval{require DBD::mysql};if($@){eval{require DBD::MariaDB};if($@){print qq~0|The Perl module DBD::mysql was not found|The Perl module (<b>DBD::mysql</b>) does not appear to be installed on your server. This module (or alternatively DBD::MariaDB) is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/DBD::mysql" target="_blank" rel=noopener>MetaCPAN</a>|DBD::mysql~}else{print qq~2|The Perl module DBD::mysql was not found, but DBD::MariaDB is present (<span class=modv id=DBD_MariaDB>$DBD::MariaDB::VERSION</span>)~}}else{print qq~2|The Perl module DBD::mysql is present (<span class=modv id=DBD_mysql>$DBD::mysql::VERSION</span>)~}}elsif($test==12){eval{require DBI};if($@){print qq~0|The Perl module DBI was not found|The Perl module (<b>DBI</b>) does not appear to be installed on your server. This module is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/DBI" target="_blank" rel=noopener>MetaCPAN</a>|DBI~}else{print qq~2|The Perl module DBI is present (<span class=modv id=DBI>$DBI::VERSION</span>)~}}elsif($test==13){eval{require Digest::HMAC_SHA1};if($@){print qq~1|The Perl module Digest::HMAC_SHA1 was not found|The Perl module (<b>Digest::HMAC_SHA1</b>) does not appear to be installed on your server. This module is only required if you wish to enable 2FA with an external authenticator app, and may be freely obtained from <a href="https://metacpan.org/pod/Digest::HMAC_SHA1" target="_blank" rel=noopener>MetaCPAN</a>.|Digest::HMAC_SHA1~}else{print qq~2|The Perl module Digest::HMAC_SHA1 is present (<span class=modv id=Digest_HMAC>$Digest::HMAC_SHA1::VERSION</span>)~}}elsif($test==14){eval{require Digest::MD5};if($@){print qq~0|The Perl module Digest::MD5 was not found|The Perl module (<b>Digest::MD5</b>) does not appear to be installed on your server. This module is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/Digest::MD5" target="_blank" rel=noopener>MetaCPAN</a>|Digest::MD5~}else{print qq~2|The Perl module Digest::MD5 is present (<span class=modv id=Digest_MD5>$Digest::MD5::VERSION</span>)~}}elsif($test==15){eval{require Encode};if($@){print qq~0|The Perl module Encode was not found|The Perl module (<b>Encode</b>) does not appear to be installed on your server. This module is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/Encode" target="_blank" rel=noopener>MetaCPAN</a>|Encode~}else{print qq~2|The Perl module Encode is present (<span class=modv id=Encode>$Encode::VERSION</span>)~}}elsif($test==16){eval{require Excel::Writer::XLSX};if($@){print qq~1|The Perl module Excel::Writer::XLSX was not found|The Perl module (<b>Excel::Writer::XLSX</b>) does not appear to be installed on your server. This module (which may be freely obtained from <a href="https://metacpan.org/pod/Excel::Writer::XLSX" target="_blank" rel=noopener>MetaCPAN</a>) is only required if you wish to be able to export data from MIDAS in Excel 2007+ format (.xlsx)|Excel::Writer::XLSX~}else{print qq~2|The Perl module Excel::Writer::XLSX is present (<span class=modv id=Excel_Writer_XLSX>$Excel::Writer::XLSX::VERSION</span>)~}}elsif($test==17){eval{require Image::PNG::QRCode};if($@){print qq~1|The Perl module Image::PNG::QRCode was not found|The Perl module (<b>Image::PNG::QRCode</b>) does not appear to be installed on your server. This module is only required if you wish to enable 2FA with an external authenticator app, and may be freely obtained from <a href="https://metacpan.org/pod/Image::PNG::QRCode" target="_blank" rel=noopener>MetaCPAN</a>.|Image::PNG::QRCode~}else{print qq~2|The Perl module Image::PNG::QRCode is present (<span class=modv id=Image_PNG_QRCode>$Image::PNG::QRCode::VERSION</span>)~}}elsif($test==18){eval{require IO::Socket::SSL};if($@){print qq~0|The Perl module IO::Socket::SSL was not found|The Perl module (<b>IO::Socket::SSL</b>) does not appear to be installed on your server. This module is required for downloading and obtaining software updates for MIDAS and may be freely obtained from <a href="https://metacpan.org/pod/IO::Socket::SSL" target="_blank" rel=noopener>MetaCPAN</a>|IO::Socket::SSL~}else{print qq~2|The Perl module IO::Socket::SSL is present (<span class=modv id=IO_Socket_SSL>$IO::Socket::SSL::VERSION</span>)~}}elsif($test==19){eval{require JSON};if($@){print qq~0|The required Perl module JSON was not found|A required Perl module (<b>JSON</b>) does not appear to be installed on your server. This module may be freely obtained from <a href="https://metacpan.org/pod/JSON" target="_blank" rel=noopener>MetaCPAN</a>|JSON~}else{print qq~2|The Perl module JSON is present (<span class=modv id=JSON>$JSON::VERSION</span>)~}}elsif($test==20){eval{require LWP};if($@){print qq~0|The required Perl module LWP was not found|A required Perl module (<b>LWP</b>) does not appear to be installed on this server. This module may be freely obtained from <a href="https://metacpan.org/pod/LWP" target="_blank" rel=noopener>MetaCPAN</a>|LWP~}else{print qq~2|The Perl module LWP is present (<span class=modv id=LWP>$LWP::VERSION</span>)~}}elsif($test==21){eval{require LWP::Protocol::https};if($@){print qq~0|The required Perl module LWP::Protocol::https was not found|A required Perl module (<b>LWP::Protocol::https</b>) does not appear to be installed on this server. This module may be freely obtained from <a href="https://metacpan.org/pod/LWP::Protocol::https" target="_blank" rel=noopener>MetaCPAN</a>|LWP::Protocol::https~}else{print qq~2|The Perl module LWP::Protocol::https is present (<span class=modv id=LWP_Protocol_https>$LWP::Protocol::https::VERSION</span>)~}}elsif($test==22){eval{require Memoize};if($@){print qq~0|The Perl module Memoize was not found|The Perl module (<b>Memoize</b>) does not appear to be installed on your server. This module is required for running MIDAS, and may be freely obtained from <a href="https://metacpan.org/pod/Memoize" target="_blank" rel=noopener>MetaCPAN</a>|Memoize~}else{print qq~2|The Perl module Memoize is present (<span class=modv id=Memoize>$Memoize::VERSION</span>)~}}elsif($test==23){eval{require MIME::Base64};if($@){print qq~0|The Perl module MIME::Base64 was not found|A required Perl module (<b>MIME::Base64</b>) does not appear to be installed on this server. This module may be freely obtained from <a href="https://metacpan.org/pod/MIME::Base64" target="_blank" rel=noopener>MetaCPAN</a>|MIME::Base64~}else{print qq~2|The Perl module MIME::Base64 is present (<span class=modv id=MIME_Base64>$MIME::Base64::VERSION</span>)~}}elsif($test==24){eval{require Net::Config};if($@){print qq~1|The Perl module Net::Config was not found|The Perl module (<b>Net::Config</b>) does not appear to be installed on your server. This module is only required if you intend to configure MIDAS to send email through an SMTP server, and may be freely obtained from <a href="https://metacpan.org/pod/Net::Config" target="_blank" rel=noopener>MetaCPAN</a>|Net::Config}~}else{print qq~2|The Perl module Net::Config is present (<span class=modv id=Net_Config>$Net::Config::VERSION</span>)~}}elsif($test==25){eval{require Net::SMTP};if($@){print qq~1|The Perl module Net::SMTP was not found|The Perl module (<b>Net::SMTP</b>) does not appear to be installed on your server. This module is only required if you intend to configure MIDAS to send email through an SMTP server, and may be freely obtained from <a href="https://metacpan.org/pod/Net::SMTP" target="_blank" rel=noopener>MetaCPAN</a>|Net::SMTP~}else{my$smtpver=$Net::SMTP::VERSION;if($smtpver<3.10){print qq~1|The Perl module Net::SMTP needs updating|Whilst the Perl module Net::SMTP is present, version 3.10 (or later) of this module is necessary if you intend to configure MIDAS to send email through an SMTP server (You currently have v$Net::SMTP::VERSION). If you don't intent to use the SMTP capabilities in MIDAS, this warning may be ignored~}else{print qq~2|The Perl module Net::SMTP is present (<span class=modv id=Net_SMTP>$Net::SMTP::VERSION</span>)~}}}elsif($test==26){eval{require Net::SMTP::TLS};if($@){print qq~1|The Perl module Net::SMTP::TLS was not found|The Perl module (<b>Net::SMTP::TLS</b>) does not appear to be installed on your server. This module is only required if you intend to configure MIDAS to send email through an SMTP server that requires TLS, and may be freely obtained from <a href="https://metacpan.org/pod/Net::SMTP::TLS" target="_blank" rel=noopener>MetaCPAN</a>|Net:SMTP::TLS~}else{print qq~2|The Perl module Net::SMTP::TLS is present (<span class=modv id=Net_SMTP_TLS>$Net::SMTP::TLS::VERSION</span>)~}}elsif($test==27){eval{require PDF::WebKit};if($@){print qq~1|The Perl module PDF::WebKit was not found|The Perl module (<b>PDF::WebKit</b>) does not appear to be installed on your server. This module is only required if you wish to be able to have MIDAS attach PDF versions of invoices to emails (rather than including them inline), and may be freely obtained from <a href="https://metacpan.org/pod/PDF::WebKit" target="_blank" rel=noopener>MetaCPAN</a>. If you install PDF::WebKit, you'll also need to install <a href="https://wkhtmltopdf.org" target="_blank" rel=noopener>wkhtmltopdf</a>|PDF::WebKit~}else{print qq~2|The Perl module PDF::WebKit is present (<span class=modv id=PDF_WebKit>$PDF::WebKit::VERSION</span>)~}}elsif($test==28){eval{require Time::Local};if($@){print qq~0|The required Perl module Time::Local was not found|A required Perl module (<b>Time::Local</b>) does not appear to be installed on your server. This module may be freely obtained from <a href="https://metacpan.org/pod/Time::Local" target="_blank" rel=noopener>MetaCPAN</a>|Time::Local~}else{print qq~2|The Perl module Time::Local is present (<span class=modv id=Time_Local>$Time::Local::VERSION</span>)~}}elsif($test==29){eval{require XML::Simple};if($@){print qq~1|The Perl module XML::Simple was not found|The Perl module (<b>XML::Simple</b>) does not appear to be installed on your server. This module is only required if you wish to be able to export data from your MIDAS system in XML format, and may be freely obtained from <a href="https://metacpan.org/pod/XML::Simple" target="_blank" rel=noopener>MetaCPAN</a>|XML::Simple~}else{print qq~2|The Perl module XML::Simple is present (<span class=modv id=XML_Simple>$XML::Simple::VERSION</span>)~}}elsif($test==30){my$writable=1;open(my$TEST,'>',"$cwd/servertest.pl") or $writable=0;if(!$writable){print qq~0|The current directory cannot be written to|Unable to write to <b>$cwd</b>. Please check that Perl has permission to write to this location~}else{close($TEST);print qq~2|The current directory can be written to~;unlink $cwd."/servertest.pl"}}elsif($test==31){my$writable=1;open(my$TEST,'>',"$cwd/servertest.pl") or $writable=0;if($writable){close($TEST);unlink $cwd."/servertest.pl";my$size=10;open(my$BIGFILE,'>',"$cwd/bigfile.dat");print $BIGFILE "MIDASMIDASMIDASMIDAS" for 1..(($size*1024*1024)/20);close($BIGFILE);my$actualsize=-s "$cwd/bigfile.dat";if($actualsize<10485760){if($actualsize<1048676){print qq~0|There is not enough free space on this server|MIDAS requires a minimum of 10MB of free space on your server. Free up some space or increase your disk quota in order to install MIDAS. If you believe there already is enough space, please check your write permissions to ensure that the server location from which this tool is being run can be written to by this tool~}else{print qq~1|There appears to only be ~.sprintf("%.0f",($actualsize/1024/1024)).qq~MB of free space on this server/disk quota|Whilst you will be able to install MIDAS, it is recommended that there be at least 10MB of free space on your server/quota as your database will grow over time~}}else{print qq~2|There is at least 10MB of free space on this server~}unlink $cwd."/bigfile.dat"}else{print ""}}elsif($test==32){eval{require LWP::UserAgent};if(!$@){my@chk=geturl("https://u.mid.as/minim.png",1);if($chk[0]==200){print qq~2|Your server has an internet connection~;open(my$TEST,'>',"$cwd/supporttest.png");flock($TEST,2);binmode $TEST;print $TEST $chk[3];flock($TEST,8);close($TEST);chmod (0644,"$cwd/supporttest.png")}else{print qq~0|No internet connection detected|Your server was not able to establish a connection to the Internet ($chk[1]). MIDAS requires an active connection to the internet to authorize your MIDAS installation. If your server connects to the internet through a proxy, please run this test again with the address of your proxy server appended to the URL of the installer i.e. $protocol$ENV{HTTP_HOST}/$ENV{SCRIPT_NAME}?proxy=http://<i>your.proxy</i>~}}else{print qq~0|Unable to test internet connection|Unable to check your server's connection to the Internet due to the Perl Module LWP::Simple not being installed. Please install this module and then re-run these tests~}}elsif($test==33){eval{require LWP::UserAgent};if(!$@){my$spath=$ENV{SCRIPT_NAME};$spath=~s/\/$fname//g;my@chk=geturl($protocol.$ENV{HTTP_HOST}."/".$spath."/supporttest.png",1);if($chk[0]==200){print qq~2|Images are allowed in the current directory~}elsif($chk[0]==500){print qq~1|Images are not allowed in the current directory|Images do not appear to be allowed in $cwd ($chk[1]). Some server setups do not allow images to be placed within certain directories i.e. "cgi-bin". You can still install MIDAS, but you'll need to specify a different directory into which support files should be installed~}else{print qq~1|Unable to determine whether images are allowed in the current directory|Unable to determine whether images are allowed in the current directory ($chk[1]). please check your write permissions to ensure that the server location from which this tool is being run can be written to by this tool~}unlink $cwd."/supporttest.png"}else{print qq~0|Unable to test internet connection|Unable to check your server's connection to the Internet due to the Perl Module LWP::Simple not being installed. Please install this module and then re-run these tests~}}elsif($test==34){eval{require LWP::UserAgent};if(!$@){open(my$SVGTEST,'>',"$cwd/1x1.svg");print $SVGTEST qq~<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>~;close($SVGTEST);my$ua=LWP::UserAgent->new(env_proxy=>0,keep_alive=>0,timeout=>10,agent=>'MIDAS i$iv');my$spath=$ENV{SCRIPT_NAME};$spath=~s/\/$fname//g;my@chk=geturl($protocol.$ENV{HTTP_HOST}."/".$spath."/1x1.svg",1);my$SVGsupport=($chk[2]=~m!image/svg\+xml!i)?1:0;if($SVGsupport){print qq~2|Your server is configured for SVG images~}else{print qq~1|Your server doesn't appear to be correctly configured to support SVG images|Consider enabling server support for SVG images in order to get the best MIDAS experience. For help configuring your server to correctly serve SVG files, Please refer to our <a href="https://mid.as/kb/article/00134" class=color1>Knowledge Base</a>~}unlink $cwd."/1x1.svg"}else{print qq~0|Unable to test for SVG support|Unable to check your server's support for SVG images due to the Perl Module LWP::UserAgent not being installed. Please install this module and then re-run these tests~}}elsif($test==35){if(lc($ENV{HTTPS})=~m/on|yes|1/){print qq~2|Your server accepts https connections~}else{print qq~1|Your server is serving this page over an insecure http connection|It is highly recommended that you configure your server to only allow secure https connections to your MIDAS system~}}elsif($test==36){eval{require Net::SSLeay};if(!$@){my$netssleayv=$Net::SSLeay::VERSION;if($netssleayv<1.42){print qq~1|Unable to determine OpenSSL version|In order for MIDAS to download and receive updates, it needs to communicate with our secure servers. Only TLS 1.1 and TLS 1.2 protocols are permitted by our servers (older and less secure TLS 1.0, SSLv3 and SSLv2 protocols are not supported). As long your server supports making TLS 1.1/1.2 connections (available with OpenSSL 1.0.1 or later), this warning can be safely ignored. If you're unsure of what version of OpenSSL is available on your server, this tool can help determine that, provided you first update the Perl modules, Net::SSLeay, to v1.42 or later ($Net::SSLeay::VERSION is currently installed)~}else{my$opensslvt=Net::SSLeay::SSLeay_version();if(Net::SSLeay::SSLeay()>=0x10001000){if(Net::SSLeay::SSLeay()>=0x10101000){print qq~2|Your server runs $opensslvt~}else{print qq~1|Your server runs $opensslvt|OpenSSL 1.1.1 or later is recommended~}}else{if($opensslvt){print qq~0|Your server runs $opensslvt|In order for MIDAS to download and receive updates, it needs to communicate with our secure servers. Only TLS 1.1 and TLS 1.2 protocols are permitted by our servers (older and less secure TLS 1.0, SSLv3 and SSLv2 protocols are not supported). Versions of OpenSSL prior to 1.0.1 do not support TLS 1.1/1.2 connections. Your server appears to currently run $opensslvt, therefore you will need to update OpenSSL to at least 1.0.1~}else{print qq~1|Unable to determine OpenSSL version|In order for MIDAS to download and receive updates, it needs to communicate with our secure servers. Only TLS 1.1 and TLS 1.2 protocols are permitted by our servers (older and less secure TLS 1.0, SSLv3 and SSLv2 protocols are not supported). As long your server supports making TLS 1.1/1.2 connections (available with OpenSSL 1.0.1 or later), this warning can be safely ignored. If you're unsure of what version of OpenSSL is available on your server, this tool can help determine that, provided you first install the Perl module Net::SSLeay which may be freely obtained from <a href="https://metacpan.org/pod/Net::SSLeay" target="_blank" rel=noopener>MetaCPAN</a>~}}}}else{print qq~1|Unable to determine OpenSSL version|OpenSSL: In order for MIDAS to download and receive updates, it needs to communicate with our secure servers. Only TLS 1.1 and TLS 1.2 protocols are permitted by our servers (older and less secure TLS 1.0, SSLv3 and SSLv2 protocols are not supported). As long your server supports making TLS 1.1/1.2 connections (available with OpenSSL 1.0.1 or later), this warning can be safely ignored. If you're unsure of what version of OpenSSL is available on your server, this tool can help determine that, provided you first install the Perl module Net::SSLeay which may be freely obtained from <a href="https://metacpan.org/pod/Net::SSLeay" target="_blank" rel=noopener>MetaCPAN</a>~}}}sub getmod{my@modules=split(/,/,$in{module});require CPAN;open OUTPUT, '>', $cwd."cpan.out";select OUTPUT; $|=1;print "Attempting to install Perl modules\\n*** WARNING: THIS COULD TAKE SEVERAL MINUTES ***\n\n";foreach my$mod(@modules){if($mod){CPAN::Shell->install($mod)}}print "\nFinished!";close(OUTPUT);select STDOUT;print "content-type:text/html\n\n1"}sub getlog{print "content-type:text/plain\n\n";print SSI_INCLUDE($cwd."cpan.out")}sub SSI_INCLUDE{local$/;open(my$F,"<",shift);my$c=<$F>;close($F);return $c}sub parse{my(@pairs,%in);my($buffer,$pair,$name,$value);if($ENV{REQUEST_METHOD}eq'GET'){@pairs=split(/&/,$ENV{QUERY_STRING})}elsif($ENV{REQUEST_METHOD}eq'POST'){read(STDIN,$buffer,$ENV{CONTENT_LENGTH});@pairs=split(/&/,$buffer)}PAIR:foreach my$pair(@pairs){($name,$value)=split(/=/,$pair);$name=~tr/+/ /;$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;$value=~tr/+/ /;$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;($value eq "---") and next PAIR;exists $in{$name}?($in{$name}.="~~$value"):($in{$name}=$value)}return %in}