Passed
Push — develop ( 843492...60d531 )
by Nikolay
06:55 queued 12s
created

SystemManagementProcessor::getMemInfo()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 12
dl 0
loc 15
rs 9.8666
c 1
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
/**
3
 * Copyright (C) MIKO LLC - All Rights Reserved
4
 * Unauthorized copying of this file, via any medium is strictly prohibited
5
 * Proprietary and confidential
6
 * Written by Nikolay Beketov, 7 2020
7
 *
8
 */
9
10
namespace MikoPBX\PBXCoreREST\Lib;
11
12
13
use MikoPBX\Common\Providers\PBXConfModulesProvider;
14
use MikoPBX\Core\Asterisk\Configs\VoiceMailConf;
15
use MikoPBX\Core\System\Notifications;
16
use MikoPBX\Core\System\System;
17
use MikoPBX\Core\System\Util;
18
use MikoPBX\Modules\PbxExtensionState;
19
use MikoPBX\PBXCoreREST\Workers\WorkerMergeUploadedFile;
20
use Phalcon\Di\Injectable;
21
22
class SystemManagementProcessor extends Injectable
23
{
24
    /**
25
     * Processes System requests
26
     *
27
     * @param array $request
28
     *
29
     * @return \MikoPBX\PBXCoreREST\Lib\PBXApiResult
30
     */
31
    public static function systemCallBack(array $request): PBXApiResult
32
    {
33
        $action         = $request['action'];
34
        $data           = $request['data'];
35
        $res            = new PBXApiResult();
36
        $res->processor = __METHOD__;
37
        switch ($action) {
38
            case 'reboot':
39
                System::rebootSync();
40
                $res->success = true;
41
                break;
42
            case 'shutdown':
43
                System::shutdown();
44
                $res->success = true;
45
                break;
46
            case 'mergeUploadedFile':
47
                $phpPath              = Util::which('php');
48
                $workerDownloaderPath = Util::getFilePathByClassName(WorkerMergeUploadedFile::class);
49
                Util::mwExecBg("{$phpPath} -f {$workerDownloaderPath} '{$data['settings_file']}'");
50
                $res->success = true;
51
                break;
52
            case 'setDate':
53
                $res->success = System::setDate($data['date']);
54
                break;
55
            case 'updateMailSettings':
56
                // TODO
57
                $res->success = true;
58
                break;
59
            case 'sendMail':
60
                if (isset($data['email']) && isset($data['subject']) && isset($data['body'])) {
61
                    if (isset($data['encode']) && $data['encode'] === 'base64') {
62
                        $data['subject'] = base64_decode($data['subject']);
63
                        $data['body']    = base64_decode($data['body']);
64
                    }
65
                    $result = Notifications::sendMail($data['email'], $data['subject'], $data['body']);
66
                    if ($result === true) {
67
                        $res->success = true;
68
                    } else {
69
                        $res->success    = false;
70
                        $res->messages[] = $result;
71
                    }
72
                } else {
73
                    $res->success    = false;
74
                    $res->messages[] = 'Not all query parameters are set';
75
                }
76
                break;
77
            case 'fileReadContent':
78
                $res = FilesManagementProcessor::fileReadContent($data['filename'], $data['needOriginal']);
79
                break;
80
            case 'reloadMsmtp':
81
                $notifications = new Notifications();
82
                $notifications->configure();
83
                $voiceMailConfig = new VoiceMailConf();
84
                $voiceMailConfig->generateConfig();
85
                $asteriskPath = Util::which('asterisk');
86
                Util::mwExec("{$asteriskPath} -rx 'voicemail reload'");
87
                $res->success = true;
88
                break;
89
            case 'unBanIp':
90
                $res = FirewallManagementProcessor::fail2banUnbanAll($data['ip']);
91
                break;
92
            case 'getBanIp':
93
                $res = FirewallManagementProcessor::getBanIp();
94
                break;
95
            case 'downloadNewFirmware':
96
                $res = FilesManagementProcessor::downloadNewFirmware($request['data']);
97
                break;
98
            case 'firmwareDownloadStatus':
99
                $res = FilesManagementProcessor::firmwareDownloadStatus();
100
                break;
101
            case 'upgrade':
102
                $res = SystemManagementProcessor::upgradeFromImg($data['temp_filename']);
103
                break;
104
            case 'removeAudioFile':
105
                $res = FilesManagementProcessor::removeAudioFile($data['filename']);
106
                break;
107
            case 'convertAudioFile':
108
                $mvPath = Util::which('mv');
109
                Util::mwExec("{$mvPath} {$data['temp_filename']} {$data['filename']}");
110
                $res = FilesManagementProcessor::convertAudioFile($data['filename']);
111
                break;
112
            case 'downloadNewModule':
113
                $module = $request['data']['uniqid'];
114
                $url    = $request['data']['url'];
115
                $md5    = $request['data']['md5'];
116
                $res    = FilesManagementProcessor::moduleStartDownload($module, $url, $md5);
117
                break;
118
            case 'moduleDownloadStatus':
119
                $module = $request['data']['uniqid'];
120
                $res    = FilesManagementProcessor::moduleDownloadStatus($module);
121
                break;
122
            case 'installNewModule':
123
                $filePath = $request['data']['filePath'];
124
                $res      = FilesManagementProcessor::installModuleFromFile($filePath);
125
                break;
126
            case 'enableModule':
127
                $moduleUniqueID       = $request['data']['uniqid'];
128
                $moduleStateProcessor = new PbxExtensionState($moduleUniqueID);
129
                if ($moduleStateProcessor->enableModule() === false) {
130
                    $res->success  = false;
131
                    $res->messages = $moduleStateProcessor->getMessages();
132
                } else {
133
                    PBXConfModulesProvider::recreateModulesProvider();
134
                    $res->data['needReloadModules'] = true;
135
                    $res->success                   = true;
136
                }
137
                break;
138
            case 'disableModule':
139
                $moduleUniqueID       = $request['data']['uniqid'];
140
                $moduleStateProcessor = new PbxExtensionState($moduleUniqueID);
141
                if ($moduleStateProcessor->disableModule() === false) {
142
                    $res->success  = false;
143
                    $res->messages = $moduleStateProcessor->getMessages();
144
                } else {
145
                    PBXConfModulesProvider::recreateModulesProvider();
146
                    $res->data['needReloadModules'] = true;
147
                    $res->success                   = true;
148
                }
149
                break;
150
            case 'uninstallModule':
151
                $moduleUniqueID = $request['data']['uniqid'];
152
                $keepSettings   = $request['data']['keepSettings'] === 'true';
153
                $res            = FilesManagementProcessor::uninstallModule($moduleUniqueID, $keepSettings);
154
                break;
155
            default:
156
                $res             = new PBXApiResult();
157
                $res->processor  = __METHOD__;
158
                $res->messages[] = "Unknown action - {$action} in systemCallBack";
159
        }
160
161
        $res->function = $action;
162
163
        return $res;
164
    }
165
166
    /**
167
     * Upgrade MikoPBX from uploaded IMG file
168
     *
169
     * @param string $tempFilename path to uploaded image
170
     *
171
     * @return PBXApiResult
172
     */
173
    public static function upgradeFromImg(string $tempFilename): PBXApiResult
174
    {
175
        $res                  = new PBXApiResult();
176
        $res->processor       = __METHOD__;
177
        $res->success         = true;
178
        $res->data['message'] = 'In progress...';
179
180
181
        if ( ! file_exists($tempFilename)) {
182
            $res->success    = false;
183
            $res->messages[] = "Update file '{$tempFilename}' not found.";
184
185
            return $res;
186
        }
187
188
        if ( ! file_exists('/var/etc/cfdevice')) {
189
            $res->success    = false;
190
            $res->messages[] = "The system is not installed";
191
192
            return $res;
193
        }
194
        $dev = trim(file_get_contents('/var/etc/cfdevice'));
195
196
        $link = '/tmp/firmware_update.img';
197
        Util::createUpdateSymlink($tempFilename, $link);
198
        $mikopbx_firmwarePath = Util::which('mikopbx_firmware');
199
        Util::mwExecBg("{$mikopbx_firmwarePath} recover_upgrade {$link} /dev/{$dev}");
200
201
        return $res;
202
    }
203
204
}