Passed
Push — develop ( dadf5b...439163 )
by Nikolay
04:25
created

WorkerModelsEvents::reloadNginxConf()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 0
1
<?php
2
/*
3
 * MikoPBX - free phone system for small business
4
 * Copyright (C) 2017-2020 Alexey Portnov and Nikolay Beketov
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with this program.
17
 * If not, see <https://www.gnu.org/licenses/>.
18
 */
19
20
namespace MikoPBX\Core\Workers;
21
22
require_once 'Globals.php';
23
24
use MikoPBX\Common\Models\{AsteriskManagerUsers,
25
    CallQueueMembers,
26
    CallQueues,
27
    Codecs,
28
    ConferenceRooms,
29
    CustomFiles,
30
    DialplanApplications,
31
    ExtensionForwardingRights,
32
    Extensions,
33
    ExternalPhones,
34
    Fail2BanRules,
35
    FirewallRules,
36
    Iax,
37
    IncomingRoutingTable,
38
    IvrMenu,
39
    IvrMenuActions,
40
    LanInterfaces,
41
    NetworkFilters,
42
    OutgoingRoutingTable,
43
    OutWorkTimes,
44
    PbxExtensionModules,
45
    PbxSettings,
46
    Sip,
47
    SipHosts,
48
    SoundFiles,
49
    Users
50
};
51
use MikoPBX\Common\Providers\BeanstalkConnectionModelsProvider;
52
use MikoPBX\Common\Providers\ModulesDBConnectionsProvider;
53
use MikoPBX\Common\Providers\PBXConfModulesProvider;
54
use MikoPBX\Core\Asterisk\Configs\QueueConf;
55
use MikoPBX\Core\System\{BeanstalkClient,
56
    Configs\CronConf,
57
    Configs\Fail2BanConf,
58
    Configs\IptablesConf,
59
    Configs\NatsConf,
60
    Configs\NginxConf,
61
    Configs\NTPConf,
62
    Configs\PHPConf,
63
    Configs\SSHConf,
64
    Configs\SyslogConf,
65
    PBX,
66
    Processes,
67
    System,
68
    Util
69
};
70
use MikoPBX\Modules\Config\ConfigClass;
71
use MikoPBX\Modules\PbxExtensionUtils;
72
use MikoPBX\PBXCoreREST\Workers\WorkerApiCommands;
73
use Phalcon\Di;
74
use Pheanstalk\Contract\PheanstalkInterface;
75
76
ini_set('error_reporting', E_ALL);
77
ini_set('display_startup_errors', 1);
78
79
class WorkerModelsEvents extends WorkerBase
80
{
81
    private const R_MANAGERS = 'reloadManager';
82
83
    private const R_QUEUES = 'reloadQueues';
84
85
    private const R_DIALPLAN = 'reloadDialplan';
86
87
    private const R_CUSTOM_F = 'updateCustomFiles';
88
89
    private const R_FIREWALL = 'reloadFirewall';
90
91
    private const R_NETWORK = 'networkReload';
92
93
    private const R_IAX = 'reloadIax';
94
95
    private const R_SIP = 'reloadSip';
96
97
    private const R_FEATURES = 'reloadFeatures';
98
99
    private const R_CRON = 'reloadCron';
100
101
    public const  R_NGINX = 'reloadNginx';
102
103
    public const  R_NGINX_CONF = 'reloadNginxConf';
104
105
    public const  R_FAIL2BAN_CONF = 'reloadFail2BanConf';
106
107
    private const R_PHP_FPM = 'reloadPHPFPM';
108
109
    private const R_TIMEZONE = 'updateTomeZone';
110
111
    private const R_SYSLOG = 'restartSyslogD';
112
113
    private const R_SSH = 'reloadSSH';
114
115
    private const R_LICENSE = 'reloadLicense';
116
117
    private const R_NATS = 'reloadNats';
118
119
    private const R_VOICEMAIL = 'reloadVoicemail';
120
121
    private const R_REST_API_WORKER = 'reloadRestAPIWorker';
122
123
    private const R_CALL_EVENTS_WORKER = 'reloadWorkerCallEvents';
124
125
    private const R_PBX_MODULE_STATE = 'afterModuleStateChanged';
126
127
    private const R_MOH = 'reloadMoh';
128
129
    private const R_NTP = 'reloadNtp';
130
131
    private int $last_change;
132
    private array $modified_tables;
133
134
    private int $timeout = 2;
135
    private array $arrObject;
136
    private array $PRIORITY_R;
137
    private array $pbxSettingsDependencyTable = [];
138
    private array $modelsDependencyTable = [];
139
    private ConfigClass $modulesConfigObj;
140
141
    /**
142
     * The entry point
143
     *
144
     * @param $params
145
     */
146
    public function start($params): void
147
    {
148
        $this->last_change      = time() - 2;
149
        $this->arrObject        = $this->di->getShared(PBXConfModulesProvider::SERVICE_NAME);
150
        $this->modulesConfigObj = new ConfigClass();
151
152
        $this->initPbxSettingsDependencyTable();
153
        $this->initModelsDependencyTable();
154
155
        $this->PRIORITY_R = [
156
            self::R_PBX_MODULE_STATE,
157
            self::R_TIMEZONE,
158
            self::R_SYSLOG,
159
            self::R_REST_API_WORKER,
160
            self::R_NETWORK,
161
            self::R_FIREWALL,
162
            self::R_FAIL2BAN_CONF,
163
            self::R_SSH,
164
            self::R_LICENSE,
165
            self::R_NATS,
166
            self::R_NTP,
167
            self::R_PHP_FPM,
168
            self::R_NGINX,
169
            self::R_NGINX_CONF,
170
            self::R_CRON,
171
            self::R_FEATURES,
172
            self::R_SIP,
173
            self::R_IAX,
174
            self::R_DIALPLAN,
175
            self::R_QUEUES,
176
            self::R_MANAGERS,
177
            self::R_CUSTOM_F,
178
            self::R_VOICEMAIL,
179
            self::R_MOH,
180
            self::R_CALL_EVENTS_WORKER,
181
        ];
182
183
        $this->modified_tables = [];
184
185
        /** @var BeanstalkClient $client */
186
        $client = $this->di->getShared(BeanstalkConnectionModelsProvider::SERVICE_NAME);
187
        $client->subscribe(self::class, [$this, 'processModelChanges']);
188
        $client->subscribe($this->makePingTubeName(self::class), [$this, 'pingCallBack']);
189
        $client->setTimeoutHandler([$this, 'timeoutHandler']);
190
191
        while ($this->needRestart === false) {
192
            $client->wait();
193
        }
194
        // Execute all collected changes before exit
195
        $this->timeoutHandler();
196
    }
197
198
    /**
199
     * Инициализация таблицы зависимостей настроек m_PbxSettings и сервисов АТС.
200
     */
201
    private function initPbxSettingsDependencyTable(): void
202
    {
203
        $tables = [];
204
        // FeaturesSettings
205
        $tables[] = [
206
            'settingName' => [
207
                'PBXLanguage',
208
                'PBXInternalExtensionLength',
209
                'PBXRecordCalls',
210
                'PBXCallParkingExt',
211
                'PBXCallParkingStartSlot',
212
                'PBXCallParkingEndSlot',
213
                'PBXFeatureAttendedTransfer',
214
                'PBXFeatureBlindTransfer',
215
                'PBXFeatureDigitTimeout',
216
                'PBXFeatureAtxferNoAnswerTimeout',
217
                'PBXFeatureTransferDigitTimeout',
218
                'PBXFeaturePickupExten',
219
            ],
220
            'functions'   => [
221
                self::R_FEATURES,
222
                self::R_DIALPLAN,
223
            ],
224
        ];
225
        // AMIParameters
226
        $tables[] = [
227
            'settingName' => [
228
                'AMIPort',
229
                'AJAMPort',
230
                'AJAMPortTLS',
231
            ],
232
            'functions'   => [
233
                self::R_MANAGERS,
234
            ],
235
        ];
236
237
        // IaxParameters
238
        $tables[] = [
239
            'settingName' => [
240
                'IAXPort',
241
            ],
242
            'functions'   => [
243
                self::R_IAX,
244
            ],
245
        ];
246
        // Гостевые звонки без авторизацим.
247
        $tables[] = [
248
            'settingName' => [
249
                'PBXAllowGuestCalls',
250
            ],
251
            'functions'   => [
252
                self::R_SIP,
253
                self::R_DIALPLAN,
254
            ],
255
        ];
256
        // SipParameters
257
        $tables[] = [
258
            'settingName' => [
259
                'SIPPort',
260
                'RTPPortFrom',
261
                'RTPPortTo',
262
                'SIPDefaultExpiry',
263
                'SIPMinExpiry',
264
                'SIPMaxExpiry',
265
                'PBXLanguage',
266
            ],
267
            'functions'   => [
268
                self::R_SIP,
269
            ],
270
        ];
271
272
        // SSHParameters
273
        $tables[] = [
274
            'settingName' => [
275
                'SSHPort',
276
                'SSHPassword',
277
                'SSHAuthorizedKeys',
278
                'SSHRsaKey',
279
                'SSHDssKey',
280
                'SSHecdsaKey',
281
            ],
282
            'functions'   => [
283
                self::R_SSH,
284
            ],
285
        ];
286
287
        // FirewallParameters
288
        $tables[] = [
289
            'settingName' => [
290
                'SIPPort',
291
                'RTPPortFrom',
292
                'RTPPortTo',
293
                'IAXPort',
294
                'AMIPort',
295
                'AJAMPort',
296
                'AJAMPortTLS',
297
                'WEBPort',
298
                'WEBHTTPSPort',
299
                'SSHPort',
300
                'PBXFirewallEnabled',
301
                'PBXFail2BanEnabled',
302
            ],
303
            'functions'   => [
304
                self::R_FIREWALL,
305
            ],
306
            'strPosKey'   => 'FirewallSettings',
307
        ];
308
309
        // FirewallParameters
310
        $tables[] = [
311
            'settingName' => [
312
                'WEBPort',
313
                'WEBHTTPSPort',
314
                'WEBHTTPSPublicKey',
315
                'WEBHTTPSPrivateKey',
316
                'RedirectToHttps',
317
            ],
318
            'functions'   => [
319
                self::R_NGINX,
320
            ],
321
        ];
322
323
        // CronParameters
324
        $tables[] = [
325
            'settingName' => [
326
                'RestartEveryNight',
327
            ],
328
            'functions'   => [
329
                self::R_CRON,
330
            ],
331
        ];
332
333
        // DialplanParameters
334
        $tables[] = [
335
            'settingName' => [
336
                'PBXLanguage',
337
            ],
338
            'functions'   => [
339
                self::R_DIALPLAN,
340
            ],
341
        ];
342
343
        // VoiceMailParameters
344
        $tables[] = [
345
            'settingName' => [
346
                'MailTplVoicemailSubject',
347
                'MailTplVoicemailBody',
348
                'MailSMTPSenderAddress',
349
                'MailSMTPUsername',
350
                'PBXTimezone',
351
                'VoicemailNotificationsEmail',
352
                'SystemNotificationsEmail',
353
            ],
354
            'functions'   => [
355
                self::R_VOICEMAIL,
356
            ],
357
        ];
358
359
        // VisualLanguageSettings
360
        $tables[] = [
361
            'settingName' => [
362
                'SSHLanguage',
363
                'WebAdminLanguage',
364
            ],
365
            'functions'   => [
366
                self::R_REST_API_WORKER,
367
            ],
368
        ];
369
370
        // LicenseSettings
371
        $tables[] = [
372
            'settingName' => [
373
                'PBXLicense',
374
            ],
375
            'functions'   => [
376
                self::R_LICENSE,
377
                self::R_NATS,
378
            ],
379
        ];
380
381
        // TimeZoneSettings
382
        $tables[] = [
383
            'settingName' => [
384
                'PBXTimezone',
385
            ],
386
            'functions'   => [
387
                self::R_TIMEZONE,
388
                self::R_NGINX,
389
                self::R_PHP_FPM,
390
                self::R_REST_API_WORKER,
391
                self::R_SYSLOG,
392
            ],
393
        ];
394
395
        // NTPSettings
396
        $tables[] = [
397
            'settingName' => [
398
                'PBXManualTimeSettings',
399
                'NTPServer',
400
            ],
401
            'functions'   => [
402
                self::R_NTP,
403
            ],
404
        ];
405
406
        // CallRecordSettings
407
        $tables[] = [
408
            'settingName' => [
409
                'PBXRecordCalls',
410
                'PBXSplitAudioThread',
411
            ],
412
            'functions'   => [
413
                self::R_CALL_EVENTS_WORKER,
414
                self::R_DIALPLAN,
415
            ],
416
        ];
417
418
        $this->pbxSettingsDependencyTable = $tables;
419
    }
420
421
    /**
422
     * Инициализация таблицы зависимостей моделей и сервисов АТС.
423
     */
424
    private function initModelsDependencyTable(): void
425
    {
426
        $tables   = [];
427
        $tables[] = [
428
            'settingName' => [
429
                AsteriskManagerUsers::class,
430
            ],
431
            'functions'   => [
432
                self::R_MANAGERS,
433
            ],
434
        ];
435
436
        $tables[] = [
437
            'settingName' => [
438
                CallQueueMembers::class,
439
            ],
440
            'functions'   => [
441
                self::R_QUEUES,
442
            ],
443
        ];
444
445
        $tables[] = [
446
            'settingName' => [
447
                CallQueues::class,
448
            ],
449
            'functions'   => [
450
                self::R_QUEUES,
451
                self::R_DIALPLAN,
452
            ],
453
        ];
454
        $tables[] = [
455
            'settingName' => [
456
                ExternalPhones::class,
457
                Extensions::class,
458
                DialplanApplications::class,
459
                IncomingRoutingTable::class,
460
                IvrMenu::class,
461
                IvrMenuActions::class,
462
                OutgoingRoutingTable::class,
463
                OutWorkTimes::class,
464
                ConferenceRooms::class,
465
            ],
466
            'functions'   => [
467
                self::R_DIALPLAN,
468
            ],
469
        ];
470
471
        $tables[] = [
472
            'settingName' => [
473
                CustomFiles::class,
474
            ],
475
            'functions'   => [
476
                self::R_CUSTOM_F,
477
            ],
478
        ];
479
480
        $tables[] = [
481
            'settingName' => [
482
                Sip::class,
483
            ],
484
            'functions'   => [
485
                self::R_SIP,
486
                self::R_DIALPLAN,
487
                self::R_FIREWALL,
488
            ],
489
        ];
490
491
        $tables[] = [
492
            'settingName' => [
493
                Users::class,
494
                ExtensionForwardingRights::class,
495
            ],
496
            'functions'   => [
497
                self::R_SIP,
498
                self::R_DIALPLAN,
499
            ],
500
        ];
501
502
        $tables[] = [
503
            'settingName' => [
504
                FirewallRules::class,
505
                Fail2BanRules::class,
506
            ],
507
            'functions'   => [
508
                self::R_FIREWALL,
509
            ],
510
        ];
511
512
        $tables[] = [
513
            'settingName' => [
514
                Iax::class,
515
            ],
516
            'functions'   => [
517
                self::R_IAX,
518
                self::R_DIALPLAN,
519
            ],
520
        ];
521
522
        $tables[] = [
523
            'settingName' => [
524
                Codecs::class,
525
            ],
526
            'functions'   => [
527
                self::R_IAX,
528
                self::R_SIP,
529
            ],
530
        ];
531
532
        $tables[] = [
533
            'settingName' => [
534
                SoundFiles::class,
535
            ],
536
            'functions'   => [
537
                self::R_MOH,
538
                self::R_DIALPLAN,
539
            ],
540
        ];
541
542
        $tables[] = [
543
            'settingName' => [
544
                LanInterfaces::class,
545
            ],
546
            'functions'   => [
547
                self::R_NETWORK,
548
                self::R_IAX,
549
                self::R_SIP,
550
            ],
551
        ];
552
553
        $tables[] = [
554
            'settingName' => [
555
                SipHosts::class,
556
            ],
557
            'functions'   => [
558
                self::R_FIREWALL,
559
                self::R_SIP,
560
            ],
561
        ];
562
563
        $tables[] = [
564
            'settingName' => [
565
                NetworkFilters::class,
566
            ],
567
            'functions'   => [
568
                self::R_FIREWALL,
569
                self::R_SIP,
570
                self::R_MANAGERS,
571
            ],
572
        ];
573
574
        $this->modelsDependencyTable = $tables;
575
    }
576
577
    /**
578
     * Timeout handles
579
     */
580
    public function timeoutHandler(): void
581
    {
582
        $this->last_change = time() - $this->timeout;
583
        $this->startReload();
584
    }
585
586
    /**
587
     * Applies changes
588
     *
589
     * @return void
590
     */
591
    private function startReload(): void
592
    {
593
        if (count($this->modified_tables) === 0) {
594
            return;
595
        }
596
        $delta = time() - $this->last_change;
597
        if ($delta < $this->timeout) {
598
            return;
599
        }
600
601
        foreach ($this->PRIORITY_R as $method_name) {
602
            $action     = $this->modified_tables[$method_name] ?? null;
603
            $parameters = $this->modified_tables['parameters'][$method_name] ?? null;
604
            if ($action === null) {
605
                continue;
606
            }
607
            if (method_exists($this, $method_name)) {
608
                Util::sysLogMsg(__METHOD__, "Process changes by {$method_name}", LOG_DEBUG);
609
                if ($parameters === null) {
610
                    $this->$method_name();
611
                } else {
612
                    $this->$method_name($parameters);
613
                }
614
            }
615
        }
616
        // Send information about models changes to additional modules bulky without any details
617
        $this->modulesConfigObj->hookModulesMethod(ConfigClass::MODELS_EVENT_NEED_RELOAD, [$this->modified_tables]);
618
        $this->modified_tables = [];
619
    }
620
621
    /**
622
     * Parses for received Beanstalk message
623
     *
624
     * @param BeanstalkClient $message
625
     *
626
     * @throws \JsonException
627
     */
628
    public function processModelChanges(BeanstalkClient $message): void
629
    {
630
        $receivedMessage = json_decode($message->getBody(), true, 512, JSON_THROW_ON_ERROR);
631
        if ($receivedMessage['source'] === BeanstalkConnectionModelsProvider::SOURCE_INVOKE_ACTION
632
            && in_array($receivedMessage['action'], $this->PRIORITY_R, true))
633
        {
634
            $this->modified_tables[$receivedMessage['action']]               = true;
635
            $this->modified_tables['parameters'][$receivedMessage['action']] = $receivedMessage['parameters'];
636
        } elseif ($receivedMessage['source'] === BeanstalkConnectionModelsProvider::SOURCE_MODELS_CHANGED ) {
637
            $this->fillModifiedTables($receivedMessage);
638
        }
639
        $this->startReload();
640
        if ( ! $receivedMessage) {
641
            return;
642
        }
643
        // Send information about models changes to additional modules with changed data details
644
        $this->modulesConfigObj->hookModulesMethod(ConfigClass::MODELS_EVENT_CHANGE_DATA, [$receivedMessage]);
645
    }
646
647
    /**
648
     * Collects changes to determine which modules must be reloaded or reconfigured
649
     *
650
     * @param array $data
651
     */
652
    private function fillModifiedTables(array $data): void
653
    {
654
        $count_changes = count($this->modified_tables);
655
        $called_class  = $data['model'] ?? '';
656
        Util::sysLogMsg(__METHOD__, "New changes " . $called_class, LOG_DEBUG);
657
658
        $this->getNewSettingsForDependentModules($called_class);
659
        $this->fillModifiedTablesFromModels($called_class);
660
        $this->fillModifiedTablesFromPbxSettingsData($called_class, $data['recordId']);
661
        $this->fillModifiedTablesFromPbxExtensionModules($called_class, $data['recordId']);
662
663
        if ($count_changes === 0 && count($this->modified_tables) > 0) {
664
            // Начинаем отсчет времени при получении первой задачи.
665
            $this->last_change = time();
666
        }
667
    }
668
669
    /**
670
     * Gets new settings for dependence modules tables
671
     *
672
     */
673
    private function getNewSettingsForDependentModules(string $called_class): void
674
    {
675
        foreach ($this->arrObject as $configClassObj) {
676
            try {
677
                $dependencies = call_user_func([$configClassObj, ConfigClass::GET_DEPENDENCE_MODELS]);
678
                if (in_array($called_class, $dependencies, true)
679
                    && method_exists($configClassObj, ConfigClass::GET_SETTINGS)
680
                ) {
681
                    call_user_func([$configClassObj, ConfigClass::GET_SETTINGS]);
682
                }
683
            } catch (\Throwable $e) {
684
                global $errorLogger;
685
                $errorLogger->captureException($e);
686
                Util::sysLogMsg(__METHOD__, $e->getMessage(), LOG_ERR);
687
                continue;
688
            }
689
        }
690
    }
691
692
    /**
693
     * Analysis modified fields on MikoPBX models
694
     *
695
     * @param string $called_class
696
     */
697
    private function fillModifiedTablesFromModels(string $called_class): void
698
    {
699
        foreach ($this->modelsDependencyTable as $dependencyData) {
700
            if ( ! in_array($called_class, $dependencyData['settingName'], true)) {
701
                continue;
702
            }
703
            foreach ($dependencyData['functions'] as $function) {
704
                $this->modified_tables[$function] = true;
705
            }
706
        }
707
    }
708
709
    /**
710
     * Analysis modified fields on m_PbxSettings model record
711
     *
712
     * @param string $called_class
713
     * @param string $recordId
714
     */
715
    private function fillModifiedTablesFromPbxSettingsData(string $called_class, string $recordId): void
716
    {
717
        if (PbxSettings::class !== $called_class) {
718
            return;
719
        }
720
        /** @var PbxSettings $pbxSettings */
721
        $pbxSettings = PbxSettings::findFirstByKey($recordId);
722
        if ($pbxSettings === null) {
723
            return;
724
        }
725
        $settingName = $pbxSettings->key;
726
        foreach ($this->pbxSettingsDependencyTable as $data) {
727
            $additionalConditions = (isset($data['strPosKey']) && strpos($settingName, $data['strPosKey']) !== false);
728
            if ( ! $additionalConditions && ! in_array($settingName, $data['settingName'], true)) {
729
                continue;
730
            }
731
            foreach ($data['functions'] as $function) {
732
                $this->modified_tables[$function] = true;
733
            }
734
        }
735
    }
736
737
    /**
738
     * Analysis modified fields on PbxExtensionModules model record
739
     *
740
     * @param string $called_class
741
     * @param string $recordId
742
     */
743
    private function fillModifiedTablesFromPbxExtensionModules(string $called_class, string $recordId): void
744
    {
745
        if (PbxExtensionModules::class !== $called_class) {
746
            return;
747
        }
748
        $moduleSettings = PbxExtensionModules::findFirstById($recordId);
749
        if ($moduleSettings !== null) {
750
            self::invokeAction( self::R_PBX_MODULE_STATE, $moduleSettings->toArray(), 50);
751
        }
752
    }
753
754
    /**
755
     * Adds action to queue for postpone apply
756
     *
757
     * @param string $action
758
     * @param array  $parameters
759
     * @param int    $priority
760
     */
761
    public static function invokeAction(string $action, array $parameters = [], int $priority = 0): void
762
    {
763
        $di = Di::getDefault();
764
        /** @var BeanstalkClient $queue */
765
        $queue   = $di->getShared(BeanstalkConnectionModelsProvider::SERVICE_NAME);
766
        $jobData = json_encode(
767
            [
768
                'source'     => BeanstalkConnectionModelsProvider::SOURCE_INVOKE_ACTION,
769
                'action'     => $action,
770
                'parameters' => $parameters,
771
                'model'      => ''
772
            ]
773
        );
774
        $queue->publish(
775
            $jobData,
776
            self::class,
777
            $priority,
778
            PheanstalkInterface::DEFAULT_DELAY,
779
            3600
780
        );
781
    }
782
783
    /**
784
     * Restarts gnats queue server daemon
785
     */
786
    public function reloadNats(): void
787
    {
788
        $natsConf = new NatsConf();
789
        $natsConf->reStart();
790
    }
791
792
    /**
793
     * Reloads Asterisk dialplan
794
     */
795
    public function reloadDialplan(): void
796
    {
797
        PBX::dialplanReload();
798
    }
799
800
    /**
801
     * Reloads Asterisk manager interface module
802
     */
803
    public function reloadManager(): void
804
    {
805
        PBX::managerReload();
806
    }
807
808
    /**
809
     * Generates queue.conf and restart asterisk queue module
810
     */
811
    public function reloadQueues(): void
812
    {
813
        QueueConf::queueReload();
814
    }
815
816
    /**
817
     * Updates custom changes in config files
818
     */
819
    public function updateCustomFiles(): void
820
    {
821
        System::updateCustomFiles();
822
    }
823
824
    /**
825
     * Applies iptables settings and restart firewall
826
     */
827
    public function reloadFirewall(): void
828
    {
829
        IptablesConf::reloadFirewall();
830
    }
831
832
    /**
833
     *  Refreshes networks configs and restarts network daemon
834
     */
835
    public function networkReload(): void
836
    {
837
        System::networkReload();
838
    }
839
840
    /**
841
     * Refreshes IAX configs and reload iax2 module
842
     */
843
    public function reloadIax(): void
844
    {
845
        PBX::iaxReload();
846
    }
847
848
    /**
849
     * Reloads MOH file list in Asterisk.
850
     */
851
    public function reloadMoh(): void
852
    {
853
        PBX::mohReload();
854
    }
855
856
    /**
857
     * Refreshes SIP configs and reload PJSIP module
858
     */
859
    public function reloadSip(): void
860
    {
861
        PBX::sipReload();
862
    }
863
864
    /**
865
     *  Refreshes features configs and reload features module
866
     */
867
    public function reloadFeatures(): void
868
    {
869
        PBX::featuresReload();
870
    }
871
872
    /**
873
     * Restarts CROND daemon
874
     */
875
    public function reloadCron(): void
876
    {
877
        $cron = new CronConf();
878
        $cron->reStart();
879
    }
880
881
    /**
882
     * Restarts NTP daemon
883
     */
884
    public function reloadNtp(): void
885
    {
886
        NTPConf::configure();
887
    }
888
889
    /**
890
     * Restarts Nginx daemon
891
     */
892
    public function reloadNginx(): void
893
    {
894
        $nginxConf = new NginxConf();
895
        $nginxConf->generateConf();
896
        $nginxConf->reStart();
897
    }
898
899
    /**
900
     * Applies modules locations changes and restarts Nginx daemon
901
     */
902
    public function reloadNginxConf(): void
903
    {
904
        $nginxConf = new NginxConf();
905
        $nginxConf->generateModulesConfigs();
906
        $nginxConf->reStart();
907
    }
908
909
    /**
910
     * Restarts Fail2Ban daemon
911
     */
912
    public function reloadFail2BanConf(): void
913
    {
914
        Fail2BanConf::reloadFail2ban();
915
    }
916
917
    /**
918
     * Restarts PHP-FPM daemon
919
     */
920
    public function reloadPHPFPM(): void
921
    {
922
        PHPConf::reStart();
923
    }
924
925
    /**
926
     * Configures SSH settings
927
     */
928
    public function reloadSSH(): void
929
    {
930
        $sshConf = new SSHConf();
931
        $sshConf->configure();
932
    }
933
934
    /**
935
     * Reconfigures TomeZone settings
936
     */
937
    public function updateTomeZone(): void
938
    {
939
        System::timezoneConfigure();
940
    }
941
942
    /**
943
     * Restarts rsyslog.
944
     */
945
    public function restartSyslogD(): void
946
    {
947
        // Рестарт демона Syslog.
948
        $syslogConf = new SyslogConf();
949
        $syslogConf->reStart();
950
    }
951
952
    /**
953
     *  Reloads Asterisk voicemail module
954
     */
955
    public function reloadVoicemail(): void
956
    {
957
        PBX::voicemailReload();
958
    }
959
960
    /**
961
     *  Reloads WorkerApiCommands worker
962
     */
963
    public function reloadRestAPIWorker(): void
964
    {
965
        Processes::processPHPWorker(WorkerApiCommands::class);
966
    }
967
968
    /**
969
     *  Reloads WorkerCallEvents worker
970
     */
971
    public function reloadWorkerCallEvents(): void
972
    {
973
        Processes::processPHPWorker(WorkerCallEvents::class);
974
    }
975
976
    /**
977
     * Process after PBXExtension state changes
978
     *
979
     * @param array $pbxModuleRecord
980
     */
981
    public function afterModuleStateChanged(array $pbxModuleRecord): void
982
    {
983
        // // Recreate modules array
984
        PBXConfModulesProvider::recreateModulesProvider();
985
        //
986
        // // Recreate database connections
987
        ModulesDBConnectionsProvider::recreateModulesDBConnections();
988
989
        $this->arrObject = $this->di->get(PBXConfModulesProvider::SERVICE_NAME);
990
991
        $className       = str_replace('Module', '', $pbxModuleRecord['uniqid']);
992
        $configClassName = "\\Modules\\{$pbxModuleRecord['uniqid']}\\Lib\\{$className}Conf";
993
        if (class_exists($configClassName)) {
994
            $configClassObj = new $configClassName();
995
996
            // Reconfigure fail2ban and restart iptables
997
            if (method_exists($configClassObj, ConfigClass::GENERATE_FAIL2BAN_JAILS)
998
                && ! empty(call_user_func([$configClassObj, ConfigClass::GENERATE_FAIL2BAN_JAILS]))) {
999
                $this->modified_tables[self::R_FAIL2BAN_CONF] = true;
1000
            }
1001
1002
            // Refresh Nginx conf if module has any locations
1003
            if (method_exists($configClassObj, ConfigClass::CREATE_NGINX_LOCATIONS)
1004
                && ! empty(call_user_func([$configClassObj, ConfigClass::CREATE_NGINX_LOCATIONS]))) {
1005
                $this->modified_tables[self::R_NGINX_CONF] = true;
1006
            }
1007
1008
            // Refresh crontab rules if module has any for it
1009
            if (method_exists($configClassObj, ConfigClass::CREATE_CRON_TASKS)) {
1010
                $tasks = [];
1011
                call_user_func_array([$configClassObj, ConfigClass::CREATE_CRON_TASKS], [&$tasks]);
1012
                if ( ! empty($tasks)) {
1013
                    $this->modified_tables[self::R_CRON] = true;
1014
                }
1015
            }
1016
1017
            // Reconfigure asterisk manager interface
1018
            if (method_exists($configClassObj, ConfigClass::GENERATE_MANAGER_CONF)
1019
                && ! empty(call_user_func([$configClassObj, ConfigClass::GENERATE_MANAGER_CONF]))) {
1020
                 $this->modified_tables[self::R_MANAGERS] = true;
1021
            }
1022
1023
            // Hook modules AFTER_ methods
1024
            if ($pbxModuleRecord['disabled'] === '1'
1025
                && method_exists($configClassObj, ConfigClass::ON_AFTER_MODULE_DISABLE))
1026
            {
1027
                call_user_func([$configClassObj, ConfigClass::ON_AFTER_MODULE_DISABLE]);
1028
            } elseif ($pbxModuleRecord['disabled'] === '0'
1029
                && method_exists($configClassObj, ConfigClass::ON_AFTER_MODULE_ENABLE))
1030
            {
1031
                call_user_func([$configClassObj, ConfigClass::ON_AFTER_MODULE_ENABLE]);
1032
            }
1033
        }
1034
    }
1035
}
1036
1037
/**
1038
 * The start point
1039
 */
1040
WorkerModelsEvents::startWorker($argv ?? null);