From f94989c28c59a4fb66af4b44653d992c867f476f Mon Sep 17 00:00:00 2001 From: RedHood Date: Sun, 6 Dec 2020 00:59:46 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B0=D1=86=D0=B8=D1=8F=20(=D1=87=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + codeception.yml | 27 ++ mirzaev/skillparts/system/.bowerrc | 3 + mirzaev/skillparts/system/.gitignore | 33 +++ mirzaev/skillparts/system/LICENSE.md | 29 +++ mirzaev/skillparts/system/README.md | 233 ++++++++++++++++++ mirzaev/skillparts/system/Vagrantfile | 92 +++++++ mirzaev/skillparts/system/assets/AppAsset.php | 42 ++++ .../system/commands/HelloController.php | 34 +++ mirzaev/skillparts/system/docker-compose.yml | 9 + mirzaev/skillparts/system/requirements.php | 162 ++++++++++++ .../system/vagrant/config/.gitignore | 2 + .../vagrant/config/vagrant-local.example.yml | 22 ++ .../skillparts/system/vagrant/nginx/app.conf | 38 +++ .../system/vagrant/nginx/log/.gitignore | 3 + .../vagrant/provision/always-as-root.sh | 18 ++ .../system/vagrant/provision/once-as-root.sh | 79 ++++++ .../vagrant/provision/once-as-vagrant.sh | 31 +++ .../system/vagrant/provision/provision.awk | 50 ++++ mirzaev/skillparts/system/widgets/Alert.php | 75 ++++++ mirzaev/skillparts/system/yii | 21 ++ mirzaev/skillparts/system/yii.bat | 20 ++ 22 files changed, 1025 insertions(+) create mode 100644 .gitignore create mode 100644 codeception.yml create mode 100644 mirzaev/skillparts/system/.bowerrc create mode 100644 mirzaev/skillparts/system/.gitignore create mode 100644 mirzaev/skillparts/system/LICENSE.md create mode 100644 mirzaev/skillparts/system/README.md create mode 100644 mirzaev/skillparts/system/Vagrantfile create mode 100644 mirzaev/skillparts/system/assets/AppAsset.php create mode 100644 mirzaev/skillparts/system/commands/HelloController.php create mode 100644 mirzaev/skillparts/system/docker-compose.yml create mode 100644 mirzaev/skillparts/system/requirements.php create mode 100644 mirzaev/skillparts/system/vagrant/config/.gitignore create mode 100644 mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml create mode 100644 mirzaev/skillparts/system/vagrant/nginx/app.conf create mode 100644 mirzaev/skillparts/system/vagrant/nginx/log/.gitignore create mode 100644 mirzaev/skillparts/system/vagrant/provision/always-as-root.sh create mode 100644 mirzaev/skillparts/system/vagrant/provision/once-as-root.sh create mode 100644 mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh create mode 100644 mirzaev/skillparts/system/vagrant/provision/provision.awk create mode 100644 mirzaev/skillparts/system/widgets/Alert.php create mode 100644 mirzaev/skillparts/system/yii create mode 100644 mirzaev/skillparts/system/yii.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e851f6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +vendor/ +cache/ \ No newline at end of file diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000..c8c2169 --- /dev/null +++ b/codeception.yml @@ -0,0 +1,27 @@ +actor: Tester +bootstrap: _bootstrap.php +paths: + tests: tests + log: tests/_output + data: tests/_data + helpers: tests/_support +settings: + memory_limit: 1024M + colors: true +modules: + config: + Yii2: + configFile: 'config/test.php' + +# To enable code coverage: +#coverage: +# #c3_url: http://localhost:8080/index-test.php/ +# enabled: true +# #remote: true +# #remote_config: '../codeception.yml' +# whitelist: +# include: +# - models/* +# - controllers/* +# - commands/* +# - mail/* diff --git a/mirzaev/skillparts/system/.bowerrc b/mirzaev/skillparts/system/.bowerrc new file mode 100644 index 0000000..a39b5b0 --- /dev/null +++ b/mirzaev/skillparts/system/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory" : "vendor/bower-asset" +} diff --git a/mirzaev/skillparts/system/.gitignore b/mirzaev/skillparts/system/.gitignore new file mode 100644 index 0000000..5bd9be8 --- /dev/null +++ b/mirzaev/skillparts/system/.gitignore @@ -0,0 +1,33 @@ +# phpstorm project files +.idea + +# netbeans project files +nbproject + +# zend studio for eclipse project files +.buildpath +.project +.settings + +# windows thumbnail cache +Thumbs.db + +# composer vendor dir +/vendor + +# composer itself is not needed +composer.phar + +# Mac DS_Store Files +.DS_Store + +# phpunit itself is not needed +phpunit.phar +# local phpunit config +/phpunit.xml + +tests/_output/* +tests/_support/_generated + +#vagrant folder +/.vagrant \ No newline at end of file diff --git a/mirzaev/skillparts/system/LICENSE.md b/mirzaev/skillparts/system/LICENSE.md new file mode 100644 index 0000000..ee872b9 --- /dev/null +++ b/mirzaev/skillparts/system/LICENSE.md @@ -0,0 +1,29 @@ +Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/mirzaev/skillparts/system/README.md b/mirzaev/skillparts/system/README.md new file mode 100644 index 0000000..6db290b --- /dev/null +++ b/mirzaev/skillparts/system/README.md @@ -0,0 +1,233 @@ +

+ + + +

Yii 2 Basic Project Template

+
+

+ +Yii 2 Basic Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for +rapidly creating small projects. + +The template contains the basic features including user login/logout and a contact page. +It includes all commonly used configurations that would allow you to focus on adding new +features to your application. + +[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) +[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) +[![build](https://github.com/yiisoft/yii2-app-basic/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Abuild) + +DIRECTORY STRUCTURE +------------------- + + assets/ contains assets definition + commands/ contains console commands (controllers) + config/ contains application configurations + controllers/ contains Web controller classes + mail/ contains view files for e-mails + models/ contains model classes + runtime/ contains files generated during runtime + tests/ contains various tests for the basic application + vendor/ contains dependent 3rd-party packages + views/ contains view files for the Web application + web/ contains the entry script and Web resources + + + +REQUIREMENTS +------------ + +The minimum requirement by this project template that your Web server supports PHP 5.6.0. + + +INSTALLATION +------------ + +### Install via Composer + +If you do not have [Composer](http://getcomposer.org/), you may install it by following the instructions +at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix). + +You can then install this project template using the following command: + +~~~ +composer create-project --prefer-dist yiisoft/yii2-app-basic basic +~~~ + +Now you should be able to access the application through the following URL, assuming `basic` is the directory +directly under the Web root. + +~~~ +http://localhost/basic/web/ +~~~ + +### Install from an Archive File + +Extract the archive file downloaded from [yiiframework.com](http://www.yiiframework.com/download/) to +a directory named `basic` that is directly under the Web root. + +Set cookie validation key in `config/web.php` file to some random secret string: + +```php +'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', +], +``` + +You can then access the application through the following URL: + +~~~ +http://localhost/basic/web/ +~~~ + + +### Install with Docker + +Update your vendor packages + + docker-compose run --rm php composer update --prefer-dist + +Run the installation triggers (creating cookie validation code) + + docker-compose run --rm php composer install + +Start the container + + docker-compose up -d + +You can then access the application through the following URL: + + http://127.0.0.1:8000 + +**NOTES:** +- Minimum required Docker engine version `17.04` for development (see [Performance tuning for volume mounts](https://docs.docker.com/docker-for-mac/osxfs-caching/)) +- The default configuration uses a host-volume in your home directory `.docker-composer` for composer caches + + +CONFIGURATION +------------- + +### Database + +Edit the file `config/db.php` with real data, for example: + +```php +return [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=yii2basic', + 'username' => 'root', + 'password' => '1234', + 'charset' => 'utf8', +]; +``` + +**NOTES:** +- Yii won't create the database for you, this has to be done manually before you can access it. +- Check and edit the other files in the `config/` directory to customize your application as required. +- Refer to the README in the `tests` directory for information specific to basic application tests. + + +TESTING +------- + +Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/). +By default there are 3 test suites: + +- `unit` +- `functional` +- `acceptance` + +Tests can be executed by running + +``` +vendor/bin/codecept run +``` + +The command above will execute unit and functional tests. Unit tests are testing the system components, while functional +tests are for testing user interaction. Acceptance tests are disabled by default as they require additional setup since +they perform testing in real browser. + + +### Running acceptance tests + +To execute acceptance tests do the following: + +1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration + +2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full featured + version of Codeception + +3. Update dependencies with Composer + + ``` + composer update + ``` + +4. Download [Selenium Server](http://www.seleniumhq.org/download/) and launch it: + + ``` + java -jar ~/selenium-server-standalone-x.xx.x.jar + ``` + + In case of using Selenium Server 3.0 with Firefox browser since v48 or Google Chrome since v53 you must download [GeckoDriver](https://github.com/mozilla/geckodriver/releases) or [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) and launch Selenium with it: + + ``` + # for Firefox + java -jar -Dwebdriver.gecko.driver=~/geckodriver ~/selenium-server-standalone-3.xx.x.jar + + # for Google Chrome + java -jar -Dwebdriver.chrome.driver=~/chromedriver ~/selenium-server-standalone-3.xx.x.jar + ``` + + As an alternative way you can use already configured Docker container with older versions of Selenium and Firefox: + + ``` + docker run --net=host selenium/standalone-firefox:2.53.0 + ``` + +5. (Optional) Create `yii2basic_test` database and update it by applying migrations if you have them. + + ``` + tests/bin/yii migrate + ``` + + The database configuration can be found at `config/test_db.php`. + + +6. Start web server: + + ``` + tests/bin/yii serve + ``` + +7. Now you can run all available tests + + ``` + # run all available tests + vendor/bin/codecept run + + # run acceptance tests + vendor/bin/codecept run acceptance + + # run only unit and functional tests + vendor/bin/codecept run unit,functional + ``` + +### Code coverage support + +By default, code coverage is disabled in `codeception.yml` configuration file, you should uncomment needed rows to be able +to collect code coverage. You can run your tests and collect coverage with the following command: + +``` +#collect coverage for all tests +vendor/bin/codecept run --coverage --coverage-html --coverage-xml + +#collect coverage only for unit tests +vendor/bin/codecept run unit --coverage --coverage-html --coverage-xml + +#collect coverage for unit and functional tests +vendor/bin/codecept run functional,unit --coverage --coverage-html --coverage-xml +``` + +You can see code coverage output under the `tests/_output` directory. diff --git a/mirzaev/skillparts/system/Vagrantfile b/mirzaev/skillparts/system/Vagrantfile new file mode 100644 index 0000000..258aea6 --- /dev/null +++ b/mirzaev/skillparts/system/Vagrantfile @@ -0,0 +1,92 @@ +require 'yaml' +require 'fileutils' + +required_plugins_installed = nil +required_plugins = %w( vagrant-hostmanager vagrant-vbguest ) +required_plugins.each do |plugin| + unless Vagrant.has_plugin? plugin + system "vagrant plugin install #{plugin}" + required_plugins_installed = true + end +end + +# IF plugin[s] was just installed - restart required +if required_plugins_installed + # Get CLI command[s] and call again + system 'vagrant' + ARGV.to_s.gsub(/\[\"|\", \"|\"\]/, ' ') + exit +end + +domains = { + app: 'yii2basic.test' +} + +vagrantfile_dir_path = File.dirname(__FILE__) + +config = { + local: vagrantfile_dir_path + '/vagrant/config/vagrant-local.yml', + example: vagrantfile_dir_path + '/vagrant/config/vagrant-local.example.yml' +} + +# copy config from example if local config not exists +FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local]) +# read config +options = YAML.load_file config[:local] + +# check github token +if options['github_token'].nil? || options['github_token'].to_s.length != 40 + puts "You must place REAL GitHub token into configuration:\n/yii2-app-basic/vagrant/config/vagrant-local.yml" + exit +end + +# vagrant configurate +Vagrant.configure(2) do |config| + # select the box + config.vm.box = 'bento/ubuntu-18.04' + + # should we ask about box updates? + config.vm.box_check_update = options['box_check_update'] + + config.vm.provider 'virtualbox' do |vb| + # machine cpus count + vb.cpus = options['cpus'] + # machine memory size + vb.memory = options['memory'] + # machine name (for VirtualBox UI) + vb.name = options['machine_name'] + end + + # machine name (for vagrant console) + config.vm.define options['machine_name'] + + # machine name (for guest machine console) + config.vm.hostname = options['machine_name'] + + # network settings + config.vm.network 'private_network', ip: options['ip'] + + # sync: folder 'yii2-app-advanced' (host machine) -> folder '/app' (guest machine) + config.vm.synced_folder './', '/app', owner: 'vagrant', group: 'vagrant' + + # disable folder '/vagrant' (guest machine) + config.vm.synced_folder '.', '/vagrant', disabled: true + + # hosts settings (host machine) + config.vm.provision :hostmanager + config.hostmanager.enabled = true + config.hostmanager.manage_host = true + config.hostmanager.ignore_private_ip = false + config.hostmanager.include_offline = true + config.hostmanager.aliases = domains.values + + # quick fix for failed guest additions installations + # config.vbguest.auto_update = false + + # provisioners + config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone'], options['ip']] + config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false + config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always' + + # post-install message (vagrant console) + config.vm.post_up_message = "App URL: http://#{domains[:app]}" +end diff --git a/mirzaev/skillparts/system/assets/AppAsset.php b/mirzaev/skillparts/system/assets/AppAsset.php new file mode 100644 index 0000000..d8d6b20 --- /dev/null +++ b/mirzaev/skillparts/system/assets/AppAsset.php @@ -0,0 +1,42 @@ + + * @since 2.0 + */ +class AppAsset extends AssetBundle +{ + public $basePath = '@webroot'; + public $baseUrl = '@web'; + public $css = [ + '//fonts.googleapis.com/css?family=Open+Sans:400,700', + 'css/bootstrap/bootstrap.min.css', + 'css/main.css', + 'css/header.css', + 'css/info_panel.css', + 'css/categories_blocks_panel.css', + 'css/footer.css' + ]; + public $js = [ + 'https://code.jquery.com/jquery-3.5.1.min.js', + 'js/bootstrap/popper.min.js', + 'js/bootstrap/bootstrap.min.js', + 'https://kit.fontawesome.com/d7e922c226.js' + ]; + public $depends = [ + 'yii\web\YiiAsset', + // 'yii\bootstrap\BootstrapAsset' + ]; +} diff --git a/mirzaev/skillparts/system/commands/HelloController.php b/mirzaev/skillparts/system/commands/HelloController.php new file mode 100644 index 0000000..20066c4 --- /dev/null +++ b/mirzaev/skillparts/system/commands/HelloController.php @@ -0,0 +1,34 @@ + + * @since 2.0 + */ +class HelloController extends Controller +{ + /** + * This command echoes what you have entered as the message. + * @param string $message the message to be echoed. + * @return int Exit code + */ + public function actionIndex($message = 'hello world') + { + echo $message . "\n"; + + return ExitCode::OK; + } +} diff --git a/mirzaev/skillparts/system/docker-compose.yml b/mirzaev/skillparts/system/docker-compose.yml new file mode 100644 index 0000000..86be3bd --- /dev/null +++ b/mirzaev/skillparts/system/docker-compose.yml @@ -0,0 +1,9 @@ +version: '2' +services: + php: + image: yiisoftware/yii2-php:7.4-apache + volumes: + - ~/.composer-docker/cache:/root/.composer/cache:delegated + - ./:/app:delegated + ports: + - '8000:80' diff --git a/mirzaev/skillparts/system/requirements.php b/mirzaev/skillparts/system/requirements.php new file mode 100644 index 0000000..039d835 --- /dev/null +++ b/mirzaev/skillparts/system/requirements.php @@ -0,0 +1,162 @@ +Error\n\n" + . "

The path to yii framework seems to be incorrect.

\n" + . '

You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . ".

\n" + . '

Please refer to the README on how to install Yii.

\n"; + + if (!empty($_SERVER['argv'])) { + // do not print HTML when used in console mode + echo strip_tags($message); + } else { + echo $message; + } + exit(1); +} + +require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); +$requirementsChecker = new YiiRequirementChecker(); + +$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.'; +$gdOK = $imagickOK = false; + +if (extension_loaded('imagick')) { + $imagick = new Imagick(); + $imagickFormats = $imagick->queryFormats('PNG'); + if (in_array('PNG', $imagickFormats)) { + $imagickOK = true; + } else { + $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.'; + } +} + +if (extension_loaded('gd')) { + $gdInfo = gd_info(); + if (!empty($gdInfo['FreeType Support'])) { + $gdOK = true; + } else { + $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.'; + } +} + +/** + * Adjust requirements according to your application specifics. + */ +$requirements = array( + // Database : + array( + 'name' => 'PDO extension', + 'mandatory' => true, + 'condition' => extension_loaded('pdo'), + 'by' => 'All DB-related classes', + ), + array( + 'name' => 'PDO SQLite extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_sqlite'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for SQLite database.', + ), + array( + 'name' => 'PDO MySQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_mysql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for MySQL database.', + ), + array( + 'name' => 'PDO PostgreSQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_pgsql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for PostgreSQL database.', + ), + // Cache : + array( + 'name' => 'Memcache extension', + 'mandatory' => false, + 'condition' => extension_loaded('memcache') || extension_loaded('memcached'), + 'by' => 'MemCache', + 'memo' => extension_loaded('memcached') ? 'To use memcached set MemCache::useMemcached to true.' : '' + ), + // CAPTCHA: + array( + 'name' => 'GD PHP extension with FreeType support', + 'mandatory' => false, + 'condition' => $gdOK, + 'by' => 'Captcha', + 'memo' => $gdMemo, + ), + array( + 'name' => 'ImageMagick PHP extension with PNG support', + 'mandatory' => false, + 'condition' => $imagickOK, + 'by' => 'Captcha', + 'memo' => $imagickMemo, + ), + // PHP ini : + 'phpExposePhp' => array( + 'name' => 'Expose PHP', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), + 'by' => 'Security reasons', + 'memo' => '"expose_php" should be disabled at php.ini', + ), + 'phpAllowUrlInclude' => array( + 'name' => 'PHP allow url include', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), + 'by' => 'Security reasons', + 'memo' => '"allow_url_include" should be disabled at php.ini', + ), + 'phpSmtp' => array( + 'name' => 'PHP mail SMTP', + 'mandatory' => false, + 'condition' => strlen(ini_get('SMTP')) > 0, + 'by' => 'Email sending', + 'memo' => 'PHP mail SMTP server required', + ), +); + +// OPcache check +if (!version_compare(phpversion(), '5.5', '>=')) { + $requirements[] = array( + 'name' => 'APC extension', + 'mandatory' => false, + 'condition' => extension_loaded('apc'), + 'by' => 'ApcCache', + ); +} + +$result = $requirementsChecker->checkYii()->check($requirements)->getResult(); +$requirementsChecker->render(); +exit($result['summary']['errors'] === 0 ? 0 : 1); diff --git a/mirzaev/skillparts/system/vagrant/config/.gitignore b/mirzaev/skillparts/system/vagrant/config/.gitignore new file mode 100644 index 0000000..0685a56 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/config/.gitignore @@ -0,0 +1,2 @@ +# local configuration +vagrant-local.yml \ No newline at end of file diff --git a/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml b/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml new file mode 100644 index 0000000..919aec0 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/config/vagrant-local.example.yml @@ -0,0 +1,22 @@ +# Your personal GitHub token +github_token: +# Read more: https://github.com/blog/1509-personal-api-tokens +# You can generate it here: https://github.com/settings/tokens + +# Guest OS timezone +timezone: Europe/London + +# Are we need check box updates for every 'vagrant up'? +box_check_update: false + +# Virtual machine name +machine_name: yii2basic + +# Virtual machine IP +ip: 192.168.83.137 + +# Virtual machine CPU cores number +cpus: 1 + +# Virtual machine RAM +memory: 1024 diff --git a/mirzaev/skillparts/system/vagrant/nginx/app.conf b/mirzaev/skillparts/system/vagrant/nginx/app.conf new file mode 100644 index 0000000..1bfc0d5 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/nginx/app.conf @@ -0,0 +1,38 @@ +server { + charset utf-8; + client_max_body_size 128M; + sendfile off; + + listen 80; ## listen for ipv4 + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 + + server_name yii2basic.test; + root /app/web/; + index index.php; + + access_log /app/vagrant/nginx/log/yii2basic.access.log; + error_log /app/vagrant/nginx/log/yii2basic.error.log; + + location / { + # Redirect everything that isn't a real file to index.php + try_files $uri $uri/ /index.php$is_args$args; + } + + # uncomment to avoid processing of calls to non-existing static files by Yii + #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { + # try_files $uri =404; + #} + #error_page 404 /404.html; + + location ~ \.php$ { + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + #fastcgi_pass 127.0.0.1:9000; + fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; + try_files $uri =404; + } + + location ~ /\.(ht|svn|git) { + deny all; + } +} diff --git a/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore b/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore new file mode 100644 index 0000000..c0fbfdd --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/nginx/log/.gitignore @@ -0,0 +1,3 @@ +#nginx logs +yii2basic.access.log +yii2basic.error.log \ No newline at end of file diff --git a/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh b/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh new file mode 100644 index 0000000..17fb584 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/provision/always-as-root.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +info "Restart web-stack" +service php7.2-fpm restart +service nginx restart +service mysql restart diff --git a/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh b/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh new file mode 100644 index 0000000..75cbf5a --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/provision/once-as-root.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +#== Import script args == + +timezone=$(echo "$1") +readonly IP=$2 + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +export DEBIAN_FRONTEND=noninteractive + +info "Configure timezone" +timedatectl set-timezone ${timezone} --no-ask-password + +info "Add the VM IP to the list of allowed IPs" +awk -v ip=$IP -f /app/vagrant/provision/provision.awk /app/config/web.php + +info "Prepare root password for MySQL" +debconf-set-selections <<< 'mariadb-server mysql-server/root_password password' +debconf-set-selections <<< 'mariadb-server mysql-server/root_password_again password' +echo "Done!" + +info "Update OS software" +apt-get update +apt-get upgrade -y + +info "Install additional software" +apt-get install -y php7.2-curl php7.2-cli php7.2-intl php7.2-mysqlnd php7.2-gd php7.2-fpm php7.2-mbstring php7.2-xml unzip nginx mariadb-server-10.1 php.xdebug + +info "Configure MySQL" +sed -i 's/.*bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf +mysql <<< "CREATE USER 'root'@'%' IDENTIFIED BY ''" +mysql <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'" +mysql <<< "DROP USER 'root'@'localhost'" +mysql <<< 'FLUSH PRIVILEGES' +echo "Done!" + +info "Configure PHP-FPM" +sed -i 's/user = www-data/user = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf +sed -i 's/group = www-data/group = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf +sed -i 's/owner = www-data/owner = vagrant/g' /etc/php/7.2/fpm/pool.d/www.conf +cat << EOF > /etc/php/7.2/mods-available/xdebug.ini +zend_extension=xdebug.so +xdebug.remote_enable=1 +xdebug.remote_connect_back=1 +xdebug.remote_port=9000 +xdebug.remote_autostart=1 +EOF +echo "Done!" + +info "Configure NGINX" +sed -i 's/user www-data/user vagrant/g' /etc/nginx/nginx.conf +echo "Done!" + +info "Enabling site configuration" +ln -s /app/vagrant/nginx/app.conf /etc/nginx/sites-enabled/app.conf +echo "Done!" + +info "Removing default site configuration" +rm /etc/nginx/sites-enabled/default +echo "Done!" + +info "Initailize databases for MySQL" +mysql <<< 'CREATE DATABASE yii2basic' +mysql <<< 'CREATE DATABASE yii2basic_test' +echo "Done!" + +info "Install composer" +curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer diff --git a/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh b/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh new file mode 100644 index 0000000..8da4721 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/provision/once-as-vagrant.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +#== Import script args == + +github_token=$(echo "$1") + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +info "Configure composer" +composer config --global github-oauth.github.com ${github_token} +echo "Done!" + +info "Install project dependencies" +cd /app +composer --no-progress --prefer-dist install + +info "Create bash-alias 'app' for vagrant user" +echo 'alias app="cd /app"' | tee /home/vagrant/.bash_aliases + +info "Enabling colorized prompt for guest console" +sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/" /home/vagrant/.bashrc diff --git a/mirzaev/skillparts/system/vagrant/provision/provision.awk b/mirzaev/skillparts/system/vagrant/provision/provision.awk new file mode 100644 index 0000000..bcf44d3 --- /dev/null +++ b/mirzaev/skillparts/system/vagrant/provision/provision.awk @@ -0,0 +1,50 @@ +### +# Modifying Yii2's files for Vagrant VM +# +# @author HA3IK +# @version 1.0.0 + +BEGIN { + print "AWK BEGINs its work:" + IGNORECASE = 1 + + # Correct IP - wildcard last octet + match(ip, /(([0-9]+\.)+)/, arr) + ip = arr[1] "*" +} +# BODY +{ + # Check if it's the same file + if (FILENAME != isFile["same"]){ + msg = "- Work with: " FILENAME + # Close a previous file + close(isFile["same"]) + # Delete previous data + delete isFile + # Save current file + isFile["same"] = FILENAME + # Define array index for the file + switch (FILENAME){ + case /config\/web\.php$/: + isFile["IsConfWeb"] = 1 + msg = msg " - add allowed IP: " ip + break + } + # Print the concatenated message for the file + print msg + } + + # IF config/web.php + if (isFile["IsConfWeb"]){ + # IF line has "allowedIPs" and doesn't has our IP + if (match($0, "allowedIPs") && !match($0, ip)){ + match($0, /([^\]]+)(.+)/, arr) + $0 = sprintf("%s, '%s'%s", arr[1], ip, arr[2]) + } + # Rewrite the file + print $0 > FILENAME + } +} +END { + print "AWK ENDs its work." +} diff --git a/mirzaev/skillparts/system/widgets/Alert.php b/mirzaev/skillparts/system/widgets/Alert.php new file mode 100644 index 0000000..ae6c1d8 --- /dev/null +++ b/mirzaev/skillparts/system/widgets/Alert.php @@ -0,0 +1,75 @@ +session->setFlash('error', 'This is the message'); + * Yii::$app->session->setFlash('success', 'This is the message'); + * Yii::$app->session->setFlash('info', 'This is the message'); + * ``` + * + * Multiple messages could be set as follows: + * + * ```php + * Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']); + * ``` + * + * @author Kartik Visweswaran + * @author Alexander Makarov + */ +class Alert extends \yii\bootstrap\Widget +{ + /** + * @var array the alert types configuration for the flash messages. + * This array is setup as $key => $value, where: + * - key: the name of the session flash variable + * - value: the bootstrap alert type (i.e. danger, success, info, warning) + */ + public $alertTypes = [ + 'error' => 'alert-danger', + 'danger' => 'alert-danger', + 'success' => 'alert-success', + 'info' => 'alert-info', + 'warning' => 'alert-warning' + ]; + /** + * @var array the options for rendering the close button tag. + * Array will be passed to [[\yii\bootstrap\Alert::closeButton]]. + */ + public $closeButton = []; + + + /** + * {@inheritdoc} + */ + public function run() + { + $session = Yii::$app->session; + $flashes = $session->getAllFlashes(); + $appendClass = isset($this->options['class']) ? ' ' . $this->options['class'] : ''; + + foreach ($flashes as $type => $flash) { + if (!isset($this->alertTypes[$type])) { + continue; + } + + foreach ((array) $flash as $i => $message) { + echo \yii\bootstrap\Alert::widget([ + 'body' => $message, + 'closeButton' => $this->closeButton, + 'options' => array_merge($this->options, [ + 'id' => $this->getId() . '-' . $type . '-' . $i, + 'class' => $this->alertTypes[$type] . $appendClass, + ]), + ]); + } + + $session->removeFlash($type); + } + } +} diff --git a/mirzaev/skillparts/system/yii b/mirzaev/skillparts/system/yii new file mode 100644 index 0000000..f743758 --- /dev/null +++ b/mirzaev/skillparts/system/yii @@ -0,0 +1,21 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/mirzaev/skillparts/system/yii.bat b/mirzaev/skillparts/system/yii.bat new file mode 100644 index 0000000..d516b3a --- /dev/null +++ b/mirzaev/skillparts/system/yii.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem +rem @author Qiang Xue +rem @link http://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license http://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii" %* + +@endlocal