|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace App\Models; |
|
4
|
|
|
|
|
5
|
|
|
use Illuminate\Database\Eloquent\Model; |
|
6
|
|
|
|
|
7
|
|
|
/** |
|
8
|
|
|
* App\Models\Device |
|
9
|
|
|
* |
|
10
|
|
|
* @property integer $device_id |
|
11
|
|
|
* @property string $hostname |
|
12
|
|
|
* @property string $sysName |
|
13
|
|
|
* @property mixed $ip |
|
14
|
|
|
* @property string $community |
|
15
|
|
|
* @property string $authlevel |
|
16
|
|
|
* @property string $authname |
|
17
|
|
|
* @property string $authpass |
|
18
|
|
|
* @property string $authalgo |
|
19
|
|
|
* @property string $cryptopass |
|
20
|
|
|
* @property string $cryptoalgo |
|
21
|
|
|
* @property string $snmpver |
|
22
|
|
|
* @property integer $port |
|
23
|
|
|
* @property string $transport |
|
24
|
|
|
* @property integer $timeout |
|
25
|
|
|
* @property integer $retries |
|
26
|
|
|
* @property string $bgpLocalAs |
|
27
|
|
|
* @property string $sysObjectID |
|
28
|
|
|
* @property string $sysDescr |
|
29
|
|
|
* @property string $sysContact |
|
30
|
|
|
* @property string $version |
|
31
|
|
|
* @property string $hardware |
|
32
|
|
|
* @property string $features |
|
33
|
|
|
* @property string $location |
|
34
|
|
|
* @property string $os |
|
35
|
|
|
* @property boolean $status |
|
36
|
|
|
* @property string $status_reason |
|
37
|
|
|
* @property boolean $ignore |
|
38
|
|
|
* @property boolean $disabled |
|
39
|
|
|
* @property integer $uptime |
|
40
|
|
|
* @property integer $agent_uptime |
|
41
|
|
|
* @property string $last_polled |
|
42
|
|
|
* @property string $last_poll_attempted |
|
43
|
|
|
* @property float $last_polled_timetaken |
|
44
|
|
|
* @property float $last_discovered_timetaken |
|
45
|
|
|
* @property string $last_discovered |
|
46
|
|
|
* @property string $last_ping |
|
47
|
|
|
* @property float $last_ping_timetaken |
|
48
|
|
|
* @property string $purpose |
|
49
|
|
|
* @property string $type |
|
50
|
|
|
* @property string $serial |
|
51
|
|
|
* @property string $icon |
|
52
|
|
|
* @property integer $poller_group |
|
53
|
|
|
* @property boolean $override_sysLocation |
|
54
|
|
|
* @property string $notes |
|
55
|
|
|
* @property integer $port_association_mode |
|
56
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\User[] $users |
|
57
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Port[] $ports |
|
58
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\General\Syslog[] $syslogs |
|
59
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\General\Eventlog[] $eventlogs |
|
60
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Alerting\Alert[] $alerts |
|
61
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Alerting\Rule[] $rules |
|
62
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\General\Eventlog[] $eventlog |
|
63
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Sensor[] $sensors |
|
64
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereDeviceId($value) |
|
65
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereHostname($value) |
|
66
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSysName($value) |
|
67
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereIp($value) |
|
68
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereCommunity($value) |
|
69
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereAuthlevel($value) |
|
70
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereAuthname($value) |
|
71
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereAuthpass($value) |
|
72
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereAuthalgo($value) |
|
73
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereCryptopass($value) |
|
74
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereCryptoalgo($value) |
|
75
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSnmpver($value) |
|
76
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device wherePort($value) |
|
77
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereTransport($value) |
|
78
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereTimeout($value) |
|
79
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereRetries($value) |
|
80
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereBgpLocalAs($value) |
|
81
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSysObjectID($value) |
|
82
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSysDescr($value) |
|
83
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSysContact($value) |
|
84
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereVersion($value) |
|
85
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereHardware($value) |
|
86
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereFeatures($value) |
|
87
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLocation($value) |
|
88
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereOs($value) |
|
89
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereStatus($value) |
|
90
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereStatusReason($value) |
|
91
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereIgnore($value) |
|
92
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereDisabled($value) |
|
93
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereUptime($value) |
|
94
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereAgentUptime($value) |
|
95
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastPolled($value) |
|
96
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastPollAttempted($value) |
|
97
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastPolledTimetaken($value) |
|
98
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastDiscoveredTimetaken($value) |
|
99
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastDiscovered($value) |
|
100
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastPing($value) |
|
101
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereLastPingTimetaken($value) |
|
102
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device wherePurpose($value) |
|
103
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereType($value) |
|
104
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereSerial($value) |
|
105
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereIcon($value) |
|
106
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device wherePollerGroup($value) |
|
107
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereOverrideSysLocation($value) |
|
108
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device whereNotes($value) |
|
109
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device wherePortAssociationMode($value) |
|
110
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device isUp() |
|
111
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device isDown() |
|
112
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device isIgnored() |
|
113
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device notIgnored() |
|
114
|
|
|
* @method static \Illuminate\Database\Query\Builder|\App\Models\Device isDisabled() |
|
115
|
|
|
* @mixin \Eloquent |
|
116
|
|
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\DeviceGroup[] $groups |
|
117
|
|
|
*/ |
|
118
|
|
|
class Device extends Model |
|
119
|
|
|
{ |
|
120
|
|
|
/** |
|
121
|
|
|
* Indicates if the model should be timestamped. |
|
122
|
|
|
* |
|
123
|
|
|
* @var bool |
|
124
|
|
|
*/ |
|
125
|
|
|
public $timestamps = false; |
|
126
|
|
|
/** |
|
127
|
|
|
* The table associated with the model. |
|
128
|
|
|
* |
|
129
|
|
|
* @var string |
|
130
|
|
|
*/ |
|
131
|
|
|
protected $table = 'devices'; |
|
132
|
|
|
/** |
|
133
|
|
|
* The primary key column name. |
|
134
|
|
|
* |
|
135
|
|
|
* @var string |
|
136
|
|
|
*/ |
|
137
|
|
|
protected $primaryKey = 'device_id'; |
|
138
|
|
|
|
|
139
|
|
|
/** |
|
140
|
|
|
* The attributes that are mass assignable. |
|
141
|
|
|
* |
|
142
|
|
|
* @var array |
|
143
|
|
|
*/ |
|
144
|
|
|
protected $fillable = ['hostname', 'ip', 'status', 'status_reason']; |
|
145
|
|
|
|
|
146
|
|
|
/** |
|
147
|
|
|
* Initialize this class |
|
148
|
|
|
*/ |
|
149
|
|
|
public static function boot() |
|
150
|
|
|
{ |
|
151
|
|
|
parent::boot(); |
|
152
|
|
|
|
|
153
|
|
|
static::deleting(function (Device $device) { |
|
154
|
|
|
// delete related data |
|
155
|
|
|
$device->ports()->delete(); |
|
156
|
|
|
$device->syslogs()->delete(); |
|
157
|
|
|
$device->eventlogs()->delete(); |
|
158
|
|
|
}); |
|
159
|
|
|
} |
|
160
|
|
|
|
|
161
|
|
|
/** |
|
162
|
|
|
* Relationship to App\Models\Port |
|
163
|
|
|
* Returns a list of the ports this device has. |
|
164
|
|
|
*/ |
|
165
|
|
|
public function ports() |
|
166
|
|
|
{ |
|
167
|
|
|
return $this->hasMany('App\Models\Port', 'device_id', 'device_id'); |
|
168
|
|
|
} |
|
169
|
|
|
|
|
170
|
|
|
/** |
|
171
|
|
|
* Relationship to App\Models\General\Syslog |
|
172
|
|
|
* |
|
173
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\HasMany |
|
174
|
|
|
*/ |
|
175
|
|
|
public function syslogs() |
|
176
|
|
|
{ |
|
177
|
|
|
return $this->hasMany('App\Models\General\Syslog', 'device_id', 'device_id'); |
|
178
|
|
|
} |
|
179
|
|
|
|
|
180
|
|
|
// ---- Accessors/Mutators ---- |
|
181
|
|
|
|
|
182
|
|
|
/** |
|
183
|
|
|
* Relationship to App\Models\General\Eventlog |
|
184
|
|
|
* |
|
185
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\HasMany |
|
186
|
|
|
*/ |
|
187
|
|
|
public function eventlogs() |
|
188
|
|
|
{ |
|
189
|
|
|
return $this->hasMany('App\Models\General\Eventlog', 'host', 'device_id'); |
|
190
|
|
|
} |
|
191
|
|
|
|
|
192
|
|
|
/** |
|
193
|
|
|
* @return string |
|
194
|
|
|
*/ |
|
195
|
|
|
public function logo() |
|
196
|
|
|
{ |
|
197
|
|
|
$icon = $this->icon; |
|
198
|
|
|
if (isset($icon)) { |
|
199
|
|
|
return asset('images/os/'.$icon.'.png'); |
|
200
|
|
|
} else { |
|
201
|
|
|
return asset('images/os/generic.png'); |
|
202
|
|
|
} |
|
203
|
|
|
} |
|
204
|
|
|
|
|
205
|
|
|
/** |
|
206
|
|
|
* @return string |
|
207
|
|
|
*/ |
|
208
|
|
|
public function statusColour() |
|
209
|
|
|
{ |
|
210
|
|
|
$status = $this->status; |
|
211
|
|
|
$ignore = $this->ignore; |
|
212
|
|
|
$disabled = $this->disabled; |
|
213
|
|
|
if ($disabled == 1) { |
|
214
|
|
|
return 'teal'; |
|
215
|
|
|
} elseif ($ignore == 1) { |
|
216
|
|
|
return 'yellow'; |
|
217
|
|
|
} elseif ($status == 0) { |
|
218
|
|
|
return 'danger'; |
|
219
|
|
|
} else { |
|
220
|
|
|
return 'success'; |
|
221
|
|
|
} |
|
222
|
|
|
} |
|
223
|
|
|
|
|
224
|
|
|
// ---- Query scopes ---- |
|
225
|
|
|
|
|
226
|
|
|
/** |
|
227
|
|
|
* @param int $seconds |
|
228
|
|
|
* @return string |
|
229
|
|
|
*/ |
|
230
|
|
|
public function formatUptime($seconds) |
|
231
|
|
|
{ |
|
232
|
|
|
if (empty($seconds)) { |
|
233
|
|
|
$seconds = 0; |
|
234
|
|
|
} |
|
235
|
|
|
$from = new \DateTime("@0"); |
|
236
|
|
|
$to = new \DateTime("@$seconds"); |
|
237
|
|
|
return $from->diff($to)->format('%a d, %h h, %i m and %s s'); |
|
238
|
|
|
} |
|
239
|
|
|
|
|
240
|
|
|
public function getIpAttribute($ip) |
|
241
|
|
|
{ |
|
242
|
|
|
if (empty($ip)) { |
|
243
|
|
|
return null; |
|
244
|
|
|
} |
|
245
|
|
|
// @ suppresses warning, inet_ntop() returns false if it fails |
|
246
|
|
|
return @inet_ntop($ip) ?: null; |
|
247
|
|
|
} |
|
248
|
|
|
|
|
249
|
|
|
public function setIpAttribute($ip) |
|
250
|
|
|
{ |
|
251
|
|
|
$this->attributes['ip'] = inet_pton($ip); |
|
252
|
|
|
} |
|
253
|
|
|
|
|
254
|
|
View Code Duplication |
public function scopeIsUp($query) |
|
|
|
|
|
|
255
|
|
|
{ |
|
256
|
|
|
return $query->where([ |
|
257
|
|
|
['status', '=', 1], |
|
258
|
|
|
['ignore', '=', 0], |
|
259
|
|
|
['disabled', '=', 0] |
|
260
|
|
|
]); |
|
261
|
|
|
} |
|
262
|
|
|
|
|
263
|
|
View Code Duplication |
public function scopeIsDown($query) |
|
|
|
|
|
|
264
|
|
|
{ |
|
265
|
|
|
return $query->where([ |
|
266
|
|
|
['status', '=', 0], |
|
267
|
|
|
['ignore', '=', 0], |
|
268
|
|
|
['disabled', '=', 0] |
|
269
|
|
|
]); |
|
270
|
|
|
} |
|
271
|
|
|
|
|
272
|
|
|
// ---- Define Relationships ---- |
|
273
|
|
|
|
|
274
|
|
|
public function scopeIsIgnored($query) |
|
275
|
|
|
{ |
|
276
|
|
|
return $query->where([ |
|
277
|
|
|
['ignore', '=', 1], |
|
278
|
|
|
['disabled', '=', 0] |
|
279
|
|
|
]); |
|
280
|
|
|
} |
|
281
|
|
|
|
|
282
|
|
|
public function scopeNotIgnored($query) |
|
283
|
|
|
{ |
|
284
|
|
|
return $query->where([ |
|
285
|
|
|
['ignore', '=', 0] |
|
286
|
|
|
]); |
|
287
|
|
|
} |
|
288
|
|
|
|
|
289
|
|
|
public function scopeIsDisabled($query) |
|
290
|
|
|
{ |
|
291
|
|
|
return $query->where([ |
|
292
|
|
|
['disabled', '=', 1] |
|
293
|
|
|
]); |
|
294
|
|
|
} |
|
295
|
|
|
|
|
296
|
|
|
/** |
|
297
|
|
|
* Relationship to App\Models\Alerting\Alert |
|
298
|
|
|
* |
|
299
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
300
|
|
|
*/ |
|
301
|
|
|
public function alerts() |
|
302
|
|
|
{ |
|
303
|
|
|
return $this->hasMany('App\Models\Alerting\Alert', 'device_id'); |
|
304
|
|
|
} |
|
305
|
|
|
|
|
306
|
|
|
/** |
|
307
|
|
|
* Relationship to App\Models\DeviceGroup |
|
308
|
|
|
* |
|
309
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany |
|
310
|
|
|
*/ |
|
311
|
|
|
public function groups() |
|
312
|
|
|
{ |
|
313
|
|
|
return $this->belongsToMany('App\Models\DeviceGroup', 'device_group_device', 'device_id', 'device_group_id'); |
|
314
|
|
|
} |
|
315
|
|
|
|
|
316
|
|
|
/** |
|
317
|
|
|
* Relationship to App\Models\Alerting\Rule |
|
318
|
|
|
* |
|
319
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
320
|
|
|
*/ |
|
321
|
|
|
public function rules() |
|
322
|
|
|
{ |
|
323
|
|
|
return $this->hasMany('App\Models\Alerting\Rule', 'device_id'); |
|
324
|
|
|
} |
|
325
|
|
|
|
|
326
|
|
|
/** |
|
327
|
|
|
* Relationship to App\Models\Sensor |
|
328
|
|
|
* |
|
329
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
330
|
|
|
*/ |
|
331
|
|
|
public function sensors() |
|
332
|
|
|
{ |
|
333
|
|
|
return $this->hasMany('App\Models\Sensor', 'device_id'); |
|
334
|
|
|
} |
|
335
|
|
|
|
|
336
|
|
|
/** |
|
337
|
|
|
* Relationship to App\Models\Service |
|
338
|
|
|
* |
|
339
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
340
|
|
|
*/ |
|
341
|
|
|
public function services() |
|
342
|
|
|
{ |
|
343
|
|
|
return $this->hasMany('App\Models\Service', 'device_id'); |
|
344
|
|
|
} |
|
345
|
|
|
|
|
346
|
|
|
/** |
|
347
|
|
|
* Relationship to App\Models\User |
|
348
|
|
|
* Does not include users with global permissions. |
|
349
|
|
|
* |
|
350
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany |
|
351
|
|
|
*/ |
|
352
|
|
|
public function users() |
|
353
|
|
|
{ |
|
354
|
|
|
return $this->belongsToMany('App\Models\User', 'devices_perms', 'device_id', 'user_id'); |
|
355
|
|
|
} |
|
356
|
|
|
|
|
357
|
|
|
/** |
|
358
|
|
|
* Relationship to App\Models\Processor |
|
359
|
|
|
* |
|
360
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
361
|
|
|
*/ |
|
362
|
|
|
public function processors() |
|
363
|
|
|
{ |
|
364
|
|
|
return $this->hasMany('App\Models\Processor', 'device_id'); |
|
365
|
|
|
} |
|
366
|
|
|
|
|
367
|
|
|
/** |
|
368
|
|
|
* Relationship to App\Models\Storage |
|
369
|
|
|
* |
|
370
|
|
|
* @return \Illuminate\Database\Eloquent\Relations\hasMany |
|
371
|
|
|
*/ |
|
372
|
|
|
public function storage() |
|
373
|
|
|
{ |
|
374
|
|
|
return $this->hasMany('App\Models\Storage', 'device_id'); |
|
375
|
|
|
} |
|
376
|
|
|
} |
|
377
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.