PHP Classes

File: inc_functions.php

Recommend this page to a friend!
  Classes of Axel Hahn  >  Pimped Apache Status  >  inc_functions.php  >  Download  
File: inc_functions.php
Role: Auxiliary script
Content type: text/plain
Description: Sample output
Class: Pimped Apache Status
Display the requests handled by an Apache server
Author: By
Last change: 2018-04-14: v2.00.22
- optimize user interaction in upgrade process 1.x -> 2.x
- fix highlight admin menu item
- config-items: use arrays instead of comma seperated lists
2018-04-14: v2.00.22
- optimize user interaction in upgrade process 1.x -> 2.x
2018-03-17: v2.00.20
- initial setup offers to disable user auth
2018-02-08 - v2.00.17
* added updater class using ahwebinstall
* activated updater for beta releases
* removed unused old template dirs, js files and others
* fix missing lang entries
* block initial setup on second request
Date: 2 years ago
Size: 10,299 bytes
 

 

Contents

Class file image Download
<?php

/*
 * PIMPED APACHE-STATUS
 * FUNCTIONS (included by ./inc_config.php)
 * 
 */

// ----------------------------------------------------------------------
// FUNKTIONEN
// ----------------------------------------------------------------------

/**
 * get new querystring - create the new querystring by existing query string
 * of current request and given new parameters
 * @param array $aQueryParams
 * @return string
 */
function getNewQs($aQueryParams = array()) {
    $s = false;
    $aDelParams = array("doinstall");

    if ($_GET) {
        $aDefaults = $_GET;
        foreach ($aDelParams as $sParam) {
            if (array_key_exists($sParam, $aDefaults)) {
                unset($aDefaults[$sParam]);
            }
        }
        $aQueryParams = array_merge($aDefaults, $aQueryParams);
    }

    foreach ($aQueryParams as $var => $value) {
        if ($value)
            $s .= "&amp;" . $var . "=" . urlencode($value);
    }
    $s = "?" . $s;
    return $s;
}

/**
 * follow a given url by checking http header data and follow locations
 * @param string   $url          url to follow
 * @return string
 */
function httpFollowUrl($sUrl) {
    $sReturn = $sUrl;
    $sData = httpGet($sUrl, 1);
    preg_match('/Location:\ (.*)/', $sData, $aTmp);
    if (count($aTmp)) {
        $sNextUrl = trim($aTmp[1]);
        if ($sNextUrl && $sNextUrl !== $sUrl) {
            $sReturn = httpFollowUrl($sNextUrl);
        }
    }
    return $sReturn;
}

/**
 * make an http get request and return the response body
 * @param string   $url          url to fetch
 * @param boolean  $bHeaderOnly  send header only
 * @return string
 */
function httpGet($url, $bHeaderOnly = false) {
    global $oLog;
    $ch = curl_init($url);
    $oLog->add(__FUNCTION__ . "($url, $bHeaderOnly) - START");
    if ($bHeaderOnly) {
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_NOBODY, 1);
    } else {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, 'pimped apache status');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    $res = curl_exec($ch);
    curl_close($ch);
    $oLog->add(__FUNCTION__ . "($url, $bHeaderOnly) - done.");
    return ($res);
}

/**
 * check authentication if a user and password were configured
 * @global array  $aCfg  config from ./config/config_user.json
 * @return boolean
 */
function checkAuth() {
    global $aCfg;
    global $aLangTxt;
    // echo '<pre>'.print_r($aCfg, 1).'</pre>'; die();
    if (
            !$aCfg['auth'] || !array_key_exists('user', $aCfg['auth']) || !array_key_exists('password', $aCfg['auth']) 
            || ($aCfg['auth']['user'] == 'admin' && !$aCfg['auth']['password'] )
    ) {
        return true;
    }

    if (
            array_key_exists('PHP_AUTH_USER', $_SERVER) && array_key_exists('PHP_AUTH_PW', $_SERVER) && $aCfg['auth']['user'] == $_SERVER['PHP_AUTH_USER'] && $aCfg['auth']['password'] == md5($_SERVER['PHP_AUTH_PW'])
    ) {
        return true;
    }

    header('WWW-Authenticate: Basic realm="Pimped Apache Status"');
    header('HTTP/1.0 401 Unauthorized');
    die($aLangTxt["authAccessDenied"]);
}

/**
 * search temp directory using tmpdir in config. if false then use system
 * temp dir
 * @param bool  $bForce  force check and ignore ttl
 * @return type
 */
function getTempdir(){
    global $aCfg;
    global $oLog;
    $oLog->add(__FUNCTION__ . '() start');
    $sTmpDir=(isset($aCfg['tmpdir']) && $aCfg['tmpdir']) ? $aCfg['tmpdir'] : sys_get_temp_dir();

    if($sTmpDir && !($sTmpDir[0]==='/' || $sTmpDir[1]===':')){
        $sTmpDir=__DIR__ . '/' . $sTmpDir;
    }
    if(!is_writable($sTmpDir)){
        echo 'WARNING: directory is not writable: '.$sTmpDir.' - check write access or set a new value for "tmpdir"<br>';
        $oLog->add(__FUNCTION__ . '() - directory is not writable: '.$sTmpDir.' - check write access or set a new value for tmpdir', 'error');
    }
    $oLog->add(__FUNCTION__ . '() - set temp dir '.$sTmpDir);
    return $sTmpDir;
}
/**
 * check for an update of the product
 * @param bool  $bForce  force check and ignore ttl
 * @return type
 */
function checkUpdate($bForce = false) {
    global $aLangTxt;
    global $aEnv;
    global $aCfg;
    global $oLog;
    $iTtl = (int) $aCfg["checkupdate"];

    // if the user does not want an update check then respect it
    if (!$iTtl && !$bForce) {
        $oLog->add(__FUNCTION__ . ": is disabled");

        return '<a href="' . $aEnv['links']['update']['updater']['url'] . '"'
                . ' target="./admin/' . $aEnv['links']['update']['updater']['target'] . '&skin=' . $aEnv['active']['skin'] . '&lang=' . $aEnv['active']['lang'] . '"'
                . ' class="button"'
                . '>' . $aLangTxt['versionManualCheck'] . '</a>';
        // return false;
    }
    
    $sUrlCheck = str_replace(" ", "%20", $aEnv['links']['update']['check']['url']);
    $sTarget = getTempdir() . '/checkupdate_' . md5($sUrlCheck) . '.tmp';
    $bExec = true;
    if (file_exists($sTarget)) {
        $bExec = false;
        $aStat = stat($sTarget);
        $iAge = time() - $aStat[9];
        if ($iAge > $iTtl) {
            $bExec = true;
        }
        $oLog->add(__FUNCTION__ . " last exec: " . $iAge . " s ago - timer is $iTtl");
    } else {
        $oLog->add(__FUNCTION__ . " last exec: never (touchfile was not found)");
    }
    if ($bForce) {
        $bExec = true;
        $oLog->add(__FUNCTION__ . " last exec: override: force parameter was found");
    }

    if ($bExec) {
        $oLog->add(__FUNCTION__ . " fetching $sUrlCheck ...");
        $sResult = httpGet($sUrlCheck);
        if (!$sResult) {
            $sResult = ' <span class="version-updateerror">' . $aLangTxt['versionError'] . '</span>';
            $oLog->add(__FUNCTION__ . " unable to check version.");
        } else {
            $oLog->add(__FUNCTION__ . " <pre>$sResult</pre>");
            
            if (!file_put_contents($sTarget, $sResult)){
                $oLog->add(__FUNCTION__ . " unable to write file [$sTarget]", "error");
            }
        }
    } else {
        $oLog->add(__FUNCTION__ . " reading cache $sTarget ...");
        $sResult = file_get_contents($sTarget);
    }

    $sVersion = str_replace("UPDATE: v", "", str_replace(" is available", "", $sResult));
    if (strpos($sResult, "UPDATE") === 0) {
        $sUrl = getNewQs()
                . '&lang=' . $aEnv['active']['lang']
                . '&skin=' . $aEnv['active']['skin']
                . '&action=update'
        ;
        $sResult = ' <span class="version-updateavailable" title="' . $sResult . '">'
                    . '<a href="' . $sUrl . '">'
                    . sprintf($aLangTxt['versionUpdateAvailable'], $sVersion)
                    . '</a>'
                . '</span>';
    } else if (strpos($sResult, "OK") === 0) {
        $sResult = ' <span class="version-uptodate" title="' . $sResult . '">'
                . $aLangTxt['versionUptodate']
                . '</span>';
    }

    return '<div id="checkversion">' . $sResult . '</div>';
}

/**
 * return a bool only: does exist a newer version or not?
 * (used in views/update.php)
 * @param string  
 * @return bool
 */
function hasNewVersion($sUpdateOut = '') {
    $sResult = $sUpdateOut ? $sUpdateOut : checkUpdate(true);
    // echo htmlentities($sResult);
    return (strpos($sResult, "UPDATE") > 0 ? true : false);
}

function getHtmlHead($aLangTxt) {
    global $aEnv;
    
    require_once(__DIR__ . '/classes/cdnorlocal.class.php');
    
    $sVendorUrl=(strpos($_SERVER['REQUEST_URI'], '/admin/') ? '.' : '') . './vendor/';
    $oCdn = new axelhahn\cdnorlocal(array(
        'vendordir'=>__DIR__ . '/vendor', 
        'vendorurl'=>$sVendorUrl, 
        'debug'=>0
    ));
    $aLangJs = array();
    
    foreach ($aLangTxt as $sKey => $sVal) {
        if (strpos($sKey, 'js::') === 0) {
            $aLangJs[str_replace('js::', '', $sKey)] = $sVal;
        }
    }
    $oCdn->setLibs($aEnv['vendor']);
    /*
    echo '<!-- ';
    print_r($oCdn->getLibs());
    // echo $oCdn->getLibVersion('jquery');
    echo $oCdn->getLibRelpath('jquery');
    echo '--> ';
     */
    
    $sHeader = '<script>var aLang=' . json_encode($aLangJs) . ';</script>' . "\n"

            // jQuery
            . '<script src="' . $oCdn->getFullUrl($oCdn->getLibRelpath('jquery')."/jquery.min.js") . '"></script>' . "\n"

            // datatbles
            . '<script src="' . $oCdn->getFullUrl($oCdn->getLibRelpath('datatables')."/js/jquery.dataTables.min.js") . '"></script>' . "\n"
            . '<link rel="stylesheet" href="' . $oCdn->getFullUrl($oCdn->getLibRelpath('datatables')."/css/jquery.dataTables.min.css") . '">' . "\n"

            // Admin LTE
            . '<script src="' . $oCdn->getFullUrl($oCdn->getLibRelpath('admin-lte')."/js/adminlte.min.js") . '" type="text/javascript"></script>' . "\n"
            . '<link rel="stylesheet" href="' . $oCdn->getFullUrl($oCdn->getLibRelpath('admin-lte')."/css/AdminLTE.min.css") . '">' . "\n"
            . '<link rel="stylesheet" href="' . $oCdn->getFullUrl($oCdn->getLibRelpath('admin-lte')."/css/skins/_all-skins.min.css") . '">' . "\n"

            // Bootstrap    
            . '<link href="' . $oCdn->getFullUrl($oCdn->getLibRelpath('twitter-bootstrap').'/css/bootstrap.min.css') . '" rel="stylesheet">'
            . '<link href="' . $oCdn->getFullUrl($oCdn->getLibRelpath('twitter-bootstrap').'/css/bootstrap-theme.min.css') . '" rel="stylesheet">'
            . '<script src="' . $oCdn->getFullUrl($oCdn->getLibRelpath('twitter-bootstrap').'/js/bootstrap.min.js') . '" type="text/javascript"></script>'

            // Font awesome
            . '<link href="' . $oCdn->getFullUrl('font-awesome/4.7.0/css/font-awesome.min.css') . '" rel="stylesheet">'

            // Morris
            . '<script src="' . $oCdn->getFullUrl("raphael/2.2.7/raphael.min.js") . '"></script>' . "\n"
            . '<script src="' . $oCdn->getFullUrl("morris.js/0.5.1/morris.min.js") . '"></script>' . "\n"

            // Knob
            . '<script src="' . $oCdn->getFullUrl("jQuery-Knob/1.2.13/jquery.knob.min.js") . '"></script>' . "\n"

    ;
    return $sHeader;
}

For more information send a message to info at phpclasses dot org.