diff options
author | Yury German <blueknight@gentoo.org> | 2016-02-12 22:22:00 -0500 |
---|---|---|
committer | Yury German <blueknight@gentoo.org> | 2016-02-12 22:22:00 -0500 |
commit | 657cafe0e955cf88033597f131aa50835140c617 (patch) | |
tree | cf21a30d319cb2a238a6cfb8b4eb3b20b1b5dcff /plugins/jetpack/class.jetpack-cli.php | |
parent | Adding New Mantra version 2.4.1.1 - Bug 574468 (diff) | |
download | blogs-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.php | 456 |
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 |