-
Notifications
You must be signed in to change notification settings - Fork 0
/
BraftonError.php
306 lines (298 loc) · 9.27 KB
/
BraftonError.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
<?php
/**
* Brafton Error Class for reporting to Brafton Servers
*
* This class provides an interface between both the client CMS and Brafton Servers to report Errors as a result of the
* Importer Plugin/module. Critical Errors (E_ERROR) should be reported to Brafton Servers while all other Errors are logged site side.
*
* PHP version 5
*
*
* @package Brafton API Library
* @author Deryk King <[email protected]>
* @version 2.3.1
* @since File available since Release 3.0.0
*/
/**
*
*/
class BraftonErrorReport {
/**
* Current url location
*
* @access private
* @var string
*/
private $url;
/**
* Encryption key for verification for the error logging api
*
* @access private
* @var string
*/
private $e_key;
/**
* Url location for error reporting with $e_key as [GET] Parameter
*
* @access private
* @var string
*/
private $post_url;
/**
* Current section reporting the error
*
* @access private
* @var string
*/
private $section;
/**
* current brafton level of severity
*
* @access public
* @var int
*/
public $level;
/**
* stores value of Mode to be in
*
* @access public
* @var boolean
*/
public $debug;
/**
* domain script is running on
*
* @access public
* @var string
*/
private $domain;
/**
* Constructor method
*
* @access public
* @param string $api
* @param string $brand
* @param boolean $debug
* @return void
*/
public function __construct($api, $brand, $debug){
$this->debug = $debug;
$this->url = $_SERVER['REQUEST_URI'];
$this->domain = $_SERVER['HTTP_HOST'];
$this->api = $api;
$this->brand = $brand;
$this->e_key = 'ucocfukkuineaxf2lzl3x6h9';
$this->post_url = 'http://updater.brafton.com/errorlog/wordpress/error/'.$this->e_key;
$this->level = 1;
$this->section = 'error initialize';
register_shutdown_function(array($this, 'check_for_fatal'));
set_error_handler(array($this, 'log_error') );
set_exception_handler(array($this, 'log_exception'));
ini_set( "display_errors", 0 );
error_reporting( E_ALL );
}
/**
* Sets the current section reporting the error
*
* @access public
* @param string $sec
*/
public function set_section($sec){
$this->section = $sec;
}
/**
* Gets the current Section reporting an error
*
* @access public
* @return string
*/
public function get_section(){
return $this->section;
}
/**
* Sets the Brafton level of Severity
*
* @access public
* @param int $level
* @return void
*/
public function set_level($level){
$this->level = $level;
}
//upon error being thrown log_error fires off to throw an exception erro
/**
* Exception handler for errors
*
* Sets up to create the Exception Object with the appropriate information for handling an Exception as an Error
*
* @access public
* @param int $num
* @param string $str
* @param string $file
* @param int $line
* @param string $content (default: null)
* @return void
*/
public function log_error( $num, $str, $file, $line, $context = null )
{
if($str == 'Call to a member function getAttribute() on a non-object'){
$str = $str. " Couldn't retrieve either (news, comments, categoryDefinition)";
}
$this->log_exception( new ErrorException( $str, 0, $num, $file, $line ) );
}
/**
* retrieves the current error log
*
* @access private
* @return array
*/
private function b_e_log(){
//Use this method to get current errorlog from client CMS
return $brafton;
}
/**
* Check for known minor errors
*
* @access public
* @param obj $e
* @return boolean
*/
public function check_known_errors($e){
switch(basename($e->getFile())){
case 'link-template.php':
return false;
break;
case 'post.php':
return false;
break;
case 'class-wp-image-editor-imagick.php':
return false;
break;
case 'translation-management.class.php':
return false;
break;
default:
return true;
}
}
/**
* Handles Errors and Exceptions
*
* This method must accomplish the following.
* check if Exeption object severity is set and if it is not set a default level 2. Prevents Non Vital Errors from being
* Reported.
* Check Message for the cron did not run and sets level 1 so it is reported as Vital Error.
* Checks for known unsolvable however non essential errors so as not to log them or report them.
* Make a local report via the make_local_report method to log the error for future debugging.
* Make a Remote report to Brafton (if not on a localhost machine) and severity was level 1
* Set redirect to previous page if running manually.
*
* @access public
* @param obj Exception $e
* @return void
*/
public function log_exception( Exception $e ){
$errorLevel = method_exists($e,'getseverity')? $e->getseverity(): 2;
$errorLevel = $e->getMessage() == 'Article Importer has failed to run. The cron was scheduled but did not trigger at the appropriate time'? 1 : $errorLevel;
if ( ($errorLevel == 1) || ($this->debug) && ($this->check_known_errors($e)) ){
$errorlog = $this->make_local_report($e, $errorLevel);
if($errorLevel == 1){
/**
* CMS Specific: Handle how to make a report to Brafton Servers Here. Be sure to Turn Debug Mode "ON"
* automatically.
*/
$append = '&b_error=vital';
if($this->domain != 'localhost'){
$this->send_remote_report($errorlog);
}
if(isset($_GET['b_error']) && $_GET['b_error'] == 'vital'){ $append = ''; }
header("LOCATION:$this->url{$append}");
}else {
return;
}
}
return;
}
//function for checking if fatal error has occured and trigger the error flow
/**
* Checks form fatal Errors E_ERROR/severity=1
*
* @access public
* @return void
*/
public function check_for_fatal(){
$error = error_get_last();
if ( $error["type"] == E_ERROR )
$this->log_error( $error["type"], $error["message"], $error["file"], $error["line"] );
}
/**
* Sets Debug Tracing Message
*
* Sets up a more robust Message for tracing the progress and stack of the scripts when logging errors to the system.
*
* @access public
* @param string $msg
* @return void
*/
public function debug_trace($msg){
if(!$this->debug){
return;
}
if($this->level > 2){ return; }
$brafton_error = $this->b_e_log();
$debug_trace = array(
'client_sys_time' => date(get_option('date_format')) . " " . date("H:i:s"),
'error' => 'Debug Tace : '.$msg['message'].' in '. $msg['file'] . ' on line '. $msg['line'] . ' in section ' . $this->section
);
$brafton_error[] = $debug_trace;
update_option('brafton_e_log', $brafton_error);
}
/**
* Make a local report of errors
*
* This method converts the error Object into an array for storage into the local cms in this method. It must return the
* array for later consumption by the remote report method.
*
* @access public
* @param obj $e
* @param int $errorLevel
* @return array
*/
public function make_local_report($e, $errorLevel){
$brafton_error = $this->b_e_log();
$errorlog = array(
'Domain' => $this->domain,
'API' => $this->api,
'Brand' => $this->brand,
'client_sys_time' => date(get_option('date_format')) . " " . date("H:i:s"),
'error' => get_class($e).' : '.$errorLevel.' | '.$e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' brafton_level '.$this->level.' in section '.$this->section
);
$brafton_error[] = $errorlog;
/**
* wordpress example of storing local report
* update_option('brafton_e_log', $brafton_error);
*/
return $errorlog;
}
/**
* Make a remote report of errors
*
* Remote data must be a json object stored in $_POST['error'].
*
* @access public
* @param array $errorlog
* @return void
*/
public function send_remote_report($errorlog){
/**
* Wordpress example
* $post_args = array(
* 'body' => array(
* 'error' => json_encode($errorlog)
* )
* );
* wp_remote_post($this->post_url, $post_args);
*/
}
}
?>