2017-08-02 16:06:56 -04:00
< ? php
require_once ( '../config.inc.php' );
require_once ( HTML2PS_DIR . 'stubs.common.inc.php' );
require_once ( HTML2PS_DIR . 'error.php' );
require_once ( HTML2PS_DIR . 'config.parse.php' );
parse_config_file ( '../html2ps.config' );
define ( 'CHECK_STATUS_FAILED' , 0 );
define ( 'CHECK_STATUS_WARNING' , 1 );
define ( 'CHECK_STATUS_SUCCESS' , 2 );
error_reporting ( E_ALL );
ini_set ( " display_errors " , " 1 " );
$__g_registered_checks = array ();
function out_header () {
readfile ( 'systemcheck.header.tpl' );
}
function out_footer () {
readfile ( 'systemcheck.footer.tpl' );
}
function status2class ( $status ) {
$mapping = array ( CHECK_STATUS_FAILED => " failed " ,
CHECK_STATUS_WARNING => " warning " ,
CHECK_STATUS_SUCCESS => " success " );
if ( isset ( $mapping [ $status ])) {
return $mapping [ $status ];
};
error_log ( sprintf ( " Unknown status code passed to 'status2class': %s " , $status ));
return " unknown " ;
}
function out_check_list () {
$checks = ManagerChecks :: getChecks ();
foreach ( $checks as $check ) {
$title = htmlspecialchars ( $check -> title ());
$message = nl2br ( $check -> getMessage ());
$status_class = status2class ( $check -> getStatus ());
print <<< EOF
< div class = " check " >
< div class = " title ${ status_class}">${title } </div>
< div class = " message " > $ { message } </ div >
</ div >
EOF ;
};
}
class ManagerChecks {
function register ( $check ) {
global $__g_registered_checks ;
$__g_registered_checks [] = $check ;
}
function run () {
global $__g_registered_checks ;
$size = count ( $__g_registered_checks );
for ( $i = 0 ; $i < $size ; $i ++ ) {
$__g_registered_checks [ $i ] -> run ();
};
}
function getChecks () {
global $__g_registered_checks ;
return $__g_registered_checks ;
}
}
class CheckSimple {
var $_message ;
/**
* Invariants
*/
function title () {
error_no_method ( 'title' , get_class ( $this ));
}
function description () {
error_no_method ( 'description' , get_class ( $this ));
}
/**
* Start checking
*/
function run () {
error_no_method ( 'run' , get_class ( $this ));
}
/**
* Get check status code ; status code should be one of the following
* predefined constants :
* CHECK_STATUS_FAILED - check failed , script will not work unless this issue is fixed
* CHECK_STATUS_WARNING - check succeeded , script may encounter minor issues
* CHECK_STATUS_SUCCESS - check succeeded without any problems
*
* @ return Integer Status code
*/
function getStatus () {
error_no_method ( 'status' , get_class ( $this ));
}
/**
* Returns a short human - readable message describing results of the
* check run . By default , this message is generated in 'run' method
* ( overridden in CheckSimple children ) and stored via 'setMessage'
*
* @ return String description of the test results
*/
function getMessage () {
return $this -> _message ;
}
function setMessage ( $message ) {
$this -> _message = $message ;
}
}
/**
*/
class CheckBinary extends CheckSimple {
var $_success ;
function setSuccess ( $success ) {
$this -> _success = $success ;
}
function getSuccess () {
return $this -> _success ;
}
}
/**
*/
class CheckBinaryRequired extends CheckBinary {
function getStatus () {
if ( $this -> getSuccess ()) {
return CHECK_STATUS_SUCCESS ;
} else {
return CHECK_STATUS_FAILED ;
};
}
}
/**
*/
class CheckBinaryRecommended extends CheckBinary {
function getStatus () {
if ( $this -> getSuccess ()) {
return CHECK_STATUS_SUCCESS ;
} else {
return CHECK_STATUS_WARNING ;
};
}
}
/**
*/
class CheckTriState extends CheckSimple {
var $_status ;
function getStatus () {
return $this -> _status ;
}
function setStatus ( $status ) {
$this -> _status = $status ;
}
}
/**
* Actual checks
*/
/**
* PHP version
*/
class CheckPHPVersion extends CheckTriState {
function title () {
return " PHP Version " ;
}
function description () {
return " " ;
}
function run () {
// > "4.3.0";
}
}
// ManagerChecks::register(new CheckPHPVersion());
/**
* Required / recommended extensions
*/
/**
* Presense of DOM / XML extensions
*/
class CheckDOM extends CheckTriState {
function title () {
return " XML DOM extension " ;
}
function description () {
return " HTML files are parsed using XML DOM extensions " ;
}
function run () {
if ( function_exists ( 'domxml_open_mem' ) ||
class_exists ( 'DOMDocument' )) {
$this -> setStatus ( CHECK_STATUS_SUCCESS );
$this -> setMessage ( 'Native XML DOM extension found' );
return ;
};
if ( file_exists ( HTML2PS_DIR . 'classes/include.php' )) {
$this -> setStatus ( CHECK_STATUS_WARNING );
$this -> setMessage ( 'No native XML DOM extension found, falling back to Active-State DOM XML. Note that it is <b>highly recommended to use native PHP XML DOM extension</b>.' );
return ;
};
$this -> setStatus ( CHECK_STATUS_FAILED );
$this -> setMessage ( 'No XML DOM extension found' );
}
}
/**
* Presense of PDFLIB extension
*/
class CheckPDFLIB extends CheckBinaryRecommended {
}
/**
* Presense of Curl extension
*/
class CheckCurl extends CheckBinaryRecommended {
function title () {
return " Curl PHP Extension " ;
}
function description () {
return " Curl PHP extension is recommended for fetching files via HTTP protocol " ;
}
function run () {
$this -> setSuccess ( false );
if ( ! extension_loaded ( 'curl' )) {
$this -> setMessage ( 'Missing Curl extension. Script will use pure-PHP fallback (allow_url_fopen=On is required!). <b>Proxy support is not available</b>' );
return ;
};
$version = curl_version ();
// PHP 5.0.1 and greater return array instead of string
if ( is_array ( $version )) {
$version = $version [ 'version' ];
};
$this -> setMessage ( sprintf ( 'Found Curl extension version %s.' , $version [ 'version' ]));
$this -> setSuccess ( true );
}
}
/**
* Presense of GD extension
*/
class CheckGD extends CheckBinaryRequired {
function title () {
return " GD PHP Extension " ;
}
function description () {
return " GD PHP extension is required for graphic file processing " ;
}
function run () {
$this -> setSuccess ( false );
if ( ! extension_loaded ( 'gd' )) {
$this -> setMessage ( 'Missing GD extension. Please refer to <a href="http://php.net/gd">PHP.net instructions</a> on installing/enabling this extension.' );
return ;
};
$gd_info = gd_info ();
$gd_version_string = $gd_info [ 'GD Version' ];
/**
* Extract version number if it is a bundled version ; otherwise we assume that
* version string should contain verions number only
*/
if ( preg_match ( " /bundled \ (([ \ d \ .]+) compatible \ )/ " , $gd_version_string , $matches )) {
$gd_version = $matches [ 1 ];
} else {
$gd_version = $gd_version_string ;
};
if ( $gd_version < " 2.0.1 " ) {
$this -> setMessage ( " GD version 2.0.1+ required for 'imagecreatetruecolor' function to work " );
return ;
};
$this -> setMessage ( " Found GD version $gd_version . " );
$this -> setSuccess ( true );
}
}
/**
* Presense of ZLIB extension ( compressed files )
*/
class CheckZLIB extends CheckBinaryRecommended {
}
/**
* System limits & settings
*/
/**
* Execution time limit
*/
class CheckMaxExecutionTime extends CheckTriState {
}
/**
* Memory limit
*/
class CheckMemoryLimit extends CheckTriState {
}
/**
* Allow_url_fopen setting
*/
class CheckAllowURLFopen extends CheckBinaryRecommended {
function title () {
return " allow_url_fopen ini setting " ;
}
function description () {
return " allow_url_fopen should be enabled when CURL extension is not available " ;
}
function run () {
$this -> setSuccess ( false );
$setting = ini_get ( 'allow_url_fopen' );
if ( ! $setting ) {
$this -> setMessage ( '<a href="http://php.net/filesystem">allow_url_fopen</a> is disabled. You will not be able to fetch files via HTTP without CURL extension.' );
return ;
}
$this -> setMessage ( 'allow_url_fopen is enabled' );
$this -> setSuccess ( true );
}
}
/**
* Access / permissions
*/
/**
* permissions on cache directory
*/
class CheckPermissionsCache extends CheckBinaryRequired {
}
/**
* Permissions on 'out' directory
*/
class CheckPermissionsOut extends CheckBinaryRecommended {
}
/**
* Permissions on 'temp' directory ( system - dependent )
*/
class CheckPermissionsTemp extends CheckBinaryRequired {
function title () {
return " Permissions on 'temp' subdirectory " ;
}
function description () {
return " Script should have full access to 'temp' subdirectory to keep temporary files there " ;
}
function run () {
if ( ! file_exists ( HTML2PS_DIR . '/temp/' )) {
$this -> setMessage ( " 'temp' subdirectory is missing " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_readable ( HTML2PS_DIR . '/temp/' )) {
$this -> setMessage ( " 'temp' subdirectory is not readable " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_writable ( HTML2PS_DIR . '/temp/' )) {
$this -> setMessage ( " 'temp' subdirectory is not writable " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_executable ( HTML2PS_DIR . '/temp/' ) && PHP_OS != " WINNT " ) {
$this -> setMessage ( " 'temp' subdirectory is not executable " );
$this -> setSuccess ( false );
return ;
};
$this -> setMessage ( " 'temp' subdirectory is fully accessible to the script " );
$this -> setSuccess ( true );
}
}
/**
* Permissions / availability of GS executable
*/
/**
* Permissions of fonts directory
*/
class CheckPermissionsFonts extends CheckBinaryRequired {
function title () {
return " Permissions on 'fonts' subdirectory " ;
}
function description () {
return " Script should be able to read 'fonts' subdirectory to access installed fonts " ;
}
function run () {
if ( ! file_exists ( HTML2PS_DIR . '/fonts/' )) {
$this -> setMessage ( " 'fonts' subdirectory is missing " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_readable ( HTML2PS_DIR . '/fonts/' )) {
$this -> setMessage ( " 'fonts' subdirectory is not readable " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_executable ( HTML2PS_DIR . '/fonts/' ) && PHP_OS != " WINNT " ) {
$this -> setMessage ( " 'fonts' subdirectory is not executable " );
$this -> setSuccess ( false );
return ;
};
$this -> setMessage ( " 'fonts' subdirectory is readable and executable by the script " );
$this -> setSuccess ( true );
}
}
/**
* Permissions / presence of Type1 fonts repository
*/
class CheckPermissionsType1 extends CheckBinaryRecommended {
function title () {
return " Permissions on Type1 fonts directory " ;
}
function description () {
return " Script should be able to access Type1 fonts directory containing font metrics in order to generate Postscript files " ;
}
function run () {
if ( ! file_exists ( TYPE1_FONTS_REPOSITORY )) {
$this -> setMessage ( " Type1 fonts directory ( " . TYPE1_FONTS_REPOSITORY . " ) is missing. You will not be able to generate postscript files. " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_readable ( TYPE1_FONTS_REPOSITORY )) {
$this -> setMessage ( " Type1 fonts directory ( " . TYPE1_FONTS_REPOSITORY . " ) is not readable. You will not be able to generate postscript files. " );
$this -> setSuccess ( false );
return ;
};
if ( ! is_executable ( HTML2PS_DIR . '/fonts/' ) && PHP_OS != " WINNT " ) {
$this -> setMessage ( " Type1 fonts directory ( " . TYPE1_FONTS_REPOSITORY . " ) is not executable. You will not be able to generate postscript files. " );
$this -> setSuccess ( false );
return ;
};
$this -> setMessage ( " Type1 fonts directory is readable and executable by the script " );
$this -> setSuccess ( true );
}
}
/**
* Fonts
*/
/**
* Permissions / presense of TTF files
*/
class CheckPresenceTTF extends CheckBinaryRecommended {
function title () {
return " Presense of registered TTF files " ;
}
function description () {
return " TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts. " ;
}
function run () {
$message = " " ;
$this -> setSuccess ( true );
global $g_font_resolver_pdf ;
foreach ( $g_font_resolver_pdf -> ttf_mappings as $file ) {
$fullname = HTML2PS_DIR . '/fonts/' . $file ;
if ( ! file_exists ( $fullname )) {
$message .= " Font " . $fullname . " is missing. You will not be able to generate PDF files with this font. \n " ;
$this -> setSuccess ( false );
} elseif ( ! file_exists ( $fullname )) {
$message .= " Font " . $fullname . " is not readable. You will not be able to generate PDF files with this font. \n " ;
$this -> setSuccess ( false );
} else {
$message .= " Font " . $fullname . " is present and readable. \n " ;
};
};
$this -> setMessage ( $message );
}
}
/**
* Permissions / presense of Type1 fonts
*/
/**
* Permissions / presense of AFM files for Type1 fonts
*/
class CheckPresenceType1AFM extends CheckBinaryRecommended {
function title () {
return " Presense of registered TTF files " ;
}
function description () {
return " TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts. " ;
}
function run () {
$message = " " ;
$this -> setSuccess ( true );
global $g_font_resolver ;
foreach ( $g_font_resolver -> afm_mappings as $file ) {
$fullname = TYPE1_FONTS_REPOSITORY . $file . '.afm' ;
if ( ! file_exists ( $fullname )) {
$message .= " Font " . $fullname . " is missing. You will not be able to generate PDF files with this font. \n " ;
$this -> setSuccess ( false );
} elseif ( ! file_exists ( $fullname )) {
$message .= " Font " . $fullname . " is not readable. You will not be able to generate PDF files with this font. \n " ;
$this -> setSuccess ( false );
} else {
$message .= " Font " . $fullname . " is present and readable. \n " ;
};
};
$this -> setMessage ( $message );
}
}
/**
* Graphics
*/
/**
* Generic
*/
class CheckGDFormat extends CheckBinaryRequired {
function title () {
return " GD " . $this -> _getFormatName () . " Support " ;
}
function description () {
return " GD " . $this -> _getFormatName () . " Support is required for reading images in " . $this -> _getFormatName () . " format " ;
}
function run () {
$this -> setSuccess ( false );
if ( ! extension_loaded ( 'gd' )) {
$this -> setMessage ( 'Missing GD extension. Please refer to <a href="http://php.net/gd">PHP.net instructions</a> on installing/enabling this extension.' );
return ;
};
$gd_info = gd_info ();
if ( ! $gd_info [ $this -> _getInfoKey ()]) {
$this -> setMessage ( " No " . $this -> _getFormatName () . " support, some images will not be displayed " );
return ;
};
$this -> setMessage ( $this -> _getFormatName () . " support enabled " );
$this -> setSuccess ( true );
}
}
/**
* JPEG support
*/
class CheckGDJPEG extends CheckGDFormat {
function _getFormatName () {
return " JPEG " ;
}
function _getInfoKey () {
return " JPG Support " ;
}
}
/**
* GIF support
*/
class CheckGDGIF extends CheckGDFormat {
function _getFormatName () {
return " GIF " ;
}
function _getInfoKey () {
return " GIF Read Support " ;
}
}
/**
* PNG support
*/
class CheckGDPNG extends CheckGDFormat {
function _getFormatName () {
return " PNG " ;
}
function _getInfoKey () {
return " PNG Support " ;
}
}
/**
* Freetype support
*/
/**
* Miscellanous
*/
/**
* Check if outgoing connections are allowed
*/
class CheckOutgoingConnections extends CheckBinary {
}
ManagerChecks :: register ( new CheckDOM ());
ManagerChecks :: register ( new CheckCurl ());
ManagerChecks :: register ( new CheckAllowURLFopen ());
ManagerChecks :: register ( new CheckGD ());
ManagerChecks :: register ( new CheckGDJPEG ());
ManagerChecks :: register ( new CheckGDGIF ());
ManagerChecks :: register ( new CheckGDPNG ());
ManagerChecks :: register ( new CheckPermissionsTemp ());
ManagerChecks :: register ( new CheckPermissionsFonts ());
ManagerChecks :: register ( new CheckPermissionsType1 ());
ManagerChecks :: register ( new CheckPresenceTTF ());
ManagerChecks :: register ( new CheckPresenceType1AFM ());
ManagerChecks :: run ();
out_header ();
out_check_list ();
out_footer ();
2010-12-02 23:34:41 +00:00
?>