Completed
Push — os-images-svg ( 39c107 )
by Tony
09:59
created

Device::getIconAttribute()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
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
     * The table associated with the model.
131
     *
132
     * @var string
133
     */
134
    protected $table = 'devices';
135
    /**
136
     * The primary key column name.
137
     *
138
     * @var string
139
     */
140
    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
156
        static::deleting(function (Device $device) {
157
            // delete related data
158
            $device->ports()->delete();
159
            $device->syslogs()->delete();
160
            $device->eventlogs()->delete();
161
        });
162
    }
163
164
    // ---- Helper Functions ----
165
166
    /**
167
     * @return string
168
     */
169
    public function logo()
170
    {
171
        $base_name = pathinfo($this->icon, PATHINFO_FILENAME);
172
        $options = [
173
            "images/logos/$base_name.svg",
174
            "images/logos/$base_name.png",
175
            "images/os/$base_name.svg",
176
            "images/os/$base_name.png",
177
        ];
178
179
        foreach ($options as $file) {
180
            if (is_file(public_path()."/$file")) {
181
                return asset($file);
182
            }
183
        }
184
185
        return asset('images/os/generic.svg');
186
    }
187
188
    /**
189
     * @return string
190
     */
191
    public function statusColour()
192
    {
193
        $status = $this->status;
194
        $ignore = $this->ignore;
195
        $disabled = $this->disabled;
196
        if ($disabled == 1) {
197
            return 'teal';
198
        } elseif ($ignore == 1) {
199
            return 'yellow';
200
        } elseif ($status == 0) {
201
            return 'danger';
202
        } else {
203
            return 'success';
204
        }
205
    }
206
207
    // ---- Accessors/Mutators ----
208
    public function getIconAttribute($icon)
209
    {
210
        if (isset($icon)) {
211
            return asset("images/os/$icon");
212
        }
213
        return asset('images/os/generic.svg');
214
    }
215
    public function getIpAttribute($ip)
216
    {
217
        if (empty($ip)) {
218
            return null;
219
        }
220
        // @ suppresses warning, inet_ntop() returns false if it fails
221
        return @inet_ntop($ip) ?: null;
222
    }
223
224
    public function setIpAttribute($ip)
225
    {
226
        $this->attributes['ip'] = inet_pton($ip);
227
    }
228
229
    // ---- Query scopes ----
230
231
    /**
232
     * @param int $seconds
233
     * @return string
234
     */
235
    public function formatUptime($seconds)
236
    {
237
        if (empty($seconds)) {
238
            $seconds = 0;
239
        }
240
        $from = new \DateTime("@0");
241
        $to = new \DateTime("@$seconds");
242
        return $from->diff($to)->format('%a d, %h h, %i m and %s s');
243
    }
244
245 View Code Duplication
    public function scopeIsUp($query)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
246
    {
247
        return $query->where([
248
            ['status', '=', 1],
249
            ['ignore', '=', 0],
250
            ['disabled', '=', 0]
251
        ]);
252
    }
253
254 View Code Duplication
    public function scopeIsDown($query)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
255
    {
256
        return $query->where([
257
            ['status', '=', 0],
258
            ['ignore', '=', 0],
259
            ['disabled', '=', 0]
260
        ]);
261
    }
262
263
    public function scopeIsIgnored($query)
264
    {
265
        return $query->where([
266
            ['ignore', '=', 1],
267
            ['disabled', '=', 0]
268
        ]);
269
    }
270
271
    public function scopeNotIgnored($query)
272
    {
273
        return $query->where([
274
            ['ignore', '=', 0]
275
        ]);
276
    }
277
278
    public function scopeIsDisabled($query)
279
    {
280
        return $query->where([
281
            ['disabled', '=', 1]
282
        ]);
283
    }
284
285
    // ---- Define Relationships ----
286
287
    /**
288
     * Relationship to App\Models\Alerting\Alert
289
     *
290
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
291
     */
292
    public function alerts()
293
    {
294
        return $this->hasMany('App\Models\Alerting\Alert', 'device_id');
295
    }
296
297
    /**
298
     * Relationship to App\Models\General\Eventlog
299
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
300
     */
301
    public function eventlogs()
302
    {
303
        return $this->hasMany('App\Models\General\Eventlog', 'host', 'device_id');
304
    }
305
306
    /**
307
     * Relationship to App\Models\DeviceGroup
308
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
309
     */
310
    public function groups()
311
    {
312
        return $this->belongsToMany('App\Models\DeviceGroup', 'device_group_device', 'device_id', 'device_group_id');
313
    }
314
315
    /**
316
     * Relationship to App\Models\Port
317
     * Returns a list of the ports this device has.
318
     */
319
    public function ports()
320
    {
321
        return $this->hasMany('App\Models\Port', 'device_id', 'device_id');
322
    }
323
324
    /**
325
     * Relationship to App\Models\Processor
326
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
327
     */
328
    public function processors()
329
    {
330
        return $this->hasMany('App\Models\Processor', 'device_id');
331
    }
332
333
    /**
334
     * Relationship to App\Models\Alerting\Rule
335
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
336
     */
337
    public function rules()
338
    {
339
        return $this->hasMany('App\Models\Alerting\Rule', 'device_id');
340
    }
341
342
    /**
343
     * Relationship to App\Models\Sensor
344
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
345
     */
346
    public function sensors()
347
    {
348
        return $this->hasMany('App\Models\Sensor', 'device_id');
349
    }
350
351
    /**
352
     * Relationship to App\Models\Service
353
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
354
     */
355
    public function services()
356
    {
357
        return $this->hasMany('App\Models\Service', 'device_id');
358
    }
359
360
    /**
361
     * Relationship to App\Models\Storage
362
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
363
     */
364
    public function storage()
365
    {
366
        return $this->hasMany('App\Models\Storage', 'device_id');
367
    }
368
369
    /**
370
     * Relationship to App\Models\General\Syslog
371
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
372
     */
373
    public function syslogs()
374
    {
375
        return $this->hasMany('App\Models\General\Syslog', 'device_id', 'device_id');
376
    }
377
378
    /**
379
     * Relationship to App\Models\User
380
     * Does not include users with global permissions.
381
     *
382
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
383
     */
384
    public function users()
385
    {
386
        return $this->belongsToMany('App\Models\User', 'devices_perms', 'device_id', 'user_id');
387
    }
388
}
389