my-idlers/class.php
cp6 21ffe15e66 Fixed Swap and Bandwidth min values
Fixed Swap and Bandwidth min values
2021-04-10 16:21:34 +10:00

4102 lines
207 KiB
PHP

<?php
class idlersConfig
{
const PAGE_TITLE = 'My idlers';
const PAGE_DESC = 'My idlers listing server, shared hosting and domains information and data.';
const SRV_SORT_TYPE = 'HOSTNAME_ASC';//Server card sort type
const SH_SORT_TYPE = 'HOSTNAME_ASC';//Shared hosting sort type
const DC_SORT_TYPE = 'HOSTNAME_ASC';//Domains sort type
//Options: PRICE_DESC, PRICE_ASC, DUE_DESC, DUE_ASC, OWNED_SINCE_DESC,OWNED_SINCE_ASC, HOSTNAME_DESC & HOSTNAME_ASC
const DB_HOSTNAME = '127.0.0.1';
const DB_NAME = 'idlers';
const DB_USERNAME = 'root';
const DB_PASSWORD = '';
//Have slight background color for server table values: was special price and due soon
const COLOR_TABLE = true;
const DEFAULT_VIEW = 'CARDS';//CARDS or TABLE
const SAVE_YABS_OUTPUT = true;//true or false
const GET_ASN_INFO = true;//Get ANS name and number
//Failed attempts before ip locked from attempting login
const FAIL_ATTEMPTS_ALLOWED = 4;
//Minutes to lock ip for
const IP_LOCK_MINUTES = 10;
}
class elementHelpers extends idlersConfig
{
//Minimizes lines used + opening and closing of <?PHP tag
protected function tagOpen(string $tag = 'div', string $class = '', string $id = '')
{
if (empty($class) && empty($id)) {
$this->outputString("<$tag>");
} elseif (empty($class) && !empty($id)) {
$this->outputString("<$tag id='$id'>");
} elseif (!empty($class) && empty($id)) {
$this->outputString("<$tag class='$class'>");
} else {
$this->outputString("<$tag class='$class' id='$id'>");
}
}
protected function tagClose(string $tag = 'div', int $amount = 1)
{
for ($i = 1; $i <= $amount; $i++) {
$this->outputString("</$tag>");
}
}
protected function outputString(string $string)
{
echo $string;
}
protected function collapseButton(string $text, string $href, string $id = 'collapseId', string $class = 'btn btn-main collapse-btn', bool $expanded = false)
{
($expanded) ? $ex = "true" : $ex = "false";
$this->outputString('<a class="' . $class . '" data-toggle="collapse" href="#' . $href . '" id="' . $id . '" role="button" aria-expanded="' . $ex . '">' . $text . '</a>');
}
protected function HTMLphrase(string $element = 'p', string $class = '', string $text = '', string $id = '')
{
if (empty($class)) {
if (empty($id)) {
$this->tagOpen($element);
} else {
$this->tagOpen($element, '', $id);
}
} else {
if (empty($id)) {
$this->tagOpen($element, $class);
} else {
$this->tagOpen($element, $class, $id);
}
}
$this->outputString($text);
$this->tagClose($element);
}
protected function colOpen(string $class = 'col-12')
{
$this->tagOpen('div', $class);
}
protected function rowColOpen(string $row_class = 'row', string $col_class = 'col-12')
{
$this->tagOpen('div', $row_class);
$this->tagOpen('div', $col_class);
}
protected function textInput(string $name_id, string $value = '', string $class = 'form-control', bool $required = false, int $min_length = 0, int $max_length = 124)
{
(empty($value)) ? $val = '' : $val = " value='$value'";
($required) ? $req = 'required' : $req = '';
$this->outputString("<input type='text' id='$name_id' name='$name_id' class='$class' min-length='$min_length' max-length='$max_length'$val $req>");
}
protected function numberInput(string $name_id, string $value = '', string $class = 'form-control', bool $required = false, int $min = 0, int $max = 9999, string $step = 'any')
{
(empty($value)) ? $val = '' : $val = " value='$value'";
($required) ? $req = 'required' : $req = '';
$this->outputString("<input type='number' id='$name_id' name='$name_id' class='$class' min='$min' max='$max' step='$step'$val $req>");
}
protected function hiddenInput(string $name_id, string $value = '')
{
(empty($value)) ? $val = '' : $val = " value='$value'";
$this->outputString("<input type='hidden' id='$name_id' name='$name_id' $val>");
}
protected function submitInput(string $text, string $id = 'submitInput', string $class = 'btn')
{
$this->outputString("<input type='submit' class='$class' id='$id' value='$text'>");
}
protected function inputPrepend(string $text)
{
$this->outputString('<div class="input-group-prepend"><span class="input-group-text">' . $text . '</span></div>');
}
protected function tagsInput(string $name_id, string $class = 'form-control')
{
$this->outputString("<input type='text' id='$name_id' name='$name_id' class='$class' data-role='tagsinput'>");
}
protected function selectElement(string $name_id, string $class = 'form-control')
{
$this->outputString("<select class='$class' id='$name_id' name='$name_id'>");
}
protected function selectOption(string $text, string $value, bool $selected = false)
{
($selected) ? $sel = ' selected' : $sel = '';
$this->outputString("<option value='$value'$sel>$text</option>");
}
protected function checkInput(string $text, string $name_id, string $input_class = 'form-check-input', string $label_class = 'form-check-label')
{
$this->tagOpen("div", "form-check");
$this->outputString("<input class='$input_class' type='checkbox' id='$name_id' name='$name_id'>");
$this->outputString("<label class='$label_class' for='$name_id'>");
$this->outputString("<b>$text</b>");
$this->tagClose("label");
$this->tagClose("div");
}
protected function navTabs(array $names, array $links)
{
$this->tagOpen("ul", "nav nav-tabs");
$counter = 0;
foreach ($names as $tab) {
$this->tagOpen("li", "nav-item");
if ($counter == 0) {
$this->outputString('<a class="nav-link active" data-toggle="tab" href="' . $links[$counter] . '">' . $tab . '</a>');
} else {
$this->outputString('<a class="nav-link" data-toggle="tab" href="' . $links[$counter] . '">' . $tab . '</a>');
}
$this->tagClose("li");
$counter++;
}
$this->tagClose("ul");
}
protected function tableHeader(array $headers, string $class = 'table table-striped table-bordered table-sm', string $id = 'orderTable')
{
$this->tagOpen('div', 'table-responsive');
$this->outputString("<table class='$class' id='$id'>");
$this->tagOpen('thead');
$this->tagOpen('tr');
foreach ($headers as $th) {
$this->outputString("<th>$th</th>");
}
$this->outputString('</tr></thead><tbody>');
}
protected function tableTd(string $class, $content)
{
$this->tagOpen('td', $class);
$this->outputString($content);
$this->tagClose('td');
}
protected function virtSelectOptions()
{
$this->selectOption('KVM', 'KVM', true);
$this->selectOption('OVZ', 'OVZ');
$this->selectOption('DEDI', 'DEDI');
$this->selectOption('LXC', 'LXC');
}
protected function sharedHostingTypeOptions()
{
$this->selectOption('ApisCP', 'ApisCP');
$this->selectOption('Centos', 'Centos');
$this->selectOption('cPanel', 'cPanel', true);
$this->selectOption('Direct Admin', 'Direct Admin');
$this->selectOption('Webmin', 'Webmin');
$this->selectOption('Moss', 'Moss');
$this->selectOption('Other', 'Other');
$this->selectOption('Plesk', 'Plesk');
$this->selectOption('Run cloud', 'Run cloud');
$this->selectOption('Vesta CP', 'Vesta CP');
$this->selectOption('Virtual min', 'Virtual min');
}
protected function termSelectOptions()
{
$this->selectOption('Monthly', '1', true);
$this->selectOption('Quarterly', '2');
$this->selectOption('Half annual (half year)', '3');
$this->selectOption('Annual (yearly)', '4');
$this->selectOption('Biennial (2 years)', '5');
$this->selectOption('Triennial (3 years)', '6');
}
protected function domainTermSelectOptions()
{
$this->selectOption('Annual (yearly)', '4', true);
$this->selectOption('Biennial (2 years)', '5');
$this->selectOption('Triennial (3 years)', '6');
}
protected function CurrencySelectOptions()
{
$this->selectOption('AUD', 'AUD');
$this->selectOption('USD', 'USD', true);
$this->selectOption('GBP', 'GBP');
$this->selectOption('EUR', 'EUR');
$this->selectOption('NZD', 'NZD');
$this->selectOption('JPY', 'JPY');
$this->selectOption('CAD', 'CAD');
}
protected function OsSelectOptions()
{
$this->selectOption('Centos 7', '1');
$this->selectOption('Centos 8', '2');
$this->selectOption('Centos', '3');
$this->selectOption('Debian 9', '4');
$this->selectOption('Debian 10', '5');
$this->selectOption('Debian', '6');
$this->selectOption('Fedora 32', '7');
$this->selectOption('Fedora 33', '8');
$this->selectOption('Fedora', '9');
$this->selectOption('FreeBSD 11.4', '10');
$this->selectOption('FreeBSD 12.1', '11');
$this->selectOption('FreeBSD', '12');
$this->selectOption('OpenBSD 6.7', '13');
$this->selectOption('OpenBSD 6.8', '14');
$this->selectOption('OpenBSD', '15');
$this->selectOption('Ubuntu 16.04', '16');
$this->selectOption('Ubuntu 18.04', '17');
$this->selectOption('Ubuntu 20.04', '18');
$this->selectOption('Ubuntu 20.10', '19');
$this->selectOption('Ubuntu', '20');
$this->selectOption('Windows Server 2008', '21');
$this->selectOption('Windows Server 2012', '22');
$this->selectOption('Windows Server 2016', '23');
$this->selectOption('Windows Server 2019', '24');
$this->selectOption('Windows 10', '25');
$this->selectOption('Custom', '26');
$this->selectOption('Other', '27');
}
}
class helperFunctions extends elementHelpers
{
protected function genID(int $length = 8)
{//Returns an id string
$character_pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
$char_length = strlen($character_pool);
$the_string = '';
for ($i = 0; $i < $length; $i++) {
$the_string .= $character_pool[mt_rand(0, $char_length - 1)];
}
return $the_string;
}
protected function mhzToGhz(string $mhz, int $decimals = 2)
{
return number_format(floatval(($mhz / 1000)), $decimals);
}
protected function paymentTerm(int $term)
{
if ($term == 1) {
return "p/m";
} elseif ($term == 2) {
return "p/qtr";
} elseif ($term == 3) {
return "p/hy";
} elseif ($term == 4) {
return "p/y";
} elseif ($term == 5) {
return "p/2y";
} elseif ($term == 6) {
return "p/3y";
} else {
return "NULL";
}
}
protected function costAsPerMonth(string $cost, int $term)
{
if ($term == 1) {
return $cost;
} elseif ($term == 2) {
return ($cost / 3);
} elseif ($term == 3) {
return ($cost / 6);
} elseif ($term == 4) {
return ($cost / 12);
} elseif ($term == 5) {
return ($cost / 24);
} elseif ($term == 6) {
return ($cost / 36);
} else {
return $cost;
}
}
protected function convertToUSD(string $amount, string $convert_from)
{
if ($convert_from == 'AUD') {
return (0.76 * $amount);
} elseif ($convert_from == "USD") {
return $amount;
} elseif ($convert_from == "GBP") {
return (1.35 * $amount);
} elseif ($convert_from == "EUR") {
return (1.23 * $amount);
} elseif ($convert_from == "NZD") {
return (0.72 * $amount);
} elseif ($convert_from == "JPY") {
return (0.0097 * $amount);
} elseif ($convert_from == "CAD") {
return (0.78 * $amount);
} else {
return "";
}
}
protected function osIntToIcon(int $os)
{
if ($os <= 3) {//Centos
return "<i class='fab fa-centos os-icon'></i>";
} elseif ($os > 3 && $os <= 6) {//Debain
return "<i class='fab fa-linux os-icon'></i>";
} elseif ($os > 6 && $os < 10) {//Fedora
return "<i class='fab fa-fedora os-icon'></i>";
} elseif ($os > 10 && $os < 13) {//FreeBSD
return "<i class='fab fa-linux os-icon'></i>";
} elseif ($os > 13 && $os < 16) {//OpenBSD
return "<i class='fab fa-linux os-icon'></i>";
} elseif ($os > 15 && $os < 21) {//Ubuntu
return "<i class='fab fa-ubuntu os-icon'></i>";
} elseif ($os > 20 && $os < 26) {//Windows
return "<i class='fab fa-windows os-icon'></i>";
} else {//OTHER ISO CUSTOM etc
return "<i class='fas fa-compact-disc os-icon'></i>";
}
}
protected function osIntToString(int $os)
{
if ($os == "1") {
return "CentOS 7";
} elseif ($os == "2") {
return "CentOS 8";
} elseif ($os == "3") {
return "CentOS";
} elseif ($os == "4") {
return "Debian 9";
} elseif ($os == "5") {
return "Debian 10";
} elseif ($os == "6") {
return "Debian";
} elseif ($os == "7") {
return "Fedora 32";
} elseif ($os == "8") {
return "Fedora 33";
} elseif ($os == "9") {
return "Fedora";
} elseif ($os == "10") {
return "FreeBSD 11.4";
} elseif ($os == "11") {
return "FreeBSD 12.1";
} elseif ($os == "12") {
return "FreeBSD";
} elseif ($os == "13") {
return "OpenBSD 6.7";
} elseif ($os == "14") {
return "OpenBSD 6.8";
} elseif ($os == "15") {
return "OpenBSD";
} elseif ($os == "16") {
return "Ubuntu 16.04";
} elseif ($os == "17") {
return "Ubuntu 18.04";
} elseif ($os == "18") {
return "Ubuntu 20.04";
} elseif ($os == "19") {
return "Ubuntu 20.10";
} elseif ($os == "20") {
return "Ubuntu";
} elseif ($os == "21") {
return "Windows Server 2008";
} elseif ($os == "22") {
return "Windows Server 2012";
} elseif ($os == "23") {
return "Windows Server 2016";
} elseif ($os == "24") {
return "Windows Server 2019";
} elseif ($os == "25") {
return "Windows 10";
} elseif ($os == "26") {
return "Custom";
} elseif ($os == "27") {
return "Other";
} else {
return "Unknown";
}
}
protected function floatValue(string $string)
{//Keeps only numbers and . AKA a float
return preg_replace('/[^0-9,.]/', '', trim($string));
}
protected function intValue(string $string)
{//Keeps only numbers AKA an int
return preg_replace('/[^0-9]/', '', trim($string));
}
protected function removeFloat(string $string)
{//Removes float from a string
return ltrim(preg_replace('/[^A-Za-z\-,.]/', '', $string), '.');
}
protected function trimRemoveR(string $string)
{//Removes \r and does a trim()
return trim(str_replace("\r", '', $string));
}
protected function datatype(string $string)
{//Formats data type (ram and disk)
if (strpos($string, 'M') !== false) {
return 'MB';//Megabytes
} elseif (strpos($string, 'G') !== false) {
return 'GB';//Gigabytes
} elseif (strpos($string, 'K') !== false) {
return 'KB';//Kilobytes
} elseif (strpos($string, 'T') !== false) {
return 'TB';//TeraBytes
} elseif (strpos($string, 'B') !== false) {
return 'BT';//Bytes
}
}
public function GBtoMB(string $gb)
{//Gigabyte to Megabyte conversion
return floatval(($gb * 1024));
}
protected function TBtoGB(string $tb)
{//Terabyte to Gigabyte conversion
return floatval(($tb * 1024));
}
protected function GBpstoMBps(string $gbps, bool $format = false)
{//Gigabits to Megabits
$gbps = (float)$gbps;
if ($format) {
return floatval(number_format(($gbps * 1000), 3));
} else {
return floatval(($gbps * 1000));
}
}
protected function yabsSpeedLoc(array $data)
{//Formats YABs speed test provider and location as array
if ($data[1] == '|') {
$provider = $data[0];
} else {
$provider = $data[0] . ' ' . $data[1];
}
if ($data[2] !== '|') {
$location = $data[2] . ' ' . str_replace(',', '', $data[3]);
} else {
$location = $data[3] . ' ' . str_replace(',', '', $data[4]);
}
return array('provider' => $provider, 'location' => $location);
}
protected function yabsSpeedValues(array $data)
{//Formats YABs speed test for speed value and type as array
$data = explode('|', implode($data));
if ($data[2] == 'busy') {
$send = $send_type = NULL;
} else {
$send = floatval($data[2]);
if ($this->removeFloat($data[2]) == 'Mbitssec') {
$send_type = "MBps";
} elseif ($this->removeFloat($data[2]) == 'Gbitssec') {
$send_type = "GBps";
} elseif ($this->removeFloat($data[2]) == 'Kbitssec') {
$send_type = "KBps";
} else {
$send_type = $this->removeFloat($data[2]);
}
}
if ($data[3] == 'busy') {
$receive = $receive_type = NULL;
} else {
$receive = floatval($data[3]);
if ($this->removeFloat($data[3]) == 'Mbitssec') {
$receive_type = "MBps";
} elseif ($this->removeFloat($data[3]) == 'Gbitssec') {
$receive_type = "GBps";
} elseif ($this->removeFloat($data[3]) == 'Kbitssec') {
$receive_type = "KBps";
} else {
$receive_type = $this->removeFloat($data[3]);
}
}
return array('send' => $send, 'send_type' => $send_type, 'receive' => $receive, 'receive_type' => $receive_type);
}
protected function diskSpeedAsMbps(string $type, string $value)
{//If value type GB/s convert to MB/s, KB/s to MB/s
if ($type == "GB/s") {
return $this->GBpstoMBps($value);
} elseif ($type == "KB/s") {
return ($value / 1000);
} else {
return $value;
}
}
protected function networkSpeedAsMbps(string $type, string $value)
{//If value type GBps convert to MB/s
if ($type == "GBps") {
return $this->GBpstoMBps($value);
} else {
return $value;
}
}
protected function intToYesNo(int $int)
{// 1 = Yes, 0 = No
if ($int == 1) {
return "Yes";
} elseif ($int == 0) {
return "No";
} else {
return $int;
}
}
protected function saveYABS($content, string $filename)
{
return file_put_contents("yabs/$filename", $content);
}
protected function daysAway(string $ahead_date)
{
$today = new DateTime("now");
$date = new DateTime($ahead_date);
return $date->diff($today)->format("%a");
}
protected function deleteYabsForId(string $id)
{
if ($handle = opendir("yabs/")) {
while (false !== ($file = readdir($handle))) {
if ('.' === $file) continue;
if (strpos($file, $id) !== false) {
unlink("yabs/$file");
}
}
closedir($handle);
}
}
}
class idlers extends helperFunctions
{
protected function dbConnect()
{
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);
return new PDO("mysql:host=" . self::DB_HOSTNAME . ";dbname=" . self::DB_NAME . ";charset=utf8mb4", self::DB_USERNAME, self::DB_PASSWORD, $options);
}
protected function pageHead(string $title = 'Page Title')
{//Echo output because it breaks formatting in PHPstorm if closing + opening PHP tags
$this->outputString("<html lang='en'>");
$this->tagOpen("head");
$this->outputString("<title>" . self::PAGE_TITLE . "</title>");
$this->outputString("<meta charset='utf-8'>");
$this->outputString("<meta name='viewport' content='width=device-width, initial-scale=1'>");
$this->outputString("<meta name='description' content='" . self::PAGE_DESC . "'>");
$this->outputString("<link rel='shortcut icon' type='image/x-icon' href='assets/favicon.ico' />");
$this->outputString("<link rel='stylesheet' href='assets/css/style.css'/>");
$this->tagClose("head");
$this->tagOpen("body");
$this->tagOpen("div", "container");
}
protected function pageContents()
{
$this->navTabs(array('Services', 'Add', 'Order', 'Info', 'Search', 'Compare'), array('#services', '#add_server', '#order', '#info', '#search', '#compare'));
$this->outputString('<div id="myTabContent" class="tab-content">');
$this->outputString('<div class="tab-pane server-cards fade active show" id="services">');
$this->viewSwitcherIcon();
if (self::DEFAULT_VIEW == 'CARDS') {
$cards_start = 'active';
$table_start = '';
} else {
$cards_start = '';
$table_start = 'active';
}
$this->tagOpen('div', $cards_start, 'cardsViewDiv');
//Object cards
$this->tagClose('div');
$this->tagOpen('div', $table_start, 'tableViewDiv');
//Objects tables
$this->tagClose('div', 2);
$this->outputString('<div class="tab-pane fade" id="add_server">');
//BTN Bar
$this->rowColOpen('row text-center', 'col-12 btn-bar-col');
$this->outputString('<div class="btn-group btn-group-toggle" data-toggle="buttons">');
$this->outputString('<label class="btn btn-main btn-bar active">');
$this->outputString('<input type="radio" name="options" id="addServerBTN" autocomplete="off" checked>Add server</label>');
$this->outputString('<label class="btn btn-main btn-bar">');
$this->outputString('<input type="radio" name="options" id="addServerNoYabsBTN" autocomplete="off">Add server no YABs</label>');
$this->outputString('<label class="btn btn-main btn-bar">');
$this->outputString('<input type="radio" name="options" id="addSharedHostingBTN" autocomplete="off">Add shared hosting</label>');
$this->outputString('<label class="btn btn-main btn-bar">');
$this->outputString('<input type="radio" name="options" id="addDomainBTN" autocomplete="off">Add Domain</label>');
$this->tagClose('div', 3);
$this->tagOpen('div', 'collapse show', 'addServer');
$this->addVPSFormYabs();
$this->tagClose('div');
$this->tagOpen('div', 'collapse', 'addServerNoYabs');
$this->addVPSForm();
$this->tagClose('div');
$this->tagOpen('div', 'collapse', 'addSharedHosting');
$this->addSharedHostingForm();
$this->tagClose('div');
$this->tagOpen('div', 'collapse', 'addDomain');
$this->addDomainForm();
$this->tagClose('div', 2);
$this->outputString('<div class="tab-pane fade" id="order">');
$this->orderForm();
$this->tagClose('div');
$this->outputString('<div class="tab-pane fade" id="info">');
$this->tagClose('div');
$this->outputString('<div class="tab-pane fade" id="search">');
$this->searchDiv();
$this->tagClose('div');
$this->outputString('<div class="tab-pane fade" id="compare">');
$this->compareSection();
$this->tagClose('div', 2);
$this->editServerModal();
$this->editSharedHostingModal();
$this->editDomainModal();
$this->outputString('<div class="modal fade" id="viewMoreServerModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog modal-lg" role="document">');
$this->outputString('<div class="modal-content" id="viewMoreModalBody">');
$this->tagClose('div', 3);
$this->outputString('<div class="modal fade" id="yabsModal" tabindex="-1" role="dialog" aria-labelledby="yabsmodalview" aria-hidden="true">');
$this->outputString('<div class="modal-dialog modal-lg" role="document">');
$this->outputString('<div class="modal-content text-center">');
$this->tagOpen('div', 'modal-header');
$this->outputString('<h4 class="modal-title w-100" id="yabs_hostname_header"></h4>');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close">');
$this->outputString('<span aria-hidden="true">&times;</span>');
$this->tagClose('button');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body', 'yabsModalBody');
$this->tagClose('div', 4);
$this->outputString('<div class="modal fade" id="viewMoreModalSharedHosting" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog" role="document">');
$this->outputString('<div class="modal-content" id="viewMoreSharedHostingModalBody">');
$this->tagClose('div', 3);
$this->outputString('<div class="modal fade" id="viewMoreModalDomain" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog" role="document">');
$this->outputString('<div class="modal-content" id="viewMoreDomainModalBody">');
$this->tagClose('div', 3);
}
protected function getProvider(int $provider)
{
$select = $this->dbConnect()->prepare("SELECT `name` FROM `providers` WHERE `id` = ? LIMIT 1;");
$select->execute([$provider]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {//Yes
return $row['name'];
} else {//NO
return null;
}
}
protected function getLocation(int $location)
{
$select = $this->dbConnect()->prepare("SELECT `name` FROM `locations` WHERE `id` = ? LIMIT 1;");
$select->execute([$location]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {//Yes
return $row['name'];
} else {//NO
return null;
}
}
public function serverDetails(string $id)
{
$select = $this->dbConnect()->prepare("SELECT id, hostname, location, provider, ipv4, ipv6, `cpu`, cpu_type, cpu_freq, ram, ram_type, swap, swap_type, `disk`, disk_type, bandwidth, bandwidth_type, gb5_single, gb5_multi, gb5_id, aes_ni, amd_v, is_dedicated, is_cpu_dedicated, was_special, os, still_have, DATE_FORMAT(`owned_since`, '%M %Y') as owned_since FROM `servers` WHERE `id` = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
return json_encode($data);
}
public function serverData(string $id)
{
$select = $this->dbConnect()->prepare("SELECT `has_yabs`, `has_st` FROM `servers` WHERE `id` = ? LIMIT 1;");
$select->execute([$id]);
$row = $select->fetch();
if ($row['has_yabs'] == 1 && $row['has_st'] == 1) {
$select = $this->dbConnect()->prepare("
SELECT servers.id as server_id,hostname,ipv4,ipv6,`cpu`,cpu_type,cpu_freq,ram,ram_type,ram_mb,swap,swap_type,swap_mb,`disk`,disk_type,disk_gb,bandwidth,bandwidth_type,gb5_single,gb5_multi,gb5_id,aes_ni,amd_v,
is_dedicated,is_cpu_dedicated,was_special,os,ssh_port,still_have,tags,notes,label,asn,virt,has_yabs,has_st,ns1,ns2,DATE_FORMAT(`owned_since`, '%M %Y') as owned_since, `owned_since` as owned_since_raw, `4k`,`4k_type`,`4k_as_mbps`,`64k`,`64k_type`,
`64k_as_mbps`,`512k`,`512k_type`,`512k_as_mbps`,`1m`,`1m_type`,`1m_as_mbps`,
loc.name as location,send,send_type,recieve,recieve_type,price,currency,term,as_usd,per_month,usd_per_month,next_dd,pr.name as provider
FROM servers INNER JOIN disk_speed ds on servers.id = ds.server_id
INNER JOIN speed_tests st on servers.id = st.server_id INNER JOIN locations loc on servers.location = loc.id
INNER JOIN providers pr on servers.provider = pr.id INNER JOIN pricing on servers.id = pricing.server_id WHERE servers.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
$sel_st = $this->dbConnect()->prepare("SELECT `location`, `send`, `send_type`,`send_as_mbps`, `recieve`, `recieve_type`, `recieve_as_mbps` FROM `speed_tests` WHERE `server_id` = ? ORDER BY `datetime` DESC LIMIT 8;");
$sel_st->execute([$id]);
$speed_tests = $sel_st->fetchAll(PDO::FETCH_ASSOC);
$final = array_merge($speed_tests, $data);
return json_encode($final);
} elseif ($row['has_yabs'] == 1 && $row['has_st'] == 0) {
$select = $this->dbConnect()->prepare("
SELECT servers.id as server_id,hostname,ipv4,ipv6,`cpu`,cpu_type,cpu_freq,ram,ram_type,ram_mb,swap,swap_type,swap_mb,`disk`,disk_type,disk_gb,bandwidth,bandwidth_type,gb5_single,gb5_multi,gb5_id,aes_ni,amd_v,
is_dedicated,is_cpu_dedicated,was_special,os,ssh_port,still_have,tags,notes,label,asn,virt,has_yabs,has_st,ns1,ns2,DATE_FORMAT(`owned_since`, '%M %Y') as owned_since, `owned_since` as owned_since_raw, `4k`,`4k_type`,`64k`,`64k_type`,`512k`,`512k_type`,`1m`,`1m_type`,
loc.name as location,price,currency,term,as_usd,per_month,usd_per_month,next_dd,pr.name as provider
FROM servers INNER JOIN disk_speed ds on servers.id = ds.server_id
INNER JOIN locations loc on servers.location = loc.id
INNER JOIN providers pr on servers.provider = pr.id INNER JOIN pricing on servers.id = pricing.server_id WHERE servers.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
return json_encode($data);
} else {
$select = $this->dbConnect()->prepare("
SELECT servers.id as server_id,hostname,ipv4,ipv6,`cpu`,cpu_type,cpu_freq,ram,ram_type,ram_mb,swap,swap_type,swap_mb,`disk`,disk_type,disk_gb,
bandwidth,bandwidth_type,gb5_single,gb5_multi,gb5_id,aes_ni,amd_v,is_dedicated,is_cpu_dedicated,was_special,os,ssh_port,still_have,tags,notes,virt,has_yabs,ns1,ns2,label,asn,has_st,
DATE_FORMAT(`owned_since`, '%M %Y') as owned_since,loc.name as location,price,currency,term,as_usd,per_month,usd_per_month,next_dd,pr.name as provider
FROM servers INNER JOIN locations loc on servers.location = loc.id
INNER JOIN providers pr on servers.provider = pr.id INNER JOIN pricing on servers.id = pricing.server_id WHERE servers.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
return json_encode($data);
}
}
public function sharedHostingData(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT shared_hosting.id as server_id, domain, domains_limit, emails, disk, disk_type, disk_as_gb, ftp, db, bandwidth, provider, location, was_special,
still_have, type, `owned_since` as owned_since_raw, DATE_FORMAT(`owned_since`, '%M %Y') as owned_since,loc.name as location,price,currency,term,as_usd,per_month,next_dd,pr.name as provider
FROM shared_hosting INNER JOIN locations loc on shared_hosting.location = loc.id
INNER JOIN providers pr on shared_hosting.provider = pr.id INNER JOIN pricing on shared_hosting.id = pricing.server_id WHERE shared_hosting.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
return json_encode($data);
}
public function domainData(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT domains.id as server_id, domain, attached_to, ns1, ns2, still_have, `owned_since` as owned_since_raw, DATE_FORMAT(`owned_since`, '%M %Y') as owned_since,price,currency,term,as_usd,per_month,next_dd,pr.name as provider
FROM domains INNER JOIN providers pr on domains.provider = pr.id INNER JOIN pricing on domains.id = pricing.server_id WHERE domains.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
return json_encode($data);
}
protected function serverCards()
{
if (self::SRV_SORT_TYPE == 'HOSTNAME_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `hostname` DESC;");
} elseif (self::SRV_SORT_TYPE == 'HOSTNAME_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `hostname`;");
} elseif (self::SRV_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `owned_since` DESC;");
} elseif (self::SRV_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `owned_since`;");
} elseif (self::SRV_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::SRV_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::SRV_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::SRV_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header', 'Servers <span class="object-count">' . $count . '</span>');
}
$this->tagOpen('div', 'row');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->vpsCard($row['id']);
}
$this->tagClose('div');
}
protected function sharedHostingCards()
{
if (self::SH_SORT_TYPE == 'DOMAIN_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `domain` DESC;");
} elseif (self::SH_SORT_TYPE == 'DOMAIN_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `domain`;");
} elseif (self::SH_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `owned_since` DESC;");
} elseif (self::SH_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `owned_since`;");
} elseif (self::SH_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::SH_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::SH_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::SH_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header', 'Shared hosting <span class="object-count">' . $count . '</span>');
}
$this->tagOpen('div', 'row');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->SharedHostingCard($row['id']);
}
$this->tagClose('div');
}
protected function domainCards()
{
if (self::DC_SORT_TYPE == 'DOMAIN_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `domain` DESC;");
} elseif (self::DC_SORT_TYPE == 'DOMAIN_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `domain`;");
} elseif (self::DC_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `owned_since` DESC;");
} elseif (self::DC_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `owned_since`;");
} elseif (self::DC_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::DC_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::DC_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::DC_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header', 'Domains <span class="object-count">' . $count . '</span>');
}
$this->tagOpen('div', 'row');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->domainCard($row['id']);
}
$this->tagClose('div');
}
protected function serverTable()
{
if (self::SRV_SORT_TYPE == 'HOSTNAME_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `hostname` DESC;");
} elseif (self::SRV_SORT_TYPE == 'HOSTNAME_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `hostname`;");
} elseif (self::SRV_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `owned_since` DESC;");
} elseif (self::SRV_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` ORDER BY `owned_since`;");
} elseif (self::SRV_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::SRV_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::SRV_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::SRV_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers` INNER JOIN `pricing` ON servers.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `servers`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header', 'Servers <span class="object-count">' . $count . '</span>');
$this->tagOpen('div', 'row');
$this->tableHeader(array('Hostname', '', '', 'Type', 'CPU', 'RAM', 'Disk', 'Price', 'OS', 'Location', 'Provider', 'Due', 'Owned', 'IPv4', 'IPv6', 'Tags'), 'table objects-table', 'serversTable');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->vpsTableRow($row['id']);
}
$this->outputString('</tbody></table></div>');
$this->tagClose('div');
}
}
protected function vpsCard(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT servers.id,servers.hostname,servers.ipv4,servers.`cpu`,servers.cpu_freq,servers.ram,servers.ram_type,servers.`disk`,
servers.disk_type,servers.os,servers.virt,servers.was_special,locations.name as location,providers.name as provider,pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM servers INNER JOIN locations on servers.location = locations.id INNER JOIN providers on servers.provider = providers.id
INNER JOIN pricing on servers.id = pricing.server_id WHERE servers.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
($data['was_special'] == 1) ? $special = ' special-card' : $special = '';
(is_null($data['next_dd'])) ? $dd_class = 'no-dd' : $dd_class = 'dd-text';
$this->colOpen('col-12 col-sm-6 col-md-4 col-xl-3');
$this->tagOpen("div", "card obj-card$special");
$this->tagOpen('div', 'card-header');
$this->rowColOpen('row text-center', 'col-12 col-xl-10');
$this->HTMLphrase('h4', 'hostname-header', $data['hostname']);
$this->tagClose('div');
$this->colOpen('col-12 col-xl-2 os-col');
(empty($data['ipv4']) || is_null($data['ipv4'])) ? $host = $data['hostname'] : $host = $data['ipv4'];
$this->outputString('<a id="checkUpStatus" href="#" value="' . $host . '">' . $this->osIntToIcon($data['os']) . '</a>');
$this->tagClose('div', 3);
$this->tagOpen('div', 'card-body');
$this->HTMLphrase('h6', 'price', '$' . $data['price'] . ' ' . $data['currency'] . ' ' . $this->paymentTerm($data['term']));
$this->rowColOpen('row text-center', 'col-12');
if (is_null($data['provider']) || empty($data['provider'])) {
$this->HTMLphrase('h6', 'provider no-prov', '&nbsp;');
} else {
$this->HTMLphrase('h6', 'provider', $data['provider']);
}
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-12');
if (is_null($data['location']) || empty($data['location'])) {
$this->HTMLphrase('h6', 'location no-loc', '&nbsp;');
} else {
$this->HTMLphrase('h6', 'location', $data['location']);
}
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('p', $dd_class, "Due in {$this->processDueDate($data['id'], $data['term'], $data['next_dd'])} days");
$this->tagClose('div', 2);
$this->rowColOpen('row cpu-row', 'col-6');
$this->outputString('<i class="fas fa-microchip"></i>');
$this->HTMLphrase('p', 'value', '' . $data['cpu'] . '<span class="data-type">@</span>' . $this->mhzToGhz($data['cpu_freq']) . '<span class="data-type">Ghz</span>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<i class="fas fa-box"></i>');
$this->HTMLphrase('p', 'value', '<span class="data-type">' . $data['virt'] . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row mem-disk-row', 'col-6');
$this->outputString('<i class="fas fa-memory"></i>');
$this->HTMLphrase('p', 'value', '' . $data['ram'] . '<span class="data-type">' . $data['ram_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<i class="fas fa-hdd"></i>');
$this->HTMLphrase('p', 'value', '' . $data['disk'] . '<span class="data-type">' . $data['disk_type'] . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-6');
$this->outputString('<a class="btn btn-main" id="viewMoreServer" value="' . $id . '" data-target="#viewMoreServerModal" data-toggle="modal" href="#" role="button">More</a>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<a class="btn btn-second" id="editServer" value="' . $id . '" data-target="#editServerModal" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tagClose('div', 5);
}
protected function locationForTable(string $location)
{
if (strpos($location, ',') !== false) {
return explode(',', $location)[0];
} else {
return $location;
}
}
public function objectCards()
{
$this->serverCards();
$this->sharedHostingCards();
$this->domainCards();
}
public function objectTables()
{
$this->serverTable();
$this->sharedHostingTable();
$this->domainTable();
}
protected function vpsTableRow(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT servers.id,servers.hostname,servers.ipv4,servers.ipv6,servers.`cpu`,servers.cpu_freq,servers.ram,servers.ram_type,servers.`disk`,
servers.disk_type,servers.os,servers.virt,servers.tags, DATE_FORMAT(`owned_since`, '%d %b %Y') as dt, servers.was_special,locations.name as location,providers.name as provider,pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM servers INNER JOIN locations on servers.location = locations.id INNER JOIN providers on servers.provider = providers.id
INNER JOIN pricing on servers.id = pricing.server_id WHERE servers.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
if (self::COLOR_TABLE) {
($data['was_special'] == 1) ? $special_class = 'td-special-price' : $special_class = '';
if ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) < 7) {
$ds_class = 'td-due-soon';
} elseif ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) > 300) {
$ds_class = 'td-not-due-soon';
} else {
$ds_class = '';
}
} else {
$special_class = $ds_class = '';
}
(empty($data['ipv4']) || is_null($data['ipv4'])) ? $host = $data['hostname'] : $host = $data['ipv4'];
$this->tagOpen('tr');
$this->tableTd('', $data['hostname']);
$this->tableTd('', '<a class="btn btn-main table-btn" id="viewMoreServer" value="' . $data['id'] . '" data-target="#viewMoreServerModal" data-toggle="modal" href="#" role="button">More</a>');
$this->tableTd('', '<a class="btn btn-second table-btn" id="editServer" value="' . $data['id'] . '" data-target="#editServerModal" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tableTd('td-text-sml', $data['virt']);
$this->tableTd('td-nowrap', $data['cpu'] . '<span class="data-type">@' . $this->mhzToGhz($data['cpu_freq']) . 'Ghz</span>');
$this->tableTd('td-nowrap', $data['ram'] . '<span class="data-type">' . $data['ram_type'] . '</span>');
$this->tableTd('td-nowrap', $data['disk'] . '<span class="data-type">' . $data['disk_type'] . '</span>');
$this->tableTd('td-nowrap ' . $special_class . '', $data['price'] . ' <span class="data-type">' . $data['currency'] . ' ' . $this->paymentTerm($data['term']) . '</span>');
$this->tableTd('', '<a id="checkUpStatus" href="#" value="' . $host . '">' . $this->osIntToIcon($data['os']) . '</a>');
$this->tableTd('td-nowrap td-text-med', '<div class="td-nowrap">' . $this->locationForTable($data['location']) . '</div>');
$this->tableTd('td-nowrap td-text-med', '<div class="td-nowrap">' . $data['provider'] . '</div>');
$this->tableTd('td-nowrap td-text-sml ' . $ds_class . '', '<div class="td-nowrap">' . $this->processDueDate($data['id'], $data['term'], $data['next_dd']) . ' days</div>');
$this->tableTd('td-nowrap td-text-sml', '<div class="td-nowrap">' . $data['dt'] . '</div>');
$this->tableTd('td-nowrap td-text-sml', '<div class="td-nowrap">' . $data['ipv4'] . '</div>');
$this->tableTd('td-nowrap td-text-sml', '<div class="td-nowrap">' . $data['ipv6'] . '</div>');
$this->tableTd('td-nowrap td-text-sml', '<div class="td-nowrap">' . $data['tags'] . '</div>');
$this->tagClose('tr');
}
protected function sharedHostingTable()
{
if (self::SH_SORT_TYPE == 'DOMAIN_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `domain` DESC;");
} elseif (self::SH_SORT_TYPE == 'DOMAIN_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `domain`;");
} elseif (self::SH_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `owned_since` DESC;");
} elseif (self::SH_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` ORDER BY `owned_since`;");
} elseif (self::SH_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::SH_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::SH_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::SH_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting` INNER JOIN `pricing` ON shared_hosting.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `shared_hosting`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header mt-1', 'Shared hosting <span class="object-count">' . $count . '</span>');
$this->tagOpen('div', 'row');
$this->tableHeader(array('Domain', '', '', 'Type', 'Disk', 'Price', 'Location', 'Provider', 'Due', 'BWidth', 'Domains', 'Emails', 'FTPs', 'DBs', 'Since'), 'table objects-table', 'sharedHostingTable');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->sharedHostingTableRow($row['id']);
}
$this->outputString('</tbody></table></div>');
$this->tagClose('div');
}
}
protected function domainTable()
{
if (self::DC_SORT_TYPE == 'DOMAIN_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `domain` DESC;");
} elseif (self::DC_SORT_TYPE == 'DOMAIN_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `domain`;");
} elseif (self::DC_SORT_TYPE == 'OWNED_SINCE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `owned_since` DESC;");
} elseif (self::DC_SORT_TYPE == 'OWNED_SINCE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` ORDER BY `owned_since`;");
} elseif (self::DC_SORT_TYPE == 'PRICE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `as_usd` DESC;");
} elseif (self::DC_SORT_TYPE == 'PRICE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `as_usd`;");
} elseif (self::DC_SORT_TYPE == 'DUE_DESC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `next_dd` DESC;");
} elseif (self::DC_SORT_TYPE == 'DUE_ASC') {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains` INNER JOIN `pricing` ON domains.id = pricing.server_id ORDER BY `next_dd`;");
} else {
$select = $this->dbConnect()->prepare("SELECT `id` FROM `domains`;");
}
$select->execute();
$count = $select->rowCount();
if ($count > 0) {
$this->HTMLPhrase('h4', 'card-section-header mt-1', 'Domains <span class="object-count">' . $count . '</span>');
$this->tagOpen('div', 'row');
$this->tableHeader(array('Domain', '', '', 'NS1', 'NS2', 'Price', 'Provider', 'Due', 'Since'), 'table objects-table', 'domainsTable');
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->domainTableRow($row['id']);
}
$this->outputString('</tbody></table></div>');
$this->tagClose('div');
}
}
protected function domainTableRow(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT domains.id,domains.domain,domains.attached_to,domains.ns1,domains.ns2,DATE_FORMAT(`owned_since`, '%d %b %Y') as dt,providers.name as provider, pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM domains INNER JOIN providers on domains.provider = providers.id
INNER JOIN pricing on domains.id = pricing.server_id WHERE domains.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
if (self::COLOR_TABLE) {
if ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) < 7) {
$ds_class = 'td-due-soon';
} elseif ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) > 300) {
$ds_class = 'td-not-due-soon';
} else {
$ds_class = '';
}
} else {
$ds_class = '';
}
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $data['domain']);
$this->tableTd('', '<a class="btn btn-main table-btn" id="viewMoreDomain" value="' . $data['id'] . '" data-target="#viewMoreModalDomain" data-toggle="modal" href="#" role="button">More</a>');
$this->tableTd('', '<a class="btn btn-second table-btn" id="editDomain" value="' . $data['id'] . '" data-target="#editModalDomain" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tableTd('td-nowrap', '<code>' . $data['ns1'] . '<code>');
$this->tableTd('td-nowrap', '<code>' . $data['ns2'] . '<code>');
$this->tableTd('td-nowrap', $data['price'] . ' <span class="data-type">' . $data['currency'] . ' ' . $this->paymentTerm($data['term']) . '</span>');
$this->tableTd('td-nowrap td-text-med', '<div class="td-nowrap">' . $data['provider'] . '</div>');
$this->tableTd('td-nowrap td-text-sml ' . $ds_class . '', '<div class="td-nowrap">' . $this->processDueDate($data['id'], $data['term'], $data['next_dd']) . ' days</div>');
$this->tableTd('td-nowrap', $data['dt']);
$this->tagClose('tr');
}
protected function sharedHostingTableRow(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT shared_hosting.id,shared_hosting.domain,shared_hosting.type,shared_hosting.was_special,shared_hosting.disk,shared_hosting.disk_type,shared_hosting.bandwidth,shared_hosting.domains_limit,shared_hosting.emails,
shared_hosting.ftp,shared_hosting.db,DATE_FORMAT(`owned_since`, '%d %b %Y') as dt,locations.name as location,providers.name as provider,pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM shared_hosting INNER JOIN locations on shared_hosting.location = locations.id INNER JOIN providers on shared_hosting.provider = providers.id
INNER JOIN pricing on shared_hosting.id = pricing.server_id WHERE shared_hosting.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
if (self::COLOR_TABLE) {
($data['was_special'] == 1) ? $special_class = 'td-special-price' : $special_class = '';
if ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) < 7) {
$ds_class = 'td-due-soon';
} elseif ($this->processDueDate($data['id'], $data['term'], $data['next_dd']) > 300) {
$ds_class = 'td-not-due-soon';
} else {
$ds_class = '';
}
} else {
$special_class = $ds_class = '';
}
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $data['domain']);
$this->tableTd('', '<a class="btn btn-main table-btn" id="viewMoreSharedHosting" value="' . $data['id'] . '" data-target="#viewMoreModalSharedHosting" data-toggle="modal" href="#" role="button">More</a>');
$this->tableTd('', '<a class="btn btn-second table-btn" id="editSharedHosting" value="' . $data['id'] . '" data-target="#editModalSharedHosting" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tableTd('td-nowrap td-text-sml', $data['type']);
$this->tableTd('td-nowrap', $data['disk'] . '<span class="data-type">' . $data['disk_type'] . '</span>');
$this->tableTd('td-nowrap ' . $special_class . '', $data['price'] . ' <span class="data-type">' . $data['currency'] . ' ' . $this->paymentTerm($data['term']) . '</span>');
$this->tableTd('td-nowrap td-text-med', '<div class="td-nowrap">' . $this->locationForTable($data['location']) . '</div>');
$this->tableTd('td-nowrap td-text-med', '<div class="td-nowrap">' . $data['provider'] . '</div>');
$this->tableTd('td-nowrap td-text-sml ' . $ds_class . '', '<div class="td-nowrap">' . $this->processDueDate($data['id'], $data['term'], $data['next_dd']) . ' days</div>');
$this->tableTd('td-nowrap', $data['bandwidth'] . '<span class="data-type">TB</span>');
$this->tableTd('td-nowrap', $data['domains_limit']);
$this->tableTd('td-nowrap', $data['emails']);
$this->tableTd('td-nowrap', $data['ftp']);
$this->tableTd('td-nowrap', $data['db']);
$this->tableTd('td-nowrap', $data['dt']);
$this->tagClose('tr');
}
protected function SharedHostingCard(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT shared_hosting.id,shared_hosting.domain,shared_hosting.disk_as_gb,shared_hosting.type,shared_hosting.was_special,locations.name as location,providers.name as provider,pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM shared_hosting INNER JOIN locations on shared_hosting.location = locations.id INNER JOIN providers on shared_hosting.provider = providers.id
INNER JOIN pricing on shared_hosting.id = pricing.server_id WHERE shared_hosting.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
($data['was_special'] == 1) ? $special = ' special-card' : $special = '';
(is_null($data['next_dd'])) ? $dd_class = 'no-dd' : $dd_class = 'dd-text';
$this->colOpen('col-12 col-sm-6 col-md-4 col-xl-3');
$this->tagOpen("div", "card obj-card$special");
$this->tagOpen('div', 'card-header');
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('h4', 'hostname-header', $data['domain']);;
$this->tagClose('div', 3);
$this->tagOpen('div', 'card-body');
$this->HTMLphrase('h6', 'price', '$' . $data['price'] . ' ' . $data['currency'] . ' ' . $this->paymentTerm($data['term']));
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('h6', 'provider', $data['provider']);
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('h6', 'location', $data['location']);
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('p', $dd_class, "Due in {$this->processDueDate($data['id'], $data['term'], $data['next_dd'])} days");
$this->tagClose('div', 2);
$this->rowColOpen('row mem-disk-row', 'col-6');
$this->outputString('<i class="fas fa-box"></i>');
$this->HTMLphrase('p', 'value', '<span class="data-type">' . $data['type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<i class="fas fa-hdd"></i>');
$this->HTMLphrase('p', 'value', '<span class="data-type">' . $data['disk_as_gb'] . '<span class="data-type">GB</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-6');
$this->outputString('<a class="btn btn-main" id="viewMoreSharedHosting" value="' . $id . '" data-target="#viewMoreModalSharedHosting" data-toggle="modal" href="#" role="button">More</a>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<a class="btn btn-second" id="editSharedHosting" value="' . $id . '" data-target="#editModalSharedHosting" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tagClose('div', 5);
}
protected function domainCard(string $id)
{
$select = $this->dbConnect()->prepare("
SELECT domains.id,domains.domain,domains.attached_to,providers.name as provider, pricing.price,pricing.currency,pricing.term,pricing.next_dd
FROM domains INNER JOIN providers on domains.provider = providers.id
INNER JOIN pricing on domains.id = pricing.server_id WHERE domains.id = ? LIMIT 1;");
$select->execute([$id]);
$data = $select->fetchAll(PDO::FETCH_ASSOC)[0];
(is_null($data['next_dd'])) ? $dd_class = 'no-dd' : $dd_class = 'dd-text';
$this->colOpen('col-12 col-sm-6 col-md-4 col-xl-3');
$this->tagOpen("div", "card obj-card");
$this->tagOpen('div', 'card-header');
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('h4', 'hostname-header', $data['domain']);
$this->tagClose('div', 3);
$this->tagOpen('div', 'card-body');
$this->HTMLphrase('h6', 'price', '$' . $data['price'] . ' ' . $data['currency'] . ' ' . $this->paymentTerm($data['term']));
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('h6', 'provider', $data['provider']);
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-12');
$this->HTMLphrase('p', $dd_class, "Due in {$this->processDueDate($data['id'], $data['term'], $data['next_dd'])} days");
$this->tagClose('div', 2);
$this->rowColOpen('row text-center', 'col-6');
$this->outputString('<a class="btn btn-main" id="viewMoreDomain" value="' . $id . '" data-target="#viewMoreModalDomain" data-toggle="modal" href="#" role="button">More</a>');
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<a class="btn btn-second" id="editDomain" value="' . $id . '" data-target="#editModalDomain" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tagClose('div', 5);
}
public function editServerModal()
{
$this->outputString('<div class="modal fade" id="editServerModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog modal-lg" role="document">');
$this->tagOpen('div', 'modal-content');
$this->tagOpen('div', 'modal-header');
$this->outputString('<h4 class="modal-title w-100" id="me_hostname_header"></h4>');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close">');
$this->outputString('<span aria-hidden="true">&times;</span>');
$this->tagClose('button');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
$this->outputString('<form id="editForm" method="post">');
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->outputString('<label for="me_delete">Delete server data</label>');
$this->outputString('<label class="switch"><input type="checkbox" name="me_delete" id="me_delete"><span class="slider round"></span></label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->outputString('<label for="me_non_active">No longer have (Keep info)</label>');
$this->outputString('<label class="switch"><input type="checkbox" name="me_non_active" id="me_non_active"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Hostname');
$this->textInput('me_hostname', '', 'form-control', true);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Label');
$this->textInput('me_label', '', 'form-control', false, 1, 24);
$this->hiddenInput('me_server_id');
$this->hiddenInput('action', 'update');
$this->hiddenInput('type', 'server_modal_edit');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS1');
$this->textInput('me_ns1', '', 'form-control', false);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS2');
$this->textInput('me_ns2', '', 'form-control', false);
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-6 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Price');
$this->numberInput('me_price', '', 'form-control', true, 0, 999, 'any');
$this->tagClose('div');
$this->tagClose('div');
$this->colOpen('col-6 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Term');
$this->selectElement('me_term');
$this->termSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-6 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Currency');
$this->selectElement('me_currency');
$this->CurrencySelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('OS');
$this->selectElement('me_os');
$this->OsSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Virt');
$this->selectElement('me_virt');
$this->virtSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('SSH Port');
$this->textInput('me_ssh_port');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('IPv4');
$this->textInput('me_ipv4');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('IPv6');
$this->textInput('me_ipv6');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="me_owned_since" name="me_owned_since">');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control" id="me_next_dd" name="me_next_dd">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('CPU amount');
$this->numberInput('me_cpu_amount', '', 'form-control', false, 1, 48);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Bandwidth');
$this->numberInput('me_bandwidth', '', 'form-control', false, 0, 9999);
$this->outputString('<div class="input-group-append"><span class="input-group-text">TB</span></div>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Total disk');
$this->numberInput('me_disk', '', 'form-control', false, 0.5, 9999, 'any');
$this->outputString('<div class="input-group-append"><span class="input-group-text">GB</span></div>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Ram');
$this->numberInput('me_ram', '', 'form-control', false, 0.5, 9999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('me_ram_type');
$this->selectOption('MB', 'MB', true);
$this->selectOption('GB', 'GB');
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Swap');
$this->numberInput('me_swap', '', 'form-control', false, 0, 9999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('me_swap_type');
$this->selectOption('MB', 'MB', true);
$this->selectOption('GB', 'GB');
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->htmlPhrase('p', 'm-desc', 'Notes:');
$this->outputString("<textarea class='form-control' id='me_notes' name='me_notes' rows='4' cols='40' maxlength='255'>");
$this->outputString("</textarea>");
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Tags');
$this->tagsInput('me_tags', 'form-control');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->htmlPhrase('p', 'm-desc', 'Update YABs disk & network speeds:');
$this->outputString("<textarea class='form-control' id='me_yabs' name='me_yabs' rows='4' cols='40' placeholder='First line must be: # ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #'>");
$this->outputString("</textarea>");
$this->tagClose('div', 2);
$this->rowColOpen('form-row text-center', 'col-12');
$this->submitInput('Update', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
public function editSharedHostingModal()
{
$this->outputString('<div class="modal fade" id="editModalSharedHosting" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog" role="document">');
$this->tagOpen('div', 'modal-content');
$this->tagOpen('div', 'modal-header');
$this->outputString('<h4 class="modal-title w-100" id="sh_me_hostname_header"></h4>');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close">');
$this->outputString('<span aria-hidden="true">&times;</span>');
$this->tagClose('button');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
$this->outputString('<form id="editSharedHostingForm" method="post">');
$this->rowColOpen('form-row', 'col-8');
$this->outputString('<label for="sh_me_delete">Delete shared hosting data</label>');
$this->tagClose('div');
$this->colOpen('col-4');
$this->outputString('<label class="switch"><input type="checkbox" name="sh_me_delete" id="sh_me_delete"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-8');
$this->outputString('<label for="sh_me_non_active">No longer have (Keep info)</label>');
$this->tagClose('div');
$this->colOpen('col-4');
$this->outputString('<label class="switch"><input type="checkbox" name="sh_me_non_active" id="sh_me_non_active"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Hostname');
$this->textInput('sh_me_hostname', '', 'form-control', true);
$this->tagClose('div');
$this->hiddenInput('sh_me_server_id');
$this->hiddenInput('action', 'update');
$this->hiddenInput('type', 'shared_hosting_modal_edit');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Price');
$this->numberInput('sh_me_price', '', 'form-control', true, 0, 999, 'any');
$this->tagClose('div');
$this->tagClose('div');
$this->colOpen('col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Term');
$this->selectElement('sh_me_term');
$this->termSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Currency');
$this->selectElement('sh_me_currency');
$this->CurrencySelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="sh_me_owned_since" name="sh_me_owned_since">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control" id="sh_me_next_dd" name="sh_me_next_dd">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Bandwidth');
$this->numberInput('sh_me_bandwidth', '', 'form-control', false, 0, 99999);
$this->outputString('<div class="input-group-append"><span class="input-group-text">GB</span></div>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Total disk');
$this->numberInput('sh_me_storage', '', 'form-control', false, 0.5, 9999, 'any');
$this->outputString('<div class="input-group-append"><span class="input-group-text">GB</span></div>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Domains');
$this->numberInput('sh_me_domains_count', '', 'form-control', false, 1, 99999, '1');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Emails');
$this->numberInput('sh_me_emails', '', 'form-control', false, 1, 99999, '1');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Databases');
$this->numberInput('sh_me_db', '', 'form-control', false, 1, 99999, '1');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('FTP');
$this->numberInput('sh_me_ftp', '', 'form-control', false, 1, 99999, '1');
$this->tagClose('div', 3);
$this->rowColOpen('form-row text-center', 'col-12');
$this->submitInput('Update', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function attachDomainInput()
{
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Attached to');
$this->selectElement('d_me_attached_to');
$select_servers = $this->dbConnect()->prepare("SELECT `id`, `hostname` FROM `servers`;");
$select_servers->execute();
$this->selectOption('', '', true);//Empty option for when not attached
while ($row = $select_servers->fetch(PDO::FETCH_ASSOC)) {
$this->selectOption($row['hostname'], $row['id']);
}
$select_shared = $this->dbConnect()->prepare("SELECT `id`, `domain` FROM `shared_hosting`;");
$select_shared->execute();
while ($row = $select_shared->fetch(PDO::FETCH_ASSOC)) {
$this->selectOption($row['domain'], $row['id']);
}
$this->tagClose('select');
$this->tagClose('div', 3);
}
public function editDomainModal()
{
$this->outputString('<div class="modal fade" id="editModalDomain" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">');
$this->outputString('<div class="modal-dialog" role="document">');
$this->tagOpen('div', 'modal-content');
$this->tagOpen('div', 'modal-header');
$this->outputString('<h4 class="modal-title w-100" id="d_me_hostname_header"></h4>');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close">');
$this->outputString('<span aria-hidden="true">&times;</span>');
$this->tagClose('button');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
$this->outputString('<form id="editDomainForm" method="post">');
$this->rowColOpen('form-row', 'col-8');
$this->outputString('<label for="d_me_delete">Delete domain data</label>');
$this->tagClose('div');
$this->colOpen('col-4');
$this->outputString('<label class="switch"><input type="checkbox" name="d_me_delete" id="d_me_delete"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-8');
$this->outputString('<label for="d_me_non_active">No longer have (Keep info)</label>');
$this->tagClose('div');
$this->colOpen('col-4');
$this->outputString('<label class="switch"><input type="checkbox" name="d_me_non_active" id="d_me_non_active"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Domain');
$this->textInput('d_me_hostname', '', 'form-control', true);
$this->tagClose('div');
$this->hiddenInput('d_me_server_id');
$this->hiddenInput('action', 'update');
$this->hiddenInput('type', 'domain_modal_edit');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Price');
$this->numberInput('d_me_price', '', 'form-control', true, 0, 999, 'any');
$this->tagClose('div');
$this->tagClose('div');
$this->colOpen('col-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Term');
$this->selectElement('d_me_term');
$this->domainTermSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Currency');
$this->selectElement('d_me_currency');
$this->CurrencySelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->attachDomainInput();
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="d_me_owned_since" name="d_me_owned_since">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control" id="d_me_next_dd" name="d_me_next_dd">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS1');
$this->textInput('d_me_ns1', '', 'form-control', false, 1, 124);
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS2');
$this->textInput('d_me_ns2', '', 'form-control', false, 1, 124);
$this->tagClose('div', 3);
$this->rowColOpen('form-row text-center', 'col-12');
$this->submitInput('Update', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function addVPSFormYabs()
{
$this->rowColOpen('row', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h2', 'text-center', 'Add server from YABs');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form id="yabsForm" method="post">');
$this->hiddenInput('from_yabs', 'true');
$this->hiddenInput('has_yabs', '1');
$this->forumInputsBasic();
$this->rowColOpen('form-row', 'col-12');
$this->tagOpen('div', 'form-group');
$this->outputString('<textarea id="yabs" name="yabs" class="form-control" placeholder="First line must be: # ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #" rows="10" required></textarea>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 text-center');
$this->submitInput('Add', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function addDomainForm()
{
$this->rowColOpen('row', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h2', 'text-center', 'Add domain');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form id="domainForm" method="post">');
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->hiddenInput('domain_form', 'true');
$this->hiddenInput('has_yabs', '0');
$this->hiddenInput('action', 'insert');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Domain');
$this->textInput('domain', '', 'form-control', true, 3, 124);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Registrar');
$this->textInput('domain_provider', '', 'form-control provider-input', true, 3, 124);
$this->tagClose('div', 3);
$this->formPricingRow('domain_');
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="domain_owned_since" name="domain_owned_since">');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control next-dd" id="domain_next_due_date" name="domain_next_due_date">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 text-center');
$this->submitInput('Add', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function addSharedHostingForm()
{
$this->rowColOpen('row', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h2', 'text-center', 'Add shared hosting');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form id="sharesHostingForm" method="post">');
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->hiddenInput('shared_hosting_form', 'true');
$this->hiddenInput('has_yabs', '0');
$this->hiddenInput('action', 'insert');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Domain');
$this->textInput('shared_domain', '', 'form-control', true, 3, 124);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Provider');
$this->textInput('shared_provider', '', 'form-control provider-input', true, 3, 124);
$this->tagClose('div', 3);
$this->formPricingRow('shared_');
$this->rowColOpen('form-row', 'col-12 col-md-2');
$this->outputString('<label for="shared_was_offer">Was special offer</label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-2');
$this->outputString('<label class="switch"><input type="checkbox" name="shared_was_offer" id="shared_was_offer"><span class="slider round"></span></label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="shared_owned_since" name="shared_owned_since">');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control next-dd" id="shared_next_due_date" name="shared_next_due_date">');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Domains');
$this->numberInput('shared_domains_amount', '1', 'form-control', true, 1, 9999, '1');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Storage');
$this->numberInput('shared_storage', '10', 'form-control', true, 1, 9999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('shared_storage_type');
$this->selectOption('GB', 'GB', true);
$this->selectOption('TB', 'TB');
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Databases');
$this->numberInput('shared_db_amount', '10', 'form-control', true, 1, 9999, '1');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Email');
$this->numberInput('shared_emails', '25', 'form-control', true, 1, 9999, '1');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('FTP');
$this->numberInput('shared_ftp', '25', 'form-control', true, 1, 9999, '1');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Bandwidth');
$this->numberInput('shared_bandwidth', '1', 'form-control', false, 1, 9999, '1');
$this->outputString('<div class="input-group-append"><span class="input-group-text">TB</span></div>');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Location');
$this->textInput('shared_location', '', 'form-control location-input', true, 3, 124);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('shared_type');
$this->sharedHostingTypeOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 text-center');
$this->submitInput('Add', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function addVPSForm()
{
$this->rowColOpen('row', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h2', 'text-center', 'Add server');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form id="manualForm" method="post">');
$this->hiddenInput('manual', 'true');
$this->hiddenInput('has_yabs', '0');
$this->forumInputsBasic();
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('CPU amount');
$this->numberInput('cpu_amount', '1', 'form-control', true, 1, 64, '1');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('CPU speed');
$this->numberInput('cpu_speed', '3799', 'form-control', false, '1', '5999.999', 'any');
$this->outputString('<div class="input-group-append"><span class="input-group-text">Mhz</span></div>');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-8');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Total disk');
$this->numberInput('disk', '10', 'form-control', true, 1, 9999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('disk_type');
$this->selectOption('GB', 'GB', true);
$this->selectOption('TB', 'TB');
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-6 col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Ram');
$this->numberInput('ram', '512', 'form-control', true, 1, 62000, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('ram_type');
$this->selectOption('MB', 'MB', true);
$this->selectOption('GB', 'GB');
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Swap');
$this->numberInput('swap', '100', 'form-control', true, 0, 62000, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Type');
$this->selectElement('swap_type');
$this->selectOption('MB', 'MB', true);
$this->selectOption('GB', 'GB');
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 text-center');
$this->submitInput('Add', 'submitInput', 'btn btn-second');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
}
protected function formPricingRow(string $id_append = '')
{
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Price');
$this->numberInput('' . $id_append . 'price', '8.99', 'form-control', true, 0, 999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Currency');
$this->selectElement('' . $id_append . 'currency');
$this->CurrencySelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Term');
$this->selectElement('' . $id_append . 'term');
$this->termSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
}
protected function forumInputsBasic()
{
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->hiddenInput('action', 'insert');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Hostname');
$this->textInput('hostname', '', 'form-control', true, 1, 124);
$this->outputString('<div class="input-group-append"><span class="input-group-text"><a id="fillIpv4" href="#"><i class="fas fa-search"></i></a></span></div>');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS1');
$this->textInput('ns1', '', 'form-control', false, 1, 124);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('NS2');
$this->textInput('ns2', '', 'form-control', false, 1, 124);
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Provider');
$this->textInput('provider', '', 'form-control provider-input', true, 3, 124);
$this->tagClose('div', 2);
$this->colOpen('col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Price');
$this->numberInput('price', '', 'form-control', true, 0, 999, 'any');
$this->tagClose('div', 2);
$this->colOpen('col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Term');
$this->selectElement('term');
$this->termSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-md-3');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Currency');
$this->selectElement('currency');
$this->CurrencySelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Label');
$this->textInput('label', '', 'form-control', false, 1, 24);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('IPv4');
$this->textInput('ipv4', '', 'form-control', false, 4, 124);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('IPv6');
$this->textInput('ipv6', '', 'form-control', false, 4, 124);
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->outputString('<label for="was_offer">Was special offer</label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-2');
$this->outputString('<label class="switch"><input type="checkbox" name="was_offer" id="was_offer"><span class="slider round"></span></label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->outputString('<label for="dedi_cpu">Dedicated CPU</label>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-2');
$this->outputString('<label class="switch"><input type="checkbox" name="dedi_cpu" id="dedi_cpu"><span class="slider round"></span></label>');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('SSH');
$this->numberInput('ssh_port', '22', 'form-control', true, 1, 999999, 1);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Virt');
$this->selectElement('virt');
$this->virtSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-4');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('OS');
$this->selectElement('os');
$this->OsSelectOptions();
$this->tagClose('select');
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Bandwidth');
$this->numberInput('bandwidth', '4', 'form-control', false, '0.5', 99999, '0.5');
$this->outputString('<div class="input-group-append"><span class="input-group-text">TB</span></div>');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Location');
$this->textInput('location', '', 'form-control location-input', false, 1, 124);
$this->tagClose('div', 3);
$this->rowColOpen('form-row', 'col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Owned since');
$this->outputString('<input type="date" class="form-control" id="owned_since" name="owned_since">');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Next due date');
$this->outputString('<input type="date" class="form-control next-dd" id="next_due_date" name="next_due_date">');
$this->tagClose('div', 3);
}
protected function pageClose(bool $close_container = true)
{
if ($close_container) {
$this->tagClose('div');
}
$this->outputString('<script src="assets/js/jquery.min.js"></script>');
$this->outputString('<script src="assets/js/bootstrap.min.js"></script>');
$this->outputString('<script src="assets/js/scripts.min.js"></script>');
$this->outputString('<link rel="stylesheet" href="assets/css/all.min.css"/>');
$this->tagClose('body');
$this->tagClose('html');
}
public function mainPage()
{
$this->checkPHPversion();//Check PHP version. Wont load if not PHP 7.4 or above
$this->pageHead();
$this->pageContents();
$this->pageFooter();
$this->pageClose();
}
protected function searchDiv()
{
$this->rowColOpen('row', 'col-12');
$this->tagOpen('form');
$this->textInput('searchInput', '', 'form-control', false);
$this->tagClose('form');
$this->tagClose('div', 2);
$this->tagOpen('div', '', 'searchDivBody');
$this->tagClose('div');
}
public function searchResults(string $search_term)
{
if (!empty($search_term)) {
$select = $this->dbConnect()->prepare("SELECT `id`, `hostname`,`ipv4`, `virt`, `tags`, `label`, p.price, p.currency, p.term FROM `servers` INNER JOIN pricing p on servers.id = p.server_id WHERE `hostname` LIKE ? OR `ipv4` LIKE ? OR `tags` LIKE ? OR `label` LIKE ? LIMIT 30;");
$select->execute(["%$search_term%", "%$search_term%", "%$search_term%", "%$search_term%"]);
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->rowColOpen('row search-result', 'col-6');
$this->outputString("<p class='m-value'>{$row['hostname']} <code>{$row['ipv4']}</code> <span class='data-type'>{$row['virt']}</span> {$row['price']} {$row['currency']} <span class='data-type'>" . $this->paymentTerm($row['term']) . "</span> <code>{$row['label']}</code></p>");
$this->tagClose('div');
$this->colOpen('col-3');
$this->outputString('<a class="btn btn-main" id="viewMoreServer" value="' . $row['id'] . '" data-target="#viewMoreServerModal" data-toggle="modal" href="#" role="button">View</a>');
$this->tagClose('div');
$this->colOpen('col-3');
$this->outputString('<a class="btn btn-second" id="editServer" value="' . $row['id'] . '" data-target="#editServerModal" data-toggle="modal" href="#" role="button">Edit</a>');
$this->tagClose('div', 2);
}
$select = $this->dbConnect()->prepare("SELECT `id`, `domain`, p.price, p.currency, p.term FROM `domains` INNER JOIN pricing p on domains.id = p.server_id WHERE `domain` LIKE ? LIMIT 30;");
$select->execute(["%$search_term%"]);
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->rowColOpen('row search-result', 'col-6');
$this->outputString("<p class='m-value'>{$row['domain']} <span class='data-type'>domain</span> {$row['price']} {$row['currency']} <span class='data-type'>" . $this->paymentTerm($row['term']) . "</span></p>");
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<a class="btn btn-main" id="viewMoreDomain" value="' . $row['id'] . '" data-target="#viewMoreModalDomain" data-toggle="modal" href="#" role="button">View</a>');
$this->tagClose('div', 2);
}
$select = $this->dbConnect()->prepare("SELECT `id`, `domain`, `type`, p.price, p.currency, p.term FROM `shared_hosting` INNER JOIN pricing p on shared_hosting.id = p.server_id WHERE `domain` LIKE ? OR `type` LIKE ? LIMIT 30;");
$select->execute(["%$search_term%", "%$search_term%"]);
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->rowColOpen('row search-result', 'col-6');
$this->outputString("<p class='m-value'>{$row['domain']} <span class='data-type'>{$row['type']}</span> {$row['price']} {$row['currency']} <span class='data-type'>" . $this->paymentTerm($row['term']) . "</span></p>");
$this->tagClose('div');
$this->colOpen('col-6');
$this->outputString('<a class="btn btn-main" id="viewMoreSharedHosting" value="' . $row['id'] . '" data-target="#viewMoreModalSharedHosting" data-toggle="modal" href="#" role="button">View</a>');
$this->tagClose('div', 2);
}
}
}
protected function handleLocation(string $provider)
{//Inserts location + returns id OR returns id if location already exists
$select = $this->dbConnect()->prepare("SELECT `id`, `name` FROM `locations` WHERE `name` = ? LIMIT 1;");
$select->execute([$provider]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {//Yes
return $row['id'];
} else {//NO
$insert = $this->dbConnect()->prepare('INSERT INTO `locations` (`name`) VALUES (?);');
$insert->execute([$provider]);
return $this->dbConnect()->lastInsertId();
}
}
protected function handleProvider(string $provider)
{//Inserts provider + returns id OR returns id if provider already exists
$select = $this->dbConnect()->prepare("SELECT `id`, `name` FROM `providers` WHERE `name` = ? LIMIT 1;");
$select->execute([$provider]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {//Yes
return $row['id'];
} else {//NO
$insert = $this->dbConnect()->prepare('INSERT INTO `providers` (`name`) VALUES (?);');
$insert->execute([$provider]);
return $this->dbConnect()->lastInsertId();
}
}
public function locationsAutoCompleteGET(string $value)
{//Returns array from a LIKE query for input term
$select = $this->dbConnect()->prepare("SELECT `name` FROM locations WHERE `name` LIKE ? LIMIT 16;");
$select->execute(array('' . $value . '%'));
$array = array();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$array[] = $row['name'];
}
echo json_encode($array);
}
public function providersAutoCompleteGET(string $value)
{//Returns array from a LIKE query for input term
$select = $this->dbConnect()->prepare("SELECT `name` FROM providers WHERE `name` LIKE ? LIMIT 16;");
$select->execute(array('' . $value . '%'));
$array = array();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$array[] = $row['name'];
}
echo json_encode($array);
}
protected function pageFooter(string $text = "My Idlers", string $link = "https://github.com/cp6/my-idlers")
{
$this->rowColOpen('row footer-row', 'col-12');
$this->outputString("<a class='footer-text' href='$link'><p>$text</p></a>");
$this->tagClose('div', 2);
}
public function viewMoreModal(string $item_id)
{
$data = json_decode($this->serverData($item_id), true);
if (!isset($data)) {//returned no data
exit;
}
(is_null($data['ipv6']) || empty($data['ipv6'])) ? $ipv6 = '-' : $ipv6 = $data['ipv6'];
($data['has_yabs'] == 1) ? $has_yabs = true : $has_yabs = false;
($data['has_st'] == 1) ? $has_st = true : $has_st = false;
$this->tagOpen('div', 'modal-header');
$this->HTMLphrase('h4', 'modal-title w-100', $data['hostname'], 'view_more_header');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
if (!is_null($data['label']) || !empty($data['label'])) {
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Label');
$this->tagClose('div');
$this->colOpen('col-8');
$this->outputString('<p class="m-value">' . $data['label'] . '</p>');
$this->tagClose('div', 2);
}
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'IPv4 ');
$this->outputString('<code><p class="m-value">' . $data['ipv4'] . '</p></code>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'IPv6 ');
$this->outputString('<code><p class="m-value">' . $ipv6 . '</p></code>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'NS1 ');
$this->outputString('<code><p class="m-value">' . $data['ns1'] . '</p></code>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'NS2 ');
$this->outputString('<code><p class="m-value">' . $data['ns2'] . '</p></code>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Location ');
$this->HTMLphrase('p', 'm-value', $data['location']);
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Provider ');
$this->HTMLphrase('p', 'm-value', $data['provider']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'OS ');
$this->HTMLphrase('p', 'm-value', $this->osIntToString($data['os']));
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Due in ');
$this->HTMLphrase('p', 'm-value', '' . $this->processDueDate($data['server_id'], $data['term'], $data['next_dd']) . '<span class="data-type">days</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Bandwidth ');
$this->HTMLphrase('p', 'm-value', '' . $data['bandwidth'] . '<span class="data-type">' . $data['bandwidth_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'SSH Port ');
$this->outputString('<code><p class="m-value">' . $data['ssh_port'] . '</p></code>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Disk ');
$this->HTMLphrase('p', 'm-value', '' . $data['disk'] . '<span class="data-type">' . $data['disk_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
if (!is_null($data['asn'])) {
$asn_exp = explode(',', $data['asn']);
$asn_link = "<a href='https://stat.ripe.net/" . $asn_exp[1] . "#tabId=at-a-glance'>$asn_exp[1]</a>";
$this->HTMLphrase('p', 'm-desc', 'ASN ');
$this->HTMLphrase('p', 'm-value', $asn_exp[0] . ' ' . $asn_link);
}
$this->tagClose('div', 2);
$this->rowColOpen('row m-section-row', 'col-12 col-md-6');
$this->HTMLphrase('p', 'm-section-text text-center', 'CPU');
$this->rowColOpen('row m-row', 'col-12 col-md-6');
$this->HTMLphrase('p', 'm-desc', 'Amount ');
$this->HTMLphrase('p', 'm-value', $data['cpu']);
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->HTMLphrase('p', 'm-desc', 'Frequency ');
$this->HTMLphrase('p', 'm-value', $data['cpu_freq'] . '<span class="data-type">Mhz</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12');
$this->outputString('<i><p class="m-value">' . $data['cpu_type'] . '</p></i>');
$this->tagClose('div', 3);
$this->colOpen('col-12 col-md-6');
$this->outputString('<p class="m-section-text text-center">Ram</p>');
$this->rowColOpen('row m-row', 'col-12 col-md-6');
$this->HTMLphrase('p', 'm-desc', 'Ram ');
$this->HTMLphrase('p', 'm-value', '' . $data['ram'] . '<span class="data-type">' . $data['ram_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->HTMLphrase('p', 'm-desc', 'Swap ');
$this->HTMLphrase('p', 'm-value', '' . $data['swap'] . '<span class="data-type">' . $data['swap_type'] . '</span>');
$this->tagClose('div', 4);
if ($has_yabs) {
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'GeekBench 5');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'single: ');
$this->HTMLphrase('p', 'm-value', $data['gb5_single']);
$this->tagClose('div');
$this->colOpen('col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'multi: ');
$this->HTMLphrase('p', 'm-value', $data['gb5_multi']);
$this->tagClose('div');
$this->colOpen('col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'id: ');
$this->outputString('<a id="m_gb5_id_link" href="https://browser.geekbench.com/v5/cpu/' . $data['gb5_id'] . '"><p class="m-value">' . $data['gb5_id'] . '</p></a>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'Disk tests');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-6 col-md-3 mm-col');
$this->HTMLphrase('p', 'm-desc', '4k: ');
$this->HTMLphrase('p', 'm-value', '' . $data['4k'] . '<span class="data-type">' . $data['4k_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-6 col-md-3 mm-col');
$this->HTMLphrase('p', 'm-desc', '64k: ');
$this->HTMLphrase('p', 'm-value', '' . $data['64k'] . '<span class="data-type">' . $data['64k_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-6 col-md-3 mm-col');
$this->HTMLphrase('p', 'm-desc', '512k: ');
$this->HTMLphrase('p', 'm-value', '' . $data['512k'] . '<span class="data-type">' . $data['512k_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-6 col-md-3 mm-col');
$this->HTMLphrase('p', 'm-desc', '1m: ');
$this->HTMLphrase('p', 'm-value', '' . $data['1m'] . '<span class="data-type">' . $data['1m_type'] . '</span>');
$this->tagClose('div', 2);
}
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'Pricing');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-value', '' . $data['price'] . ' <span class="data-type">' . $data['currency'] . '</span> ');
$this->HTMLphrase('p', 'm-value', $this->paymentTerm($data['term']));
$this->tagClose('div');
$this->colOpen('col-12 col-md-6 mm-col');
$this->HTMLphrase('p', 'm-desc', 'As USD per month: ');
$this->HTMLphrase('p', 'm-value', '$' . $data['usd_per_month'] . '');
$this->tagClose('div', 2);
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'Other');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Owned since');
$this->tagClose('div');
$this->colOpen('col-8 mm-col');
$this->HTMLphrase('p', 'm-value', $data['owned_since']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Dedicated: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $this->intToYesNo($data['is_dedicated']));
$this->tagClose('div');
$this->colOpen('col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Dedi CPU: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $this->intToYesNo($data['is_cpu_dedicated']));
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Is offer: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $this->intToYesNo($data['was_special']));
$this->tagClose('div');
$this->colOpen('col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'AES-NI: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $this->intToYesNo($data['aes_ni']));
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'VM-x/AMD-V: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $this->intToYesNo($data['amd_v']));
$this->tagClose('div');
$this->colOpen('col-4 mm-col');
$this->HTMLphrase('p', 'm-desc', 'Virt: ');
$this->tagClose('div');
$this->colOpen('col-2 mm-col');
$this->HTMLphrase('p', 'm-value', $data['virt']);
$this->tagClose('div', 2);
if ($has_yabs && $has_st) {
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'Network tests');
$this->tagClose('div', 2);
$this->tagOpen('div', 'row');
$this->outputString('<div class="col-6"><p class="m-desc">Location:</p></div>');
$this->outputString('<div class="col-3"><p class="m-desc">Send:</p></div>');
$this->outputString('<div class="col-3"><p class="m-desc">Receive:</p></div>');
$this->tagClose('div');
for ($i = 0; $i <= 7; $i++) {
if (isset($data[$i])) {
$this->rowColOpen('row', 'col-6');
$this->HTMLphrase('p', 'm-value', $data[$i]['location']);
$this->tagClose('div');
$this->colOpen('col-3');
$this->HTMLphrase('p', 'm-value', '' . $data[$i]['send'] . '<span class="data-type">' . $data[$i]['send_type'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-3');
$this->HTMLphrase('p', 'm-value', '' . $data[$i]['recieve'] . '<span class="data-type">' . $data[$i]['recieve_type'] . '</span>');
$this->tagClose('div');
$this->tagClose('div');
}
}
}
$this->rowColOpen('row m-section-row', 'col-12 col-md-6');
$this->htmlPhrase('p', 'm-section-text text-center', 'Notes');
$this->outputString("<textarea class='form-control' id='server_notes' name='server_notes' rows='4' cols='40' maxlength='255' disabled>");
if (is_null($data['notes']) || empty($data['notes'])) {
$this->outputString('');
} else {
$this->outputString($data['notes']);
}
$this->outputString("</textarea>");
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->HTMLphrase('p', 'm-section-text text-center', 'Tags');
$this->tagOpen('ul');
$tags_arr = explode(",", $data['tags']);
foreach ($tags_arr as $tag) {
if (!empty($tag)) {
$this->HTMLphrase('li', 'tags-list', $tag);
}
}
$this->tagClose('ul');
$this->tagClose('div', 2);
if (file_exists("yabs/{$data['server_id']}.txt")) {
$this->rowColOpen('row m-section-row text-center', 'col-12 col-md-6');
$this->outputString('<a class="btn btn-main view-yabs-btn" id="viewYabs" value="' . $item_id . '" data-target="#yabsModal" data-toggle="modal" href="#" role="button">View YABs</a>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-6');
$this->outputString('<a class="btn btn-third" id="closeViewMoreModal" role="button" data-dismiss="modal">Close</a>');
$this->tagClose('div', 2);
} else {
$this->rowColOpen('row m-section-row text-center', 'col-12');
$this->outputString('<a class="btn btn-third" id="closeViewMoreModal" role="button" data-dismiss="modal">Close</a>');
$this->tagClose('div', 2);
}
}
public function viewMoreSharedHostingModal(string $item_id)
{
$data = json_decode($this->sharedHostingData($item_id), true);
if (!isset($data)) {//returned no data
exit;
}
$this->tagOpen('div', 'modal-header');
$this->HTMLphrase('h4', 'modal-title w-100', $data['domain'], 'view_more_header');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Type');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['type']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Provider');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['provider']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Location');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['location']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Cost');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $data['price'] . ' <span class="data-type">' . $data['currency'] . ' ' . $this->paymentTerm($data['term']) . '</span> ');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Due in');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $this->processDueDate($item_id, $data['term'], $data['next_dd']) . '<span class="data-type">days</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Owned since');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['owned_since']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-section-row', 'col-12 text-center');
$this->HTMLphrase('p', 'm-section-text', 'About');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Storage');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $data['disk'] . '<span class="data-type">' . $data['disk_type'] . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Domains');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['domains_limit']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Email accounts');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['emails']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'FTP accounts');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['ftp']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Databases');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['db']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Bandwidth');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $data['bandwidth'] . '<span class="data-type">TB</span>');
$this->tagClose('div', 2);
}
public function viewMoreDomainModal(string $item_id)
{
$data = json_decode($this->domainData($item_id), true);
if (!isset($data)) {//returned no data
exit;
}
$this->tagOpen('div', 'modal-header');
$this->HTMLphrase('h4', 'modal-title w-100', $data['domain'], 'view_more_header');
$this->outputString('<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>');
$this->tagClose('div');
$this->tagOpen('div', 'modal-body');
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Attached to');
$this->tagClose('div');
$this->colOpen('col-8');
if (!is_null($data['attached_to']) && !empty($data['attached_to'])) {
$this->outputString('<code><p class="m-value">' . $this->idToObjectName($data['attached_to']) . '</p></code>');
} else {
$this->outputString('');
}
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'NS2');
$this->tagClose('div');
$this->colOpen('col-8');
$this->outputString('<code><p class="m-value">' . $data['ns1'] . '</p></code>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'NS2');
$this->tagClose('div');
$this->colOpen('col-8');
$this->outputString('<code><p class="m-value">' . $data['ns2'] . '</p></code>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Provider');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['provider']);
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Cost');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $data['price'] . ' <span class="data-type">' . $data['currency'] . ' ' . $this->paymentTerm($data['term']) . '</span> ');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Due in');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', '' . $this->processDueDate($item_id, $data['term'], $data['next_dd']) . '<span class="data-type">days</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row m-row', 'col-4');
$this->HTMLphrase('p', 'm-desc', 'Owned since');
$this->tagClose('div');
$this->colOpen('col-8');
$this->HTMLphrase('p', 'm-value', $data['owned_since']);
$this->tagClose('div', 2);
}
protected function orderForm()
{
$this->outputString('<form id="orderForm" method="post">');
$this->rowColOpen('form-row', 'col-9');
$this->hiddenInput('order_form', 'true');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Order by');
$this->selectElement('order_by', 'form-control');
$this->selectOption('CPU count DESC', '1', true);
$this->selectOption('CPU count ASC', '2');
$this->selectOption('CPU Frequency DESC', '3');
$this->selectOption('CPU Frequency ASC', '4');
$this->selectOption('Ram amount DESC', '5');
$this->selectOption('Ram amount ASC', '6');
$this->selectOption('Disk Amount DESC', '7');
$this->selectOption('Disk Amount ASC', '8');
$this->selectOption('Owned since DESC', '9');
$this->selectOption('Owned since ASC', '10');
$this->selectOption('GB5 single DESC', '11');
$this->selectOption('GB5 single ASC', '12');
$this->selectOption('GB5 multi DESC', '13');
$this->selectOption('GB5 multi ASC', '14');
$this->selectOption('Price DESC', '15');
$this->selectOption('Price ASC', '16');
$this->selectOption('Price p/m DESC', '17');
$this->selectOption('Price p/m ASC', '18');
$this->selectOption('4k speed DESC', '19');
$this->selectOption('4k speed ASC', '20');
$this->selectOption('64k speed DESC', '21');
$this->selectOption('64k speed ASC', '22');
$this->selectOption('512k speed DESC', '23');
$this->selectOption('512k speed ASC', '24');
$this->selectOption('1m speed DESC', '25');
$this->selectOption('1m speed ASC', '26');
$this->selectOption('Network send DESC', '27');
$this->selectOption('Network send ASC', '28');
$this->selectOption('Network receive DESC', '29');
$this->selectOption('Network receive ASC', '30');
$this->selectOption('Bandwidth amount DESC', '31');
$this->selectOption('Bandwidth amount ASC', '32');
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-3');
$this->submitInput('Order', 'submitInput', 'btn btn-second btn-block order-btn');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->outputString('<div id="orderDiv"></div>');
}
public function orderTable(int $order_type)
{
if (in_array($order_type, array(1, 2, 3, 4, 5, 6, 7, 8))) {
$this->tableHeader(array('Hostname', 'CPU', 'Freq', 'Ram', 'Swap', 'Disk', 'BWidth'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `swap`, `swap_type`, `swap_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type` FROM `servers`";
if ($order_type == 1) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `cpu` DESC;");
} elseif ($order_type == 2) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `cpu`;");
} elseif ($order_type == 3) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `cpu_freq` DESC;");
} elseif ($order_type == 4) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `cpu_freq`;");
} elseif ($order_type == 5) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `ram_mb` DESC;");
} elseif ($order_type == 6) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `ram_mb`;");
} elseif ($order_type == 7) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `disk_gb` DESC;");
} elseif ($order_type == 8) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `disk_gb`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['swap'], 0) . "<span class='table-val-type'>" . $row['swap_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(9, 10))) {
$this->tableHeader(array('Hostname', 'Owned since', 'CPU', 'Freq', 'Ram', 'Disk', 'BWidth'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type`, DATE_FORMAT(`owned_since`, '%D %b %Y') as dt FROM `servers`";
if ($order_type == 9) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `owned_since` DESC;");
} elseif ($order_type == 10) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `owned_since`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['dt']}</td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(11, 12, 13, 14))) {
$this->tableHeader(array('Hostname', 'GB5 single', 'GB5 multi', 'CPU', 'Freq', 'Ram', 'Disk', 'BWidth'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type`, `gb5_single`, `gb5_multi` FROM `servers` WHERE has_yabs = 1";
if ($order_type == 11) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `gb5_single` DESC;");
} elseif ($order_type == 12) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `gb5_single`;");
} elseif ($order_type == 13) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `gb5_multi` DESC;");
} elseif ($order_type == 14) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `gb5_multi`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['gb5_single']}</td>");
$this->outputString("<td>{$row['gb5_multi']}</td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(15, 16, 17, 18))) {
$this->tableHeader(array('Hostname', 'Price', 'Term', 'P/M', 'USD', 'CPU', 'Freq', 'Ram', 'Disk', 'BWidth'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type`, `price`, `currency`, `term`, `per_month`, `as_usd` FROM `servers` INNER JOIN `pricing`p on servers.id = p.server_id";
if ($order_type == 15) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `as_usd` DESC;");
} elseif ($order_type == 16) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `as_usd`;");
} elseif ($order_type == 17) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `per_month` DESC;");
} elseif ($order_type == 18) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `per_month`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['price']} {$row['currency']}</td>");
$this->outputString("<td>" . $this->paymentTerm($row['term']) . "</td>");
$this->outputString("<td>{$row['per_month']}</td>");
$this->outputString("<td>{$row['as_usd']}</td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(19, 20, 21, 22, 23, 24, 25, 26))) {
$this->tableHeader(array('Hostname', '4k', '64k', '512k', '1m', 'CPU', 'Freq', 'Ram', 'Disk', 'BWidth'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type`, `4k`, `4k_type`, `64k`, `64k_type`, `512k`, `512k_type`, `1m`, `1m_type` FROM `servers` INNER JOIN `disk_speed`p on servers.id = p.server_id WHERE has_yabs = 1";
if ($order_type == 19) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `4k_as_mbps` DESC;");
} elseif ($order_type == 20) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `4k_as_mbps`;");
} elseif ($order_type == 21) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `64k_as_mbps` DESC;");
} elseif ($order_type == 22) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `64k_as_mbps`;");
} elseif ($order_type == 23) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `512k_as_mbps` DESC;");
} elseif ($order_type == 24) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `512k_as_mbps`;");
} elseif ($order_type == 25) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `1m_as_mbps` DESC;");
} elseif ($order_type == 26) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `1m_as_mbps`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['4k']}<span class='table-val-type'>{$row['4k_type']}</span></td>");
$this->outputString("<td>{$row['64k']}<span class='table-val-type'>{$row['64k_type']}</span></td>");
$this->outputString("<td>{$row['512k']}<span class='table-val-type'>{$row['512k_type']}</span></td>");
$this->outputString("<td>{$row['1m']}<span class='table-val-type'>{$row['1m_type']}</span></td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(27, 28, 29, 30))) {
$this->tableHeader(array('Hostname', 'Send', 'Receive', 'Location', 'CPU', 'Freq', 'Ram', 'Disk', 'BWidth'));
$base_query = "SELECT servers.id, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type`, `send`, `send_type`, p.location, `recieve`, `recieve_type` FROM `servers` INNER JOIN `speed_tests`p on servers.id = p.server_id WHERE has_yabs = 1";
if ($order_type == 27) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `send_as_mbps` DESC LIMIT 80;");
} elseif ($order_type == 28) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `send_as_mbps` LIMIT 80;");
} elseif ($order_type == 29) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `recieve_as_mbps` DESC LIMIT 80;");
} elseif ($order_type == 30) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `recieve_as_mbps` LIMIT 80;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>{$row['send']}<span class='table-val-type'>{$row['send_type']}</span></td>");
$this->outputString("<td>{$row['recieve']}<span class='table-val-type'>{$row['recieve_type']}</span></td>");
$this->outputString("<td>{$row['location']}</td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->tagClose('tr');
}
} elseif (in_array($order_type, array(31, 32))) {
$this->tableHeader(array('Hostname', 'Bandwidth', 'CPU', 'Freq', 'Ram', 'Disk'));
$base_query = "SELECT `id`, `hostname`, `cpu`, `cpu_freq`, `ram`, `ram_type`, `ram_mb`, `disk`, `disk_type`, `disk_gb`, `bandwidth`, `bandwidth_type` FROM `servers`";
if ($order_type == 31) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `bandwidth` DESC;");
} elseif ($order_type == 32) {
$select = $this->dbConnect()->prepare("$base_query ORDER BY `bandwidth`;");
}
$select->execute();
while ($row = $select->fetch(PDO::FETCH_ASSOC)) {
$this->tagOpen('tr');
$this->outputString("<td>{$row['hostname']}</td>");
$this->outputString("<td>" . number_format($row['bandwidth'], 0) . "<span class='table-val-type'>" . $row['bandwidth_type'] . "</span></td>");
$this->outputString("<td>{$row['cpu']}</td>");
$this->outputString("<td>" . $this->mhzToGhz($row['cpu_freq']) . "<span class='table-val-type'>Ghz</span></td>");
$this->outputString("<td>" . number_format($row['ram'], 0) . "<span class='table-val-type'>" . $row['ram_type'] . "</span></td>");
$this->outputString("<td>" . number_format($row['disk'], 0) . "<span class='table-val-type'>" . $row['disk_type'] . "</span></td>");
$this->tagClose('tr');
}
}
$this->outputString('</tbody></table></div>');
}
public function infoCard()
{
$select = $this->dbConnect()->prepare("SELECT COUNT(*), SUM(`cpu`), SUM(`disk_gb`), SUM(`ram_mb`), SUM(`swap_mb`), SUM(`bandwidth`), SUM(`was_special`), SUM(`gb5_single`), SUM(`gb5_multi`) FROM `servers`;");
$select->execute();
$row = $select->fetchAll(PDO::FETCH_ASSOC)[0];
$inactive_servers = $this->dbConnect()->prepare("SELECT COUNT(*) as inactive FROM `servers` WHERE `still_have` = 0;");
$inactive_servers->execute();
$inactive_servers_count = $inactive_servers->fetch()['inactive'];
$kvm = $this->dbConnect()->prepare("SELECT COUNT(*) as kvm_count FROM `servers` WHERE `virt` = 'KVM';");
$kvm->execute();
$kvm_count = $kvm->fetch()['kvm_count'];
$ovz = $this->dbConnect()->prepare("SELECT COUNT(*) as ovz_count FROM `servers` WHERE `virt` = 'OVZ';");
$ovz->execute();
$ovz_count = $ovz->fetch()['ovz_count'];
$dedi = $this->dbConnect()->prepare("SELECT COUNT(*) as dedi_count FROM `servers` WHERE `virt` = 'DEDI';");
$dedi->execute();
$dedi_count = $dedi->fetch()['dedi_count'];
$lxc = $this->dbConnect()->prepare("SELECT COUNT(*) as lxc_count FROM `servers` WHERE `virt` = 'LXC';");
$lxc->execute();
$lxc_count = $lxc->fetch()['lxc_count'];
$domains = $this->dbConnect()->prepare("SELECT COUNT(*) as domains_count FROM `domains` WHERE `still_have` = 1;");
$domains->execute();
$domains_count = $domains->fetch()['domains_count'];
$domains_inactive = $this->dbConnect()->prepare("SELECT COUNT(*) as domains_count FROM `domains` WHERE `still_have` = 0;");
$domains_inactive->execute();
$domains_inactive_count = $domains_inactive->fetch()['domains_count'];
$sh = $this->dbConnect()->prepare("SELECT COUNT(*) as sh_count FROM `shared_hosting` WHERE `still_have` = 1;");
$sh->execute();
$sh_count = $sh->fetch()['sh_count'];
$sh_inactive = $this->dbConnect()->prepare("SELECT COUNT(*) as sh_count FROM `shared_hosting` WHERE `still_have` = 0;");
$sh_inactive->execute();
$sh_inactive_count = $sh_inactive->fetch()['sh_count'];
$cpu_freq = $this->dbConnect()->prepare("SELECT `cpu_freq` FROM `servers` ORDER BY `cpu_freq` DESC LIMIT 1;");
$cpu_freq->execute();
$fastest_cpu_freq = $cpu_freq->fetch()['cpu_freq'];
$single_high = $this->dbConnect()->prepare("SELECT `gb5_single` FROM `servers` ORDER BY `gb5_single` DESC LIMIT 1;");
$single_high->execute();
$highest_single_gb5 = $single_high->fetch()['gb5_single'];
$multi_high = $this->dbConnect()->prepare("SELECT `gb5_multi` FROM `servers` ORDER BY `gb5_multi` DESC LIMIT 1;");
$multi_high->execute();
$highest_multi_gb5 = $multi_high->fetch()['gb5_multi'];
$oldest = $this->dbConnect()->prepare("SELECT `hostname`, `owned_since` FROM `servers` ORDER BY `owned_since`;");
$oldest->execute();
$oldest_row = $oldest->fetchAll(PDO::FETCH_ASSOC)[0];
$oldest_d = $this->dbConnect()->prepare("SELECT `domain`, `owned_since` FROM `domains` ORDER BY `owned_since`;");
$oldest_d->execute();
if (isset($oldest_d->fetchAll(PDO::FETCH_ASSOC)[0])) {
$oldest_d_row = $oldest_d->fetchAll(PDO::FETCH_ASSOC)[0];
} else {
$oldest_d_row = array('domain' => null, 'owned_since' => null);
}
$sel_price = $this->dbConnect()->prepare("SELECT `as_usd`, `term`, `usd_per_month` FROM `pricing`;");
$sel_price->execute();
$tally = 0;
$pm_tally = 0;
while ($row1 = $sel_price->fetch(PDO::FETCH_ASSOC)) {
$cost = $row1['as_usd'];
$term = $row1['term'];
$pm = $row1['usd_per_month'];
$pm_tally = ($pm_tally + $pm);
if ($term == 1) {
$tally = $tally + ($cost * 12);
} elseif ($term == 2) {
$tally = $tally + ($cost * 4);
} elseif ($term == 3) {
$tally = $tally + ($cost * 2);
} elseif ($term == 4) {
$tally = $tally + $cost;
} elseif ($term == 4) {
$tally = $tally + ($cost / 2);
} elseif ($term == 4) {
$tally = $tally + ($cost / 3);
}
}
$this->outputString("<div class='card' id='infoCard'>");
$this->tagOpen('div', 'card-header text-center');
$this->HTMLphrase('h2', '', 'My idlers info');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total servers: <span class="info-val">' . $row['COUNT(*)'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total shared hosting: <span class="info-val">' . $sh_count . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total domains: <span class="info-val">' . $domains_count . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'KVM/OVZ/DEDI/LXC: <span class="info-val">' . $kvm_count . '/' . $ovz_count . '/' . $dedi_count . '/' . $lxc_count . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'No longer have servers: <span class="info-val">' . $inactive_servers_count . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'No longer have domains/shared: <span class="info-val">' . $domains_inactive_count . '/' . $sh_inactive_count . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total CPU: <span class="info-val">' . $row['SUM(`cpu`)'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Fastest CPU: <span class="info-val">' . $fastest_cpu_freq . '<span class="data-type">Mhz</span></span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total disk: <span class="info-val">' . number_format($row['SUM(`disk_gb`)'], 0) . '<span class="data-type">GB</span></span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total bandwidth: <span class="info-val">' . number_format($row['SUM(`bandwidth`)'], 0) . '<span class="data-type">TB</span></span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total ram: <span class="info-val">' . number_format($row['SUM(`ram_mb`)'], 2) . '<span class="data-type">MB</span></span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total swap: <span class="info-val">' . number_format($row['SUM(`swap_mb`)'], 2) . '<span class="data-type">MB</span></span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total gb5_single: <span class="info-val">' . number_format($row['SUM(`gb5_single`)'], 0) . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total gb5_multi: <span class="info-val">' . number_format($row['SUM(`gb5_multi`)'], 0) . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Highest single/multi: <span class="info-val">' . $highest_single_gb5 . '/' . $highest_multi_gb5 . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');;
$this->HTMLphrase('p', 'info-desc', 'Special priced: <span class="info-val">' . $row['SUM(`was_special`)'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Oldest server: <span class="info-val">' . $oldest_row['hostname'] . ' ' . $oldest_row['owned_since'] . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Oldest domain: <span class="info-val">' . $oldest_d_row['domain'] . ' ' . $oldest_d_row['owned_since'] . '</span>');
$this->tagClose('div', 2);
$this->rowColOpen('row info-row', 'col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total cost p/m USD: <span class="info-val">$' . $pm_tally . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->HTMLphrase('p', 'info-desc', 'Total cost per year USD: <span class="info-val">$' . $tally . '</span>');
$this->tagClose('div');
$this->colOpen('col-12 col-md-4');
$this->tagClose('div', 4);
}
protected function hasPassedDate(string $the_date)
{
if (new DateTime() > new DateTime($the_date)) {
//current date time has passed $the_date
return true;
} else {
//current date time has NOT passed $the_date
return false;
}
}
protected function nextDueDate(int $term, string $last_dd)
{
$date = new DateTime($last_dd);
if ($term == 1) {
$date->add(new DateInterval('P1M'));
} elseif ($term == 2) {
$date->add(new DateInterval('P3M'));
} elseif ($term == 3) {
$date->add(new DateInterval('P6M'));
} elseif ($term == 4) {
$date->add(new DateInterval('P1Y'));
} elseif ($term == 5) {
$date->add(new DateInterval('P2Y'));
} elseif ($term == 6) {
$date->add(new DateInterval('P3Y'));
}
return $date->format('Y-m-d');
}
protected function processDueDate(string $item_id, int $term, $last_dd)
{//Will return days until due. Will update if passed due date and then return days until due
if (is_null($last_dd)) {
return "-";//Due date not set
} else {
if ($this->hasPassedDate($last_dd)) {
$update = $this->dbConnect()->prepare("UPDATE `pricing` SET `next_dd` = ? WHERE `server_id` = ? LIMIT 1;");
$new_dd = $this->nextDueDate($term, $last_dd);
$update->execute([$new_dd, $item_id]);
return $this->daysAway($new_dd);
} else {
return $this->daysAway($last_dd);
}
}
}
public function showYabsModal(string $item_id)
{
$this->tagOpen('form');
$this->outputString('<textarea class="form-control" id="yabsTextBox" name="yabsTextBox" rows="40" cols="50">');
$this->outputString(file_get_contents("yabs/$item_id.txt"));
$this->tagClose('textarea');
$this->tagClose('form');
$this->rowColOpen('row text-center', 'col-12');
$this->outputString('<a class="btn btn-third" role="button" data-dismiss="modal">Close YABs</a>');
$this->tagClose('div', 2);
}
public function getIpForDomain(string $domain, string $type = 'A'): string
{//Gets IP from A record for a domain
switch ($type) {
case "A":
$data = dns_get_record($domain, DNS_A);
if (isset($data['0']['ip'])) {
return $data['0']['ip'];
}
break;
case "AAAA":
$data = dns_get_record($domain, DNS_AAAA);
if (isset($data['0']['ipv6'])) {
return $data['0']['ipv6'];
}
break;
}
return "";//Doesnt exist/null/empty/invalid
}
public function checkIsUp(string $host, int $port = 80, int $wait_time = 1): int
{//Check if host/ip is "up"
if ($fp = @fsockopen($host, $port, $errCode, $errStr, $wait_time)) {
$result = 1;
} else {
$result = 0;
}
@fclose($fp);
return $result;
}
public function getAsnInfo(string $ip)
{//Thanks ripe.net
$data = json_decode(@file_get_contents("https://stat.ripe.net/data/whois/data.json?resource=$ip"), true);
if (isset($data) && $data['status_code'] == 200) {
$origin = $desc = '';
foreach ($data['data']['irr_records'][0] as $rec) {
if ($rec['key'] == 'descr') {
$desc = $rec['value'];
}
if ($rec['key'] == 'origin') {
$origin .= $rec['value'];
}
}
return "$desc, AS$origin";
} else {
return "";
}
}
protected function viewSwitcherIcon()
{
$this->rowColOpen('row text-center', 'col-12');
if (self::DEFAULT_VIEW == 'CARDS') {
$this->outputString('<a id="viewSwitcherIcon"><i class="fas fa-table" id="viewSwitchIcon" title="Switch to table"></i></a>');
} else {
$this->outputString('<a id="viewSwitcherIcon"><i class="fas fa-th" id="viewSwitchIcon" title="Switch to cards"></i></a>');
}
$this->tagClose('div', 2);
}
protected function idToObjectName(string $id)
{//Returns a hostname or domain for an id
$servers = $this->dbConnect()->prepare("SELECT `hostname` FROM `servers` WHERE `id` = ? LIMIT 1;");
$servers->execute([$id]);
$servers_res = $servers->fetch(PDO::FETCH_ASSOC);
if ($servers_res) {
return $servers_res['hostname'];
} else {
$shared = $this->dbConnect()->prepare("SELECT `domain` FROM `shared_hosting` WHERE `id` = ? LIMIT 1;");
$shared->execute([$id]);
$shared_res = $shared->fetch(PDO::FETCH_ASSOC);
if ($shared_res) {
return $shared_res['domain'];
} else {
$domain = $this->dbConnect()->prepare("SELECT `domain` FROM `domains` WHERE `id` = ? LIMIT 1;");
$domain->execute([$id]);
$domain_res = $domain->fetch(PDO::FETCH_ASSOC);
if ($domain_res) {
return $domain_res['domain'];
}
}
}
return $id;
}
protected function checkPHPversion()
{
if (version_compare(PHP_VERSION, '7.4') === -1) {
echo "<script type='text/javascript'>alert('My idlers requires PHP 7.4 as a minimum version. You have " . PHP_VERSION . " installed');</script>";
exit;
}
}
//Compare functions
protected function compatibleComparesSelect()
{
$select = $this->dbConnect()->prepare("SELECT `id`, `hostname` FROM `servers` WHERE `has_yabs` = 1 AND `has_st` = 1 ORDER BY `hostname`;");
$select->execute();
$rows = $select->fetchAll(PDO::FETCH_ASSOC);
$this->rowColOpen('form-row', 'col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Server 1');
$this->selectElement('compare_s1');
$this->selectOption('', '', true);//Empty
foreach ($rows as $aserver) {
$this->selectOption($aserver['hostname'], $aserver['id']);
}
$this->tagClose('select');
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Server 2');
$this->selectElement('compare_s2');
$this->selectOption('', '', true);
foreach ($rows as $aserver) {
$this->selectOption($aserver['hostname'], $aserver['id']);
}
$this->tagClose('select');
$this->tagClose('div', 3);
}
protected function compareSection()
{
$this->compatibleComparesSelect();
$this->tagOpen('div', '', 'compareTableDiv');
$this->tagClose('div');
}
protected function tableRowCompare(string $val1, string $val2, string $value_type = '', bool $is_int = true)
{
$value_append = '<span class="data-type">' . $value_type . '</span>';
if ($is_int) {
$val1 = intval($val1);
$val2 = intval($val2);
}
if ($val1 > $val2) {//val1 is greater than val2
$result = '+' . ($val1 - $val2);
if (!empty($value_type)) {
$result = '+' . ($val1 - $val2) . $value_append;
$val1 = $val1 . $value_append;
$val2 = $val2 . $value_append;
}
$this->tableTd('td-nowrap', $val1);
$this->tableTd('td-nowrap plus-td', $result);
$this->tableTd('td-nowrap', $val2);
} elseif ($val1 < $val2) {//val1 is less than val2
$result = '-' . ($val2 - $val1);
if (!empty($value_type)) {
$result = '-' . ($val2 - $val1) . $value_append;
$val1 = $val1 . $value_append;
$val2 = $val2 . $value_append;
}
$this->tableTd('td-nowrap', $val1);
$this->tableTd('td-nowrap neg-td', $result);
$this->tableTd('td-nowrap', $val2);
} else {//Equal
$result = 0;
if (!empty($value_type)) {
$result = '0' . $value_append;
$val1 = $val1 . $value_append;
$val2 = $val2 . $value_append;
}
$this->tableTd('td-nowrap', $val1);
$this->tableTd('td-nowrap equal-td', $result);
$this->tableTd('td-nowrap', $val2);
}
}
public function compareTable(string $server1_id, string $server2_id)
{
$server1_data = json_decode($this->serverData($server1_id), true);
$server2_data = json_decode($this->serverData($server2_id), true);
$this->tableHeader(array('', $server1_data['hostname'], 'DIF', $server2_data['hostname']), 'table compare-table', 'compareTable');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'CPU count');
$this->tableRowCompare($server1_data['cpu'], $server2_data['cpu']);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'CPU freq');
$this->tableRowCompare($this->mhzToGhz($server1_data['cpu_freq']), $this->mhzToGhz($server2_data['cpu_freq']), 'Ghz', false);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Ram');
$this->tableRowCompare($server1_data['ram_mb'], $server2_data['ram_mb'], 'MB');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Swap');
$this->tableRowCompare($server1_data['swap_mb'], $server2_data['swap_mb'], 'MB');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Disk');
$this->tableRowCompare($server1_data['disk_gb'], $server2_data['disk_gb'], 'GB');
$this->tagClose('tr');
if ($server1_data['has_yabs'] == 1 && $server2_data['has_yabs'] == 1) {
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'GB5 single');
$this->tableRowCompare($server1_data['gb5_single'], $server2_data['gb5_single']);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'GB5 multi');
$this->tableRowCompare($server1_data['gb5_multi'], $server2_data['gb5_multi']);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', '4k disk');
$this->tableRowCompare($server1_data['4k_as_mbps'], $server2_data['4k_as_mbps'], 'MB/s');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', '64k disk');
$this->tableRowCompare($server1_data['64k_as_mbps'], $server2_data['64k_as_mbps'], 'MB/s');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', '512k disk');
$this->tableRowCompare($server1_data['512k_as_mbps'], $server2_data['512k_as_mbps'], 'MB/s');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', '1m disk');
$this->tableRowCompare($server1_data['1m_as_mbps'], $server2_data['1m_as_mbps'], 'MB/s');
$this->tagClose('tr');
}
if ($server1_data['has_st'] == 1 && $server2_data['has_st'] == 1) {
if (isset($server1_data[0]) && isset($server2_data[0])) {
if ($server1_data[0]['location'] == $server2_data[0]['location']) {
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[0]['location'] . ' send');
$this->tableRowCompare($server1_data[0]['send_as_mbps'], $server2_data[0]['send_as_mbps'], 'MBps');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[0]['location'] . ' recieve');
$this->tableRowCompare($server1_data[0]['recieve_as_mbps'], $server2_data[0]['recieve_as_mbps'], 'MBps');
$this->tagClose('tr');
}
}
if (isset($server1_data[1]) && isset($server2_data[1])) {
if ($server1_data[1]['location'] == $server2_data[1]['location']) {
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[1]['location'] . ' send');
$this->tableRowCompare($server1_data[1]['send_as_mbps'], $server2_data[1]['send_as_mbps'], 'MBps');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[1]['location'] . ' recieve');
$this->tableRowCompare($server1_data[1]['recieve_as_mbps'], $server2_data[1]['recieve_as_mbps'], 'MBps');
$this->tagClose('tr');
}
}
if (isset($server1_data[2]) && isset($server2_data[2])) {
if ($server1_data[2]['location'] == $server2_data[2]['location']) {
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[2]['location'] . ' send');
$this->tableRowCompare($server1_data[2]['send_as_mbps'], $server2_data[2]['send_as_mbps'], 'MBps');
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', $server1_data[2]['location'] . ' recieve');
$this->tableRowCompare($server1_data[2]['recieve_as_mbps'], $server2_data[2]['recieve_as_mbps'], 'MBps');
$this->tagClose('tr');
}
}
}
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'USD p/m');
$this->tableRowCompare($server1_data['usd_per_month'], $server2_data['usd_per_month'], 'p/m', false);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Actual price');
$this->tableTd('td-nowrap', $server1_data['price'] . '<span class="data-type">' . $server1_data['currency'] . '</span>' . ' ' . $this->paymentTerm($server1_data['term']));
$this->tableTd('td-nowrap equal-td', '');
$this->tableTd('td-nowrap', $server2_data['price'] . '<span class="data-type">' . $server2_data['currency'] . '</span>' . ' ' . $this->paymentTerm($server2_data['term']));
$this->tagClose('tr');
$this->tagOpen('tr');
if ($server1_data['price'] > 0 && $server2_data['price'] > 0) {
$this->tableTd('td-nowrap', 'CPU per USD');
$this->tableRowCompare(number_format(($server1_data['usd_per_month'] / $server1_data['cpu']), 2), number_format(($server2_data['usd_per_month'] / $server2_data['cpu']), 2), '', false);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Disk GB per USD');
$this->tableRowCompare(($server1_data['disk_gb'] / $server1_data['usd_per_month']), ($server2_data['disk_gb'] / $server2_data['usd_per_month']), 'GB', true);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Ram MB per USD');
$this->tableRowCompare(($server1_data['ram_mb'] / $server1_data['usd_per_month']), ($server2_data['ram_mb'] / $server2_data['usd_per_month']), 'MB', true);
$this->tagClose('tr');
if ($server1_data['has_yabs'] == 1 && $server2_data['has_yabs'] == 1) {
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'GB5 single per USD');
$this->tableRowCompare(($server1_data['gb5_single'] / $server1_data['usd_per_month']), ($server2_data['gb5_single'] / $server2_data['usd_per_month']), '', true);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'GB5 multi per USD');
$this->tableRowCompare(($server1_data['gb5_multi'] / $server1_data['usd_per_month']), ($server2_data['gb5_multi'] / $server2_data['usd_per_month']), '', true);
$this->tagClose('tr');
}
}
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Location');
$this->tableTd('td-nowrap', $server1_data['location']);
$this->tableTd('td-nowrap equal-td', '');
$this->tableTd('td-nowrap', $server2_data['location']);
$this->tagClose('tr');
$this->tagOpen('tr');
$this->tableTd('td-nowrap', 'Provider');
$this->tableTd('td-nowrap', $server1_data['provider']);
$this->tableTd('td-nowrap equal-td', '');
$this->tableTd('td-nowrap', $server2_data['provider']);
$this->tagClose('tr');
$this->tableTd('td-nowrap', 'Owned since');
$this->tableTd('td-nowrap', $server1_data['owned_since']);
$this->tableTd('td-nowrap equal-td', '');
$this->tableTd('td-nowrap', $server2_data['owned_since']);
$this->tagClose('tr');
$this->outputString('</tbody></table></div>');
}
}
class itemInsert extends idlers
{
public string $item_id;
public array $data;
public function __construct(array $data)
{
$this->item_id = $this->genId();
$this->data = $data;
}
public function insertBasicWithYabs()
{//Insert data from form EXCEPT the YABs output
$data = $this->data;
$item_id = $this->item_id;
(isset($data['dedi_cpu'])) ? $dedi_cpu = 1 : $dedi_cpu = 0;
($data['virt'] == 'DEDI') ? $dedi = 1 : $dedi = 0;
(isset($data['was_offer'])) ? $offer = 1 : $offer = 0;
(empty($data['ipv4'])) ? $ipv4 = null : $ipv4 = $data['ipv4'];
(empty($data['ipv6'])) ? $ipv6 = null : $ipv6 = $data['ipv6'];
(empty($data['label'])) ? $label = null : $label = $data['label'];
if (self::GET_ASN_INFO) {
if (!is_null($ipv4)) {
$asn = $this->getAsnInfo($ipv4);
} elseif (!is_null($ipv6)) {
$asn = $this->getAsnInfo($ipv6);
} else {
$asn = null;
}
if (empty($asn)) {
$asn = null;
}
} else {
$asn = null;
}
$location_id = $this->handleLocation($data['location']);
$provider_id = $this->handleProvider($data['provider']);
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `servers` (id, hostname, location, provider, ipv4,ipv6, owned_since, os, is_cpu_dedicated, is_dedicated, was_special, bandwidth, virt, has_yabs, ns1, ns2, ssh_port, label, asn) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
$insert->execute([$item_id, $data['hostname'], $location_id, $provider_id, $ipv4, $ipv6, $data['owned_since'], $data['os'], $dedi_cpu, $dedi, $offer, $data['bandwidth'], $data['virt'], $data['has_yabs'], $data['ns1'], $data['ns2'], $data['ssh_port'], $label, $asn]);
$this->insertPrice($data['price'], $data['currency'], $data['term'], $data['next_due_date']);
return $item_id;
}
public function insertBasic()
{//Manual form insert (NO YABs)
$data = $this->data;
$item_id = $this->item_id;
(isset($data['dedi_cpu'])) ? $dedi_cpu = 1 : $dedi_cpu = 0;
($data['virt'] == 'DEDI') ? $dedi = 1 : $dedi = 0;
(isset($data['was_offer'])) ? $offer = 1 : $offer = 0;
(empty($data['ipv4'])) ? $ipv4 = null : $ipv4 = $data['ipv4'];
(empty($data['ipv6'])) ? $ipv6 = null : $ipv6 = $data['ipv6'];
(empty($data['label'])) ? $label = null : $label = $data['label'];
if (self::GET_ASN_INFO) {
if (!is_null($ipv4)) {
$asn = $this->getAsnInfo($ipv4);
} elseif (!is_null($ipv6)) {
$asn = $this->getAsnInfo($ipv6);
} else {
$asn = null;
}
if (empty($asn)) {
$asn = null;
}
} else {
$asn = null;
}
($data['ram_type'] == 'GB') ? $ram_mb = $this->GBtoMB($data['ram']) : $ram_mb = $data['ram'];
($data['swap_type'] == 'GB') ? $swap_mb = $this->GBtoMB($data['swap']) : $swap_mb = $data['swap'];
($data['disk_type'] == 'TB') ? $disk_gb = $this->TBtoGB($data['disk']) : $disk_gb = $data['disk'];
$location_id = $this->handleLocation($data['location']);
$provider_id = $this->handleProvider($data['provider']);
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `servers` (id, hostname, location, provider, ipv4,ipv6, owned_since, os, is_cpu_dedicated, is_dedicated, was_special, bandwidth, virt, cpu, cpu_freq, ram, ram_type, swap, swap_type, disk, disk_type, ram_mb, swap_mb, disk_gb, ns1, ns2, ssh_port, label, asn) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
$insert->execute([$item_id, $data['hostname'], $location_id, $provider_id, $ipv4, $ipv6, $data['owned_since'], $data['os'], $dedi_cpu, $dedi, $offer, $data['bandwidth'], $data['virt'], $data['cpu_amount'], $data['cpu_speed'], $data['ram'], $data['ram_type'], $data['swap'], $data['swap_type'], $data['disk'], $data['disk_type'], $ram_mb, $swap_mb, $disk_gb, $data['ns1'], $data['ns2'], $data['ssh_port'], $label, $asn]);
$this->insertPrice($data['price'], $data['currency'], $data['term'], $data['next_due_date']);
return $item_id;
}
public function insertSharedHosting()
{//domains form insert
$data = $this->data;
$item_id = $this->item_id;
($data['shared_storage_type'] == 'TB') ? $disk_gb = $this->TBtoGB($data['shared_storage']) : $disk_gb = $data['shared_storage'];
(isset($data['shared_was_offer'])) ? $offer = 1 : $offer = 0;
$location_id = $this->handleLocation($data['shared_location']);
$provider_id = $this->handleProvider($data['shared_provider']);
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `shared_hosting` (id, domain, domains_limit, emails, disk, disk_type, disk_as_gb, ftp, db, bandwidth, provider, location, was_special, still_have, type, owned_since) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
$insert->execute([$item_id, $data['shared_domain'], $data['shared_domains_amount'], $data['shared_emails'], $data['shared_storage'], $data['shared_storage_type'], $disk_gb, $data['shared_ftp'], $data['shared_db_amount'], $data['shared_bandwidth'], $provider_id, $location_id, $offer, '1', $data['shared_type'], $data['shared_owned_since']]);
$this->insertPrice($data['shared_price'], $data['shared_currency'], $data['shared_term'], $data['shared_next_due_date']);
return $item_id;
}
public function insertDomain()
{//domains form insert
$data = $this->data;
$domain_id = $this->item_id;
$provider_id = $this->handleProvider($data['domain_provider']);
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `domains` (id, domain, provider, owned_since) VALUES (?,?,?,?)');
$insert->execute([$domain_id, $data['domain'], $provider_id, $data['domain_owned_since']]);
$this->insertPrice($data['domain_price'], $data['domain_currency'], $data['domain_term'], $data['domain_next_due_date']);
return $domain_id;
}
public function insertYabsData()
{//YABS data handler
$file_name = 'yabsFromForm.txt';
$logfile = fopen($file_name, "w") or die("Unable to open file!");
fwrite($logfile, $this->data['yabs']);
fclose($logfile);
$file = @fopen($file_name, 'r');
if ($file) {
$array = explode("\n", fread($file, filesize($file_name)));
//echo json_encode($array);
//exit;
}
if (count($array) < 50) {
return 9;//Less than 50 lines
}
if (strpos($array[0], '# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #') !== false) {
if ($array[1] == "\r") {
return 8;//Didnt copy output correctly
}
$version_array = explode(' ', preg_replace('!\s+!', ' ', $this->trimRemoveR($array[2])));
$version = $version_array[1];//YABs version
if ($version == 'v2020-12-29') {
$cpu = $this->trimRemoveR(str_replace(':', '', strstr($array[10], ': ')));
$cpu_spec = explode(' ', strstr($array[11], ': '));//: 2 @ 3792.872 MHz
$cpu_cores = $cpu_spec[1];
$cpu_freq = $cpu_spec[3];
$ram_line = $this->trimRemoveR(str_replace(':', '', strstr($array[14], ': ')));
$ram = floatval($ram_line);
$ram_type = $this->datatype($ram_line);
$swap_line = $this->trimRemoveR(str_replace(':', '', strstr($array[15], ': ')));
$swap = floatval($swap_line);
$swap_type = $this->datatype($swap_line);
$disk_line = $this->trimRemoveR(str_replace(':', '', strstr($array[16], ': ')));
$disk = floatval($disk_line);
$disk_type = $this->datatype($disk_line);
$io_3 = explode(' ', preg_replace('!\s+!', ' ', $array[24]));
$io_6 = explode(' ', preg_replace('!\s+!', ' ', $array[30]));
(strpos($array[12], 'Enabled') !== false) ? $aes_ni = 1 : $aes_ni = 0;
(strpos($array[13], 'Enabled') !== false) ? $vm_amd_v = 1 : $vm_amd_v = 0;
$d4k_as_mbps = $this->diskSpeedAsMbps($io_3[3], $this->floatValue($io_3[2]));
$d64k_as_mbps = $this->diskSpeedAsMbps($io_3[7], $this->floatValue($io_3[6]));
$d512k_as_mbps = $this->diskSpeedAsMbps($io_6[3], $this->floatValue($io_6[2]));
$d1m_as_mbps = $this->diskSpeedAsMbps($io_6[7], $this->floatValue($io_6[6]));
$disk_test_arr = array($this->item_id, $this->floatValue($io_3[2]), $io_3[3], $this->floatValue($io_3[6]), $io_3[7], $this->floatValue($io_6[2]), $io_6[3], $this->floatValue($io_6[6]), $io_6[7], $d4k_as_mbps, $d64k_as_mbps, $d512k_as_mbps, $d1m_as_mbps);
$this->insertDiskTest($disk_test_arr);
if (isset($array[40])) {
if ($array[45] == "Geekbench 5 Benchmark Test:\r") {
//No ipv6
//Has short ipv4 network speed testing (-r)
$start_st = 36;
$end_st = 43;
$gb_s = 49;
$gb_m = 50;
$gb_url = 51;
} elseif ($array[45] == "Geekbench 4 Benchmark Test:\r") {
return 6;//GeekBench 5 only allowed
} elseif ($array[45] == "Geekbench 5 test failed. Run manually to determine cause.") {
return 7;//GeekBench test failed
} elseif ($array[40] == "Geekbench 5 Benchmark Test:\r") {
//No ipv6
//Has full ipv4 network speed testing
$start_st = 36;
$end_st = 38;
$gb_s = 44;
$gb_m = 45;
$gb_url = 46;
} elseif ($array[40] == "iperf3 Network Speed Tests (IPv6):\r") {
//HAS ipv6
//Has short ipv4 & ipv6 network speed testing
$start_st = 36;
$end_st = 38;
$gb_s = 52;
$gb_m = 53;
$gb_url = 54;
} elseif ($array[55] == "Geekbench 5 Benchmark Test:\r") {
//HAS ipv6
//Has full ipv4 & ipv6 network speed testing
$start_st = 36;
$end_st = 43;
$gb_s = 59;
$gb_m = 60;
$gb_url = 61;
} else {
return 5;//Not correct YABs command output
}
} else {
return 4;//Not correct format
}
$geekbench_single = $this->intValue($array[$gb_s]);
$geekbench_multi = $this->intValue($array[$gb_m]);
$geek_full_url = explode(' ', preg_replace('!\s+!', ' ', $array[$gb_url]));
$gb5_id = substr($geek_full_url[3], strrpos($geek_full_url[3], '/') + 1);//
$has_a_speed_test = false;
for ($i = $start_st; $i <= $end_st; $i++) {
if (strpos($array[$i], 'busy') !== false) {
//Has a "busy" result, No insert
} else {
$data = explode(' ', preg_replace('!\s+!', ' ', $array[$i]));
$send_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['send_type'], $this->yabsSpeedValues($data)['send']);
$recieve_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['receive_type'], $this->yabsSpeedValues($data)['receive']);
$insert = $this->dbConnect()->prepare('INSERT INTO `speed_tests` (`server_id`, `location`, `send`, `send_type`,`send_as_mbps`, `recieve`,`recieve_type`, `recieve_as_mbps`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
$insert->execute([$this->item_id, $this->yabsSpeedLoc($data)['location'], $this->yabsSpeedValues($data)['send'], $this->yabsSpeedValues($data)['send_type'], $send_as_mbps, $this->yabsSpeedValues($data)['receive'], $this->yabsSpeedValues($data)['receive_type'], $recieve_as_mbps]);
$has_a_speed_test = true;
}
}
if ($has_a_speed_test) {
$update_st = $this->dbConnect()->prepare('UPDATE `servers` SET `has_st` = 1 WHERE `id` = ? LIMIT 1;');
$update_st->execute([$this->item_id]);
}
($ram_type == 'GB') ? $ram_mb = $this->GBtoMB($ram) : $ram_mb = $ram;
($swap_type == 'GB') ? $swap_mb = $this->GBtoMB($swap) : $swap_mb = $swap;
($disk_type == 'TB') ? $disk_gb = $this->TBtoGB($disk) : $disk_gb = $disk;
$update = $this->dbConnect()->prepare('UPDATE `servers` SET `cpu` = ?, `cpu_freq` = ?, `cpu_type` = ?, ram = ?, ram_type = ?, swap = ?, swap_type = ?, disk = ?, disk_type = ?, `aes_ni` = ?, `amd_v` = ?, gb5_single = ?, gb5_multi = ?, gb5_id = ?, ram_mb = ?, swap_mb = ?, disk_gb = ? WHERE `id` = ? LIMIT 1;');
$update->execute([$cpu_cores, $cpu_freq, $cpu, $ram, $ram_type, $swap, $swap_type, $disk, $disk_type, $aes_ni, $vm_amd_v, $geekbench_single, $geekbench_multi, $gb5_id, $ram_mb, $swap_mb, $disk_gb, $this->item_id]);
if (self::SAVE_YABS_OUTPUT) {
$this->saveYABS($this->data['yabs'], "{$this->item_id}.txt");
}
return 1;
} else {
return 2;//Wrong version
}
} else {
return 3;//Didnt start at right spot
}
}
protected function insertDiskTest(array $results)
{//Insert disk io results from the built array
$insert = $this->dbConnect()->prepare("INSERT IGNORE INTO `disk_speed` (`server_id`, `4k`, `4k_type`, `64k`, `64k_type`, `512k`, `512k_type`, `1m`, `1m_type`, `4k_as_mbps`, `64k_as_mbps`, `512k_as_mbps`, `1m_as_mbps`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);");
return $insert->execute([$this->item_id, $results[1], $results[2], $results[3], $results[4], $results[5], $results[6], $results[7], $results[8], $results[9], $results[10], $results[11], $results[12]]);
}
protected function insertPrice(string $price, string $currency, int $term, string $next_dd)
{//Insert price data
$as_usd = $this->convertToUSD($price, $currency);
$insert = $this->dbConnect()->prepare("INSERT IGNORE INTO `pricing` (server_id, price, currency, term, as_usd, per_month, usd_per_month, next_dd) VALUES (?,?,?,?,?,?,?,?);");
return $insert->execute([$this->item_id, $price, $currency, $term, $as_usd, $this->costAsPerMonth($price, $term), $this->costAsPerMonth($as_usd, $term), $next_dd]);
}
}
class itemUpdate extends idlers
{
public string $item_id;
public string $type;
public array $data;
public function __construct(array $data)
{
$this->data = $data;
if (isset($data['sh_me_server_id'])) {
$this->item_id = $data['sh_me_server_id'];
$this->type = 'SHARED';
} elseif (isset($data['d_me_server_id'])) {
$this->item_id = $data['d_me_server_id'];
$this->type = 'DOMAIN';
} else {
$this->item_id = $data['me_server_id'];
$this->type = 'SERVER';
}
}
public function updateServerFromModal()
{
$data = $this->data;
if (!isset($data['me_non_active'])) {
$this->updateActiveStatus(1);
} elseif ($data['me_non_active'] == 'on') {
$this->updateActiveStatus(0);
}
$update = $this->dbConnect()->prepare("UPDATE `servers` SET `hostname` = ?,`ipv4` = ?,`ipv6` = ?,`cpu` = ?,`bandwidth` = ?,`disk` = ?,`ram` = ?,`ram_type` = ?,`swap` = ?,`swap_type` = ?, `virt` = ?, `tags` = ?, `owned_since` = ?, `ns1` = ?, `ns2` = ?, `ssh_port` = ?, `notes` = ?, `label` = ? WHERE `id`= ? LIMIT 1;");
return $update->execute([$data['me_hostname'], $data['me_ipv4'], $data['me_ipv6'], $data['me_cpu_amount'], $data['me_bandwidth'], $data['me_disk'], $data['me_ram'], $data['me_ram_type'], $data['me_swap'], $data['me_swap_type'], $data['me_virt'], $data['me_tags'], $data['me_owned_since'], $data['me_ns1'], $data['me_ns2'], $data['me_ssh_port'], $data['me_notes'], $data['me_label'], $this->item_id]);
}
public function updateServerPricingFromModal()
{
$data = $this->data;
$as_usd = $this->convertToUSD($data['me_price'], $data['me_currency']);
$update = $this->dbConnect()->prepare("UPDATE `pricing` SET `price` = ?,`currency` = ?,`term` = ?,`as_usd` = ?,`per_month` = ?, `usd_per_month` = ?, `next_dd` = ? WHERE `server_id`= ? LIMIT 1;");
return $update->execute([$data['me_price'], $data['me_currency'], $data['me_term'], $as_usd, $this->costAsPerMonth($data['me_price'], $data['me_term']), $this->costAsPerMonth($as_usd, $data['me_term']), $data['me_next_dd'], $this->item_id]);
}
public function updateSharedHostingFromModal()
{
$data = $this->data;
if (!isset($data['sh_me_non_active'])) {
$this->updateActiveStatus(1);
} elseif ($data['sh_me_non_active'] == 'on') {
$this->updateActiveStatus(0);
}
$update = $this->dbConnect()->prepare("UPDATE `shared_hosting` SET `domain` = ?,`domains_limit` = ?,`emails` = ?,`disk` = ?,`disk_as_gb` = ?,`disk_type` = ?,`ftp` = ?,`db` = ?,`bandwidth` = ?,`owned_since` = ? WHERE `id`= ? LIMIT 1;");
return $update->execute([$data['sh_me_hostname'], $data['sh_me_domains_count'], $data['sh_me_emails'], $data['sh_me_storage'], $data['sh_me_storage'], 'GB', $data['sh_me_ftp'], $data['sh_me_db'], $data['sh_me_bandwidth'], $data['sh_me_owned_since'], $this->item_id]);
}
public function updateSharedHostingPricingFromModal()
{
$data = $this->data;
$as_usd = $this->convertToUSD($data['sh_me_price'], $data['sh_me_currency']);
$update = $this->dbConnect()->prepare("UPDATE `pricing` SET `price` = ?,`currency` = ?,`term` = ?,`as_usd` = ?,`per_month` = ?, `usd_per_month` = ?, `next_dd` = ? WHERE `server_id`= ? LIMIT 1;");
return $update->execute([$data['sh_me_price'], $data['sh_me_currency'], $data['sh_me_term'], $as_usd, $this->costAsPerMonth($data['sh_me_price'], $data['sh_me_term']), $this->costAsPerMonth($as_usd, $data['sh_me_term']), $data['sh_me_next_dd'], $this->item_id]);
}
public function updateDomainFromModal()
{
$data = $this->data;
if (!isset($data['d_me_non_active'])) {
$this->updateActiveStatus(1);
} elseif ($data['d_me_non_active'] == 'on') {
$this->updateActiveStatus(0);
}
(!empty($_POST['d_me_attached_to'])) ? $attached_to = $_POST['d_me_attached_to'] : $attached_to = null;
$update = $this->dbConnect()->prepare("UPDATE `domains` SET `domain` = ?,`ns1` = ?,`ns2` = ?,`owned_since` = ?, `attached_to` = ? WHERE `id`= ? LIMIT 1;");
return $update->execute([$data['d_me_hostname'], $data['d_me_ns1'], $data['d_me_ns2'], $data['d_me_owned_since'], $attached_to, $this->item_id]);
}
public function updateDomainPricingFromModal()
{
$data = $this->data;
$as_usd = $this->convertToUSD($data['d_me_price'], $data['d_me_currency']);
$update = $this->dbConnect()->prepare("UPDATE `pricing` SET `price` = ?,`currency` = ?,`term` = ?,`as_usd` = ?,`per_month` = ?, `usd_per_month` = ?, `next_dd` = ? WHERE `server_id`= ? LIMIT 1;");
return $update->execute([$data['d_me_price'], $data['d_me_currency'], $data['d_me_term'], $as_usd, $this->costAsPerMonth($data['d_me_price'], $data['d_me_term']), $this->costAsPerMonth($as_usd, $data['d_me_term']), $data['d_me_next_dd'], $this->item_id]);
}
public function deleteObjectData()
{//Delete server data from all relevant tables
if ($this->type == 'SHARED') {
$table = 'shared_hosting';
} elseif ($this->type == 'DOMAIN') {
$table = 'domains';
} else {
$table = 'servers';
}
$item_id = $this->item_id;
$del_server = $this->dbConnect()->prepare("DELETE FROM `$table` WHERE `id` = ? LIMIT 1;");
$del_server->execute([$item_id]);
$del_pricing = $this->dbConnect()->prepare("DELETE FROM `pricing` WHERE `server_id` = ? LIMIT 1;");
$del_pricing->execute([$item_id]);
if ($this->type == 'SERVER') {
$del_disk = $this->dbConnect()->prepare("DELETE FROM `disk_speed` WHERE `server_id` = ?;");
$del_disk->execute([$item_id]);
$del_speed = $this->dbConnect()->prepare("DELETE FROM `speed_tests` WHERE `server_id` = ?;");
$del_speed->execute([$item_id]);
$this->deleteYabsForId($item_id);//Delete saved YABs
}
}
protected function updateActiveStatus(int $status)
{
if ($this->type == 'SHARED') {
$table = 'shared_hosting';
} elseif ($this->type == 'DOMAIN') {
$table = 'domains';
} else {
$table = 'servers';
}
$update = $this->dbConnect()->prepare("UPDATE `$table` SET `still_have` = ? WHERE `id` = ? LIMIT 1;");
return $update->execute([$status, $this->item_id]);
}
public function updateYabsData(bool $save_yabs = true)
{//YABS data handler
$file_name = 'yabsFromForm.txt';
$logfile = fopen($file_name, "w") or die("Unable to open file!");
fwrite($logfile, $this->data['me_yabs']);
if ($save_yabs) {
$this->saveYABS($this->data['me_yabs'], "{$this->item_id}_" . date('Y-m-d') . ".txt");
}
fclose($logfile);
$file = @fopen($file_name, 'r');
if ($file) {
$array = explode("\n", fread($file, filesize($file_name)));
}
if (strpos($array[0], '# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #') !== false || count($array) < 50) {
$io_3 = explode(' ', preg_replace('!\s+!', ' ', $array[24]));
$io_6 = explode(' ', preg_replace('!\s+!', ' ', $array[30]));
(strpos($array[12], 'Enabled') !== false) ? $aes_ni = 1 : $aes_ni = 0;
(strpos($array[13], 'Enabled') !== false) ? $vm_amd_v = 1 : $vm_amd_v = 0;
$d4k_as_mbps = $this->diskSpeedAsMbps($io_3[3], $this->floatValue($io_3[2]));
$d64k_as_mbps = $this->diskSpeedAsMbps($io_3[7], $this->floatValue($io_3[6]));
$d512k_as_mbps = $this->diskSpeedAsMbps($io_6[3], $this->floatValue($io_6[2]));
$d1m_as_mbps = $this->diskSpeedAsMbps($io_6[7], $this->floatValue($io_6[6]));
$disk_test_arr = array($this->item_id, $this->floatValue($io_3[2]), $io_3[3], $this->floatValue($io_3[6]), $io_3[7], $this->floatValue($io_6[2]), $io_6[3], $this->floatValue($io_6[6]), $io_6[7], $d4k_as_mbps, $d64k_as_mbps, $d512k_as_mbps, $d1m_as_mbps);
$insert = $this->dbConnect()->prepare("INSERT IGNORE INTO `disk_speed` (`server_id`, `4k`, `4k_type`, `64k`, `64k_type`, `512k`, `512k_type`, `1m`, `1m_type`, `4k_as_mbps`, `64k_as_mbps`, `512k_as_mbps`, `1m_as_mbps`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);");
$insert->execute([$this->item_id, $disk_test_arr[1], $disk_test_arr[2], $disk_test_arr[3], $disk_test_arr[4], $disk_test_arr[5], $disk_test_arr[6], $disk_test_arr[7], $disk_test_arr[8], $disk_test_arr[9], $disk_test_arr[10], $disk_test_arr[11], $disk_test_arr[12]]);
if ($array[45] == "Geekbench 5 Benchmark Test:\r") {
//No ipv6
//Has short ipv4 network speed testing (-r)
$start_st = 36;
$end_st = 43;
} elseif ($array[40] == "Geekbench 5 Benchmark Test:\r") {
//No ipv6
//Has full ipv4 network speed testing
$start_st = 36;
$end_st = 38;
} elseif ($array[40] == "iperf3 Network Speed Tests (IPv6):\r") {
//HAS ipv6
//Has short ipv4 & ipv6 network speed testing
$start_st = 36;
$end_st = 38;
} elseif ($array[55] == "Geekbench 5 Benchmark Test:\r") {
//HAS ipv6
//Has full ipv4 & ipv6 network speed testing
$start_st = 36;
$end_st = 43;
}
for ($i = $start_st; $i <= $end_st; $i++) {
if (strpos($array[$i], 'busy') !== false) {
//Has a "busy" result, No insert
} else {
$data = explode(' ', preg_replace('!\s+!', ' ', $array[$i]));
$send_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['send_type'], $this->yabsSpeedValues($data)['send']);
$recieve_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['receive_type'], $this->yabsSpeedValues($data)['receive']);
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `speed_tests` (`server_id`, `location`, `send`, `send_type`,`send_as_mbps`, `recieve`,`recieve_type`, `recieve_as_mbps`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
$insert->execute([$this->item_id, $this->yabsSpeedLoc($data)['location'], $this->yabsSpeedValues($data)['send'], $this->yabsSpeedValues($data)['send_type'], $send_as_mbps, $this->yabsSpeedValues($data)['receive'], $this->yabsSpeedValues($data)['receive_type'], $recieve_as_mbps]);
}
}
return true;
} else {//Not formatted right
return false;
}
}
}
class auth extends idlers
{
public string $token;
private string $user;
private string $ip_address;
public function selfDestruct()
{
$select = $this->dbConnect()->prepare("SELECT `user` FROM `auth`;");
$select->execute();
$user_count = $select->rowCount();
if ($user_count == 0) {
//Begin create user
$this->createAccountForm();
} else {
//User already exists
//Delete AUTH.php
$this->deleteAuthFile();
}
}
protected function createAccountForm()
{
if (isset($_POST['pass']) && isset($_POST['user'])) {
//Form submitted
$this->insertAccount($_POST['user'], $_POST['pass']);
} else {
$this->pageHead();
$this->rowColOpen('row text-center', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h1', '', 'Create account');
$this->HTMLphrase('p', '', 'If you are seeing this there are currently 0 accounts. Once 1 is created this file gets deleted.');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form method="post">');
$this->rowColOpen('form-row', 'col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Username');
$this->textInput('user', '', 'form-control', true, 4, 64);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Password');
$this->outputString("<input type='password' id='pass' name='pass' class='form-control' min-length='12' max-length='124' required>");
$this->tagClose('div', 3);
$this->rowColOpen('form-row text-center', 'col-12');
$this->submitInput('Create', 'submitInput', 'btn btn-main');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
$this->pageFooter();
}
}
protected function insertAccount(string $user, string $pass): bool
{
$hashed_password = password_hash($pass, PASSWORD_DEFAULT);//Hash the submitted password
$insert = $this->dbConnect()->prepare("INSERT INTO `auth` (`user`, `pass`) VALUES (?,?)");
return $insert->execute([$user, $hashed_password]);
}
public function sessionStartIfNone()
{
if (session_status() == PHP_SESSION_NONE) {
session_start();//No session stated... so start one
}
}
public function isLoggedIn(): bool
{
$this->sessionStartIfNone();//Start session if none already started
if (isset($_SESSION['token']) && !empty($_SESSION['token'])) {
$this->token = $_SESSION['token'];
return true;//Logged in
} else {
return false;
}
}
public function loginForm()
{
if (isset($_POST['user']) && isset($_POST['pass'])) {
$this->attemptLogin($_POST['user'], $_POST['pass']);
} else {
$this->pageHead();
$this->rowColOpen('row text-center', 'col-12');
$this->tagOpen('div', 'card');
$this->tagOpen('div', 'card-header');
$this->HTMLphrase('h3', '', 'My idlers login');
$this->tagClose('div');
$this->tagOpen('div', 'card-body');
$this->outputString('<form method="post">');
$this->rowColOpen('form-row', 'col-12 col-md-3');
$this->tagClose('div', 1);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Username');
$this->textInput('user', '', 'form-control', true, 4, 64);
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-3');
$this->tagClose('div', 2);
$this->rowColOpen('form-row', 'col-12 col-md-3');
$this->tagClose('div', 1);
$this->colOpen('col-12 col-md-6 mm-col');
$this->tagOpen('div', 'input-group');
$this->inputPrepend('Password');
$this->outputString("<input type='password' id='pass' name='pass' class='form-control' min-length='12' max-length='124' required>");
$this->tagClose('div', 2);
$this->colOpen('col-12 col-md-3');
$this->tagClose('div', 2);
$this->rowColOpen('form-row text-center', 'col-12');
$this->submitInput('Login', 'submitInput', 'btn btn-main');
$this->tagClose('div', 2);
$this->tagClose('form');
$this->tagClose('div', 4);
$this->pageFooter();
}
}
protected function usernameExists(string $username): bool
{
$select = $this->dbConnect()->prepare("SELECT `user` FROM `auth` WHERE `user` = ? LIMIT 1;");
$select->execute([$username]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {//Row found
$this->user = $row['user'];
return true;
} else {//NO row found
return false;
}
}
protected function checkPasswordCorrect(string $password): bool
{
$select = $this->dbConnect()->prepare("SELECT `pass` FROM `auth` WHERE `user` = ? LIMIT 1;");
$select->execute([$this->user]);
$row = $select->fetch(PDO::FETCH_ASSOC);
if (password_verify($password, $row['pass'])) {
return true;//Password is correct
} else {
return false;//Bad password
}
}
protected function doLoginWasSuccess(): bool
{
$update = $this->dbConnect()->prepare("UPDATE `auth` SET `login_count` = (login_count + 1), `last_login` = NOW() WHERE `user` = ? LIMIT 1;");
return $update->execute([$this->user]);
}
protected function addLoginFailCount(): bool
{
$update = $this->dbConnect()->prepare("UPDATE `auth` SET login_fails = (login_fails + 1), `last_fail` = NOW() WHERE `user` = ? LIMIT 1;");
return $update->execute([$this->user]);
}
protected function addLoginFailAttempt(): bool
{
$insert = $this->dbConnect()->prepare('INSERT IGNORE INTO `login_attempts` (`user`, `ip`) VALUES (?, ?)');
return $insert->execute([$this->user, $this->ip_address]);
}
protected function setToken(int $length = 32)
{
$this->sessionStartIfNone();
$_SESSION['token'] = $this->genID($length);//Set session as token
$this->token = $_SESSION['token'];
$update_token = $this->dbConnect()->prepare("UPDATE `auth` SET `token` = ? WHERE `user` = ? LIMIT 1;");
$update_token->execute([$_SESSION['token'], $this->user]);
}
protected function indexRedirect()
{
header("Location: index.php");
exit;
}
protected function getRecentFailCount(): int
{
$select = $this->dbConnect()->prepare("SELECT COUNT(*) as the_count FROM `login_attempts` WHERE `ip` = ? AND `datetime` > (NOW() - INTERVAL 10 MINUTE);");
$select->execute([$this->ip_address]);
return $select->fetch()['the_count'];//login fails for IP in last 10 minutes
}
protected function hasLockTimePassed(): bool
{
$select = $this->dbConnect()->prepare("SELECT `datetime` FROM `login_attempts` WHERE `ip` = ? ORDER BY `datetime` DESC LIMIT 1;");
$select->execute([$this->ip_address]);
$locked_until = $select->fetch(PDO::FETCH_ASSOC);
$time = new DateTime($locked_until['datetime']);
$time->add(new DateInterval("PT" . self::IP_LOCK_MINUTES . "M"));
$locked_until_formatted = $time->format('Y-m-d H:i:s');
$now = date('Y-m-d H:i:s');
if ($now > $locked_until_formatted) {//Time has passed
return true;
} else {
return false;
}
}
public function attemptLogin(string $username, string $password)
{
$this->ip_address = $_SERVER['REMOTE_ADDR'];
if ($this->getRecentFailCount() >= self::FAIL_ATTEMPTS_ALLOWED) {
if (!$this->hasLockTimePassed()) {//IP is currently not allowed to attempt login
$this->indexRedirect();//Redirect to index and show login form
} else {//IP has passed lock time
if ($this->usernameExists($username)) {//Username found
if ($this->checkPasswordCorrect($password)) {//Password is correct
$this->doLoginWasSuccess();//Add login counter and last login datetime
$this->setToken();//Set session token
$this->indexRedirect();//Redirect to index and show servers
} else {//Password is wrong
$this->addLoginFailCount();
$this->addLoginFailAttempt();
$this->indexRedirect();//Redirect to index and login form
}
} else {//Username not found in DB
$this->indexRedirect();//Redirect to index and show login form
}
}
} else {//A clean attempt
echo $this->getRecentFailCount();
if ($this->usernameExists($username)) {//Username found
if ($this->checkPasswordCorrect($password)) {//Password is correct
$this->doLoginWasSuccess();//Add login counter and last login datetime
$this->setToken();//Set session token
$this->indexRedirect();//Redirect to index and show servers
} else {//Password is wrong
$this->addLoginFailCount();//Add 1 onto login fail count
$this->addLoginFailAttempt();//ip and datetime into login attempt fail logs
$this->indexRedirect();//Redirect to index and show login form
}
} else {//Username not found in DB
$this->indexRedirect();//Redirect to index and show login form
}
}
}
protected function deleteAuthFile()
{
unlink('AUTH.php');
}
}