Completed
Push — master ( e090e4...18d79e )
by Damian
02:26
created

code/checks/FileAgeCheck.php (1 issue)

class opening brace is on a new line.

Coding Style Informational

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * Checks for the maximum age of one or more files or folders.
5
 * Useful for files which should be frequently auto-generated, 
6
 * like static caches, as well as for backup files and folders.
7
 * Does NOT check for existence of a file (will silently fail).
8
 *
9
 * Examples:
10
 * // Checks that Requirements::combine_files() has regenerated files in the last 24h
11
 * EnvironmentCheckSuite::register(
12
 * 	'check', 
13
 * 	'FileAgeCheck("' . ASSETS_PATH . '/_combined_files/*.js' . '", "-1 day", '>', " . FileAgeCheck::CHECK_ALL) . "'
14
 * );
15
 * 
16
 * // Checks that at least one backup folder has been created in the last 24h
17
 * EnvironmentCheckSuite::register(
18
 * 	'check', 
19
 * 	'FileAgeCheck("' . BASE_PATH . '/../backups/*' . '", "-1 day", '>', " . FileAgeCheck::CHECK_SINGLE) . "'
20
 * );
21
 */
22
class FileAgeCheck implements EnvironmentCheck {
0 ignored issues
show
As per PSR2, the opening brace for this class should be on a new line.
Loading history...
23
	/**
24
	 * @var int
25
	 */
26
	const CHECK_SINGLE = 1;
27
28
	/**
29
	 * @var int
30
	 */
31
	const CHECK_ALL = 2;
32
	
33
	/**
34
	 * Absolute path to a file or folder, compatible with glob().
35
	 *
36
	 * @var string
37
	 */
38
	protected $path;
39
40
	/**
41
	 * Relative date specification, compatible with strtotime().
42
	 *
43
	 * @var string
44
	 */
45
	protected $relativeAge;
46
47
	/**
48
	 * The function to use for checking file age: so filemtime(), filectime(), or fileatime().
49
	 *
50
	 * @var string
51
	 */
52
	protected $checkFn;
53
54
	/**
55
	 * Constant, check for a single file to match age criteria, or all of them.
56
	 *
57
	 * @var int
58
	 */
59
	protected $checkType;
60
61
	/**
62
	 * Type of comparison (either > or <).
63
	 *
64
	 * @var string
65
	 */
66
	protected $compareOperand;
67
68
	/**
69
	 * @param string $path
70
	 * @param string $relativeAge
71
	 * @param string $compareOperand
72
	 * @param null|int $checkType
73
	 * @param string $checkFn
74
	 */
75
	function __construct($path, $relativeAge, $compareOperand = '>', $checkType = null, $checkFn = 'filemtime') {
76
		$this->path = $path;
77
		$this->relativeAge = $relativeAge;
78
		$this->checkFn = $checkFn;
79
		$this->checkType = ($checkType) ? $checkType : self::CHECK_SINGLE;
80
		$this->compareOperand = $compareOperand;
81
	}
82
83
	/**
84
	 * @inheritdoc
85
	 *
86
	 * @return array
87
	 */
88
	function check() {
89
		$cutoffTime =  strtotime($this->relativeAge, SS_Datetime::now()->Format('U'));
90
		$files = $this->getFiles();
91
		$invalidFiles = array();
92
		$validFiles = array();
93
		$checkFn = $this->checkFn;
94
		$allValid = true;
95
		if($files) foreach($files as $file) {
96
			$fileTime = $checkFn($file);
97
			$valid = ($this->compareOperand == '>') ? ($fileTime >= $cutoffTime) : ($fileTime <= $cutoffTime);
98
			if($valid) {
99
				$validFiles[] = $file;
100
			} else {
101
				$invalidFiles[] = $file;
102
				if($this->checkType == self::CHECK_ALL) {
103
					return array(
104
						EnvironmentCheck::ERROR,
105
						sprintf(
106
							'File "%s" doesn\'t match age check (compare %s: %s, actual: %s)', 
107
							$file, $this->compareOperand, date('c', $cutoffTime), date('c', $fileTime)
108
						)
109
					);	
110
				}
111
			}
112
		}
113
114
		// If at least one file was valid, count as passed
115
		if($this->checkType == self::CHECK_SINGLE && count($invalidFiles) < count($files)) {
116
			return array(EnvironmentCheck::OK, '');
117
		} else {
118
	       if (count($invalidFiles) == 0) return array(EnvironmentCheck::OK, '');
119
	       else return array(
120
				EnvironmentCheck::ERROR,
121
				sprintf('No files matched criteria (%s %s)', $this->compareOperand, date('c', $cutoffTime))
122
			);
123
		}
124
			
125
	}
126
127
	/**
128
	 * Gets a list of absolute file paths.
129
	 *
130
	 * @return array
131
	 */
132
	protected function getFiles() {
133
		return glob($this->path);
134
	}
135
}
136