Test Failed
Push — master ( 6cb9f0...7deac3 )
by Antonio Carlos
07:23 queued 02:51
created

src/Checkers/ServerUptime.php (1 issue)

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
namespace PragmaRX\Health\Checkers;
4
5
use DomainException;
6
use Carbon\CarbonInterval;
7
use PragmaRX\Health\Support\Result;
8
use PragmaRX\Health\Support\Traits\Database;
9
10 View Code Duplication
class ServerUptime extends Base
0 ignored issues
show
This class 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...
11
{
12
    use Database;
13
14
    /**
15
     * Check resource.
16
     *
17
     * @return Result
18
     */
19
    public function check()
20
    {
21
        $this->loadDatabase();
22
23
        $current = $this->getCurrentUptime();
24
25
        $this->persist($current);
26
27
        $rebooted =
28
            ($cs = $this->uptimeInSeconds($current)) <
29
            ($ss = $this->uptimeInSeconds($this->database));
30
31
        return $this->makeResult(
32
            !$rebooted,
33
            $this->makeMessage($current, $this->database)
34
        );
35
    }
36
37
    /**
38
     * Execute command to get an uptime string.
39
     *
40
     * @return mixed|string
41
     * @throws Exception
42
     */
43
    private function executeUptimeCommand()
44
    {
45
        $error = exec($this->target->command, $system_string, $output);
46
47
        if ($output !== 0) {
48
            throw new DomainException((string) $error);
49
        }
50
51
        return (!is_array($system_string) || empty($system_string))
52
            ? ''
53
            : $system_string[0];
54
    }
55
56
    /**
57
     * Get current uptime.
58
     *
59
     * @return array
60
     * @throws Exception
61
     */
62
    protected function getCurrentUptime()
63
    {
64
        return $this->parseUptimeString($this->executeUptimeCommand());
65
    }
66
67
    /**
68
     * Normalize uptime matches.
69
     *
70
     * @param $matches
71
     * @return \Illuminate\Support\Collection
72
     */
73
    protected function normalizeMatches($matches)
74
    {
75
        return collect($matches)
76
            ->filter(function ($item, $key) {
77
                return !is_numeric($key);
78
            })
79
            ->map(function ($item, $key) {
80
                $return = $item[0];
81
82
                if (starts_with($key, 'load')) {
83
                    $return = floatval($return);
84
                } elseif (is_numeric($return)) {
85
                    $return = (int) $return;
86
                } elseif (empty($return)) {
87
                    $return = null;
88
                }
89
90
                return $return;
91
            })
92
            ->toArray();
93
    }
94
95
    /**
96
     * Parse the uptime string.
97
     *
98
     * @param $system_string
99
     * @return array
100
     */
101
    protected function parseUptimeString($system_string)
102
    {
103
        $matches = [];
104
105
        preg_match(
106
            $this->target->regex,
107
            $system_string,
108
            $matches,
109
            PREG_OFFSET_CAPTURE
110
        );
111
112
        $matches = $this->normalizeMatches($matches);
113
114
        $matches['uptime_string'] = $system_string;
115
116
        return $matches;
117
    }
118
119
    /**
120
     * Convert uptime to seconds.
121
     *
122
     * @param $date
123
     * @return int
124
     */
125
    protected function uptimeInSeconds($date)
126
    {
127
        return (
128
            (isset($date['up_days']) ? $date['up_days'] * 24 * 60 : 0) +
129
            (isset($date['up_hours']) ? $date['up_hours'] * 60 : 0) +
130
            (isset($date['up_minutes']) ? $date['up_minutes'] : 0)
131
        );
132
    }
133
134
    /**
135
     * Make uptime message.
136
     *
137
     * @param $current
138
     * @param $saved
139
     * @return string
140
     */
141
    protected function makeMessage($current, $saved = null)
142
    {
143
        $current = $this->toUptimeString($current);
144
145
        $saved = $this->toUptimeString($saved);
146
147
        return sprintf($this->target->getErrorMessage(), $current, $saved);
148
    }
149
150
    /**
151
     * Convert uptime to human readable string.
152
     *
153
     * @param $uptime
154
     * @return string
155
     */
156
    public function toUptimeString($uptime)
157
    {
158
        return (string) CarbonInterval::days(
159
            isset($uptime['up_days']) ? $uptime['up_days'] : 0
160
        )
161
            ->hours(isset($uptime['up_hours']) ? $uptime['up_hours'] : 0)
162
            ->minutes(isset($uptime['up_minutes']) ? $uptime['up_minutes'] : 0);
163
    }
164
}
165