<?php
|
|
// Project: Web Reference Database (refbase) <http://www.refbase.net>
|
|
// Copyright: Matthias Steffens <mailto:refbase@extracts.de> 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 <mailto:karnesky@gmail.com> and
|
|
// Matthias Steffens <mailto:refbase@extracts.de>
|
|
//
|
|
// 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 <http://php.net/function.exec>).
|
|
|
|
// 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 <http://www.php.net/manual/en/ref.filesystem.php#ini.auto-detect-line-endings>)
|
|
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);
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
?>
|