Passed
Push — develop ( eb8832...f8f730 )
by Nikolay
05:34
created

SystemManagementProcessor::callBack()   F

Complexity

Conditions 32
Paths 30

Size

Total Lines 146
Code Lines 135

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 135
c 0
b 0
f 0
dl 0
loc 146
rs 3.3333
cc 32
nc 30
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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