|
|
|
<?php
|
|
|
|
|
|
|
|
// Init version
|
|
|
|
define(
|
|
|
|
'_CLITOR_IS_',
|
|
|
|
'1.3.0'
|
|
|
|
);
|
|
|
|
|
|
|
|
// 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 processor exits
|
|
|
|
if (empty($argv[1]))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'processor required' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!file_exists($argv[1]))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'processor does not exist' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check namespace provided
|
|
|
|
if (empty($argv[2]))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'namespace required' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check target file does not exist yet
|
|
|
|
if (!file_exists($argv[3]))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'filename does not exist' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get namespace meta
|
|
|
|
$clitoris = _exec(
|
|
|
|
$argv[1],
|
|
|
|
sprintf(
|
|
|
|
"keva_get %s _CLITOR_IS_",
|
|
|
|
$argv[2]
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
if (empty($clitoris->value))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'_CLITOR_IS_ not found for this namespace' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate protocol
|
|
|
|
if (empty($clitoris->value))
|
|
|
|
{
|
|
|
|
print(
|
|
|
|
'_CLITOR_IS_ not found' . PHP_EOL
|
|
|
|
);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Split content to smaller parts (according to the protocol limits)
|
|
|
|
$pieces = str_split(
|
|
|
|
base64_encode(
|
|
|
|
file_get_contents(
|
|
|
|
$argv[3]
|
|
|
|
)
|
|
|
|
),
|
|
|
|
3072
|
|
|
|
);
|
|
|
|
|
|
|
|
// Count total pieces
|
|
|
|
$total = count(
|
|
|
|
$pieces
|
|
|
|
);
|
|
|
|
|
|
|
|
// Begin pieces saving
|
|
|
|
foreach ($pieces as $key => $value)
|
|
|
|
{
|
|
|
|
// Check piece stored in blockchain is valid
|
|
|
|
$piece = _exec(
|
|
|
|
$argv[1],
|
|
|
|
sprintf(
|
|
|
|
"keva_get %s %d",
|
|
|
|
$argv[2],
|
|
|
|
$key
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
// Piece value not found
|
|
|
|
if (empty($piece->value))
|
|
|
|
{
|
|
|
|
printf(
|
|
|
|
'Piece %s/%s value not found, create new record...' . PHP_EOL,
|
|
|
|
$key + 1,
|
|
|
|
$total
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Piece value invalid, begin blockchain record
|
|
|
|
else if ($piece->value != $value)
|
|
|
|
{
|
|
|
|
printf(
|
|
|
|
'Piece %s/%s value invalid, overwrite record...' . PHP_EOL,
|
|
|
|
$key + 1,
|
|
|
|
$total,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Piece valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf(
|
|
|
|
'Piece %s/%s - OK' . PHP_EOL,
|
|
|
|
$key + 1,
|
|
|
|
$total
|
|
|
|
);
|
|
|
|
|
|
|
|
continue; // skip next operations for this piece
|
|
|
|
}
|
|
|
|
|
|
|
|
// Record new piece
|
|
|
|
print_r(
|
|
|
|
_exec(
|
|
|
|
$argv[1],
|
|
|
|
sprintf(
|
|
|
|
"keva_put %s %d %s",
|
|
|
|
$argv[2],
|
|
|
|
$key,
|
|
|
|
$value
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
// Apply delays to prevent too-long-mempool-chain reject
|
|
|
|
$delay = isset($argv[3]) && $argv[3] > 0 ? (int) $argv[3] : 60;
|
|
|
|
|
|
|
|
printf(
|
|
|
|
'Piece %s/%s sent, waiting %s seconds...' . PHP_EOL,
|
|
|
|
$key + 1,
|
|
|
|
$total,
|
|
|
|
$delay
|
|
|
|
);
|
|
|
|
|
|
|
|
sleep(
|
|
|
|
$delay
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Done
|
|
|
|
printf(
|
|
|
|
'data successfully synced with namespace "%s"' . PHP_EOL,
|
|
|
|
$argv[2]
|
|
|
|
);
|