Passed
Push — develop ( 7909ee...0ee8c3 )
by Nikolay
17:35 queued 11:32
created

PostController::callAction()   B

Complexity

Conditions 7
Paths 10

Size

Total Lines 22
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 18
c 1
b 0
f 0
dl 0
loc 22
rs 8.8333
cc 7
nc 10
nop 1
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, 4 2020
7
 *
8
 */
9
10
namespace MikoPBX\PBXCoreREST\Controllers\System;
11
12
use MikoPBX\Common\Models\Extensions;
13
use MikoPBX\Common\Models\ModelsBase;
14
use MikoPBX\Common\Models\PbxExtensionModules;
15
use MikoPBX\Common\Models\PbxSettings;
16
use MikoPBX\Common\Models\SoundFiles;
17
use MikoPBX\PBXCoreREST\Controllers\BaseController;
18
use Phalcon\Di;
19
20
/**
21
 * /pbxcore/api/system/{name}' System management (POST).
22
 *
23
 * Setup system time
24
 *   curl -X POST -d timestamp=1602509882 http://127.0.0.1/pbxcore/api/system/setDate
25
 *
26
 * Send email
27
 *   curl -X POST -d '{"email": "[email protected]", "subject":"Hi from mikopbx", "body":"Test message", "encode":""}' http://172.16.156.223/pbxcore/api/system/sendMail;
28
 *     'encode' - может быть пустой строкой или 'base64', на случай, если subject и body передаются в base64;
29
 *
30
 * Unban IP address
31
 *   curl -X POST -d '{"ip": "172.16.156.1"}' http://172.16.156.212/pbxcore/api/system/unBanIp;
32
 *   Answer example:
33
 *   {"result":"Success","data":[{"jail":"asterisk","ip":"172.16.156.1","timeofban":1522326119}],"function":"getBanIp"}
34
 *
35
 * Get config file content
36
 *   curl -X POST -d '{"filename": "/etc/asterisk/asterisk.conf"}'
37
 *   http://172.16.156.212/pbxcore/api/system/fileReadContent;
38
 *
39
 * Answer example:
40
 *   {"result":"ERROR","message":"API action not found;","function":"fileReadContent"}
41
 *   {"result":"Success","data":"W2RpcmVj","function":"fileReadContent"}
42
 *
43
 * Convert audiofile:
44
 *   curl -X POST -d '{"filename": "/tmp/WelcomeMaleMusic.mp3"}'
45
 *   http://172.16.156.212/pbxcore/api/system/convertAudioFile; Пример ответа:
46
 *   {
47
 *      "result": "Success",
48
 *      "filename": "/tmp/WelcomeMaleMusic.wav",
49
 *      "function": "convertAudioFile"
50
 *   }
51
 *
52
 *
53
 * Delete audiofile:
54
 *   curl -X POST -d '{"filename": "/storage/usbdisk1/mikopbx/tmp/2233333.wav"}'
55
 *   http://172.16.156.212/pbxcore/api/system/removeAudioFile;
56
 *
57
 *
58
 * System upgrade (from file)
59
 * curl -X POST -d
60
 *   '{"filename": "/storage/usbdisk1/mikopbx/tmp/2019.4.200-mikopbx-generic-x86-64-linux.img"}'
61
 *   http://127.0.0.1/pbxcore/api/system/upgrade -H 'Cookie: XDEBUG_SESSION=PHPSTORM'; curl -F
62
 *   "[email protected]" http://172.16.156.212/pbxcore/api/system/upgrade;
63
 *
64
 *
65
 * System upgrade (over link)
66
 * curl -X POST -d '{"md5":"df7622068d0d58700a2a624d991b6c1f", "url":
67
 *   "https://www.askozia.ru/upload/update/firmware/6.2.96-9.0-svn-mikopbx-x86-64-cross-linux.img"}'
68
 *   http://172.16.156.223/pbxcore/api/system/upgradeOnline;
69
 *
70
 *
71
 * Install new module with params by URL
72
 * curl -X POST -d '{"uniqid":"ModuleCTIClient", "md5":"fd9fbf38298dea83667a36d1d0464eae", "url":
73
 * "https://www.askozia.ru/upload/update/modules/ModuleCTIClient/ModuleCTIClientv01.zip"}'
74
 * http://172.16.156.223/pbxcore/api/modules/uploadNewModule;
75
 *
76
 *
77
 * Receive uploading status
78
 * curl  -X POST -d '{"uniqid":"ModuleSmartIVR"} http://172.16.156.223/pbxcore/api/system/statusUploadingNewModule
79
 *
80
 *
81
 * Install new module from ZIP archive:
82
 * curl -F "[email protected]" http://127.0.0.1/pbxcore/api/modules/uploadNewModule;
83
 *
84
 *
85
 * Uninstall module:
86
 * curl -X POST -d '{"uniqid":"ModuleSmartIVR"} http://172.16.156.223/pbxcore/api/system/uninstallModule
87
 *
88
 */
89
class PostController extends BaseController
90
{
91
    public function callAction($actionName): void
92
    {
93
        switch ($actionName) {
94
            case 'convertAudioFile':
95
                $this->convertAudioFile();
96
                break;
97
            case 'installNewModule':
98
            case 'enableModule':
99
            case 'disableModule':
100
            case 'uninstallModule':
101
                $data = $this->request->getPost();
102
                $this->sendRequestToBackendWorker('system', $actionName, $data);
103
                // Clear WWW models cache after successfully install or remove module
104
                if ($this->response->getStatusCode()===200){
105
                    PbxExtensionModules::clearCache(Extensions::class);
106
                    PbxExtensionModules::clearCache(PbxExtensionModules::class);
107
                    PbxExtensionModules::clearCache(PbxSettings::class);
108
                }
109
                break;
110
            default:
111
                $data = $this->request->getPost();
112
                $this->sendRequestToBackendWorker('system', $actionName, $data);
113
        }
114
    }
115
116
    /**
117
     * Categorize and store uploaded audio files
118
     */
119
    private function convertAudioFile(): void
120
    {
121
        $data                  = [];
122
        $category              = $this->request->getPost('category');
123
        $data['temp_filename'] = $this->request->getPost('temp_filename');
124
        $di                    = Di::getDefault();
125
        $mediaDir              = $di->getShared('config')->path('asterisk.customSoundDir');
126
        $mohDir                = $di->getShared('config')->path('asterisk.mohdir');
127
        switch ($category) {
128
            case SoundFiles::CATEGORY_MOH:
129
                $data['filename'] = "{$mohDir}/" . basename($data['temp_filename']);
130
                break;
131
            case SoundFiles::CATEGORY_CUSTOM:
132
                $data['filename'] = "{$mediaDir}/" . basename($data['temp_filename']);
133
                break;
134
            default:
135
                $this->sendError(400, 'Category not set');
136
        }
137
        $requestMessage = json_encode(
138
            [
139
                'processor' => 'system',
140
                'data'      => $data,
141
                'action'    => 'convertAudioFile',
142
            ]
143
        );
144
        $connection     = $this->di->getShared('beanstalkConnection');
145
        $response       = $connection->request($requestMessage, 15, 0);
146
        if ($response !== false) {
147
            $response = json_decode($response, true);
148
            $this->response->setPayloadSuccess($response);
149
        } else {
150
            $this->sendError(500);
151
        }
152
    }
153
154
}