ghost
11 months ago
2 changed files with 203 additions and 1 deletions
@ -1,3 +1,193 @@ |
|||||||
<?php |
<?php |
||||||
|
|
||||||
// @TODO #1 |
// Init helper |
||||||
|
function _exec( |
||||||
|
string $processor, |
||||||
|
string $command |
||||||
|
): mixed |
||||||
|
{ |
||||||
|
if (false !== exec(sprintf('%s %s', $processor, $command), $output)) |
||||||
|
{ |
||||||
|
$rows = []; |
||||||
|
|
||||||
|
foreach($output as $row) |
||||||
|
{ |
||||||
|
$rows[] = $row; |
||||||
|
} |
||||||
|
|
||||||
|
if ($result = @json_decode(implode(PHP_EOL, $rows))) |
||||||
|
{ |
||||||
|
return $result; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// Check file exits |
||||||
|
if (!file_exists($argv[2])) |
||||||
|
{ |
||||||
|
exit('filename does not exist!' . PHP_EOL); |
||||||
|
} |
||||||
|
|
||||||
|
// Get file hash sum |
||||||
|
$md5file = md5_file( |
||||||
|
$argv[2] |
||||||
|
); |
||||||
|
|
||||||
|
// Search namespace by md5file |
||||||
|
echo 'Get namespaces list...' . PHP_EOL; |
||||||
|
|
||||||
|
$namespaces = _exec( |
||||||
|
$argv[1], |
||||||
|
'keva_list_namespaces' |
||||||
|
); |
||||||
|
|
||||||
|
// Get _CLITOR_IS_ meta |
||||||
|
foreach ((array) $namespaces as $namespace) |
||||||
|
{ |
||||||
|
echo sprintf( |
||||||
|
'Search for _CLITOR_IS_ match file MD5 %s ...' . PHP_EOL, |
||||||
|
$md5file |
||||||
|
); |
||||||
|
|
||||||
|
$meta = _exec( |
||||||
|
$argv[1], |
||||||
|
sprintf( |
||||||
|
"%s '%s' '%s'", |
||||||
|
'keva_get', |
||||||
|
$namespace->namespaceId, |
||||||
|
'_CLITOR_IS_' |
||||||
|
) |
||||||
|
); |
||||||
|
|
||||||
|
if ($value = @json_decode($meta->value)) |
||||||
|
{ |
||||||
|
if ( |
||||||
|
isset($value->pieces) && |
||||||
|
isset($value->pieces->total) && |
||||||
|
isset($value->pieces->size) && |
||||||
|
|
||||||
|
isset($value->file) && |
||||||
|
isset($value->file->md5) && |
||||||
|
$value->file->md5 === $md5file |
||||||
|
) |
||||||
|
{ |
||||||
|
// Meta found |
||||||
|
echo sprintf( |
||||||
|
'_CLITOR_IS_ found for this file with namespace %s' . PHP_EOL, |
||||||
|
$namespace->namespaceId |
||||||
|
); |
||||||
|
|
||||||
|
// Split content to smaller parts using _CLITOR_IS_ size defined before |
||||||
|
$pieces = str_split( |
||||||
|
base64_encode( |
||||||
|
file_get_contents( |
||||||
|
$argv[2] |
||||||
|
) |
||||||
|
), |
||||||
|
$value->pieces->size |
||||||
|
); |
||||||
|
|
||||||
|
// Count total pieces |
||||||
|
$total = count( |
||||||
|
$pieces |
||||||
|
); |
||||||
|
|
||||||
|
// Validate pieces count |
||||||
|
if ($value->pieces->total !== $total) |
||||||
|
{ |
||||||
|
echo '_CLITOR_IS_ have another pieces quantity' . PHP_EOL; |
||||||
|
|
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
// Begin pieces saving |
||||||
|
foreach ($pieces as $key => $value) |
||||||
|
{ |
||||||
|
// Check piece stored is valid |
||||||
|
$piece = _exec( |
||||||
|
$argv[1], |
||||||
|
sprintf( |
||||||
|
"%s '%s' '%s'", |
||||||
|
'keva_get', |
||||||
|
$namespace->namespaceId, |
||||||
|
$key |
||||||
|
) |
||||||
|
); |
||||||
|
|
||||||
|
// Piece value not found |
||||||
|
if (empty($piece->value)) |
||||||
|
{ |
||||||
|
echo sprintf( |
||||||
|
'Piece %s value not found, creating...' . PHP_EOL, |
||||||
|
$key |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
// Piece value invalid, begin blockchain record |
||||||
|
else if ($piece->value !== $value) |
||||||
|
{ |
||||||
|
echo sprintf( |
||||||
|
'Piece %s value invalid (%s <> %s), rewriting...' . PHP_EOL, |
||||||
|
$key, |
||||||
|
md5( |
||||||
|
$piece->value |
||||||
|
), |
||||||
|
md5( |
||||||
|
$value |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
// Piece valid |
||||||
|
else |
||||||
|
{ |
||||||
|
echo sprintf( |
||||||
|
'Piece %s - OK' . PHP_EOL, |
||||||
|
$key |
||||||
|
); |
||||||
|
|
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
print_r( |
||||||
|
_exec( |
||||||
|
$argv[1], |
||||||
|
sprintf( |
||||||
|
"%s '%s' '%s' '%s'", |
||||||
|
'keva_put', |
||||||
|
$namespace->namespaceId, |
||||||
|
$key, |
||||||
|
$value |
||||||
|
) |
||||||
|
) |
||||||
|
); |
||||||
|
|
||||||
|
// Apply delays to prevent too-long-mempool-chain reject |
||||||
|
$delay = isset($argv[3]) && $argv[3] > 0 ? (int) $argv[3] : 60; |
||||||
|
|
||||||
|
echo sprintf( |
||||||
|
'Piece %s sent, waiting %s seconds...' . PHP_EOL, |
||||||
|
$key, |
||||||
|
$total, |
||||||
|
$delay |
||||||
|
); |
||||||
|
|
||||||
|
sleep($delay); |
||||||
|
} |
||||||
|
|
||||||
|
// Print result |
||||||
|
echo sprintf( |
||||||
|
'done! run to extract: php %s/get.php %s %s' . PHP_EOL, |
||||||
|
__DIR__, |
||||||
|
$argv[1], |
||||||
|
$namespace->namespaceId |
||||||
|
); |
||||||
|
|
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
echo 'Could not recover this file!' . PHP_EOL; |
Loading…
Reference in new issue