Completed
Push — develop ( 7d9761...dd942e )
by Tony
74:17 queued 45:24
created

Device::status_colour()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 4.25

Importance

Changes 0
Metric Value
cc 4
eloc 12
nc 4
nop 0
dl 0
loc 15
rs 9.2
c 0
b 0
f 0
ccs 3
cts 4
cp 0.75
crap 4.25
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
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Processor[] $processors
118
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Service[] $services
119
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Storage[] $storage
120
 */
121
class Device extends Model
122
{
123
    /**
124
     * Indicates if the model should be timestamped.
125
     *
126
     * @var bool
127
     */
128
    public $timestamps = false;
129
    /**
130 20
     * The table associated with the model.
131
     *
132 20
     * @var string
133
     */
134 20
    protected $table = 'devices';
135
    /**
136 1
     * The primary key column name.
137 1
     *
138 1
     * @var string
139 20
     */
140 20
    protected $primaryKey = 'device_id';
141
142
    /**
143
     * The attributes that are mass assignable.
144
     *
145
     * @var array
146
     */
147
    protected $fillable = ['hostname', 'ip', 'status', 'status_reason'];
148
149
    /**
150
     * Initialize this class
151
     */
152
    public static function boot()
153
    {
154
        parent::boot();
155 18
156
        static::deleting(function (Device $device) {
157 18
            // delete related data
158
            $device->ports()->delete();
159
            $device->syslogs()->delete();
160
            $device->eventlogs()->delete();
161
        });
162
    }
163 1
164
    // ---- Helper Functions ----
165 1
166
    /**
167
     * @return string
168
     */
169
    public function logo()
170
    {
171 1
        $icon = $this->icon;
172
        if (isset($icon)) {
173 1
            return asset('images/os/'.$icon.'.png');
174
        } else {
175
            return asset('images/os/generic.png');
176
        }
177
    }
178
179
    /**
180
     * @return string
181
     */
182
    public function statusColour()
183
    {
184
        $status = $this->status;
185
        $ignore = $this->ignore;
186
        $disabled = $this->disabled;
187
        if ($disabled == 1) {
188
            return 'teal';
189
        } elseif ($ignore == 1) {
190
            return 'yellow';
191
        } elseif ($status == 0) {
192
            return 'danger';
193
        } else {
194
            return 'success';
195
        }
196
    }
197
198
    // ---- Accessors/Mutators ----
199
200
    public function getIpAttribute($ip)
201
    {
202
        if (empty($ip)) {
203
            return null;
204 1
        }
205
        // @ suppresses warning, inet_ntop() returns false if it fails
206 1
        return @inet_ntop($ip) ?: null;
207 1
    }
208
209
    public function setIpAttribute($ip)
210
    {
211
        $this->attributes['ip'] = inet_pton($ip);
212 18
    }
213
214 18
    // ---- Query scopes ----
215 18
216
    /**
217
     * @param int $seconds
218
     * @return string
219
     */
220
    public function formatUptime($seconds)
221
    {
222
        if (empty($seconds)) {
223
            $seconds = 0;
224
        }
225
        $from = new \DateTime("@0");
226
        $to = new \DateTime("@$seconds");
227
        return $from->diff($to)->format('%a d, %h h, %i m and %s s');
228
    }
229
230
    public function scopeIsUp($query)
231
    {
232
        return $query->where([
233
            ['status', '=', 1],
234
            ['ignore', '=', 0],
235
            ['disabled', '=', 0]
236
        ]);
237
    }
238
239
    public function scopeIsDown($query)
240
    {
241
        return $query->where([
242
            ['status', '=', 0],
243
            ['ignore', '=', 0],
244
            ['disabled', '=', 0]
245
        ]);
246
    }
247
248
    public function scopeIsIgnored($query)
249
    {
250
        return $query->where([
251
            ['ignore', '=', 1],
252
            ['disabled', '=', 0]
253
        ]);
254
    }
255
256
    public function scopeNotIgnored($query)
257
    {
258
        return $query->where([
259
            ['ignore', '=', 0]
260
        ]);
261
    }
262
263
    public function scopeIsDisabled($query)
264
    {
265
        return $query->where([
266
            ['disabled', '=', 1]
267
        ]);
268
    }
269
270
    // ---- Define Relationships ----
271
272
    /**
273
     * Relationship to App\Models\Alerting\Alert
274
     *
275
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
276
     */
277
    public function alerts()
278
    {
279
        return $this->hasMany('App\Models\Alerting\Alert', 'device_id');
280
    }
281
282
    /**
283
     * Relationship to App\Models\General\Eventlog
284
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
285
     */
286
    public function eventlogs()
287
    {
288
        return $this->hasMany('App\Models\General\Eventlog', 'host', 'device_id');
289
    }
290
291
    /**
292
     * Relationship to App\Models\DeviceGroup
293
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
294
     */
295
    public function groups()
296
    {
297
        return $this->belongsToMany('App\Models\DeviceGroup', 'device_group_device', 'device_id', 'device_group_id');
298
    }
299
300
    /**
301
     * Relationship to App\Models\Port
302
     * Returns a list of the ports this device has.
303
     */
304
    public function ports()
305
    {
306
        return $this->hasMany('App\Models\Port', 'device_id', 'device_id');
307
    }
308
309
    /**
310
     * Relationship to App\Models\Processor
311
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
312
     */
313
    public function processors()
314
    {
315
        return $this->hasMany('App\Models\Processor', 'device_id');
316
    }
317
318
    /**
319
     * Relationship to App\Models\Alerting\Rule
320
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
321
     */
322
    public function rules()
323
    {
324
        return $this->hasMany('App\Models\Alerting\Rule', 'device_id');
325
    }
326
327
    /**
328
     * Relationship to App\Models\Sensor
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
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
339
     */
340
    public function services()
341
    {
342
        return $this->hasMany('App\Models\Service', 'device_id');
343
    }
344
345
    /**
346
     * Relationship to App\Models\Storage
347
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
348
     */
349
    public function storage()
350
    {
351
        return $this->hasMany('App\Models\Storage', 'device_id');
352
    }
353
354
    /**
355
     * Relationship to App\Models\General\Syslog
356
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
357
     */
358
    public function syslogs()
359
    {
360
        return $this->hasMany('App\Models\General\Syslog', 'device_id', 'device_id');
361
    }
362
363
    /**
364
     * Relationship to App\Models\User
365
     * Does not include users with global permissions.
366
     *
367
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
368
     */
369
    public function users()
370
    {
371
        return $this->belongsToMany('App\Models\User', 'devices_perms', 'device_id', 'user_id');
372
    }
373
}
374