bin: copy externals outside before exec
Signed-off-by: Varun Patil <varunpatil@ucla.edu>pull/563/head
parent
117e849038
commit
98df8aa7b1
|
@ -7,6 +7,33 @@ class BinExt
|
||||||
public const EXIFTOOL_VER = '12.58';
|
public const EXIFTOOL_VER = '12.58';
|
||||||
public const GOVOD_VER = '0.1.0';
|
public const GOVOD_VER = '0.1.0';
|
||||||
|
|
||||||
|
/** Copy a binary to temp dir for execution */
|
||||||
|
public static function getTempBin(string $path, string $name, bool $copy = true): string
|
||||||
|
{
|
||||||
|
$target = sys_get_temp_dir().'/'.$name;
|
||||||
|
if (file_exists($target)) {
|
||||||
|
if (!is_writable($target)) {
|
||||||
|
throw new \Exception("{$name} temp binary path is not writable: {$target}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_executable($target) && !chmod($target, 0755)) {
|
||||||
|
throw new \Exception("failed to make {$name} temp binary executable: {$target}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $target;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($copy) {
|
||||||
|
if (!copy($path, $target)) {
|
||||||
|
throw new \Exception("failed to copy {$name} binary from {$path} to {$target}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::getTempBin($path, $name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \Exception("failed to find exiftool temp binary {$target}");
|
||||||
|
}
|
||||||
|
|
||||||
/** Test configured exiftool binary */
|
/** Test configured exiftool binary */
|
||||||
public static function testExiftool(): bool
|
public static function testExiftool(): bool
|
||||||
{
|
{
|
||||||
|
@ -25,6 +52,14 @@ class BinExt
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get path to exiftool binary */
|
||||||
|
public static function getExiftoolPBin(): string
|
||||||
|
{
|
||||||
|
$path = Util::getSystemConfig('memories.exiftool');
|
||||||
|
|
||||||
|
return self::getTempBin($path, 'exiftool-'.self::EXIFTOOL_VER);
|
||||||
|
}
|
||||||
|
|
||||||
/** Get path to exiftool binary for proc_open */
|
/** Get path to exiftool binary for proc_open */
|
||||||
public static function getExiftool(): array
|
public static function getExiftool(): array
|
||||||
{
|
{
|
||||||
|
@ -32,17 +67,13 @@ class BinExt
|
||||||
return ['perl', __DIR__.'/../exiftool-bin/exiftool/exiftool'];
|
return ['perl', __DIR__.'/../exiftool-bin/exiftool/exiftool'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [Util::getSystemConfig('memories.exiftool')];
|
return [self::getExiftoolPBin()];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Detect the exiftool binary to use */
|
/** Detect the exiftool binary to use */
|
||||||
public static function detectExiftool()
|
public static function detectExiftool()
|
||||||
{
|
{
|
||||||
if (!empty($path = Util::getSystemConfig('memories.exiftool'))) {
|
if (!empty($path = Util::getSystemConfig('memories.exiftool'))) {
|
||||||
if (file_exists($path) && !is_executable($path)) {
|
|
||||||
@chmod($path, 0755);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,12 +93,8 @@ class BinExt
|
||||||
// Set config
|
// Set config
|
||||||
Util::setSystemConfig('memories.exiftool', $path);
|
Util::setSystemConfig('memories.exiftool', $path);
|
||||||
|
|
||||||
// make sure it is executable
|
// make sure it exists
|
||||||
if (file_exists($path)) {
|
if (file_exists($path)) {
|
||||||
if (!is_executable($path)) {
|
|
||||||
@chmod($path, 0755);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +166,7 @@ class BinExt
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get transcoder path
|
// Get transcoder path
|
||||||
$transcoder = Util::getSystemConfig('memories.vod.path');
|
$transcoder = self::getTempBin(Util::getSystemConfig('memories.vod.path'), 'go-vod-'.self::GOVOD_VER);
|
||||||
if (empty($transcoder)) {
|
if (empty($transcoder)) {
|
||||||
throw new \Exception('Transcoder not configured');
|
throw new \Exception('Transcoder not configured');
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,15 +114,16 @@ class OtherController extends GenericApiController
|
||||||
$status = [];
|
$status = [];
|
||||||
|
|
||||||
// Check exiftool version
|
// Check exiftool version
|
||||||
$status['exiftool'] = $this->getExecutableStatus(Util::getSystemConfig('memories.exiftool'));
|
|
||||||
if ('ok' === $status['exiftool'] || Util::getSystemConfig('memories.exiftool_no_local')) {
|
|
||||||
try {
|
try {
|
||||||
|
$s = $this->getExecutableStatus(BinExt::getExiftoolPBin());
|
||||||
|
if ('ok' === $s || Util::getSystemConfig('memories.exiftool_no_local')) {
|
||||||
BinExt::testExiftool();
|
BinExt::testExiftool();
|
||||||
$status['exiftool'] = 'test_ok';
|
$s = 'test_ok';
|
||||||
|
}
|
||||||
|
$status['exiftool'] = $s;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$status['exiftool'] = 'test_fail:'.$e->getMessage();
|
$status['exiftool'] = 'test_fail:'.$e->getMessage();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Check for system perl
|
// Check for system perl
|
||||||
$status['perl'] = $this->getExecutableStatus(exec('which perl'));
|
$status['perl'] = $this->getExecutableStatus(exec('which perl'));
|
||||||
|
|
|
@ -24,8 +24,9 @@ class Repair implements IRepairStep
|
||||||
|
|
||||||
public function run(IOutput $output): void
|
public function run(IOutput $output): void
|
||||||
{
|
{
|
||||||
// kill any instances of go-vod
|
// kill any instances of go-vod and exiftool
|
||||||
\OCA\Memories\Util::pkill('go-vod');
|
\OCA\Memories\Util::pkill('go-vod');
|
||||||
|
\OCA\Memories\Util::pkill('exiftool');
|
||||||
|
|
||||||
// detect exiftool
|
// detect exiftool
|
||||||
if ($path = \OCA\Memories\BinExt::detectExiftool()) {
|
if ($path = \OCA\Memories\BinExt::detectExiftool()) {
|
||||||
|
|
Loading…
Reference in New Issue