Completed
Push — try/jetbench ( b78066 )
by
unknown
19:42 queued 12:37
created

Jetbench::set_module_statuses()   B

Complexity

Conditions 7
Paths 20

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 20
nop 0
dl 0
loc 31
rs 8.4906
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Jetbench allows dynamic, transient enabling/disabling and some configuration of Jetpack modules based on a cookie.
5
 *
6
 * This allows us to benchmark and debug the effect of Jetpack configuration changes without making permanent changes
7
 * to a site.
8
 *
9
 * TODO: generate cookie name based on shared secret?
10
 */
11
12
// basic idea here is to hook super early and change configuration for this request in a transient way
13
if ( ! isset( $_COOKIE[JETPACK__BENCHMARK_COOKIE] ) ) {
14
	return;
15
}
16
17
$cookie = $_COOKIE[JETPACK__BENCHMARK_COOKIE];
18
19
$jetbench_settings = json_decode( $cookie, true );
20
21
if ( ! $jetbench_settings ) {
22
	error_log("Could not JSON decode Jetpack Benchmark settings: " . $cookie );
23
	unset( $_COOKIE[JETPACK__BENCHMARK_COOKIE] );
24
	if ( ! headers_sent() ) {
25
		setcookie( JETPACK__BENCHMARK_COOKIE, '', time() - ( 15 * 60 ) );
26
	}
27
	return;
28
}
29
30
error_log(print_r($jetbench_settings,1));
31
32
class Jetbench {
33
	static $force_module_statuses = array();
34
	static $settings;
35
36
	static function init( $settings ) {
37
		self::$settings = $settings;
38
39
		// after Jetpack::init is called, but before Jetpack::load_modules is called...
40
		add_filter( 'plugins_loaded', array( 'Jetbench', 'set_module_statuses' ) );
41
42
		// when we ask for active Jetpack modules, filter the results
43
		add_filter( 'option_jetpack_active_modules', array( 'Jetbench', 'filter_active_modules' ) );
44
	}
45
46
	static function set_module_statuses() {
47
		// load configuration into static variables
48
		$enabled_modules = array();
49
		$disabled_modules = array();
50
51
		foreach ( Jetpack::get_available_modules() as $module ) {
52
			error_log("setting status for $module");
53
			if ( isset( self::$settings[$module] ) ) {
54
				// enable module based on truthiness of configuration value
55
				if ( self::$force_module_statuses[$module] = !! self::$settings[$module] ) {
56
					$enabled_modules[] = $module;
57
				} else {
58
					$disabled_modules[] = $module;
59
				}
60
61
				// if ( 'somename' === $module && is_array( $settings[$module] ) ) {
62
					// do something special with $settings[$module]
63
				// }
64
			}
65
		}
66
67
		if ( ! headers_sent() ) {
68
			if ( count( $disabled_modules ) > 0 ) {
69
				header( 'X-Jetbench-Module-Disabled: ' . implode( ',', $disabled_modules ) );
70
			}
71
72
			if ( count( $enabled_modules ) > 0 ) {
73
				header( 'X-Jetbench-Module-Enabled: ' . implode( ',', $enabled_modules ) );
74
			}
75
		}
76
	}
77
78
	static function filter_active_modules( $modules ) {
79
		$disabled = array();
80
		$enabled = array();
81
82
		foreach( self::$force_module_statuses as $module => $status ) {
83
			if ( $status ) {
84
				if ( ! in_array( $module, $modules ) ) {
85
					$modules[] = $module;
86
					$enabled[] = $module;
87
				}
88
			} else {
89
				while ( ( $key = array_search( $module, $modules ) ) !== false ) {
90
					unset( $modules[ $key ]);
91
					$disabled[] = $module;
92
				}
93
			}
94
		}
95
96
		return $modules;
97
	}
98
}
99
100
Jetbench::init( $jetbench_settings );
101
102
103