Completed
Push — master ( d449dd...efd982 )
by Ma
02:04
created

Monitor::getServerHistoryStructure()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 2
Metric Value
c 2
b 0
f 2
dl 0
loc 10
rs 9.4285
cc 2
eloc 7
nc 2
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
     * Server repository
54
     * @var \Doctrine\ORM\EntityRepository
55
     */
56
    private $serverRepository;
57
    /**
58
     * @var \Monitor\Utils\ArrayHelper
59
     */
60
    private $arrayHelper;
61
62
    public function __construct(
63
        ConfigInterface $config,
64
        Facade $notificationFacade,
65
        FormatInterface $format,
66
        EntityRepository $serverRepository,
67
        ServerHistoryService $serverHistoryService,
68
        ArrayHelper $arrayHelper
69
    ) {
70
        $this->config = $config;
71
        $this->format = $format;
72
        $this->serverRepository = $serverRepository;
73
        $this->serversConfig = $this->getServersConfig();
74
        $this->notificationFacade = $notificationFacade;
75
        $this->serverHistoryService = $serverHistoryService;
76
        $this->serverHistoryStruct = $this->serverHistoryService->getTableStructure();
77
        $this->arrayHelper = $arrayHelper;
78
    }
79
    
80
    /**
81
     * Set client
82
     *
83
     * @param \Monitor\Contract\Client\ClientInterface $client
84
     */
85
    public function setClient(ClientInterface $client)
86
    {
87
        $this->client = $client;
88
    }
89
90
    /**
91
     * Run Monitor
92
     */
93
    public function run()
94
    {
95
        $this->isClientValid();
96
        array_map([$this, "checkServer"], $this->serversConfig);
97
        $this->deleteOldHistoryRecords();
98
    }
99
100
    /**
101
     * Check server
102
     *
103
     * @param \Monitor\Model\Server $serverConfig
104
     */
105
    private function checkServer(Server $serverConfig)
106
    {
107
        $this->client->setQuery(
108
            $serverConfig->getUrlPath(),
109
            [
110
                'format'    => $this->config->get('format'),
111
                'ping_host' => $serverConfig->getPingHostname()
112
            ]
113
        );
114
115
        $serverData = $this->getServerData();
116
        $serverData['server_id'] = $serverConfig->getId();
117
        $serverData['hostname']  = $serverConfig->getName();
118
119
        if ($serverData['status'] !== 'online') {
120
            $serverData['status'] = 'offline';
121
        }
122
        $this->serverHistoryService->addServerHistory($serverData);
123
        $this->notificationFacade->checkTriggers(
124
            $serverData,
125
            $this->config->get('ms_in_hour')
126
        );
127
    }
128
129
    /**
130
     * Check if client is valid
131
     *
132
     * @throws \Exception
133
     */
134
    private function isClientValid()
135
    {
136
        if ( ! $this->client) {
137
            throw new \Exception('Client is not valid');
138
        }
139
    }
140
141
    /**
142
     * Delete old server history from DB
143
     */
144
    private function deleteOldHistoryRecords()
145
    {
146
        $expireTimeInDays = $this->config->get('history_expire_time_in_days');
147
        $msInDay = $this->config->get('ms_in_day');
148
        $expireTimeInMs = $expireTimeInDays * $msInDay;
149
        $expireTime = time() - $expireTimeInMs;
150
        $this->serverHistoryService->deleteRecordsByTime($expireTime);
151
    }
152
153
    /**
154
     * Get servers config
155
     */
156
    private function getServersConfig()
157
    {
158
        $serverConfigs = $this->serverRepository->findAll();
159
        return $serverConfigs;
160
    }
161
162
    /**
163
     * Get server data
164
     *
165
     * @return array $serverData
166
     */
167
    private function getServerData()
168
    {
169
        $resources = $this->client->getResources();
170
171
        if ( ! $resources) {
172
            $resources = json_encode(
173
                ['status' => 'offline']
174
            );
175
        }
176
        $decodedData = $this->format->convertToArray($resources);
177
        $serverData = $this->arrayHelper->fillWithDefaultValue(
178
            $this->serverHistoryStruct,
179
            $decodedData
180
        );
181
        return $serverData;
182
    }
183
}
184