~xibo-maintainers/xibo/tempel

« back to all changes in this revision

Viewing changes to lib/XTR/MaintenanceRegularTask.php

  • Committer: Dan Garner
  • Date: 2016-10-04 13:42:54 UTC
  • mto: This revision was merged to the branch mainline in revision 540.
  • Revision ID: git-v1:503f3749134c312e5c1bf2d1c4e6dc5c16f19a1c
Convert maintenance to 3 x tasks and hook up the task runner XTR.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/*
 
3
 * Spring Signage Ltd - http://www.springsignage.com
 
4
 * Copyright (C) 2016 Spring Signage Ltd
 
5
 * (MaintenanceRegularTask.php)
 
6
 */
 
7
 
 
8
 
 
9
namespace Xibo\XTR;
 
10
use Xibo\Helper\WakeOnLan;
 
11
 
 
12
/**
 
13
 * Class MaintenanceRegularTask
 
14
 * @package Xibo\XTR
 
15
 */
 
16
class MaintenanceRegularTask implements TaskInterface
 
17
{
 
18
    use TaskTrait;
 
19
 
 
20
    /** @inheritdoc */
 
21
    public function run()
 
22
    {
 
23
        $this->runMessage = '# ' . __('Regular Maintenance') . PHP_EOL . PHP_EOL;
 
24
 
 
25
        $this->displayDownEmailAlerts();
 
26
 
 
27
        $this->licenceSlotValidation();
 
28
 
 
29
        $this->wakeOnLan();
 
30
 
 
31
        $this->buildLayouts();
 
32
 
 
33
        $this->tidyLibrary();
 
34
    }
 
35
 
 
36
    /**
 
37
     * Display Down email alerts
 
38
     */
 
39
    private function displayDownEmailAlerts()
 
40
    {
 
41
        $this->runMessage .= '## ' . __('Email Alerts') . PHP_EOL;
 
42
 
 
43
        $emailAlerts = ($this->config->GetSetting("MAINTENANCE_EMAIL_ALERTS") == 'On');
 
44
        $alwaysAlert = ($this->config->GetSetting("MAINTENANCE_ALWAYS_ALERT") == 'On');
 
45
        $alertForViewUsers = ($this->config->GetSetting('MAINTENANCE_ALERTS_FOR_VIEW_USERS') == 1);
 
46
 
 
47
        foreach ($this->app->container->get('\Xibo\Controller\Display')->setApp($this->app)->validateDisplays($this->displayFactory->query()) as $display) {
 
48
            /* @var \Xibo\Entity\Display $display */
 
49
            // Is this the first time this display has gone "off-line"
 
50
            $displayGoneOffline = ($display->loggedIn == 1);
 
51
 
 
52
            // Should we send an email?
 
53
            if ($emailAlerts) {
 
54
                // Alerts enabled for this display
 
55
                if ($display->emailAlert == 1) {
 
56
                    // Display just gone offline, or always alert
 
57
                    if ($displayGoneOffline || $alwaysAlert) {
 
58
                        // Fields for email
 
59
                        $subject = sprintf(__("Email Alert for Display %s"), $display->display);
 
60
                        $body = sprintf(__("Display %s with ID %d was last seen at %s."), $display->display, $display->displayId, $this->date->getLocalDate($display->lastAccessed));
 
61
 
 
62
                        // Add to system
 
63
                        $notification = $this->notificationFactory->createEmpty();
 
64
                        $notification->subject = $subject;
 
65
                        $notification->body = $body;
 
66
                        $notification->createdDt = $this->date->getLocalDate(null, 'U');
 
67
                        $notification->releaseDt = $this->date->getLocalDate(null, 'U');
 
68
                        $notification->isEmail = 1;
 
69
                        $notification->isInterrupt = 0;
 
70
                        $notification->userId = $this->user->userId;
 
71
                        $notification->isSystem = 1;
 
72
 
 
73
                        // Add the system notifications group - if there is one.
 
74
                        foreach ($this->userGroupFactory->getSystemNotificationGroups() as $group) {
 
75
                            /* @var \Xibo\Entity\UserGroup $group */
 
76
                            $notification->assignUserGroup($group);
 
77
                        }
 
78
 
 
79
                        // Get a list of people that have view access to the display?
 
80
                        if ($alertForViewUsers) {
 
81
 
 
82
                            foreach ($this->userGroupFactory->getByDisplayGroupId($display->displayGroupId) as $group) {
 
83
                                /* @var \Xibo\Entity\UserGroup $group */
 
84
                                $notification->assignUserGroup($group);
 
85
                            }
 
86
                        }
 
87
 
 
88
                        $notification->save();
 
89
 
 
90
                        $this->runMessage .= ' - A' . PHP_EOL;
 
91
                    } else {
 
92
                        $this->runMessage .= ' - U' . PHP_EOL;
 
93
                    }
 
94
                }
 
95
                else {
 
96
                    // Alert disabled for this display
 
97
                    $this->runMessage .= ' - D' . PHP_EOL;
 
98
                }
 
99
            }
 
100
            else {
 
101
                // Email alerts disabled globally
 
102
                $this->runMessage .= ' - X' . PHP_EOL;
 
103
            }
 
104
        }
 
105
    }
 
106
 
 
107
    /**
 
108
     * Licence Slot Validation
 
109
     */
 
110
    private function licenceSlotValidation()
 
111
    {
 
112
        $maxDisplays = $this->config->GetSetting('MAX_LICENSED_DISPLAYS');
 
113
 
 
114
        if ($maxDisplays > 0) {
 
115
            $this->runMessage .= '## ' . __('Licence Slot Validation') . PHP_EOL;
 
116
 
 
117
            // Get a list of all displays
 
118
            try {
 
119
                $dbh = $this->store->getConnection();
 
120
                $sth = $dbh->prepare('SELECT displayId, display FROM `display` WHERE licensed = 1 ORDER BY lastAccessed');
 
121
                $sth->execute();
 
122
 
 
123
                $displays = $sth->fetchAll(\PDO::FETCH_ASSOC);
 
124
 
 
125
                if (count($displays) > $maxDisplays) {
 
126
                    // :(
 
127
                    // We need to un-licence some displays
 
128
                    $difference = count($displays) - $maxDisplays;
 
129
 
 
130
                    $update = $dbh->prepare('UPDATE `display` SET licensed = 0 WHERE displayId = :displayId');
 
131
 
 
132
                    foreach ($displays as $display) {
 
133
 
 
134
                        // If we are down to 0 difference, then stop
 
135
                        if ($difference == 0)
 
136
                            break;
 
137
 
 
138
                        echo sprintf(__('Disabling %s'), $this->sanitizer->string($display['display'])) . '<br/>' . PHP_EOL;
 
139
                        $update->execute(['displayId' => $display['displayId']]);
 
140
 
 
141
                        $difference--;
 
142
                    }
 
143
                }
 
144
 
 
145
                $this->runMessage .= ' - Done' . PHP_EOL . PHP_EOL;
 
146
            }
 
147
            catch (\Exception $e) {
 
148
                $this->log->error($e);
 
149
            }
 
150
        }
 
151
    }
 
152
 
 
153
    /**
 
154
     * Wake on LAN
 
155
     */
 
156
    private function wakeOnLan()
 
157
    {
 
158
        $this->runMessage = '# ' . __('Wake On LAN') . PHP_EOL;
 
159
 
 
160
        try {
 
161
            // Get a list of all displays which have WOL enabled
 
162
            foreach($this->displayFactory->query(null, ['wakeOnLan' => 1]) as $display) {
 
163
                /** @var \Xibo\Entity\Display $display */
 
164
                // Time to WOL (with respect to today)
 
165
                $timeToWake = strtotime(date('Y-m-d') . ' ' . $display->wakeOnLanTime);
 
166
                $timeNow = time();
 
167
 
 
168
                // Should the display be awake?
 
169
                if ($timeNow >= $timeToWake) {
 
170
                    // Client should be awake, so has this displays WOL time been passed
 
171
                    if ($display->lastWakeOnLanCommandSent < $timeToWake) {
 
172
                        // Call the Wake On Lan method of the display object
 
173
                        if ($display->macAddress == '' || $display->broadCastAddress == '')
 
174
                            throw new \InvalidArgumentException(__('This display has no mac address recorded against it yet. Make sure the display is running.'));
 
175
 
 
176
                        $this->log->notice('About to send WOL packet to ' . $display->broadCastAddress . ' with Mac Address ' . $display->macAddress);
 
177
 
 
178
                        try {
 
179
                            WakeOnLan::TransmitWakeOnLan($display->macAddress, $display->secureOn, $display->broadCastAddress, $display->cidr, '9', $this->log);
 
180
                            $this->runMessage .= ' - ' . $display->display . ' Sent WOL Message. Previous WOL send time: ' . $this->date->getLocalDate($display->lastWakeOnLanCommandSent) . PHP_EOL;
 
181
 
 
182
                            $display->lastWakeOnLanCommandSent = time();
 
183
                            $display->save(['validate' => false, 'audit' => true]);
 
184
                        }
 
185
                        catch (\Exception $e) {
 
186
                            $this->runMessage .= ' - ' . $display->display . ' Error=' . $e->getMessage() . PHP_EOL;
 
187
                        }
 
188
                    }
 
189
                    else
 
190
                        $this->runMessage .= ' - ' . $display->display . ' Display already awake. Previous WOL send time: ' . $this->date->getLocalDate($display->lastWakeOnLanCommandSent) . PHP_EOL;
 
191
                }
 
192
                else
 
193
                    $this->runMessage .= ' - ' . $display->display . ' Sleeping' . PHP_EOL;
 
194
 
 
195
                $this->runMessage .= ' - ' . $display->display . ' N/A' . PHP_EOL;
 
196
            }
 
197
 
 
198
            $this->runMessage .= ' - Done' . PHP_EOL . PHP_EOL;
 
199
        }
 
200
        catch (\PDOException $e) {
 
201
            $this->log->error($e->getMessage());
 
202
            $this->runMessage .= ' - Error' . PHP_EOL . PHP_EOL;
 
203
        }
 
204
    }
 
205
 
 
206
    /**
 
207
     * Build layouts
 
208
     */
 
209
    private function buildLayouts()
 
210
    {
 
211
        $this->runMessage .= '## ' . __('Build Layouts') . PHP_EOL;
 
212
 
 
213
        // Build Layouts
 
214
        foreach ($this->layoutFactory->query(null, ['status' => 3]) as $layout) {
 
215
            /* @var \Xibo\Entity\Layout $layout */
 
216
            try {
 
217
                $layout->xlfToDisk(['notify' => false]);
 
218
            } catch (\Exception $e) {
 
219
                $this->log->error('Maintenance cannot build Layout %d, %s.', $layout->layoutId, $e->getMessage());
 
220
            }
 
221
        }
 
222
 
 
223
        $this->runMessage .= ' - Done' . PHP_EOL . PHP_EOL;
 
224
    }
 
225
 
 
226
    /**
 
227
     * Tidy library
 
228
     */
 
229
    private function tidyLibrary()
 
230
    {
 
231
        $this->runMessage .= '## ' . __('Tidy Library') . PHP_EOL;
 
232
 
 
233
        // Keep tidy
 
234
        /** @var \Xibo\Controller\Library $libraryController */
 
235
        $libraryController = $this->app->container->get('\Xibo\Controller\Library');
 
236
        $libraryController->removeExpiredFiles();
 
237
        $libraryController->removeTempFiles();
 
238
 
 
239
        $this->runMessage .= ' - Done' . PHP_EOL . PHP_EOL;
 
240
    }
 
241
}
 
 
b'\\ No newline at end of file'