From 49a1b33df4074b6be58d2e23759801f2eaefbd16 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 16 May 2022 15:54:04 +0200 Subject: [PATCH] check extension dependency on shell commands --- CHANGELOG | 1 + inc/inc.ClassExtensionMgr.php | 8 ++++++++ inc/inc.Utils.php | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 5f7f5d223..ab08c277e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ - add hook additionalDocumentContentInfo - add restapi function 'statstotal' - custom attributes of type 'date' regard the date format +- check extension dependency on shell commands -------------------------------------------------------------------------------- Changes in version 5.1.25 diff --git a/inc/inc.ClassExtensionMgr.php b/inc/inc.ClassExtensionMgr.php index b70f0fe3b..07e7d51d3 100644 --- a/inc/inc.ClassExtensionMgr.php +++ b/inc/inc.ClassExtensionMgr.php @@ -441,6 +441,14 @@ class SeedDMS_Extension_Mgr { } } break; + case 'cmd': + if(is_array($dval) && $dval) { + foreach($dval as $d) { + if(!commandExists($d)) + $this->errmsgs[] = sprintf("Missing command '%s'", $d); + } + } + break; default: $tmp = explode('-', $dval, 2); if(isset($this->extconf[$dkey]['version'])) { diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php index 3192b6fbd..6628a5df2 100644 --- a/inc/inc.Utils.php +++ b/inc/inc.Utils.php @@ -696,6 +696,37 @@ function addDirSep($str) { /* {{{ */ return trim($str); } /* }}} */ +/** + * Determines if a command exists on the current environment + * + * @param string $command The command to check + * @return bool True if the command has been found ; otherwise, false. + */ +function commandExists ($command) { + $whereIsCommand = (PHP_OS == 'WINNT') ? 'where' : 'command -v'; + + $process = proc_open( + "$whereIsCommand $command", + array( + 0 => array("pipe", "r"), //STDIN + 1 => array("pipe", "w"), //STDOUT + 2 => array("pipe", "w"), //STDERR + ), + $pipes + ); + if ($process !== false) { + $stdout = stream_get_contents($pipes[1]); + $stderr = stream_get_contents($pipes[2]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($process); + + return $stdout != ''; + } + + return false; +} + /** * Send a file from disk to the browser *