Completed
Push — master ( efd982...a1f7a2 )
by Ma
02:18
created

Monitor::getServersConfig()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 2
Metric Value
c 2
b 0
f 2
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
namespace Monitor;
3
4
use Monitor\Notification\Facade;
5
use Monitor\Model\Server;
6
use Monitor\Model\ServerHistory;
7
use Monitor\Contract\Client\ClientInterface;
8
use Monitor\Contract\Format\FormatInterface;
9
use Monitor\Contract\Config\ConfigInterface;
10
use Monitor\Service\ServerHistory as ServerHistoryService;
11
use Monitor\Utils\ArrayHelper;
12
use Doctrine\ORM\EntityRepository;
13
14
class Monitor
15
{
16
17
    /**
18
     * Config
19
     * @var \Monitor\Contract\Config\ConfigInterface
20
     */
21
    private $config;
22
    /**
23
     * Servers config consist \Monitor\Model\Server
24
     * @var array
25
     */
26
    private $serversConfig = [];
27
    /**
28
     * ServersHistory table structure
29
     * @var array
30
     */
31
    private $serverHistoryStruct = [];
32
    /**
33
     * Notification Facade
34
     * @var \Monitor\Notification\Facade
35
     */
36
    private $notificationFacade;
37
    /**
38
     * Monitor client
39
     * @var \Monitor\Contract\Client\ClientInterface
40
     */
41
    private $client;
42
    /**
43
     * Format
44
     * @var \Monitor\Contract\Format\FormatInterface
45
     */
46
    private $format;
47
    /**
48
     * Server history service
49
     * @var \Monitor\Service\ServerHistory
50
     */
51
    private $serverHistoryService;
52
    /**
53
     * @var \Monitor\Utils\ArrayHelper
54
     */
55
    private $arrayHelper;
56
57
    public function __construct(
58
        ConfigInterface $config,
59
        Facade $notificationFacade,
60
        FormatInterface $format,
61
        array $serversConfig,
62
        ServerHistoryService $serverHistoryService,
63
        ArrayHelper $arrayHelper
64
    ) {
65
        $this->config = $config;
66
        $this->format = $format;
67
        $this->serversConfig = $serversConfig;
68
        $this->notificationFacade = $notificationFacade;
69
        $this->serverHistoryService = $serverHistoryService;
70
        $this->serverHistoryStruct = $this->serverHistoryService->getTableStructure();
71
        $this->arrayHelper = $arrayHelper;
72
    }
73
    
74
    /**
75
     * Set client
76
     *
77
     * @param \Monitor\Contract\Client\ClientInterface $client
78
     */
79
    public function setClient(ClientInterface $client)
80
    {
81
        $this->client = $client;
82
    }
83
84
    /**
85
     * Run Monitor
86
     */
87
    public function run()
88
    {
89
        $this->isClientValid();
90
        array_map([$this, "checkServer"], $this->serversConfig);
91
        $this->deleteOldHistoryRecords();
92
    }
93
94
    /**
95
     * Check server
96
     *
97
     * @param \Monitor\Model\Server $serverConfig
98
     */
99
    private function checkServer(Server $serverConfig)
100
    {
101
        $this->client->setQuery(
102
            $serverConfig->getUrlPath(),
103
            [
104
                'format'    => $this->config->get('format'),
105
                'ping_host' => $serverConfig->getPingHostname()
106
            ]
107
        );
108
109
        $serverData = $this->getServerData();
110
        $serverData['server_id'] = $serverConfig->getId();
111
        $serverData['hostname']  = $serverConfig->getName();
112
113
        if ($serverData['status'] !== 'online') {
114
            $serverData['status'] = 'offline';
115
        }
116
        $this->serverHistoryService->addServerHistory($serverData);
117
        $this->notificationFacade->checkTriggers(
118
            $serverData,
119
            $this->config->get('ms_in_hour')
120
        );
121
    }
122
123
    /**
124
     * Check if client is valid
125
     *
126
     * @throws \Exception
127
     */
128
    private function isClientValid()
129
    {
130
        if ( ! $this->client) {
131
            throw new \Exception('Client is not valid');
132
        }
133
    }
134
135
    /**
136
     * Delete old server history from DB
137
     */
138
    private function deleteOldHistoryRecords()
139
    {
140
        $expireTimeInDays = $this->config->get('history_expire_time_in_days');
141
        $msInDay = $this->config->get('ms_in_day');
142
        $expireTimeInMs = $expireTimeInDays * $msInDay;
143
        $expireTime = time() - $expireTimeInMs;
144
        $this->serverHistoryService->deleteRecordsByTime($expireTime);
145
    }
146
147
    /**
148
     * Get server data
149
     *
150
     * @return array $serverData
151
     */
152
    private function getServerData()
153
    {
154
        $resources = $this->client->getResources();
155
156
        if ( ! $resources) {
157
            $resources = json_encode(
158
                ['status' => 'offline']
159
            );
160
        }
161
        $decodedData = $this->format->convertToArray($resources);
162
        $serverData = $this->arrayHelper->fillWithDefaultValue(
163
            $this->serverHistoryStruct,
164
            $decodedData
165
        );
166
        return $serverData;
167
    }
168
}
169