HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/heifetz/heifetz-app/kotsik
#!/usr/bin/env php
<?php

use Commands\CreateAdmin;
use Core\DbLib\DbDriver;
use Core\Models\Auth;
use Core\Models\RedisCache;
use Helpers\Output;

const VERSION = '1.0.0';

try {
    define('ROOT', realpath(__DIR__) . '/');
    date_default_timezone_set('Europe/Moscow');

    require_once ROOT . '/vendor/autoload.php';
    require_once(ROOT . '/config.php');
    require_once(ROOT . '/core/exceptions.php');
    require_once(ROOT . '/core/dblib/dblib.php');

    /** @var object $_CONFIG */

    $commands = [
        'admin' => ['admin:create' => CreateAdmin::getDescription()],
        'cache' => ['cache:clear' => 'Частично очищаем кэш Redis'],
        'make' => ['make:migration' => 'Создаёт Миграцию'],
    ];

    $devCommands = [
        'admin' => [
            'admin:reset' => 'Сбрасывает пароли',
            'admin:save-live' => 'Сбрасывает критичные для Live сервера настройки',
        ],
    ];

    if (IS_DEV || IS_TEST) {
        foreach ($devCommands as $groupName => $innerCommands) {
            foreach ($innerCommands as $command => $title) {
                $commands[$groupName][$command] = $title;
            }
        }
    }

    $maxCommandSize = 0;
    foreach ($commands as $groupName => $innerCommands) {
        foreach ($innerCommands as $command => $title) {
            $maxCommandSize = max($maxCommandSize, strlen($command));
        }
    }
    $maxCommandSize += 2;

    array_shift($argv);

    if (empty($argv)) {
        Output::print('Kotsik Framework ');
        Output::green(VERSION);
        Output::printLn(' (' . APPLICATION_ENV . ')');
        Output::printLn();
        Output::yellowLn('Использование:');
        Output::printLn('  command [options] [arguments]');
        Output::printLn();
        Output::yellowLn('Доступные команды:');
        foreach ($commands as $groupName => $innerCommands) {
            Output::greenLn(' ' . $groupName);
            foreach ($innerCommands as $command => $title) {
                Output::yellow('  ' . $command);
                echo str_pad($title, $maxCommandSize - strlen($command) + strlen($title), pad_type: STR_PAD_LEFT) . PHP_EOL;
            }
        }

        return;
    }

    $command = array_shift($argv);
    $command = explode(':', $command);
    $group = array_shift($command);
    if (empty($commands[$group])) {
        Output::error('Команда "' . $group . '" не определена');

        return 1;
    }

    if (empty($command)) {
        $error = 'Команда "' . $group . '" не определена' . PHP_EOL . PHP_EOL;
        $error .= 'Вы имели в виду одно из этого?' . PHP_EOL;
        $suggestions = array_map(fn($command) => '    ' . $command, array_keys($commands[$group]));
        $error .= join(PHP_EOL, $suggestions);
        Output::error($error);

        return 1;
    }

    $action = array_shift($command);
    if (empty($commands[$group][$group . ':' . $action])) {
        $error = 'Команда "' . $group . ':' . $action . '" не определена' . PHP_EOL . PHP_EOL;
        $error .= 'Вы имели в виду одно из этого?' . PHP_EOL;
        $suggestions = array_map(fn($command) => '    ' . $command, array_keys($commands[$group]));
        $error .= join(PHP_EOL, $suggestions);
        Output::error($error);

        return 1;
    }

    switch ($group) {
        case 'cache':
            switch ($action) {
                case 'clear':
                    RedisCache::create()->clear();
                    Output::greenLn('Очистка завершена');
                    break;
            }
            break;
        case 'make':
            switch ($action) {
                case 'migration':
                    if (empty($argv)) {
                        Output::error('Необходимо указать название Миграции');

                        return 1;
                    }

                    $migrationName = array_shift($argv);
                    $migrationName = 'm' . date('Y_m_d_Hi_') . $migrationName;
                    $fileName = ROOT . 'migrations/' . $migrationName . '.php';
                    if (file_exists($fileName)) {
                        Output::error('Миграция с таким названием уже существует');

                        return 1;
                    }
                    $title = readline('Можете указать заголовок Миграции [оставить пустым]:' . PHP_EOL);

                    $data = file_get_contents(ROOT . 'migrations/migration.example');
                    $data = str_replace('{{NAME}}', $migrationName, $data);
                    $data = str_replace('{{TITLE}}', $title, $data);
                    file_put_contents($fileName, $data);
                    Output::greenLn('Миграция успешно создана');
                    break;
            }
            break;
        case 'admin':
            switch ($action) {
                case 'create':
                    (new CreateAdmin())->run();
                    break;
                case 'reset':
                    if (IS_PROD) {
                        Output::error('Для данного env нельзя сбрасывать пароли');

                        return 1;
                    }

                    if ($_CONFIG->debug) {
                        ini_set('display_errors', 1);
                        error_reporting(E_ALL);
                    }

                    $db = DbDriver::getInstance();

                    $newPass = Auth::getPasswordHash('1');
                    $db->query("UPDATE users SET password = '$newPass' WHERE id > 0;");

                    Output::success('Пароли пользователей сброшены');
                    break;
            }
            break;
    }
} catch (Exception $exception) {
    Output::error($exception->getMessage());

    return 1;
}