mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-05 19:42:38 +02:00
Update
This commit is contained in:
parent
51cb12d2ee
commit
f38a9536da
3 changed files with 151 additions and 123 deletions
|
@ -525,6 +525,25 @@ function getFFMPEGRemoteLog($keyword)
|
|||
}
|
||||
}
|
||||
|
||||
function stopFFMPEGRemote($keyword)
|
||||
{
|
||||
$obj = AVideoPlugin::getDataObjectIfEnabled('API');
|
||||
if(!empty($obj) && !empty($obj->standAloneFFMPEG)){
|
||||
$url = "{$obj->standAloneFFMPEG}";
|
||||
|
||||
$codeToExec = array('stop'=>1, 'keyword'=>$keyword, 'time'=>time());
|
||||
|
||||
$codeToExecEncrypted = encryptString(json_encode($codeToExec));
|
||||
|
||||
$url = addQueryStringParameter($url, 'APISecret', $obj->APISecret);
|
||||
$url = addQueryStringParameter($url, 'codeToExecEncrypted', $codeToExecEncrypted);
|
||||
_error_log("execFFMPEGAsyncOrRemote: URL $url");
|
||||
return json_decode(url_get_contents($url));
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Function to find the process by keyword using the pid file
|
||||
function findProcess($keyword)
|
||||
{
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* FFMPEG Command Execution Script with API Secret Validation
|
||||
* -----------------------------------------------------------
|
||||
|
@ -87,61 +88,63 @@
|
|||
* Replace `https://yourSite.com/` with your actual website URL.
|
||||
*/
|
||||
|
||||
$global_timeLimit = 300;
|
||||
$global_timeLimit = 300;
|
||||
|
||||
ini_set("memory_limit", -1);
|
||||
ini_set('default_socket_timeout', $global_timeLimit);
|
||||
set_time_limit($global_timeLimit);
|
||||
ini_set('max_execution_time', $global_timeLimit);
|
||||
ini_set("memory_limit", "-1");
|
||||
ini_set("memory_limit", -1);
|
||||
ini_set('default_socket_timeout', $global_timeLimit);
|
||||
set_time_limit($global_timeLimit);
|
||||
ini_set('max_execution_time', $global_timeLimit);
|
||||
ini_set("memory_limit", "-1");
|
||||
|
||||
header('Content-Type: application/json');
|
||||
header('Content-Type: application/json');
|
||||
|
||||
require_once __DIR__ . "/../../../objects/functionsStandAlone.php";
|
||||
require_once __DIR__ . "/../../../objects/functionsStandAlone.php";
|
||||
|
||||
if (empty($streamerURL)) {
|
||||
echo json_encode(['error' => true, 'message' => 'streamerURL not defined']);
|
||||
exit;
|
||||
}
|
||||
if (empty($streamerURL)) {
|
||||
echo json_encode(['error' => true, 'message' => 'streamerURL not defined']);
|
||||
exit;
|
||||
}
|
||||
|
||||
function _decryptString($string)
|
||||
{
|
||||
global $global;
|
||||
$url = "{$global['webSiteRootURL']}plugin/API/get.json.php?APIName=decryptString&string={$string}";
|
||||
function _decryptString($string)
|
||||
{
|
||||
global $global;
|
||||
$url = "{$global['webSiteRootURL']}plugin/API/get.json.php?APIName=decryptString&string={$string}";
|
||||
|
||||
$content = file_get_contents($url);
|
||||
$json = json_decode($content);
|
||||
$content = file_get_contents($url);
|
||||
$json = json_decode($content);
|
||||
|
||||
if (!empty($json) && empty($json->error)) {
|
||||
$json2 = json_decode($json->message);
|
||||
if ($json2->time > strtotime('30 seconds ago')) {
|
||||
return $json2;
|
||||
}
|
||||
}
|
||||
return $json2;
|
||||
return false;
|
||||
}
|
||||
if (!empty($json) && empty($json->error)) {
|
||||
$json2 = json_decode($json->message);
|
||||
if ($json2->time > strtotime('30 seconds ago')) {
|
||||
return $json2;
|
||||
}
|
||||
}
|
||||
return $json2;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Function to safely get inputs from either command line or request
|
||||
function getInput($key, $default = '') {
|
||||
global $argv;
|
||||
// Function to safely get inputs from either command line or request
|
||||
function getInput($key, $default = '')
|
||||
{
|
||||
global $argv;
|
||||
|
||||
// Check if running from command line or HTTP request
|
||||
if (php_sapi_name() === 'cli') {
|
||||
foreach ($argv as $arg) {
|
||||
if (strpos($arg, "{$key}=") === 0) {
|
||||
return substr($arg, strlen("{$key}="));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default;
|
||||
}
|
||||
// Check if running from command line or HTTP request
|
||||
if (php_sapi_name() === 'cli') {
|
||||
foreach ($argv as $arg) {
|
||||
if (strpos($arg, "{$key}=") === 0) {
|
||||
return substr($arg, strlen("{$key}="));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default;
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
return $default;
|
||||
}
|
||||
|
||||
// Validate and sanitize the ffmpegCommand
|
||||
function sanitizeFFmpegCommand($command) {
|
||||
// Validate and sanitize the ffmpegCommand
|
||||
function sanitizeFFmpegCommand($command)
|
||||
{
|
||||
$allowedPrefixes = ['ffmpeg', '/usr/bin/ffmpeg', '/bin/ffmpeg'];
|
||||
|
||||
// Remove dangerous characters
|
||||
|
@ -165,21 +168,21 @@
|
|||
}
|
||||
|
||||
|
||||
// Fetch and sanitize inputs
|
||||
$codeToExecEncrypted = getInput('codeToExecEncrypted', '');
|
||||
$codeToExec = _decryptString($codeToExecEncrypted);
|
||||
// Fetch and sanitize inputs
|
||||
$codeToExecEncrypted = getInput('codeToExecEncrypted', '');
|
||||
$codeToExec = _decryptString($codeToExecEncrypted);
|
||||
|
||||
if (empty($codeToExec)) {
|
||||
die('Invalid Request');
|
||||
}
|
||||
if (empty($codeToExec)) {
|
||||
die('Invalid Request');
|
||||
}
|
||||
|
||||
$ffmpegCommand = sanitizeFFmpegCommand($codeToExec->ffmpegCommand);
|
||||
$keyword = preg_replace('/[^a-zA-Z0-9_-]/', '', $codeToExec->keyword);
|
||||
$ffmpegCommand = sanitizeFFmpegCommand($codeToExec->ffmpegCommand);
|
||||
$keyword = preg_replace('/[^a-zA-Z0-9_-]/', '', $codeToExec->keyword);
|
||||
|
||||
// Kill processes associated with the keyword
|
||||
if (!empty($keyword)) {
|
||||
killProcessFromKeyword($keyword);
|
||||
}
|
||||
// Kill processes associated with the keyword
|
||||
if (!empty($keyword)) {
|
||||
killProcessFromKeyword($keyword);
|
||||
}
|
||||
|
||||
// Get the system's temporary directory
|
||||
$tempDir = "{$global['systemRootPath']}videos/ffmpegLogs/";
|
||||
|
@ -191,56 +194,65 @@ $tempDir = rtrim($tempDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
|||
// Create a unique log file path
|
||||
$logFile = "{$tempDir}ffmpeg_{$keyword}.log";
|
||||
|
||||
$time = time();
|
||||
$modified = @filemtime($logFile);
|
||||
$secondsAgo = $time - $obj->modified;
|
||||
$isActive = $secondsAgo < 10;
|
||||
|
||||
if (!empty($codeToExec->log)) {
|
||||
if (!empty($codeToExec->log)) {
|
||||
$time = time();
|
||||
$modified = @filemtime($logFile);
|
||||
$secondsAgo = $time - $obj->modified;
|
||||
$isActive = $secondsAgo < 10;
|
||||
echo json_encode([
|
||||
'error' => !file_exists($logFile),
|
||||
'msg' => '',
|
||||
'logFile' => $logFile,
|
||||
'time' =>$time,
|
||||
'modified' =>$modified,
|
||||
'secondsAgo' =>$secondsAgo,
|
||||
'isActive' =>$isActive,
|
||||
'time' => $time,
|
||||
'modified' => $modified,
|
||||
'secondsAgo' => $secondsAgo,
|
||||
'isActive' => $isActive,
|
||||
]);
|
||||
exit;
|
||||
}else
|
||||
// Validate that ffmpegCommand is not empty after sanitization
|
||||
if (empty($ffmpegCommand)) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'msg' => 'Invalid or empty ffmpeg command',
|
||||
'codeToExec' => $codeToExec,
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
} else if (!empty($codeToExec->stop) && !empty($keyword)) {
|
||||
$cmd = "pkill -f 'ffmpeg.*$keyword'";
|
||||
echo json_encode([
|
||||
'error' => !file_exists($logFile),
|
||||
'msg' => '',
|
||||
'logFile' => $logFile,
|
||||
'kill' => exec("pkill -f 'ffmpeg.*$keyword'"),
|
||||
'keyword' => $keyword,
|
||||
'unlink' => unlink($logFile),
|
||||
]);
|
||||
exit;
|
||||
} else
|
||||
// Validate that ffmpegCommand is not empty after sanitization
|
||||
if (empty($ffmpegCommand)) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'msg' => 'Invalid or empty ffmpeg command',
|
||||
'codeToExec' => $codeToExec,
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
// Redirect all output to the log file
|
||||
$ffmpegCommand .= " > {$logFile} 2>&1";
|
||||
// Redirect all output to the log file
|
||||
$ffmpegCommand .= " > {$logFile} 2>&1";
|
||||
|
||||
// Debug output (optional)
|
||||
error_log("Constructed FFMPEG Command [$keyword]: $ffmpegCommand");
|
||||
|
||||
try {
|
||||
$pid = execAsync($ffmpegCommand, $keyword);
|
||||
echo json_encode([
|
||||
'error' => false,
|
||||
'msg' => 'Command executed',
|
||||
'command' => $ffmpegCommand,
|
||||
'pid' => $pid,
|
||||
'logFile' => $logFile,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'msg' => 'Failed to execute command',
|
||||
'errorMsg' => $e->getMessage(),
|
||||
'logFile' => $logFile,
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
// Debug output (optional)
|
||||
error_log("Constructed FFMPEG Command [$keyword]: $ffmpegCommand");
|
||||
|
||||
try {
|
||||
$pid = execAsync($ffmpegCommand, $keyword);
|
||||
echo json_encode([
|
||||
'error' => false,
|
||||
'msg' => 'Command executed',
|
||||
'command' => $ffmpegCommand,
|
||||
'pid' => $pid,
|
||||
'logFile' => $logFile,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode([
|
||||
'error' => true,
|
||||
'msg' => 'Failed to execute command',
|
||||
'errorMsg' => $e->getMessage(),
|
||||
'logFile' => $logFile,
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
<?php
|
||||
|
||||
includeConfigLog(__LINE__, basename(__FILE__));
|
||||
require_once $global['systemRootPath'] . 'locale/function.php';
|
||||
includeConfigLog(__LINE__, basename(__FILE__));
|
||||
require_once $global['systemRootPath'] . 'objects/plugin.php';
|
||||
includeConfigLog(__LINE__, basename(__FILE__));
|
||||
|
||||
abstract class PluginAbstract {
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue