summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury German <blueknight@gentoo.org>2016-02-12 22:22:00 -0500
committerYury German <blueknight@gentoo.org>2016-02-12 22:22:00 -0500
commit657cafe0e955cf88033597f131aa50835140c617 (patch)
treecf21a30d319cb2a238a6cfb8b4eb3b20b1b5dcff /plugins/jetpack/class.jetpack-cli.php
parentAdding New Mantra version 2.4.1.1 - Bug 574468 (diff)
downloadblogs-gentoo-657cafe0e955cf88033597f131aa50835140c617.tar.gz
blogs-gentoo-657cafe0e955cf88033597f131aa50835140c617.tar.bz2
blogs-gentoo-657cafe0e955cf88033597f131aa50835140c617.zip
Updating plugins easy-table, jetpack, openid, public-post preview, talbe-of-contents-plus, wordress-mobile-pack - Bug 574468
Diffstat (limited to 'plugins/jetpack/class.jetpack-cli.php')
-rw-r--r--plugins/jetpack/class.jetpack-cli.php456
1 files changed, 439 insertions, 17 deletions
diff --git a/plugins/jetpack/class.jetpack-cli.php b/plugins/jetpack/class.jetpack-cli.php
index 5fd75d24..d84f39ca 100644
--- a/plugins/jetpack/class.jetpack-cli.php
+++ b/plugins/jetpack/class.jetpack-cli.php
@@ -7,26 +7,82 @@ WP_CLI::add_command( 'jetpack', 'Jetpack_CLI' );
*/
class Jetpack_CLI extends WP_CLI_Command {
+ // Aesthetics
+ public $green_open = "\033[32m";
+ public $red_open = "\033[31m";
+ public $yellow_open = "\033[33m";
+ public $color_close = "\033[0m";
+
/**
* Get Jetpack Details
*
* ## OPTIONS
*
- * None. Simply returns details about whether or not your blog
- * is connected, its Jetpack version, and WordPress.com blog_id.
+ * empty: Leave it empty for basic stats
+ *
+ * full: View full stats. It's the data from the heartbeat
*
* ## EXAMPLES
*
* wp jetpack status
+ * wp jetpack status full
*
*/
public function status( $args, $assoc_args ) {
- if ( Jetpack::is_active() ) {
+ if ( ! Jetpack::is_active() ) {
+ WP_CLI::error( __( 'Jetpack is not currently connected to WordPress.com', 'jetpack' ) );
+ }
+
+ if ( isset( $args[0] ) && 'full' !== $args[0] ) {
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $args[0] ) );
+ }
+
+ /*
+ * Are they asking for all data?
+ *
+ * Loop through heartbeat data and organize by priority.
+ */
+ $all_data = ( isset( $args[0] ) && 'full' == $args[0] ) ? 'full' : false;
+ if ( $all_data ) {
+ WP_CLI::success( __( 'Jetpack is currently connected to WordPress.com', 'jetpack' ) );
+ WP_CLI::line( sprintf( __( "The Jetpack Version is %s", 'jetpack' ), JETPACK__VERSION ) );
+ WP_CLI::line( sprintf( __( "The WordPress.com blog_id is %d", 'jetpack' ), Jetpack_Options::get_option( 'id' ) ) );
+
+ // Heartbeat data
+ WP_CLI::line( "\n" . __( 'Additional data: ', 'jetpack' ) );
+
+ // Get the filtered heartbeat data.
+ // Filtered so we can color/list by severity
+ $stats = Jetpack::jetpack_check_heartbeat_data();
+
+ // Display red flags first
+ foreach ( $stats['bad'] as $stat => $value ) {
+ printf( "$this->red_open%-'.16s %s $this->color_close\n", $stat, $value );
+ }
+
+ // Display caution warnings next
+ foreach ( $stats['caution'] as $stat => $value ) {
+ printf( "$this->yellow_open%-'.16s %s $this->color_close\n", $stat, $value );
+ }
+
+ // The rest of the results are good!
+ foreach ( $stats['good'] as $stat => $value ) {
+
+ // Modules should get special spacing for aestetics
+ if ( strpos( $stat, 'odule-' ) ) {
+ printf( "%-'.30s %s\n", $stat, $value );
+ usleep( 4000 ); // For dramatic effect lolz
+ continue;
+ }
+ printf( "%-'.16s %s\n", $stat, $value );
+ usleep( 4000 ); // For dramatic effect lolz
+ }
+ } else {
+ // Just the basics
WP_CLI::success( __( 'Jetpack is currently connected to WordPress.com', 'jetpack' ) );
WP_CLI::line( sprintf( __( 'The Jetpack Version is %s', 'jetpack' ), JETPACK__VERSION ) );
WP_CLI::line( sprintf( __( 'The WordPress.com blog_id is %d', 'jetpack' ), Jetpack_Options::get_option( 'id' ) ) );
- } else {
- WP_CLI::line( __( 'Jetpack is not currently connected to WordPress.com', 'jetpack' ) );
+ WP_CLI::line( "\n" . _x( "View full status with 'wp jetpack status full'", '"wp jetpack status full" is a command - do not translate', 'jetpack' ) );
}
}
@@ -50,7 +106,7 @@ class Jetpack_CLI extends WP_CLI_Command {
* wp jetpack disconnect user username
* wp jetpack disconnect user email@domain.com
*
- * @synopsis blog|[user <user_id>]
+ * @synopsis <blog|user> [<user_identifier>]
*/
public function disconnect( $args, $assoc_args ) {
if ( ! Jetpack::is_active() ) {
@@ -79,7 +135,7 @@ class Jetpack_CLI extends WP_CLI_Command {
WP_CLI::error( __( 'Please specify a valid user.', 'jetpack' ) );
}
} else {
- WP_CLI::error( __( 'Please specify a user.', 'jetpack' ) );
+ WP_CLI::error( __( 'Please specify a user by either ID, username, or email.', 'jetpack' ) );
}
}
@@ -104,17 +160,91 @@ class Jetpack_CLI extends WP_CLI_Command {
}
/**
- * Manage Jetpack Modules
+ * Reset Jetpack options and settings to default
*
* ## OPTIONS
*
- * list: View all available modules, and their status.
+ * modules: Resets modules to default state ( get_default_modules() )
*
- * activate <module_slug>: Activate a module.
+ * options: Resets all Jetpack options except:
+ * - All private options (Blog token, user token, etc...)
+ * - id (The Client ID/WP.com Blog ID of this site)
+ * - master_user
+ * - version
+ * - activated
*
- * deactivate <module_slug>: Deactivate a module.
+ * ## EXAMPLES
*
- * toggle <module_slug>: Toggle a module on or off.
+ * wp jetpack reset options
+ * wp jetpack reset modules
+ *
+ * @synopsis <modules|options>
+ */
+ public function reset( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'prompt';
+ if ( ! in_array( $action, array( 'options', 'modules' ) ) ) {
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+
+ // Are you sure?
+ jetpack_cli_are_you_sure();
+
+ switch ( $action ) {
+ case 'options':
+ $options_to_reset = Jetpack::get_jetpack_options_for_reset();
+
+ // Reset the Jetpack options
+ _e( "Resetting Jetpack Options...\n", "jetpack" );
+ sleep(1); // Take a breath
+ foreach ( $options_to_reset['jp_options'] as $option_to_reset ) {
+ Jetpack_Options::delete_option( $option_to_reset );
+ usleep( 100000 );
+ WP_CLI::success( sprintf( __( '%s option reset', 'jetpack' ), $option_to_reset ) );
+ }
+
+ // Reset the WP options
+ _e( "Resetting the jetpack options stored in wp_options...\n", "jetpack" );
+ usleep( 500000 ); // Take a breath
+ foreach ( $options_to_reset['wp_options'] as $option_to_reset ) {
+ delete_option( $option_to_reset );
+ usleep( 100000 );
+ WP_CLI::success( sprintf( __( '%s option reset', 'jetpack' ), $option_to_reset ) );
+ }
+
+ // Reset to default modules
+ _e( "Resetting default modules...\n", "jetpack" );
+ usleep( 500000 ); // Take a breath
+ $default_modules = Jetpack::get_default_modules();
+ Jetpack_Options::update_option( 'active_modules', $default_modules );
+ WP_CLI::success( __( 'Modules reset to default.', 'jetpack' ) );
+
+ // Jumpstart option is special
+ Jetpack_Options::update_option( 'jumpstart', 'new_connection' );
+ WP_CLI::success( __( 'jumpstart option reset', 'jetpack' ) );
+ break;
+ case 'modules':
+ $default_modules = Jetpack::get_default_modules();
+ Jetpack_Options::update_option( 'active_modules', $default_modules );
+ WP_CLI::success( __( 'Modules reset to default.', 'jetpack' ) );
+ break;
+ case 'prompt':
+ WP_CLI::error( __( 'Please specify if you would like to reset your options, or modules', 'jetpack' ) );
+ break;
+ }
+ }
+
+ /**
+ * Manage Jetpack Modules
+ *
+ * ## OPTIONS
+ *
+ * list : View all available modules, and their status.
+ * activate all : Activate all modules
+ * deactivate all: Deactivate all modules
+ *
+ * activate <module_slug> : Activate a module.
+ * deactivate <module_slug> : Deactivate a module.
+ * toggle <module_slug> : Toggle a module on or off.
*
* ## EXAMPLES
*
@@ -123,35 +253,47 @@ class Jetpack_CLI extends WP_CLI_Command {
* wp jetpack module deactivate stats
* wp jetpack module toggle stats
*
- * @synopsis [list|activate|deactivate|toggle [<module_name>]]
+ * wp jetpack module activate all
+ * wp jetpack module deactivate all
+ *
+ * @synopsis <list|activate|deactivate|toggle> [<module_name>]
*/
public function module( $args, $assoc_args ) {
$action = isset( $args[0] ) ? $args[0] : 'list';
if ( ! in_array( $action, array( 'list', 'activate', 'deactivate', 'toggle' ) ) ) {
WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
}
-
if ( in_array( $action, array( 'activate', 'deactivate', 'toggle' ) ) ) {
if ( isset( $args[1] ) ) {
$module_slug = $args[1];
- if ( ! Jetpack::is_module( $module_slug ) ) {
+ if ( 'all' !== $module_slug && ! Jetpack::is_module( $module_slug ) ) {
WP_CLI::error( sprintf( __( '%s is not a valid module.', 'jetpack' ), $module_slug ) );
}
if ( 'toggle' == $action ) {
$action = Jetpack::is_module_active( $module_slug ) ? 'deactivate' : 'activate';
}
+ // Bulk actions
+ if ( 'all' == $args[1] ) {
+ $action = ( 'deactivate' == $action ) ? 'deactivate_all' : 'activate_all';
+ }
+ // VaultPress needs to be handled elsewhere.
+ if ( in_array( $action, array( 'activate', 'deactivate', 'toggle' ) ) && 'vaultpress' == $args[1] ) {
+ WP_CLI::error( sprintf( _x( 'Please visit %s to configure your VaultPress subscription.', '%s is a website', 'jetpack' ), esc_url( 'https://vaultpress.com/jetpack/' ) ) );
+ }
} else {
WP_CLI::line( __( 'Please specify a valid module.', 'jetpack' ) );
$action = 'list';
}
}
-
switch ( $action ) {
case 'list':
WP_CLI::line( __( 'Available Modules:', 'jetpack' ) );
$modules = Jetpack::get_available_modules();
sort( $modules );
foreach( $modules as $module_slug ) {
+ if ( 'vaultpress' == $module_slug ) {
+ continue;
+ }
$active = Jetpack::is_module_active( $module_slug ) ? __( 'Active', 'jetpack' ) : __( 'Inactive', 'jetpack' );
WP_CLI::line( "\t" . str_pad( $module_slug, 24 ) . $active );
}
@@ -159,19 +301,299 @@ class Jetpack_CLI extends WP_CLI_Command {
case 'activate':
$module = Jetpack::get_module( $module_slug );
Jetpack::log( 'activate', $module_slug );
- Jetpack::activate_module( $module_slug, false );
+ Jetpack::activate_module( $module_slug, false, false );
WP_CLI::success( sprintf( __( '%s has been activated.', 'jetpack' ), $module['name'] ) );
break;
+ case 'activate_all':
+ $modules = Jetpack::get_available_modules();
+ Jetpack_Options::update_option( 'active_modules', $modules );
+ WP_CLI::success( __( 'All modules activated!', 'jetpack' ) );
+ break;
case 'deactivate':
$module = Jetpack::get_module( $module_slug );
Jetpack::log( 'deactivate', $module_slug );
Jetpack::deactivate_module( $module_slug );
WP_CLI::success( sprintf( __( '%s has been deactivated.', 'jetpack' ), $module['name'] ) );
break;
+ case 'deactivate_all':
+ Jetpack_Options::update_option( 'active_modules', '' );
+ WP_CLI::success( __( 'All modules deactivated!', 'jetpack' ) );
+ break;
case 'toggle':
// Will never happen, should have been handled above and changed to activate or deactivate.
break;
}
}
+ /**
+ * Manage Protect Settings
+ *
+ * ## OPTIONS
+ *
+ * whitelist: Whitelist an IP address. You can also read or clear the whitelist.
+ *
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack protect whitelist <ip address>
+ * wp jetpack protect whitelist list
+ * wp jetpack protect whitelist clear
+ *
+ * @synopsis <whitelist> [<ip|ip_low-ip_high|list|clear>]
+ */
+ public function protect( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'prompt';
+ if ( ! in_array( $action, array( 'whitelist' ) ) ) {
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+ // Check if module is active
+ if ( ! Jetpack::is_module_active( __FUNCTION__ ) ) {
+ WP_CLI::error( sprintf( _x( '%s is not active. You can activate it with "wp jetpack module activate %s"', '"wp jetpack module activate" is a command - do not translate', 'jetpack' ), __FUNCTION__, __FUNCTION__ ) );
+ }
+ if ( in_array( $action, array( 'whitelist' ) ) ) {
+ if ( isset( $args[1] ) ) {
+ $action = 'whitelist';
+ } else {
+ $action = 'prompt';
+ }
+ }
+ switch ( $action ) {
+ case 'whitelist':
+ $whitelist = array();
+ $new_ip = $args[1];
+ $current_whitelist = get_site_option( 'jetpack_protect_whitelist' );
+
+ // Build array of IPs that are already whitelisted.
+ // Re-build manually instead of using jetpack_protect_format_whitelist() so we can easily get
+ // low & high range params for jetpack_protect_ip_address_is_in_range();
+ foreach( $current_whitelist as $whitelisted ) {
+
+ // IP ranges
+ if ( $whitelisted->range ) {
+
+ // Is it already whitelisted?
+ if ( jetpack_protect_ip_address_is_in_range( $new_ip, $whitelisted->range_low, $whitelisted->range_high ) ) {
+ WP_CLI::error( sprintf( __( "%s has already been whitelisted", 'jetpack' ), $new_ip ) );
+ break;
+ }
+ $whitelist[] = $whitelisted->range_low . " - " . $whitelisted->range_high;
+
+ } else { // Individual IPs
+
+ // Check if the IP is already whitelisted (single IP only)
+ if ( $new_ip == $whitelisted->ip_address ) {
+ WP_CLI::error( sprintf( __( "%s has already been whitelisted", 'jetpack' ), $new_ip ) );
+ break;
+ }
+ $whitelist[] = $whitelisted->ip_address;
+
+ }
+ }
+
+ /*
+ * List the whitelist
+ * Done here because it's easier to read the $whitelist array after it's been rebuilt
+ */
+ if ( isset( $args[1] ) && 'list' == $args[1] ) {
+ if ( ! empty( $whitelist ) ) {
+ WP_CLI::success( __( 'Here are your whitelisted IPs:', 'jetpack' ) );
+ foreach ( $whitelist as $ip ) {
+ WP_CLI::line( "\t" . str_pad( $ip, 24 ) ) ;
+ }
+ } else {
+ WP_CLI::line( __( 'Whitelist is empty.', "jetpack" ) ) ;
+ }
+ break;
+ }
+
+ /*
+ * Clear the whitelist
+ */
+ if ( isset( $args[1] ) && 'clear' == $args[1] ) {
+ if ( ! empty( $whitelist ) ) {
+ $whitelist = array();
+ jetpack_protect_save_whitelist( $whitelist );
+ WP_CLI::success( __( 'Cleared all whitelisted IPs', 'jetpack' ) );
+ } else {
+ WP_CLI::line( __( 'Whitelist is empty.', "jetpack" ) ) ;
+ }
+ break;
+ }
+
+ // Append new IP to whitelist array
+ array_push( $whitelist, $new_ip );
+
+ // Save whitelist if there are no errors
+ $result = jetpack_protect_save_whitelist( $whitelist );
+ if ( is_wp_error( $result ) ) {
+ WP_CLI::error( __( $result, 'jetpack' ) );
+ }
+
+ WP_CLI::success( sprintf( __( '%s has been whitelisted.', 'jetpack' ), $new_ip ) );
+ break;
+ case 'prompt':
+ WP_CLI::error(
+ __( 'No command found.', 'jetpack' ) . "\n" .
+ __( 'Please enter the IP address you want to whitelist.', 'jetpack' ) . "\n" .
+ _x( 'You can save a range of IPs {low_range}-{high_range}. No spaces allowed. (example: 1.1.1.1-2.2.2.2)', 'Instructions on how to whitelist IP ranges - low_range/high_range should be translated.', 'jetpack' ) . "\n" .
+ _x( "You can also 'list' or 'clear' the whitelist.", "'list' and 'clear' are commands and should not be translated", 'jetpack' ) . "\n"
+ );
+ break;
+ }
+ }
+
+ /**
+ * Manage Jetpack Options
+ *
+ * ## OPTIONS
+ *
+ * list : List all jetpack options and their values
+ * delete : Delete an option
+ * - can only delete options that are white listed.
+ * update : update an option
+ * - can only update option strings
+ * get : get the value of an option
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack options list
+ * wp jetpack options get <option_name>
+ * wp jetpack options delete <option_name>
+ * wp jetpack options update <option_name> [<option_value>]
+ *
+ * @synopsis <list|get|delete|update> [<option_name>] [<option_value>]
+ */
+ public function options( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'list';
+ $safe_to_modify = Jetpack::get_jetpack_options_for_reset();
+
+ // Jumpstart is special
+ array_push( $safe_to_modify, 'jumpstart' );
+
+ // Is the option flagged as unsafe?
+ $flagged = ! in_array( $args[1], $safe_to_modify );
+
+ if ( ! in_array( $action, array( 'list', 'get', 'delete', 'update' ) ) ) {
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+
+ if ( isset( $args[0] ) ) {
+ if ( 'get' == $args[0] && isset( $args[1] ) ) {
+ $action = 'get';
+ } else if ( 'delete' == $args[0] && isset( $args[1] ) ) {
+ $action = 'delete';
+ } else if ( 'update' == $args[0] && isset( $args[1] ) ) {
+ $action = 'update';
+ } else {
+ $action = 'list';
+ }
+ }
+
+ // Bail if the option isn't found
+ $option = isset( $args[1] ) ? Jetpack_Options::get_option( $args[1] ) : false;
+ if ( isset( $args[1] ) && ! $option && 'update' !== $args[0] ) {
+ WP_CLI::error( __( 'Option not found or is empty. Use "list" to list option names', 'jetpack' ) );
+ }
+
+ // Let's print_r the option if it's an array
+ // Used in the 'get' and 'list' actions
+ $option = is_array( $option ) ? print_r( $option ) : $option;
+
+ switch ( $action ) {
+ case 'get':
+ WP_CLI::success( "\t" . $option );
+ break;
+ case 'delete':
+ jetpack_cli_are_you_sure( $flagged );
+
+ Jetpack_Options::delete_option( $args[1] );
+ WP_CLI::success( sprintf( __( 'Deleted option: %s', 'jetpack' ), $args[1] ) );
+ break;
+ case 'update':
+ jetpack_cli_are_you_sure( $flagged );
+
+ // Updating arrays would get pretty tricky...
+ $value = Jetpack_Options::get_option( $args[1] );
+ if ( $value && is_array( $value ) ) {
+ WP_CLI::error( __( 'Sorry, no updating arrays at this time', 'jetpack' ) );
+ }
+
+ Jetpack_Options::update_option( $args[1], $args[2] );
+ WP_CLI::success( sprintf( _x( 'Updated option: %s to "%s"', 'Updating an option from "this" to "that".', 'jetpack' ), $args[1], $args[2] ) );
+ break;
+ case 'list':
+ $options_compact = Jetpack_Options::get_option_names();
+ $options_non_compact = Jetpack_Options::get_option_names( 'non_compact' );
+ $options_private = Jetpack_Options::get_option_names( 'private' );
+ $options = array_merge( $options_compact, $options_non_compact, $options_private );
+
+ // Table headers
+ WP_CLI::line( "\t" . str_pad( __( 'Option', 'jetpack' ), 30 ) . __( 'Value', 'jetpack' ) );
+
+ // List out the options and their values
+ // Tell them if the value is empty or not
+ // Tell them if it's an array
+ foreach ( $options as $option ) {
+ $value = Jetpack_Options::get_option( $option );
+ if ( ! $value ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . 'Empty' );
+ continue;
+ }
+
+ if ( ! is_array( $value ) ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . $value );
+ } else if ( is_array( $value ) ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . 'Array - Use "get <option>" to read option array.' );
+ }
+ }
+ $option_text = '{' . _x( 'option', 'a variable command that a user can write, provided in the printed instructions', 'jetpack' ) . '}';
+ $value_text = '{' . _x( 'value', 'the value that they want to update the option to', 'jetpack' ) . '}';
+
+ WP_CLI::success(
+ _x( "Above are your options. You may 'get', 'delete', and 'update' them.", "'get', 'delete', and 'update' are commands - do not translate.", 'jetpack' ) . "\n" .
+ str_pad( 'wp jetpack options get', 26 ) . $option_text . "\n" .
+ str_pad( 'wp jetpack options delete', 26 ) . $option_text . "\n" .
+ str_pad( 'wp jetpack options update', 26 ) . "$option_text $value_text" . "\n" .
+ _x( "Type 'wp jetpack options' for more info.", "'wp jetpack options' is a command - do not translate.", 'jetpack' ) . "\n"
+ );
+ break;
+ }
+ }
}
+
+/*
+ * Standard "ask for permission to continue" function.
+ * If action cancelled, ask if they need help.
+ *
+ * Written outside of the class so it's not listed as an executable command w/ 'wp jetpack'
+ *
+ * @param $flagged bool false = normal option | true = flagged by get_jetpack_options_for_reset()
+ * @param $error_msg string (optional)
+ */
+function jetpack_cli_are_you_sure( $flagged = false, $error_msg = false ) {
+ $cli = new Jetpack_CLI();
+
+ // Default cancellation message
+ if ( ! $error_msg ) {
+ $error_msg =
+ __( 'Action cancelled. Have a question?', 'jetpack' )
+ . ' '
+ . $cli->green_open
+ . 'jetpack.me/support'
+ . $cli->color_close;
+ }
+
+ if ( ! $flagged ) {
+ $prompt_message = __( 'Are you sure? This cannot be undone. Type "yes" to continue:', '"yes" is a command. Do not translate that.', 'jetpack' );
+ } else {
+ /* translators: Don't translate the word yes here. */
+ $prompt_message = __( 'Are you sure? Modifying this option may disrupt your Jetpack connection. Type "yes" to continue.', 'jetpack' );
+ }
+
+ WP_CLI::line( $prompt_message );
+ $handle = fopen( "php://stdin", "r" );
+ $line = fgets( $handle );
+ if ( 'yes' != trim( $line ) ){
+ WP_CLI::error( $error_msg );
+ }
+} \ No newline at end of file