parseCommands($args);
}
/**
* Checks if current $wpInstallStorage object is capable of having the
* given non-scan action performed.
*
* @param string $action
* @param WPInstallStorage $wpInstallStorage
*
* @return void
*
* @throws LSCMException Thrown when scan data cannot be read.
* @throws LSCMException Thrown when expected scan data format has changed.
* @throws LSCMException Thrown when attempting to execute a "mass"
* operation without any discovered installations.
*/
private function checkDataFile(
$action,
WPInstallStorage $wpInstallStorage )
{
if ( $action == WPInstallStorage::CMD_SCAN2 ) {
/**
* Always allowed.
*/
return;
}
if ( ($err = $wpInstallStorage->getError()) ) {
switch ($err) {
case WPInstallStorage::ERR_NOT_EXIST:
case WPInstallStorage::ERR_CORRUPTED:
case WPInstallStorage::ERR_VERSION_HIGH:
throw new LSCMException(
'Scan data could not be read! Please scan again '
. '(without the \'-n\' flag) before attempting any '
. "cache operations.\n"
);
case WPInstallStorage::ERR_VERSION_LOW:
throw new LSCMException(
'Scan data file format has been changed for this '
. 'version. Please scan again (without the \'-n\' '
. "flag) before attempting any cache operations.\n"
);
//no default
}
}
elseif ( strpos($action,'mass_') === 0
&& $wpInstallStorage->getCount() == 0 ) {
throw new LSCMException(
'No WordPress installations discovered in the previous scan. '
. 'If you have any newly installed WordPress '
. 'installations, please scan again or add them with '
. "command 'addinstalls'.\n"
);
}
}
/**
*
* @param WPInstall $wpInstall
*/
private function printStatusMsg( WPInstall $wpInstall )
{
$msg = "$this->currWpPath - Status: ";
$status = $wpInstall->getStatus();
if ( $status & WPInstall::ST_PLUGIN_ACTIVE ) {
$msg .= 'enabled';
if ( !$status & WPInstall::ST_LSC_ADVCACHE_DEFINED ) {
$msg .= ', not caching';
}
}
else {
$msg .= 'disabled';
}
$msg .= ' | Flagged: ';
$msg .= ($status & WPInstall::ST_FLAGGED) ? 'yes' : 'no';
$msg .= ' | Error: ';
if ( $status & WPInstall::ST_ERR_SITEURL ) {
$msg .= 'Could not retrieve WordPress siteURL.';
}
elseif ( $status & WPInstall::ST_ERR_DOCROOT ) {
$msg .= 'Could not match WordPress siteURL to a known control '
. 'panel docroot.';
}
elseif ( $status & WPInstall::ST_ERR_EXECMD ) {
$msg .= 'WordPress fatal error encountered during action '
. 'execution. This is most likely caused by custom code in '
. 'this WordPress installation.';
}
elseif ( $status & WPInstall::ST_ERR_EXECMD_DB ) {
$msg .= 'Error establishing WordPress database connection.';
}
elseif ( $status & WPInstall::ST_ERR_TIMEOUT ) {
$msg .= 'Timeout occurred during action execution.';
}
elseif ( $status & WPInstall::ST_ERR_WPCONFIG ) {
$msg .= 'Could not find a valid wp-config.php file.';
}
echo "$msg\n\n";
}
/**
*
* @param string[] $args
*
* @return void
*
* @throws LSCMException Thrown when -svr parameter is passed without a
* value.
* @throws LSCMException Thrown when -svr parameter value points to a
* non-empty directory.
* @throws LSCMException Thrown when -vh parameter is passed without a
* value.
* @throws LSCMException Thrown when -vh parameter value contains invalid
* character '$'.
* @throws LSCMException Thrown when -vh parameter value points to a
* non-empty directory.
* @throws LSCMException Thrown indirectly by
* ControlPanel::getClassInstance() call.
* @throws LSCMException Thrown indirectly by
* $controlPanel->getServerCacheRoot() call.
* @throws LSCMException Thrown indirectly by
* $controlPanel->getVHCacheRoot() call.
*/
private function handleSetCacheRootInput( array &$args )
{
if ( empty($args) ) {
$this->cacheRootCmds[] = 'listCacheRoots';
return;
}
$controlPanel = ControlPanel::getClassInstance();
if ( ($key = array_search('-svr', $args)) !== false ) {
if ( empty($args[$key + 1])
|| ($this->svrCacheRootParam = trim($args[$key + 1])) == '' ) {
throw new LSCMException(
'Invalid Command, missing server cache root value.'
);
}
$currSvrCacheRoot = $controlPanel->getServerCacheRoot();
if ( $this->svrCacheRootParam != $currSvrCacheRoot ) {
if ( !Util::is_dir_empty($this->svrCacheRootParam) ) {
throw new LSCMException(
'Provided server level cache root must be an empty '
. 'directory.'
);
}
$this->cacheRootCmds[] = 'setSvrCacheRoot';
}
unset($args[$key], $args[$key + 1]);
}
if ( ($key = array_search('-vh', $args)) !== false ) {
$setvhCacheRoot = false;
if ( empty($args[$key + 1])
|| ($this->vhCacheRootParam = trim($args[$key + 1])) == '' ) {
throw new LSCMException(
'Invalid Command, missing virtual host cache root value.'
);
}
if ( strpos($this->vhCacheRootParam, '$') !== false ) {
throw new LSCMException(
'Invalid Command, virtual host cache root value cannot '
. 'contain any \'$\' characters. \'$vh_user\' will be '
. 'automatically added to the end of virtual host '
. 'cache root values starting with a \'/\'.'
);
}
$currVHCacheRoot = $controlPanel->getVHCacheRoot();
if ( $this->vhCacheRootParam[0] == '/' ) {
$updatedVhCacheRoot =
rtrim($this->vhCacheRootParam, '/') . '/$vh_user';
if ( $updatedVhCacheRoot != $currVHCacheRoot
&& ! Util::is_dir_empty($this->vhCacheRootParam) ) {
throw new LSCMException(
'Provided absolute path for virtual host level cache '
. 'root must be an empty directory.'
);
}
$this->vhCacheRootParam = $updatedVhCacheRoot;
$setvhCacheRoot = true;
}
elseif ( $this->vhCacheRootParam != $currVHCacheRoot ) {
$setvhCacheRoot = true;
}
unset($args[$key], $args[$key + 1]);
if ( $setvhCacheRoot ) {
$this->cacheRootCmds[] = 'setVHCacheRoot';
}
}
}
/**
*
* @param string[] $args
*
* @return void
*
* @throws LSCMException Thrown when passed version set value is invalid.
*/
private function handleSetVersionInput( array &$args )
{
if ( ($key = array_search('--list', $args)) !== false ) {
unset($args[$key]);
$this->versionCmd = 'list';
return;
}
if ( ($key = array_search('--latest', $args)) !== false ) {
unset($args[$key]);
$this->versionCmd = 'latest';
return;
}
if ( empty($args) ) {
$this->versionCmd = 'active';
return;
}
$v = array_shift($args);
if ( preg_match('/[1-9]\.\d(?:\.\d)*(?:\.\d)*/', $v) !== 1 ) {
throw new LSCMException("Invalid version number ($v).");
}
$this->versionCmd = $v;
}
/**
*
* @param string[] $args
*/
private function handleScanInput( array &$args )
{
if ( ($key = array_search('-n', $args)) !== false ) {
unset($args[$key]);
$this->commands[] = WPInstallStorage::CMD_DISCOVER_NEW2;
}
else {
$this->commands[] = WPInstallStorage::CMD_SCAN2;
}
if ( ($key = array_search('-e', $args)) !== false ) {
unset($args[$key]);
$this->commands[] = UserCommand::CMD_MASS_ENABLE;
}
}
/**
*
* @param string[] $args
*/
private function handleScanNewInput( array &$args )
{
if ( ($key = array_search('-en', $args)) !== false ) {
unset($args[$key]);
$this->commands[] = WPInstallStorage::CMD_DISCOVER_NEW_AND_ENABLE;
}
else {
$this->commands[] = WPInstallStorage::CMD_DISCOVER_NEW2;
}
}
/**
*
* @param string[] $args
*
* @return bool
*/
private function isMassOperation( array &$args )
{
if ( ($key = array_search('-m', $args)) !== false ) {
unset($args[$key]);
return true;
}
return false;
}
/**
*
* @param string $cmd
* @param string[] $args
*
* @throws LSCMException Thrown when expected WP path value is not
* provided.
* @throws LSCMException Thrown when provided an invalid WP path value.
*/
private function handleSingleOperationInput( $cmd, array &$args )
{
$path = array_shift($args);
if ( $path == null ) {
throw new LSCMException('Invalid Command, missing WP path.');
}
$wpInstall = new WPInstall($path);
if ( !$wpInstall->hasValidPath() ) {
throw new LSCMException("Invalid WP Path: $path.");
}
$this->commands[] = $cmd;
$this->currWpPath = rtrim($path, '/');
}
/**
*
* @param string $cmdType
* @param string[] $args
*
* @throws LSCMException Thrown when neither -m nor -wppath parameters are
* provided in notify command.
* @throws LSCMException Thrown when -wppath parameter is passed without a
* value in notify command.
* @throws LSCMException Thrown when provided -wppath parameter value is
* invalid in notify command.
* @throws LSCMException Thrown when -msgfile parameter is passed without a
* value in notify command.
* @throws LSCMException Thrown when provided -msgfile parameter value
* points to a non-existent file in notify command.
* @throws LSCMException Thrown when unable to get file contents of the
* file pointed to by provided -msgfile value in notify command.
* @throws LSCMException Thrown when neither -msgfile nor -msg parameters
* are provided in notify command.
* @throws LSCMException Thrown when parameter -msg is passed without a
* value in notify command.
* @throws LSCMException Thrown when expected -plugin parameter is not
* provided in notify command.
* @throws LSCMException Thrown when provided -plugin parameter value does
* not a known plugin slug in notify command.
* @throws LSCMException Thrown when neither -m flag nor WP path value are
* provided in remove command.
* @throws LSCMException Thrown when provided WP path value is invalid in
* remove command.
*/
private function handleDashNotifyInput( $cmdType, array &$args )
{
if ( $cmdType == 'notify' ) {
if ( ($key = array_search('-m', $args)) !== false ) {
unset($args[$key]);
$this->commands[] = UserCommand::CMD_MASS_DASH_NOTIFY;
}
else {
if ( ($key = array_search('-wppath', $args)) === false ) {
throw new LSCMException(
'Invalid Command, missing required \'-m\' or '
. '\'-wppath\' parameter.'
);
}
if ( empty($args[$key + 1]) ) {
throw new LSCMException(
'Invalid Command, missing \'-wppath\' value.'
);
}
$path = $args[$key + 1];
$wpInstall = new WPInstall($path);
if ( !$wpInstall->hasValidPath() ) {
throw new LSCMException("Invalid WP Path: $path.");
}
$this->commands[] = UserCommand::CMD_DASH_NOTIFY;
$this->currWpPath = rtrim($path, '/');
unset($args[$key], $args[$key + 1]);
}
if ( ($key = array_search('-msgfile', $args)) !== false ) {
if ( empty($args[$key + 1]) ) {
throw new LSCMException(
'Invalid Command, missing \'-msgfile\' value.'
);
}
$msgFilePath = $args[$key + 1];
if ( !file_exists($msgFilePath) ) {
throw new LSCMException(
'Provided message file does not exist.'
);
}
if ( ($message = file_get_contents($msgFilePath)) === false ) {
throw new LSCMException(
'Unable to retrieve provided message file content.'
);
}
}
else {
if ( ($key = array_search('-msg', $args)) === false ) {
throw new LSCMException(
'Invalid Command, missing required \'-msgfile\' or '
. '\'-msg\' parameter.'
);
}
if ( empty($args[$key + 1]) ) {
throw new LSCMException(
'Invalid Command, missing \'-msg\' value.'
);
}
$message = $args[$key + 1];
}
$dashInput = array( 'msg' => $message );
unset($args[$key], $args[$key + 1]);
if ( ($key = array_search('-plugin', $args)) !== false ) {
if ( empty($args[$key + 1]) ) {
throw new LSCMException(
'Invalid Command, missing \'-plugin\' value.'
);
}
$slug = $args[$key + 1];
$pluginInfoJSON = Util::get_url_contents(
"https://api.wordpress.org/plugins/info/1.0/$slug.json"
);
$pluginInfo = json_decode($pluginInfoJSON, true);
if ( empty($pluginInfo['name']) ) {
throw new LSCMException(
'Could not find a plugin matching the provided plugin '
. 'slug.'
);
}
$dashInput['slug'] = $slug;
unset($args[$key], $args[$key + 1]);
}
$this->input = $dashInput;
}
elseif ( $cmdType == 'remove' ) {
$arg1 = array_shift($args);
if ( $arg1 == '-m' ) {
$this->commands[] = UserCommand::CMD_MASS_DASH_DISABLE;
}
else {
$path = $arg1;
if ( $path == null ) {
throw new LSCMException(
'Invalid Command, missing \'-m\' flag or WP path value.'
);
}
$wpInstall = new WPInstall($path);
if ( !$wpInstall->hasValidPath() ) {
throw new LSCMException("Invalid WP Path: $path.");
}
$this->commands[] = UserCommand::CMD_DASH_DISABLE;
$this->currWpPath = rtrim($path, '/');
}
}
}
/**
*
* @param string[] $args
*
* @throws LSCMException Thrown when command 'cpanelplugin' is used in a
* non-cPanel environment.
* @throws LSCMException Thrown indirectly by
* ControlPanel::getClassInstance() call.
*/
private function handleCpanelPluginInput( array &$args )
{
$controlPanel = ControlPanel::getClassInstance();
if ( !($controlPanel instanceof CPanel) ) {
throw new LSCMException(
'Command \'cpanelplugin\' cannot be used in a non-cPanel '
. 'environment.'
);
}
switch ($args[0]) {
case '--install':
$this->specialCmd = self::SPECIAL_CMD_CPANEL_PLUGIN_INSTALL;
unset($args[0]);
break;
case '--uninstall':
$this->specialCmd = self::SPECIAL_CMD_CPANEL_PLUGIN_UNINSTALL;
unset($args[0]);
break;
case '-autoinstall':
if ( !isset($args[1]) ) {
$this->specialCmd =
self::SPECIAL_CMD_CPANEL_PLUGIN_AUTOINSTALL_STATUS;
}
elseif ( "$args[1]" === '1' ) {
$this->specialCmd =
self::SPECIAL_CMD_CPANEL_PLUGIN_AUTOINSTALL_ON;
unset($args[1]);
}
elseif ( "$args[1]" === '0' ) {
$this->specialCmd =
self::SPECIAL_CMD_CPANEL_PLUGIN_AUTOINSTALL_OFF;
unset($args[1]);
}
unset($args[0]);
break;
case '--fixconf':
$this->specialCmd = self::SPECIAL_CMD_CPANEL_PLUGIN_FIX_CONF;
unset($args[0]);
break;
//no default
}
}
/**
*
* @param string[] $args
*
* @throws LSCMException Thrown when -wpinstall parameter is passed without
* a value.
* @throws LSCMException Thrown when expected 'docroot' value is not
* provided when using parameter -wpinstall.
* @throws LSCMException Thrown when expected 'server name' value is not
* provided when using parameter -wpinstall.
* @throws LSCMException Thrown when expected 'site url' value is not
* provided when using parameter -wpinstall.
* @throws LSCMException Thrown when -wpinstallsfile parameter is passed
* without a value.
* @throws LSCMException Thrown when provided -wpinstallsfile parameter
* value points to a non-existent file.
* @throws LSCMException Thrown when unable to get file contents of the
* file pointed to by provided -wpinstallsfile parameter value.
*/
private function handleAddInstallsInput( array &$args )
{
switch ($args[0]) {
case '-wpinstall':
if ( empty($args[1]) ) {
throw new LSCMException(
'Invalid Command, missing \'