Passed
Push — develop ( dc1165...764b3a )
by Nikolay
07:08 queued 11s
created

PbxExtensionUtils::isEnabled()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
c 0
b 0
f 0
dl 0
loc 5
rs 10
cc 2
nc 2
nop 1
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, 10 2020
7
 */
8
9
namespace MikoPBX\Modules;
10
11
12
use Error as ErrorAlias;
13
use MikoPBX\Common\Models\ModelsBase;
14
use MikoPBX\Common\Models\PbxExtensionModules;
15
use MikoPBX\Core\System\Util;
16
use Phalcon\Di;
17
18
use function MikoPBX\Common\Config\appPath;
19
20
class PbxExtensionUtils
21
{
22
    /**
23
     * Checks module state by UniqueID
24
     *
25
     * @param string $moduleUniqueID
26
     *
27
     * @return bool
28
     */
29
    public static function isEnabled(string $moduleUniqueID): bool
30
    {
31
        $result = PbxExtensionModules::findFirstByUniqid($moduleUniqueID);
32
33
        return ($result !== false && $result->disabled !== '1');
34
    }
35
36
    /**
37
     * Creates JS, CSS, IMG cache folders and links for module by UniqueID
38
     *
39
     * @param string $moduleUniqueID
40
     */
41
    public static function createAssetsSymlinks(string $moduleUniqueID): void
42
    {
43
        $moduleDir = self::getModuleDir($moduleUniqueID);
44
45
        // IMG
46
        $moduleImageDir      = "{$moduleDir}/public/assets/img";
47
        $imgCacheDir         = appPath('sites/admin-cabinet/assets/img/cache');
48
        $moduleImageCacheDir = "{$imgCacheDir}/{$moduleUniqueID}";
49
        if (file_exists($moduleImageCacheDir)) {
50
            unlink($moduleImageCacheDir);
51
        }
52
        if (file_exists($moduleImageDir)) {
53
            symlink($moduleImageDir, $moduleImageCacheDir);
54
        }
55
        // CSS
56
        $moduleCSSDir      = "{$moduleDir}/public/assets/css";
57
        $cssCacheDir       = appPath('sites/admin-cabinet/assets/css/cache');
58
        $moduleCSSCacheDir = "{$cssCacheDir}/{$moduleUniqueID}";
59
        if (file_exists($moduleCSSCacheDir)) {
60
            unlink($moduleCSSCacheDir);
61
        }
62
        if (file_exists($moduleCSSDir)) {
63
            symlink($moduleCSSDir, $moduleCSSCacheDir);
64
        }
65
        // JS
66
        $moduleJSDir      = "{$moduleDir}/public/assets/js";
67
        $jsCacheDir       = appPath('sites/admin-cabinet/assets/js/cache');
68
        $moduleJSCacheDir = "{$jsCacheDir}/{$moduleUniqueID}";
69
        if (file_exists($moduleJSCacheDir)) {
70
            unlink($moduleJSCacheDir);
71
        }
72
        if (file_exists($moduleJSDir)) {
73
            symlink($moduleJSDir, $moduleJSCacheDir);
74
        }
75
    }
76
77
    /**
78
     * Returns module dir by UniqueID
79
     *
80
     * @param string $moduleUniqueID
81
     *
82
     * @return string
83
     *
84
     */
85
    public static function getModuleDir(string $moduleUniqueID): string
86
    {
87
        $di = Di::getDefault();
88
        if ($di === null) {
89
            return "/tmp/{$moduleUniqueID}";
90
        }
91
        $config     = $di->getShared('config');
92
        $modulesDir = $config->path('core.modulesDir');
93
94
        return "{$modulesDir}/{$moduleUniqueID}";
95
    }
96
97
    /**
98
     * Creates links to agi-bin files for module by UniqueID
99
     *
100
     * @param string $moduleUniqueID
101
     */
102
    public static function createAgiBinSymlinks(string $moduleUniqueID): void
103
    {
104
        $moduleDir = self::getModuleDir($moduleUniqueID);
105
106
        $di = Di::getDefault();
107
        if ($di === null) {
108
            return;
109
        }
110
        $config = $di->getShared('config');
111
112
        // Create symlinks to AGI-BIN
113
        $agiBinDir       = $config->path('asterisk.astagidir');
114
        $moduleAgiBinDir = "{$moduleDir}/agi-bin";
115
        $files           = glob("$moduleAgiBinDir/*.{php}", GLOB_BRACE);
116
        foreach ($files as $file) {
117
            $newFilename = $agiBinDir . '/' . basename($file);
118
            Util::createUpdateSymlink($file, $newFilename);
119
        }
120
121
        $pathChmod = Util::which('chmod');
122
        Util::mwExec("{$pathChmod} +x {$agiBinDir}/*");
123
    }
124
125
    /**
126
     * Disables incompatible modules
127
     */
128
    public static function disableOldModules(): void
129
    {
130
        $parameters = [
131
            'conditions' => 'disabled=0',
132
        ];
133
        $modules    = PbxExtensionModules::find($parameters)->toArray();
134
        foreach ($modules as $module) {
135
            $needDisable = false;
136
            $moduleDir   = PbxExtensionUtils::getModuleDir($module['uniqid']);
137
            $moduleJson  = "{$moduleDir}/module.json";
138
            if ( ! file_exists($moduleJson)) {
139
                $needDisable = true;
140
            }
141
            $jsonString            = file_get_contents($moduleJson);
142
            $jsonModuleDescription = json_decode($jsonString, true);
143
            $minPBXVersion         = $jsonModuleDescription['min_pbx_version'] ?? '1.0.0';
144
            if (version_compare($minPBXVersion, ModelsBase::MIN_MODULE_MODEL_VER, '<')) {
145
                $needDisable = true;
146
            }
147
            if ($needDisable) {
148
                try {
149
                    $moduleStateProcessor = new PbxExtensionState($module['uniqid']);
150
                    $moduleStateProcessor->disableModule();
151
                } catch (ErrorAlias $exception) {
152
                    Util::sysLogMsg(__CLASS__, "Can not disable module {$module['uniqid']} Message: {$exception}");
153
                } finally {
154
                    $currentModule           = PbxExtensionModules::findFirstByUniqid($module['uniqid']);
155
                    if ($currentModule->disabled==='0'){
156
                        $currentModule->disabled = '1';
157
                        $currentModule->update();
158
                    }
159
                }
160
            }
161
        }
162
    }
163
164
}