// Copyright: Matthias Steffens and the file's // original author(s). // // This code is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY. Please see the GNU General Public // License for more details. // // File: ./includes/execute.inc.php // Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/includes/execute.inc.php $ // Author(s): Richard Karnesky and // Matthias Steffens // // Created: 16-Dec-05, 18:00 // Modified: $Date: 2012-11-12 22:43:32 +0000 (Mon, 12 Nov 2012) $ // $Author: karnesky $ // $Revision: 1366 $ // This file contains functions that deal with execution of shell commands and provides // fixes for 'exec()' on certain win32 systems (based on rivera at spamjoy dot unr dot edu's // 'wind_exec()' function ). // Note: Since the 'exec()' function is used, some things may not work if //'safe_mode' is set to 'On' in your 'php.ini' file. If you need or want to // keep 'safe_mode=ON' then you'll need to put the programs within the // directory that's specified in 'safe_mode_exec_dir'. // -------------------------------------------------------------------- // Import records using the bibutils program given in '$program' function importBibutils($sourceText, $program) { global $contentTypeCharset; // defined in 'ini.inc.php' // Get the absolute path for the bibutils package: // (function 'getExternalUtilityPath()' is defined in 'include.inc.php') $bibutilsPath = getExternalUtilityPath("bibutils"); // Write the source data to a temporary file: $tempFile = writeToTempFile($sourceText); // Set input and output encoding: if ($contentTypeCharset != "UTF-8") { $inputEncodingArg = " -i iso8859_1"; $outputEncodingArg = " -o iso8859_1"; } else { $inputEncodingArg = " -i utf8"; $outputEncodingArg = " -o utf8"; } // Pass this temp file to the bibutils utility for conversion: $outputFile = convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg); unlink($tempFile); // Read the resulting output file and return the converted data: $resultString = readFromFile($outputFile); unlink($outputFile); return $resultString; } // -------------------------------------------------------------------- // Export records using the bibutils program given in '$program' function exportBibutils($result, $program) { global $contentTypeCharset; // these variables are defined in 'ini.inc.php' global $convertExportDataToUTF8; // Get the absolute path for the bibutils package: // (function 'getExternalUtilityPath()' is defined in 'include.inc.php') $bibutilsPath = getExternalUtilityPath("bibutils"); // Generate and serve a MODS XML file of ALL records: // (function 'modsCollection()' is defined in 'modsxml.inc.php') $recordCollection = modsCollection($result); // Write the MODS XML data to a temporary file: $tempFile = writeToTempFile($recordCollection); // Set input and output encoding: if (($convertExportDataToUTF8 == "no") AND ($contentTypeCharset != "UTF-8")) { $inputEncodingArg = " -i iso8859_1"; $outputEncodingArg = " -o iso8859_1"; } else { $inputEncodingArg = " -i utf8"; $outputEncodingArg = " -o utf8"; } // Pass this temp file to the bibutils utility for conversion: $outputFile = convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg); unlink($tempFile); // Read the resulting output file and return the converted data: $resultString = readFromFile($outputFile); unlink($outputFile); return $resultString; } // -------------------------------------------------------------------- // Convert file contents using the bibutils program given in '$program' function convertBibutils($bibutilsPath, $tempFile, $program, $inputEncodingArg, $outputEncodingArg) { global $sessionTempDir; // defined in 'ini.inc.php' $outputFile = tempnam($sessionTempDir, "refbase-"); $cmd = $bibutilsPath . $program . $inputEncodingArg . $outputEncodingArg . " " . $tempFile; execute($cmd, $outputFile); return $outputFile; } // -------------------------------------------------------------------- // Execute shell command function execute($cmd, $outputFile) { if (getenv("OS") == "Windows_NT") executeWin32($cmd . " > " . $outputFile); else { exec($cmd, $output); arrayToFile($output, $outputFile); } } // -------------------------------------------------------------------- // Execute shell command on win32 systems function executeWin32($cmd) { $cmdline = "cmd /C ". $cmd; // Make a new instance of the COM object $WshShell = new COM("WScript.Shell"); // Make the command window but dont show it $oExec = $WshShell->Run($cmdline, 0, true); } // -------------------------------------------------------------------- // Write data to a temporary file function writeToTempFile($sourceText) { global $sessionTempDir; // defined in 'ini.inc.php' $tempFile = tempnam($sessionTempDir, "refbase-"); $tempFileHandle = fopen($tempFile, "w"); // open temp file with write permission fwrite($tempFileHandle, $sourceText); // save data to temp file fclose($tempFileHandle); // close temp file return $tempFile; } // -------------------------------------------------------------------- // Get file contents function readFromFile($file) { // Enable PHP to detect Mac (CR) EOL conventions: // (see ) ini_set('auto_detect_line_endings', true); $fileContents = file_get_contents($file); // Remove UTF-8 BOM if present $bom = "\xef\xbb\xbf"; if (0 == strncmp($fileContents, $bom, 3)) { $fileContents = substr($fileContents, 3); } return $fileContents; } // -------------------------------------------------------------------- // Write an array (as from $return argument in exec) to a file function arrayToFile($array, $outputFile) { return (stringToFile(implode("\n", $array), $outputFile)); } function stringToFile($string, $outputFile) { $rc = false; do { if (!($f = fopen($outputFile, "wa+"))) { $rc = 1; break; } if (!fwrite($f, $string)) { $rc = 2; break; } $rc = true; } while (0); if ($f) fclose($f); return ($rc); } // -------------------------------------------------------------------- ?>