689 lines
16 KiB
PHP
689 lines
16 KiB
PHP
#!/usr/bin/env php
|
|
|
|
<?php
|
|
|
|
ini_set('display_errors', 'On');
|
|
error_reporting(E_ALL);
|
|
|
|
set_time_limit(0);
|
|
set_include_path(get_include_path() . PATH_SEPARATOR . "../../bindings/php");
|
|
|
|
include 'megaapi.php';
|
|
require_once('vendor/autoload.php');
|
|
|
|
use Symfony\Component\Console\Shell;
|
|
use Symfony\Component\Console\Application;
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\Console\Input\InputArgument;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
|
|
$megaapi = NULL;
|
|
$cwd = NULL;
|
|
|
|
class AppListener implements MegaListenerInterface
|
|
{
|
|
public function onRequestStart($megaApi, $request)
|
|
{
|
|
}
|
|
|
|
public function onRequestFinish($megaApi, $request, $error)
|
|
{
|
|
global $cwd;
|
|
|
|
if($error->getErrorCode() != MegaError::API_OK)
|
|
{
|
|
print("INFO: Request finished with error ( " . $request . " ) Result: " . $error . "\n");
|
|
print("MEGA > ");
|
|
return;
|
|
}
|
|
|
|
$requestType = $request->getType();
|
|
if($requestType == MegaRequest::TYPE_LOGIN)
|
|
{
|
|
print("Fetchning nodes. Please wait...\n");
|
|
print("MEGA > ");
|
|
$megaApi->fetchNodes();
|
|
}
|
|
else if($requestType == MegaRequest::TYPE_FETCH_NODES)
|
|
{
|
|
print("Account correctly loaded\n");
|
|
print("MEGA > ");
|
|
$cwd = $megaApi->getRootNode();
|
|
}
|
|
else if($requestType == MegaRequest::TYPE_EXPORT)
|
|
{
|
|
print("INFO: Exported link: " . $request->getLink() . "\n");
|
|
print("MEGA > ");
|
|
}
|
|
else if($requestType == MegaRequest::TYPE_ACCOUNT_DETAILS)
|
|
{
|
|
$accountDetails = $request->getMegaAccountDetails();
|
|
print("INFO: Account details received\n");
|
|
print("Account e-mail: " . $megaApi->getMyEmail() . "\n");
|
|
print("Storage: " . $accountDetails->getStorageUsed() . " of " . $accountDetails->getStorageMax() .
|
|
" (" . (100 * $accountDetails->getStorageUsed() / $accountDetails->getStorageMax()) . "%)\n");
|
|
print("Pro level: " . $accountDetails->getProLevel() . "\n");
|
|
print("MEGA > ");
|
|
}
|
|
}
|
|
|
|
public function onRequestTemporaryError($megaApi, $request, $error)
|
|
{
|
|
print("INFO: Request temporary error ( " . $request . " ) Error: " + $error . "\n");
|
|
}
|
|
|
|
public function onTransferStart($megaApi, $transfer)
|
|
{
|
|
print("INFO: Transfer start ( " . $transfer . " " . $transfer->getFileName() . " )\n");
|
|
}
|
|
|
|
public function onTransferFinish($megaApi, $transfer, $error)
|
|
{
|
|
print("INFO: Transfer finished ( " . $transfer . " " . $transfer->getFileName() . " ) Result: " . $error . "\n");
|
|
print("MEGA > ");
|
|
}
|
|
|
|
public function onTransferUpdate($megaApi, $transfer)
|
|
{
|
|
print("INFO: Transfer update ( " . $transfer . " " . $transfer->getFileName() . " ) Progress: " . $transfer->getTransferredBytes()/1024 ." KB of " . $transfer->getTotalBytes()/1024 . " KB, " . $transfer->getSpeed()/1024 . " KB/s\n");
|
|
}
|
|
|
|
public function onTransferTemporaryError($megaApi, $request, $error)
|
|
{
|
|
print("INFO: Transfer temporary error ( " . $transfer . " " . $transfer->getFileName() . " ) Error: " . $error . "\n");
|
|
}
|
|
|
|
public function onUsersUpdate($megaApi, $users)
|
|
{
|
|
}
|
|
|
|
public function onNodesUpdate($megaApi, $nodes)
|
|
{
|
|
global $cwd;
|
|
|
|
if($nodes != NULL)
|
|
{
|
|
print("INFO: Nodes updated ( " . count($nodes) . " )\n");
|
|
print("MEGA > ");
|
|
}
|
|
else
|
|
$cwd = $megaApi->getRootNode();
|
|
}
|
|
|
|
public function onReloadNeeded($megaApi)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
class LoginCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('login');
|
|
$this->setDescription('Log in to a MEGA account');
|
|
$this->addArgument('email', InputArgument::REQUIRED, 'Email of the account');
|
|
$this->addArgument('password', InputArgument::REQUIRED, 'Password of the account');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
|
|
$email = $input->getArgument('email');
|
|
$password = $input->getArgument('password');
|
|
$megaapi->login($email, $password);
|
|
}
|
|
}
|
|
|
|
class LogoutCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('logout');
|
|
$this->setDescription('Log out a MEGA account');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
$megaapi->logout();
|
|
$cwd = null;
|
|
}
|
|
}
|
|
|
|
class LsCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('ls');
|
|
$this->setDescription('List a MEGA folder');
|
|
$this->addArgument('path', InputArgument::OPTIONAL, 'folder path');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
if ($path)
|
|
{
|
|
$folder = $megaapi->getNodeByPath($path, $cwd);
|
|
}
|
|
else
|
|
{
|
|
$folder = $cwd;
|
|
}
|
|
|
|
|
|
$output->writeln(" .");
|
|
if($megaapi->getParentNode($folder) != NULL)
|
|
{
|
|
$output->writeln(" ..");
|
|
}
|
|
|
|
$children = $megaapi->getChildren($folder);
|
|
foreach($children as $node)
|
|
{
|
|
$output->write(" " . $node->getName());
|
|
if($node->getType() == MegaNode::TYPE_FILE)
|
|
{
|
|
$output->writeln(" (" . $node->getSize() . " bytes)");
|
|
}
|
|
else
|
|
{
|
|
$output->writeln(" (folder)");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class MkdirCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('mkdir');
|
|
$this->setDescription('Create a folder');
|
|
$this->addArgument('name', InputArgument::REQUIRED, 'folder name');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$name = $input->getArgument('name');
|
|
$megaapi->createFolder($name, $cwd);
|
|
}
|
|
}
|
|
|
|
class CdCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('cd');
|
|
$this->setDescription('Change the current directory');
|
|
$this->addArgument('path', InputArgument::REQUIRED, 'new current directory');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
$new = $megaapi->getNodeByPath($path, $cwd);
|
|
if($new == null)
|
|
{
|
|
$output->writeln("Invalid path");
|
|
return;
|
|
}
|
|
|
|
$cwd = $new;
|
|
}
|
|
}
|
|
|
|
class MvCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('mv');
|
|
$this->setDescription('Move a file/folder');
|
|
$this->addArgument('source', InputArgument::REQUIRED, 'Source file/folder');
|
|
$this->addArgument('destination', InputArgument::REQUIRED, 'Destination file/folder');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$source = $input->getArgument('source');
|
|
$name = $input->getArgument('destination');
|
|
|
|
$srcNode = $megaapi->getNodeByPath($source, $cwd);
|
|
if($srcNode == null)
|
|
{
|
|
$output->writeln($source . ": No such file or directory");
|
|
return;
|
|
}
|
|
|
|
$dstNode = $megaapi->getNodeByPath($name, $cwd);
|
|
if(($dstNode != null) && $dstNode->isFile())
|
|
{
|
|
$output->writeln($name . ": Not a directory");
|
|
return;
|
|
}
|
|
|
|
if($dstNode != null)
|
|
{
|
|
$megaapi->moveNode($srcNode, $dstNode);
|
|
return;
|
|
}
|
|
|
|
if(strpos($name,"/") !== false || strpos($name,"\\") !== false)
|
|
{
|
|
$str1 = strrchr($name, "/");
|
|
$str2 = strrchr($name, "\\");
|
|
$index = null;
|
|
|
|
if($str2 == FALSE || strlen($str1) < strlen($str2))
|
|
{
|
|
echo "A\n";
|
|
$index = strlen($name) - strlen($str1);
|
|
}
|
|
else
|
|
{
|
|
echo "B\n";
|
|
$index = strlen($name) - strlen($str2);
|
|
}
|
|
|
|
$path = substr($name, 0, $index);
|
|
$base = $megaapi->getNodeByPath($path, $cwd);
|
|
$name = substr($name, $index+1);
|
|
|
|
echo "INDEX: " . $index . "\n";
|
|
echo "str1: " . $str1 . "\n";
|
|
echo "str2: " . $str2 . "\n";
|
|
echo "PATH: " . $path . "\n";
|
|
echo "NAME: " . $name . "\n";
|
|
|
|
if($base == null)
|
|
{
|
|
$output->writeln($path . ": Not such directory");
|
|
return;
|
|
}
|
|
|
|
if($base->isFile())
|
|
{
|
|
$output->writeln($path . ": Not a directory");
|
|
return;
|
|
}
|
|
|
|
$megaapi->moveNode($srcNode, $base);
|
|
if(strlen($name) != 0)
|
|
{
|
|
$megaapi->renameNode($srcNode, $name);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if($dstNode == null)
|
|
{
|
|
$megaapi->renameNode($srcNode, $name);
|
|
}
|
|
}
|
|
}
|
|
|
|
class PwdCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('pwd');
|
|
$this->setDescription('Get the current working directory');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$output->writeln($megaapi->getNodePath($cwd));
|
|
}
|
|
}
|
|
|
|
class RmCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('rm');
|
|
$this->setDescription('Remove a file/folder');
|
|
$this->addArgument('path', InputArgument::REQUIRED, 'Path to file/folder to delete');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
$node = $megaapi->getNodeByPath($path, $cwd);
|
|
if($node == null)
|
|
{
|
|
$output->writeln("Invalid path");
|
|
return;
|
|
}
|
|
|
|
$megaapi->remove($node);
|
|
}
|
|
}
|
|
|
|
class GetCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('get');
|
|
$this->setDescription('Download a file from MEGA');
|
|
$this->addArgument('path', InputArgument::REQUIRED, 'Path to the file');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
$node = $megaapi->getNodeByPath($path, $cwd);
|
|
if($node == null)
|
|
{
|
|
$output->writeln("Invalid path");
|
|
return;
|
|
}
|
|
|
|
if(!$node->isFile())
|
|
{
|
|
$output->writeln("Not a file");
|
|
return;
|
|
}
|
|
|
|
$megaapi->startDownload($node, "./");
|
|
}
|
|
}
|
|
|
|
class PutCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('put');
|
|
$this->setDescription('Upload a file to MEGA');
|
|
$this->addArgument('path', InputArgument::REQUIRED, 'Path to the local file');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
$megaapi->startUpload($path, $cwd);
|
|
}
|
|
}
|
|
|
|
class ExportCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('export');
|
|
$this->setDescription('Generate a public link');
|
|
$this->addArgument('path', InputArgument::REQUIRED, 'Path to the file/folder in MEGA');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$path = $input->getArgument('path');
|
|
$node = $megaapi->getNodeByPath($path, $cwd);
|
|
if($node == null)
|
|
{
|
|
$output->writeln("Invalid path");
|
|
return;
|
|
}
|
|
|
|
$megaapi->exportNode($node);
|
|
}
|
|
}
|
|
|
|
class ImportCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('import');
|
|
$this->setDescription('Import a MEGA public file link');
|
|
$this->addArgument('link', InputArgument::REQUIRED, 'Public MEGA file link');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$link = $input->getArgument('link');
|
|
$megaapi->importFileLink($link, $cwd);
|
|
}
|
|
}
|
|
|
|
class PasswdCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('passwd');
|
|
$this->setDescription('Change the access password');
|
|
$this->addArgument('current_password', InputArgument::REQUIRED, 'Current password');
|
|
$this->addArgument('new_password', InputArgument::REQUIRED, 'New password');
|
|
$this->addArgument('repeat_new_password', InputArgument::REQUIRED, 'New password');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$current_password = $input->getArgument('current_password');
|
|
$new_password = $input->getArgument('new_password');
|
|
$repeat_new_password = $input->getArgument('repeat_new_password');
|
|
|
|
if($new_password != $repeat_new_password)
|
|
{
|
|
$output->writeln("Error: Password mismatch");
|
|
return;
|
|
}
|
|
|
|
$megaapi->changePassword($current_password, $new_password);
|
|
}
|
|
}
|
|
|
|
class WhoamiCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('whoami');
|
|
$this->setDescription('Show info about the current user');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$output->writeln($megaapi->getMyEmail());
|
|
$megaapi->getAccountDetails();
|
|
}
|
|
}
|
|
|
|
class MountCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('mount');
|
|
$this->setDescription('Show incoming shares');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
global $megaapi;
|
|
global $cwd;
|
|
|
|
if($cwd == null)
|
|
{
|
|
$output->writeln("Not logged in");
|
|
return;
|
|
}
|
|
|
|
$output->writeln("INFO: INSHARES:");
|
|
$users = $megaapi->getContacts();
|
|
foreach($users as $user)
|
|
{
|
|
$megaapi->getInShares();
|
|
$inshares = $megaapi->getInShares($user);
|
|
foreach($inshares as $share)
|
|
{
|
|
$output->writeln("INFO: INSHARE on " . $user->getEmail() . " " . $share->getName() . " Access level: " . $megaapi->getAccess($share));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class ExitCommand extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('exit');
|
|
$this->setDescription('Exit the app');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
class QuitCommand extends ExitCommand
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('quit');
|
|
$this->setDescription('Exit the app');
|
|
}
|
|
}
|
|
|
|
MegaApi::setLogLevel(MegaApi::LOG_LEVEL_ERROR);
|
|
$applistener = new AppListener();
|
|
|
|
$megaapi = new MegaApiPHP("API_KEY", "PHP megacli");
|
|
$megaapi->addListener($applistener);
|
|
|
|
$application = new Application('MEGA', 'PHP');
|
|
$application->add(new LoginCommand());
|
|
$application->add(new LogoutCommand());
|
|
$application->add(new LsCommand());
|
|
$application->add(new MkdirCommand());
|
|
$application->add(new CdCommand());
|
|
$application->add(new PwdCommand());
|
|
$application->add(new RmCommand());
|
|
$application->add(new GetCommand());
|
|
$application->add(new PutCommand());
|
|
$application->add(new ExitCommand());
|
|
$application->add(new QuitCommand());
|
|
$application->add(new ExportCommand());
|
|
$application->add(new ImportCommand());
|
|
$application->add(new WhoamiCommand());
|
|
$application->add(new PasswdCommand());
|
|
$application->add(new MountCommand());
|
|
$application->add(new MvCommand());
|
|
|
|
$shell = new Shell($application);
|
|
$shell->run();
|
|
|
|
?>
|
|
|
|
|