class-orchestrate-runner.php 3.46 KB
Newer Older
1
2
3
4
5
<?php

namespace Automattic\WP\Cron_Control\CLI;

/**
6
 * Commands used by the Go-based runner to execute events
7
 */
8
class Orchestrate_Runner extends \WP_CLI_Command {
9
	/**
Erick Hitter's avatar
Clarify  
Erick Hitter committed
10
	 * List the next set of events to run; meant for Runner
11
	 *
12
	 * Will not be all events, just those atop the curated queue
13
	 *
Erick Hitter's avatar
Clarify  
Erick Hitter committed
14
15
	 * Not intended for human use, rather it powers the Go-based Runner. Use the `events list` command instead.
	 *
16
	 * @subcommand list-due-batch
17
	 */
18
	public function list_due_now( $args, $assoc_args ) {
19
20
21
22
		if ( 0 !== \Automattic\WP\Cron_Control\Events::instance()->run_disabled() ) {
			\WP_CLI::error( __( 'Automatic event execution is disabled', 'automattic-cron-control' ) );
		}

23
24
25
26
27
28
29
30
31
		$events = \Automattic\WP\Cron_Control\Events::instance()->get_events();

		$format = \WP_CLI\Utils\get_flag_value( $assoc_args, 'format', 'table' );

		\WP_CLI\Utils\format_items( $format, $events['events'], array(
			'timestamp',
			'action',
			'instance',
		) );
32
	}
33
34

	/**
Erick Hitter's avatar
Clarify  
Erick Hitter committed
35
36
37
	 * Run a given event; meant for Runner
	 *
	 * Not intended for human use, rather it powers the Go-based Runner. Use the `events run` command instead.
38
39
40
41
42
	 *
	 * @subcommand run
	 * @synopsis --timestamp=<timestamp> --action=<action-hashed> --instance=<instance>
	 */
	public function run_event( $args, $assoc_args ) {
43
44
45
46
		if ( 0 !== \Automattic\WP\Cron_Control\Events::instance()->run_disabled() ) {
			\WP_CLI::error( __( 'Automatic event execution is disabled', 'automattic-cron-control' ) );
		}

47
48
49
50
		$timestamp = \WP_CLI\Utils\get_flag_value( $assoc_args, 'timestamp', null );
		$action    = \WP_CLI\Utils\get_flag_value( $assoc_args, 'action',    null );
		$instance  = \WP_CLI\Utils\get_flag_value( $assoc_args, 'instance',  null );

51
52
53
54
55
56
57
58
59
60
		if ( ! is_numeric( $timestamp ) ) {
			\WP_CLI::error( __( 'Invalid timestamp', 'automattic-cron-control' ) );
		}

		if ( ! is_string( $action ) ) {
			\WP_CLI::error( __( 'Invalid action', 'automattic-cron-control' ) );
		}

		if( ! is_string( $instance ) ) {
			\WP_CLI::error( __( 'Invalid instance', 'automattic-cron-control' ) );
61
62
63
64
		}

		$now = time();
		if ( $timestamp > $now ) {
65
			\WP_CLI::error( sprintf( __( 'Given timestamp is for %1$s GMT, %2$s from now. The event\'s existence was not confirmed, and no attempt was made to execute it.', 'automattic-cron-control' ), date( TIME_FORMAT, $timestamp ), human_time_diff( $now, $timestamp ) ) );
66
67
		}

68
69
70
		// Prepare environment
		\Automattic\WP\Cron_Control\set_doing_cron();

71
72
73
74
75
		// Run the event
		$run = \Automattic\WP\Cron_Control\run_event( $timestamp, $action, $instance );

		if ( is_wp_error( $run ) ) {
			\WP_CLI::error( $run->get_error_message() );
76
		} elseif ( isset( $run['success'] ) && true === $run['success'] ) {
77
78
79
80
81
			\WP_CLI::success( $run['message'] );
		} else {
			\WP_CLI::error( $run['message'] );
		}
	}
82
83

	/**
Erick Hitter's avatar
Clarify  
Erick Hitter committed
84
85
86
	 * Get some details needed to execute events; meant for Runner
	 *
	 * Not intended for human use, rather it powers the Go-based Runner. Use the `orchestrate manage-automatic-execution` command instead.
87
88
89
90
91
92
	 *
	 * @subcommand get-info
	 */
	public function get_info( $args, $assoc_args ) {
		$info = array(
			array(
93
				'multisite' => is_multisite() ? 1 : 0,
94
				'siteurl'   => site_url(),
95
				'disabled'  => \Automattic\WP\Cron_Control\Events::instance()->run_disabled(),
96
97
98
99
100
			),
		);

		$format = \WP_CLI\Utils\get_flag_value( $assoc_args, 'format', 'table' );

101
		\WP_CLI\Utils\format_items( $format, $info, array_keys( $info[0] ) );
102
	}
103
104
}

105
\WP_CLI::add_command( 'cron-control orchestrate runner-only', 'Automattic\WP\Cron_Control\CLI\Orchestrate_Runner' );