Passed
Push — develop ( cfa396...74c300 )
by Nikolay
06:43 queued 11s
created

UpdateSystemConfig::updateConfigEveryNewRelease()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
nc 1
nop 0
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, 7 2020
7
 */
8
9
namespace MikoPBX\Core\System\Upgrade;
10
11
use MikoPBX\Common\Models\PbxExtensionModules;
12
use MikoPBX\Core\System\Configs\IptablesConf;
13
use MikoPBX\Core\System\MikoPBXConfig;
14
use MikoPBX\Core\System\Storage;
15
use MikoPBX\Core\System\Util;
16
use Phalcon\Config as ConfigAlias;
17
use Phalcon\Di;
18
19
use function MikoPBX\Common\Config\appPath;
20
21
class UpdateSystemConfig extends Di\Injectable
22
{
23
24
    private ConfigAlias $config;
25
26
    private MikoPBXConfig $mikoPBXConfig;
27
28
    /**
29
     * System constructor.
30
     */
31
    public function __construct()
32
    {
33
        $this->config        = $this->getDI()->getShared('config');
34
        $this->mikoPBXConfig = new MikoPBXConfig();
35
    }
36
37
    /**
38
     * Updates settings after every new release
39
     */
40
    public function updateConfigs(): bool
41
    {
42
        $this->deleteLostModules();
43
44
        $previous_version = str_ireplace('-dev', '', $this->mikoPBXConfig->getGeneralSettings('PBXVersion'));
45
        $current_version  = str_ireplace('-dev', '', trim(file_get_contents('/etc/version')));
46
        if ($previous_version !== $current_version) {
47
            $upgradeClasses      = [];
48
            $upgradeClassesDir   = appPath('src/Core/System/Upgrade/Releases');
49
            $upgradeClassesFiles = glob($upgradeClassesDir . '/*.php', GLOB_NOSORT);
50
            foreach ($upgradeClassesFiles as $file) {
51
                $className        = pathinfo($file)['filename'];
52
                $moduleModelClass = "\\MikoPBX\\Core\\System\\Upgrade\\Releases\\{$className}";
53
                if (class_exists($moduleModelClass)) {
54
                    $upgradeClasses[$moduleModelClass::PBX_VERSION] = $moduleModelClass;
55
                }
56
            }
57
            uksort($upgradeClasses, [__CLASS__, "sortArrayByReleaseNumber"]);
58
59
            foreach ($upgradeClasses as $releaseNumber => $upgradeClass) {
60
                $processor = new $upgradeClass();
61
                $processor->processUpdate();
62
                Util::echoWithSyslog(' - UpdateConfigs: Upgrade system up to ' . $releaseNumber . ' ');
63
                Util::echoGreenDone();
64
            }
65
66
            $this->updateConfigEveryNewRelease();
67
            $this->mikoPBXConfig->setGeneralSettings('PBXVersion', trim(file_get_contents('/etc/version')));
68
        }
69
70
        return true;
71
    }
72
73
    /**
74
     * Deletes modules, not installed on the system
75
     */
76
    private function deleteLostModules(): void
77
    {
78
        /** @var \MikoPBX\Common\Models\PbxExtensionModules $modules */
79
        $modules = PbxExtensionModules::find();
80
        foreach ($modules as $module) {
81
            if ( ! is_dir("{$this->config->path('core.modulesDir')}/{$module->uniqid}")) {
82
                $module->delete();
83
            }
84
        }
85
    }
86
87
    /**
88
     * Every new release routines
89
     */
90
    private function updateConfigEveryNewRelease(): void
91
    {
92
        Storage::clearSessionsFiles();
93
        IptablesConf::updateFirewallRules();
94
    }
95
96
    /**
97
     * Sorts array of upgrade classes by release numbers
98
     *
99
     * @param $a
100
     * @param $b
101
     *
102
     * @return int|bool
103
     */
104
    private function sortArrayByReleaseNumber($a, $b)
105
    {
106
        return version_compare($a, $b);
107
    }
108
}