Quantcast
Channel: Библиотека знаний
Viewing all 1318 articles
Browse latest View live

Yii2 Framework extensions / Расширения - [Notifications]

$
0
0

Yii2 Framework extensions / Расширения

Создание

Обязательным требование для расширения является наличие типа
"type": "yii2-extension" Пример

Коллекции виджетов

Widgets

bootstrap

Editors

Upload / File input

Tags / Select / Select2 / Autocomplete

Карты / Maps / GEO

Editable / Table / Tables / Grids

EAV

Tree / Draggable / Sortable

Flags

Pajx

Charts / Графики

Pickes

Дата / Время Date picker

Pagination

Panels / Boxes / Div

Мобильные устройства

Навигация

ExtJs

Extension

User

Rest

  • yii2-rest

Excel

Shops

Cart

Log

Localization

Backup

Markdown

Fonts

Console

APP / Template

API

APNS / GSM

OAuth/OpenID

User/Auntification

RBAC

Image

File

Assets

Sort

Rules/Validator

Relation

Behavior

Scroll page

Notifications

GEO

  • willdurand/geocoder

WebSocket

Chat

Легенда

  • yiisoft/yii2-authclient - так обозначаются пакеты composer

Loaders

SMS

Switch

Sliders

Удаленные хранилища

Social

Проекты для начала разработки на Yii2

Webapp-Template

Модули

Theme / Темы

Angular


Android - [Устройства]

Xiaomi Redmi 3 - [Разблокировка]

$
0
0

Xiaomi Redmi 3

Установка

Flash writer

Usb drivers

  • QDLoader HS-USB Driver
    • QDLoader HS-USB Driver_64bit_Setup.exe (QDLoader HS-USB Driver_32bit_Setup.exe)
  • ADB Driver Lite

Прошивки

  • ido_xhdpi_global_images_6.7.29_20160712.0000.26_5.1_global (Прошика)

Где скачать?

Разблокировка

или Спец. сборка TWRP с защитой aboot от изменений и с упрощенным патчем boot

Видео

Python - [FrameWork/Библиотеки]

$
0
0

Python

Debian - установка

  • apt-get install python python-dev python-support python-lxml, python-gevent openssl python-gevent-socketio python-psutil python-reconfigure python-daemon python-passlib python-requests python-dbus python-imaging stunnel apt-show-versions python-catcher python-exconsole
  • easy_install pip

Установка pip

Установка pip пакетов (зависимостей)

  • pip install -r ./requirements.txt
  • pip install libxml

Установка пакетов из разных источников

REPO

$ pip install csvkit

GIT

$ pip installgit+https://github.com/wireservice/csvkit.git

ZIP

pip installgit+https://github.com/wireservice/csvkit/archive/master.zip

Обновление pip пакетов

Обновление пакета

$ pip install-U csvkit

Обновление всех пакетов

$ pip freeze --local|grep-v'^\-e'|cut-d = -f1|xargs-n1 pip install-U
$ pip freeze --local|grep-v'^\-e'|cut-d = -f1|xargs-n1 pip install--upgrade

Отладка

ORM

FrameWork/Библиотеки

Софт

PHP2Python

Сообщества

Документация / Книги / Статьи / Инструменты для изучения языка

Книги

  • Django. Подробное руководство

А. Головатый

  • Django. Разработка веб-приложений на Python

Джефф Форсье, Пол Биссекс, Уэсли Дж. Чан

  • Django: Практика создания Web-сайтов на Python

Владимир Дронов

  • Элемент ненумерованного списка * Элемент ненумерованного спискаPython 3 и PyQt 5. Разработка приложений

Николай Прохоренок, Владимир Дронов

  • Python 3. Самое необходимое

Николай Прохоренок, Владимир Дронов

  • Python в системном администрировании UNIX и Linux

Ноа Гифт, Джереми М. Джонс

  • Python и анализ данных

Уэс Маккинни

  • Python на практике

Марк Саммерфилд

  • Python на примерах. Практический курс по программированию

А. Васильев

  • Python. К вершинам мастерства

Лучано Рамальо

  • Python. Карманный справочник

Марк Лутц

  • Python. Подробный справочник

Дэвид Бизли

  • Python. Самое необходимое (+ Видеокурс на DVD)

Николай Прохоренок

  • Python: создание приложений. Библиотека профессионала

Уэсли Дж. Чан

  • Автоматизация рутинных задач с помощью Python: практическое руководство для начинающих

Эл Свейгарт

  • Изучаем Python

Марк Лутц

  • Построение систем машинного обучения на языке Python

Ричарт В., Коэльо П.Л.

  • Программирование компьютерного зрения на Python

Ян Эрик Солем

  • Программирование на Python 3. Подробное руководство

Марк Саммерфилд

  • Программирование на Python для начинающих

Майк МакГрат

  • Программирование на Python. Том 1

Марк Лутц

  • Программирование на Python. Том 2

Марк Лутц

  • Программируем на Python

Майкл Доусон

  • Простой Python. Современный стиль программирования

Билл Любанович

  • Разработка веб-приложений с использованием Flask на языке Python

Мигель Гринберг

  • Секреты Python. 59 рекомендаций по написанию эффективного кода

Бретт Слаткин

  • Скраппинг веб-сайтов с помощью Python

Митчелл Р.

Видеоуроки

RUS

ENG

Операционные системы

$
0
0

4K Xiaomi YI 4K - [Обновление firmware]

Chuwi Hibook Pro - [Прошивки]

$
0
0

Chuwi Hibook Pro

Windows

Android

Вопросы / Ответы

  • Подскажите как снести Windows и оставить только Android с максимальным количеством гб?
  • Создать загрузочную флешку Gparted Live (используя Rufus. Тут описано как правильно создать бут-флешку для UEFI).
  • Загрузить с нее планшет (F7 во время старта БИОС, выбрать загрузочную флешку)
  • Удалить все разделы начиная с 12-го по какой получится (в разное время, при разных типах инсталляции Виндоус, количество Виндоус-разделов отличалось)
  • Сдвинуть, по граф шкале, в крайнее правое положение 10-й, 11-й разделы.
  • Растянуть 9-й раздел (Data) на все освободившееся место.
  • Применить изменения, дождаться окончания всех операций, перезагрузить планшет.

Прошивки

Красивые клипы для души - [Chanels]

$
0
0

Красивые клипы для души

Chanels

Amaranthe

XANDRIA

Within Temptation

DELAIN

EPICA

Nightwish

Tarja (Nightwish)

Концерты

Studio

PHANTASMA

Остальные


Как загружается Linux

$
0
0

Как загружается Linux

Когда я осваивал Linux, мне было очень интересно что происходит при загрузке системы. Попытка разобраться в процессе загрузки привела меня в исходники загрузочных скриптов (/etc/inittab, /etc/rc*, /etc/init.d/*, ...) и их конфигов (/etc/sysconfig/*, /etc/cond.f/*, ...). Надо отметить серьёзные размеры и сложность этих скриптов - чтобы в них разобраться потребовалось немало времени. Но я в те времена искренне верил, что загрузка это сложный процесс, и что размеры и сложность загрузочных скриптов вполне оправданы. Когда меня окончательно достал RedHat, я решил собрать свой дистрибутив на базе LFS. Для своего дистрибутива пришлось самостоятельно разрабатывать загрузочные скрипты, и тут-то выяснилась правда: ничего сложного в процессе загрузки нет! Проработав 2.5 года на своём дистрибутиве (PoWeR Linux) я мигрировал на Gentoo (на качественную поддержку своего просто не хватало времени). Изучив загрузочные скрипты Gentoo я пришёл в ужас! Их размеры и сложность были ещё больше, чем у старого RedHat. После детального изучения стала ясна причина: один и тот же комплект загрузочных скриптов использовался и для LiveCD и для обычной системы - такой себе универсальный монстрик.
Так что при переходе на Gentoo я решил взять загрузочные скрипты из PoWeR Linux а стандартные Gentoo-шные не использовать (т.е. у меня от Gentoo используется только portage). И с тех пор ещё 4 года эти скрипты работают у меня на домашней рабочей станции и кучке удалённых серверов.

Характеристики

Размер скриптов (всех вместе) - 316 строк, 7.5KB:

$ wc 1 3 lib.sh 
 199  703 5152 1
  89  272 1671 3
  28  118  770 lib.sh
 316 1093 7593 итого

Минусы:

Всё в одном файле - при обновлении приложений практически невозможно автоматически обновить код инициализации этого приложения. Например, когда обновляется ALSA, то пакет может просто заменить файлы /etc/init.d/alsasound, /etc/conf.d/alsasound, /etc/modules.d/alsa. А в моём случае админу нужно будет ручками править /etc/runit/1. Нет поддержки всего на свете. Например, я не использую RAID и LVM - так что команды для их инициализации вам нужно будет добавлять самостоятельно. Вам нужно будет самостоятельно поддерживать эти скрипты. Я обычно при обновлении Gentoo поглядываю на изменения в (неиспользуемых мной) /etc/init.d/* скриптах и если меняется что-то важное - обновляю свои скрипты. Но, на практике, необходимость в таких изменениях возникает примерно раз в два года.

Плюсы:

Всё в одном небольшом файле - нет необходимости разыскивать по куче скриптов и их конфигов где настраивается то, что вам понадобилось; можно быстро и легко увидеть все базовые настройки системы.

Есть поддержка всего, что мне и моим друзьям за 6.5 лет было нужно на домашних компах и серверах.

Идеальны для изучения процесса инициализации Linux. Вы работаете с реальными базовыми командами Linux, которые одинаковы во всех дистрибутивах, а не со скриптами и конфигами специфичными для вашего дистрибутива.

Ускоряют загрузку системы. У меня домашняя машина грузится в single user mode (6 консолек с getty, syslog, klog, gpm) за 16.5 секунд. Я экспериментировал с параллельной загрузкой в стиле initng - эффект скорее отрицательный за счёт усложнения скриптов и порождения лишних процессов. Initng хорош для ускорения загрузки традиционных, раздутых скриптов, выполняющих множество ненужных действий, а в моём случае ускорять просто нечего. :) Не смотря на малый размер эти скрипты не только надёжно и быстро грузят систему, но и поддерживают несколько фич облегчающих жизнь админу:

Выполняемые команды сгруппированы в блоки по типам. В процессе загрузки выводятся названия блоков, с информацией были ли ошибки при выполнении команд блока. Если при выполнении блока команд были ошибки - выводится детальная информация по командам этого блока и возникшим ошибкам, после чего система ждёт 5 секунд нажатия любой кнопки для запуска bash и ручного исправления ошибок. После выхода из bash предлагается либо продолжить загрузку либо перегрузиться. Если ничего не нажимать, загрузка продолжится. Логи всего, что выводится при загрузке и отключении на экран (названия блоков команд и информация по возникающим ошибкам) сохраняются в файлах /var/log/boot, /var/log/shutdown. Благодаря этому можно на удалённых серверах посмотреть, как проходила загрузка/отключение. Пример сообщений выводимых при загрузке

 + UDEV
 + MODULES
 + SYSCTL
 + MTAB
 - MOUNTALL
++ swapon -a
++ false
EXIT CODE: 1
++ mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm
... press any key in 5 seconds to open shell ...
 + CLEANTMP
 + RANDOMSEED
 + HWCLOCK
 + SENSORS
 + LOADKEYS
 + SOUND
 + HOST_NAME
 + ENVUPDATE
 + NETWORK
 + RUNIT
 + DMESG

Runit

Для загрузки я вместо SysV init использую Runit. Runit не поддерживает /etc/inittab, вместо этого в нём используется простая схема: При загрузке запускается скрипт /etc/runit/1. Его задача полностью проинициализировать систему. По завершению скрипта /etc/runit/1 запускается скрипт /etc/runit/2, который должен запустить все необходимые сервисы (syslog, getty, ssh, apache, ...). Когда пользователь останавливает/перегружает систему запускается скрипт /etc/runit/3 который должен подготовить систему к отключению (завершить все процессы, отмонтировать диски, etc.). При желании можно настроить SysVinit для работы в том же стиле: Запуск /etc/runit/{1,2,3} из SysVinit: /etc/inittab

id:3:initdefault:
rc::bootwait:/etc/runit/1
l0:0:wait:/bin/sh -c '/etc/runit/3; exec /sbin/halt'
l3:3:once:/etc/runit/2
l6:6:wait:/bin/sh -c '/etc/runit/3; exec /sbin/reboot'
ca:12345:ctrlaltdel:/sbin/shutdown -r now

Сервисы Для запуска всех сервисов (getty, syslog, mysql, etc.) я использую тот же runit (по сути это просто немного улучшенный вариант daemontools). Но это отдельная большая тема, так что просто уточню что в этой статье скриптов для запуска сервисов нет, здесь только инициализация/отключение системы.

Исходники Вспомогательные функции: /etc/runit/lib.sh

#!/bin/bash
startlog() { exec 3>&1 4>&2 1> >(tee $1) 2>&1; }
stoplog() { exec 1>&3- 2>&4-; }

wanna() {
    echo -e "\a... press any key in $2 seconds to $1 ..."
    read -t $2 -n 1 -s </dev/console
}
emergency() {
    if wanna "open shell" 5; then
        bash --norc </dev/console &>/dev/console
        if [[ "$0" == "/etc/runit/1" ]] && wanna "reboot now" 3; then
            exit 100
        fi
    fi
}

trace() { trap 'ERR=$?' ERR; set -Ex; $1 2>&1; set +Ex; trap ERR; } 2>&-
try() {
    local output=$( trace $1 )
    if [[ "$output" =~ "ERR=" ]]; then
        echo -e "\e[1m\e[31m - \e[37m$1\e[0m"
        echo "$output" | sed $'s/.*ERR=\(.*\)/\a\033[36mEXIT CODE: \\1\033[0m/g'
        emergency
    else
        echo -e "\e[1m\e[32m + \e[37m$1\e[0m"
    fi
}

Startup: /etc/runit/1

#!/bin/bash

CONSOLE() {
    dmesg -n 1
}

INIT() {
    mount -n -t proc  none /proc
    mount -n -t sysfs none /sys
    mount -n -t ramfs none /dev
    mknod -m 660 /dev/console c 5 1
    mknod -m 660 /dev/null c 1 3
    ln -snf /proc/self/fd /dev/fd   # needed for startlog in /etc/runit/lib.sh
}

UDEV() {
    udevstart

    ### Standard add-on
    ln -snf /proc/self/fd/0 /dev/stdin
    ln -snf /proc/self/fd/1 /dev/stdout
    ln -snf /proc/self/fd/2 /dev/stderr
    ln -snf /proc/kcore /dev/core
    mkdir /dev/pts
    mkdir /dev/shm
    mount -n -t devpts -o gid=5,mode=0620 none /dev/pts

    ### My custom add-on
    ln -s vcs /dev/vcs0
    ln -s dvd2 /dev/dvd
    ln -s cdrom2 /dev/cdrom
    mkdir /dev/lirc
    mknod /dev/lirc/0 c 61 0
    mknod /dev/vmmon c 10 165
    mknod /dev/sdb  b 8  16
    mknod /dev/sdb1 b 8  17
}

MODULES() {
    update-modules

    ### Network
    modprobe -q skge
    modprobe -q 8139too media=56 # 1=10half 17=10full 56=100full
    modprobe -q sky2

    ### Lirc
    setserial /dev/ttyS1 uart none
    modprobe -q lirc_serial io=0x2f8 irq=3 # io=0x3f8 irq=4

    ### VMware
    modprobe -q vmmon
    modprobe -q vmnet
}

SYSCTL() {
    sysctl -p /etc/sysctl.conf
}

MTAB() {
    # Adding already-mounted fs to /etc/mtab
    >/etc/mtab
    mount -f /
    awk '$2 != "/" {print}' /proc/mounts >> /etc/mtab
    for i in $(cut -d ' ' -f 2 </etc/mtab); do mount -f -o remount "$i"; done
}

MOUNTALL() {
    swapon -a
    mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm
}

CLEANTMP() {
    # Cleaning up temporary files and locks, prepare utmp & wtmp
    rm -rf /var/lib/net-scripts/state/*
    rm -rf /var/run/console.lock /var/run/console/* # reset pam_console
    find /var/lock -type f -print0 | xargs -0 rm -f --
    find /var/run ! -type d ! -name utmp ! -name innd.pid \
        ! -name random-seed -exec rm -f -- {} \;
    > /var/lock/.keep
    rm -f /tmp/.X*-lock /tmp/esrv* /tmp/kio* /tmp/jpsock.* /tmp/.fam* /tmp/iceauth.* /tmp/xauth.*
    rm -rf /tmp/.esd* /tmp/orbit-* /tmp/ssh-* /tmp/ksocket-* /tmp/.*-unix
    rm -rf /tmp/.{ICE,X11}-unix
    mkdir -p /tmp/.{ICE,X11}-unix
    chmod 1777 /tmp/.{ICE,X11}-unix
}

RANDOMSEED() {
    # Restoring random-seed.
    [ -f /var/run/random-seed ] && cat /var/run/random-seed >>/dev/urandom
    rm -f /var/run/random-seed
    ( umask 077 ; dd if=/dev/urandom of=/var/run/random-seed count=1 2>/dev/null )
}

HWCLOCK() {
    if [ ! -f /etc/adjtime ]; then echo "0.0 0 0.0" > /etc/adjtime ; fi
    hwclock --adjust --localtime
    hwclock --hctosys --localtime
}

SENSORS() {
    sensors -s
}

LOADKEYS() {
    # Commands for TTY initialization like 'setfont' and 'echo -ne "\033(K"'
    # shouldn't be executed in /etc/runit/1 because:
    # - which TTYs should be initialized may depend on current runlevel
    # - if TTY state become broken (for ex. after 'cat /dev/urandom'),
    #   then after logout and login TTY state should be reinitialized
    # these commands should be executed before each getty invocation instead.
    loadkeys koi2   # -q windowkeys
}

SOUND() {
    alsactl -f /etc/asound.state restore
}

HOST_NAME() {
    hostname home
    echo "HOSTNAME='$(hostname)'" >/etc/env.d/01hostname
}

ENVUPDATE() {
    env-update.sh -u
}

NETWORK() {
    ifconfig lo 127.0.0.1 up
    route add -net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1 dev lo
    iptables-restore </etc/iptables
    ifconfig eth2 192.168.2.1 broadcast 192.168.2.255 netmask 255.255.255.0
    ifconfig eth2:0 192.168.2.254
    ifconfig eth1 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0
    ifconfig eth0 192.168.10.2 broadcast 192.168.10.255 netmask 255.255.255.0
    #route add default gw 192.168.1.1 dev eth1
}

RUNIT() {
    # Set default action (shutdown or not) if Ctrl+Alt+Del pressed,
    # but /etc/runit/ctrlaltdel don't setup /etc/runit/stopit.
    touch /etc/runit/stopit
    chmod 100 /etc/runit/stopit
    
    # Set default action on shutdown (halt or reboot) if:
    # - /etc/runit/1 crash or exit 100
    # - /etc/runit/2 exit non 111
    # - Ctrl+Alt+Del pressed, but /etc/runit/ctrlaltdel don't setup /etc/runit/reboot
    touch /etc/runit/reboot
    chmod 100 /etc/runit/reboot
    
    # Set runlevel to:
    # - single      if kernel has param: S
    # - RUNLEVELNAME    if kernel has param: runlevel=RUNLEVELNAME
    # - default     if kernel has no params or unable to set requested runlevel
    grep -q '\(^\| \)S\( \|$\)' /proc/cmdline && runlevel='single'
    runsvchdir ${runlevel:-default} || runsvchdir default
}

SEND_MAIL() {
    echo -e "To: root\nSubject: reboot at $(date)" | sendmail -t
}

DMESG() {
    # Create an 'after-boot' dmesg log
    touch /var/log/dmesg
    chmod 640 /var/log/dmesg
    dmesg > /var/log/dmesg
}


PATH=/sbin:/usr/sbin:/bin:/usr/bin
trap ':' INT QUIT TSTP
. /etc/runit/lib.sh

try CONSOLE
try INIT
startlog /var/log/boot
try UDEV
try MODULES
try SYSCTL
try MTAB
try MOUNTALL
try CLEANTMP
try RANDOMSEED
try HWCLOCK
try SENSORS
try LOADKEYS
try SOUND
try HOST_NAME
try ENVUPDATE
try NETWORK
try RUNIT
#try SEND_MAIL
try DMESG
stoplog

# Select next stage (exit 0 for stage 2, exit 100 for stage 3):
exit 0

Shutdown: /etc/runit/3

#!/bin/bash

CONSOLE() {
    chvt 1
    # Required in case getty was last process in this console and it leave
    # console in broken state (\n work as <LF> without <CR>).
    { stty sane ; echo ; } >/dev/console
}

TERM() {
    # Give a chance for all processes for clean exit.
    # This also will kill all 'runsvdir' and signal all 'runsv' to exit.
    killall5 -15
}

HWCLOCK() {
    hwclock --systohc --localtime
}

SERVICES() {
    sv force-stop /var/service/* &>/dev/null || :
}

SOUND() {
    alsactl -f /etc/asound.state store
}

RANDOMSEED() {
    umask 077
    dd if=/dev/urandom of=/var/run/random-seed count=1 2>/dev/null
}

NETWORK() {
    for i in $(ifconfig | grep '^[^ ]' | cut -d ' ' -f 1 | tac); do
        ifconfig "$i" down
    done
}

WTMP() {
    /sbin/halt -w
}

KILL() {
    # Goodbye to everybody...
    killall5 -9
}

UMOUNTPSEUDO() {
    # Unmounting memory filesystems:
    umount -a -t tmpfs
    swapoff -a
    # Unmounting loopback devices first:
    for d in $(grep '^/dev/loop' /proc/mounts | cut -d ' ' -f 2 | tac); do
        eval "umount -d -r -f $'$d'"
    done
    umount -d -r -f -a -O bind 
}

UMOUNTHDD() {
    # Unmounting all filesystems:
    for d in $(egrep -v '^[^/]|^/dev/root' /proc/mounts | cut -d ' ' -f 2 | tac); do
        eval "umount -d -r -f $'$d'"
    done
}

FINI() {
    sync; sync
    mount -n -o remount,ro / || { sleep 1; mount -n -o remount,ro /; }
}


PATH=/sbin:/usr/sbin:/bin:/usr/bin
trap ':' INT QUIT TSTP
. /etc/runit/lib.sh

try CONSOLE
startlog /var/log/shutdown
try TERM
try HWCLOCK
try SERVICES
try SOUND
try RANDOMSEED
try NETWORK
try WTMP
try KILL
try UMOUNTPSEUDO
try UMOUNTHDD
stoplog
try FINI

Использование runit для своих сервисов

$
0
0

Использование runit для своих сервисов

Супервизор сервисов runitпозиционируется как замена стандартным скриптам инициализации Unix.

Но на практике оказалось, что runit идеален для управления сервисами безотносительно инициализации и т.п.

Введение

Супервизор берёт на себя такой функционал, как: превращение любого процесса в демон; логгирование вывода процесса и ротирование логов; запуск, остановка, рестарт, запрос состояния, управляющие скрипты для init.d; выключение и запуск сервисов автоматически при появлении новых сервисов в списке либо удалении старых из списка; возможность ведения нескольких независимых списков сервисов одновременно (например, для каждого пользователя отдельно и для системы в целом); удобный APIдля управления сервисами.

Для большинства операционных систем runit уже входит в репозитории пакетов (apt-get install runit). Кроме того, мы имеем уже готовый набор рецептов (ссылку придётся поправить, хабр сломал её) для популярных сервисов (nginx, apache etc.).

Далее рассмотрим стандартную схему runit (которая используется по умолчанию):

Демонизация

Каждый сервис описывается отдельным каталогом /etc/sv/<название сервиса>.

обычно достаточно иметь в этом каталоге исполняемый скрипт run вида

#!/bin/bash
exec 2>&1

exec your_running_command

Важно, чтобы your_running_command не демонизировала себя (не отсоединялась от стандартных потоков stdin, stdout, stderr).

Переадресация ошибок в стандартный вывод нужна для их логгирования. Выполняется логгирование, если в каталоге /etc/sv/<название сервиса>/log/ разместить файл run вида

#!/bin/bash
LOG_FOLDER=/var/log/<название сервиса>
mkdir -p $LOG_FOLDER
exec svlogd -tt $LOG_FOLDER

Сервисы, расположенные в каталоге /etc/sv/, не выполняются, пока ссылки на них не будут размещены в каталоге /etc/service/.

Как только вы сделаете ln -s /etc/sv/<название сервиса> /etc/service/<название сервиса>, сервис runsvdir увидит новый сервис, и запустит его. Более того, в случае остановки сервиса он будет автоматически перезапущен. Это даёт гораздо более быструю реакцию на остановку сервиса по сравнению с использованием сервисов мониторинга (god или monit).

Ротирование логов

При использовании svlogd логи размещаются в папке, которую Вы указали при её запуске. При этом текущий лог находится в файле current, и периодически выполняется ротирование логов в этой папке.

Управление

Запускать, останавливать, перезапускать сервисы можно с помощью команды sv (start|stop|restart...) <название сервиса>.

Кроме того, при запуске сервиса появится каталог /etc/service/<название сервиса>/supervise, в котором будут расположены очень полезные файлы и потоки:

pid — идентификатор процесса Unix;
stat — человеко-читаемое состояние сервиса
status — машинно-читаемое состояние процесса
control — поток управления

и так далее...

Можно отметить, что для остановки или запуска процесса достаточно открыть поток control на запись, и отправить туда символ d (от down) или u (от up) соответственно.

В стиле init.d

Нет ничего проще, чем поддержать управление в стиле init.d.

Просто делаем ln -s /usr/bin/sv /etc/init.d/<название сервиса>. sv поймёт, что его вызвали в стиле init.d, и готов будет принимать команды вида /etc/init.d/<название сервиса> start etc. Совсем немного магии, правда?

Настройка сервисов

В комплекте с runit поставляется утилита chpst, которая позволяет выполнять сервисы с дополнительной настройкой (ограничивать размер памяти, запускать из под определенного пользователя, с другим уровнем nice и т.д.).

Резюме

runit оказался настолько удобен и надёжен для организации своих сервисов, что мы стараемcя переводить все наши демоны под runit, заодно отказываясь от различного геморроя в виде пакетов демонизации а ля daemons gem. Также на части машин мы избавились от Monit (где требовался лишь мониторинг процессов).

Крайне рекомендую к прочтению комментарий от powerman, а также статью про Web-интерфейс к runit.

Запуск PHP скрипта с использованием nohup

$
0
0

Запуск PHP скрипта с использованием nohup

Debian / Ubuntu

nano /etc/init.d/price_parser
chmod +x /etc/init.d/price_parser

#!/bin/sh### BEGIN INIT INFO# Provides:          price_parser# Required-Start:    $remote_fs $syslog# Required-Stop:     $remote_fs $syslog# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: Stop/start price_parser### END INIT INFO 
# Author: Mirocow <mr.mirocow@gmail.com> 
. /lib/init/vars.sh
. /lib/lsb/init-functions
 
PNAME="price_parser"PPATH="/home/some/path/to/app"SCRIPT="/usr/bin/php ./yii some/cotroller/action"PIDFILE="/var/run/${PNAME}.pid"LOCKFILE="/var/lock/${PNAME}" 
RETVAL=0 
start(){echo-n"Starting $PNAME : "if[-s${PIDFILE}]; thenRETVAL=1echo-n"Already running !"echoelsecd${PPATH}&&nohup${SCRIPT}>/dev/null 2>&1&RETVAL=$?PID=$![$RETVAL-eq0]&&touch${LOCKFILE}echoecho$PID>${PIDFILE}fi} 
stop(){if[-s${PIDFILE}]; thenecho-n"Shutting down ${PNAME} : "kill-9`cat${PIDFILE}`RETVAL="$?"if[$RETVAL-eq0]; thenrm-f${LOCKFILE}rm-f${PIDFILE}fielseRETVAL=1echo-n"Already stoped !"echofireturn"$RETVAL"} 
restart(){echo-n"Restarting ${PNAME} : "
    stop
    sleep2
    start
} 
case"$1"in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status ${PNAME};;
    restart)
        restart
    ;;*)echo"Usage: $0 {start|stop|status|restart}";;esac 
exit0

CentOS / Fedora

 

Yii Framework 2 - [История изменений]

$
0
0

Yii Framework 2

Схема работы приложений

Instalation / Установка

В данной ветке содержатся только стабильные версии пакетов. Установка производится из готового шаблона проекта "yiisoft/yii2-app-basic"

Устанавливаем композер
curl -s http://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod 755 /usr/local/bin/composer
Устанавливаем зависимый пакет композера и создаем типовой проект из готового шаблона yii2-app-basic
composer global require "fxp/composer-asset-plugin:@dev"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic

или из yii2-app-advanced

composer global require "fxp/composer-asset-plugin:@dev"
composer create-project --prefer-dist yiisoft/yii2-app-advanced advanced
Обновляем vendors
rm ./composer.lock
composer install --prefer-dist
  • --stability=dev - указание composer на разрешение скачать dev версии пакетов
  • --prefer-dist - указание composer на установку пакетов без создания git репозитория

Шаблоны проектов

Установка расширений или модулей

php composer.phar require --prefer-dist yiisoft/yii2-gii "*"

или в composer.json

"yiisoft/yii2-gii": "*"

Версии

В ./composer.jsonнеобходимо вставить ниже следующие обозначения версий

Stable
"minimum-stability": "stable",
Development
"minimum-stability": "dev",

История изменений

Документация / Статьи

Проекты

Расширения

Поиск расширений

Базовые настройки

Установка дополнительных генераторов проекта (Gii)

Видео уроки

Russian

Ukraine

English

Other

Автоматический запуск в linux - [Init / Автоматический запуск в linux]

$
0
0

Автоматический запуск в linux

UpStart

/etc/init содержит конфигурационные файлы для супервизора сервисов "UpStart".

Systemv

/etc/init.d содержит конфигурационные файлы для супервизора сервисов "Systemv". /ect/rc.[n] - содержит ссылки на конфигурационные скрипты, где n - уровень запуска

  1. Runlevel 0 is halt. - Остановка системы
  2. Runlevel 1 is single-user. - Однопользовательский режим
  3. Runlevels 2-5 are multi-user. - Многопользовательский режим
  4. Runlevel 6 is reboot. - Перезагрузка

/etc/inittab - содержит инструкции запуска

Базовые конфигурационные скрипты

/etc/init.d/rc.local - Запускает скрипты из /etc/rc.local

Примеры для Debian

Systemd

Runit

Homebrew - [Установка определенных версий]

$
0
0

Homebrew

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

Update

  • brew update

Repaire

  • brew doctor

Install / Options / Info

  • brew install nginx-full
  • brew options nginx-full - Список доступных ключей/опций для установки
  • rew info nginx-full - Информация о пакете

Установка определенных версий

Errors / Ошибки

Error: Cowardly refusing to `sudo brew install`
You can use brew with sudo, but only if the brew executable is owned by root.
However, this is both not recommended and completely unsupported so do so at
your own risk.

Исправление

# sudo chown -R $USER /usr/local
# sudo chown -R $USER /Library/Caches/Homebrew

Восстановление ревизий

$ cd `brew --cellar`
$ git reset --hard HEAD

Установка / Удаление репозиториев

Установка

$ brew tap homebrew/versions

Удаление

$ brew untap homebrew/versions

Просмотр

list

Список пакетов

$ brew list|grep php
 
php70
php70-amqp
php70-event
php70-igbinary
php70-intl
php70-mcrypt
php70-mongodb
php70-pcntl
php70-pdo-pgsql
php70-redis
php70-ssh2
php70-xdebug
php70-yaml

Список необновленных пакетов

$ brew outdated
 
jasper (1.900.21)< 2.0.2
libgphoto2 (2.5.10)< 2.5.11
libicns (0.8.1_1)< 0.8.1_3
homebrew/php/php70-pdo-pgsql (7.0.12_4)< 7.0.13_5
winetricks (20161012)<20161107

Вывод с указанием версии пакета с указанием пакетов которые надо обновить

$ brew list --versions--updates|grep php
php70 7.0.13_6
php70-amqp 1.7.1
php70-event 2.0.0
php70-igbinary HEAD-cb6bca5
php70-intl 7.0.13_7
php70-mcrypt 7.0.13_5
php70-mongodb HEAD
php70-pcntl 7.0.13_5
php70-pdo-pgsql 7.0.12_4
php70-redis HEAD
php70-ssh2 HEAD
php70-xdebug 2.4.1
php70-yaml HEAD

show

Переключение пакетов

$ brew unlink php70
$ brew link php71
$ brew switch php71 70

Заморозка версии

Бывает такое, когда нада зафиксировать формулу от обновлений с помощью brew upgrade Для реализацци этой задачи воспользуйтесь brew pin, а когда нада опять возобновить возможность обновлений просто выполните brew unpin postgresql-9.4

Замораживаем

#  brew pin postgresql-9.4

Размораживаем

#  brew unpin postgresql-9.4

Development

  • brew tap homebrew/versions
  • brew install autoconf automake gcc47 pcre
  • brew install autoconf autoconf-archive automake libtool icu4c curl

Скрипт / Установщики / Настройка

Ссылки

Event-driven, non-blocking I/O with PHP - [AMPHP]

$
0
0

Event-driven, non-blocking I/O with PHP

The event loop is based on the reactor pattern (hence the name) and strongly inspired by libraries such as EventMachine (Ruby), Twisted (Python) and Node.js (V8).

Репозитории

ReactPHP

http://reactphp.org/

ReactPHP is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: Streams abstraction, async dns resolver, network client/server, http client/server, interaction with processes. Third-party libraries can use these components to create async network clients/servers and more.

AMPHP


Документация по Yii 2 Framework - [IsConsole]

$
0
0

Документация по Yii 2 Framework

Configuration

<?phpreturn['components'=>['db'=>['class'=>'yii\db\Connection','dsn'=>'mysql:host=localhost;dbname=yii2','username'=>'yii2','password'=>'<password>',],'cache'=>['class'=>'yii\caching\DummyCache',],'urlManager'=>['rules'=>['<action:(login|logout|about)>'=>'site/<action>', 
                // ... 
                ['class'=>'app\components\CarUrlRule','connectionID'=>'db',...],],'enablePrettyUrl'=>true,'enableStrictParsing'=>true,'showScriptName'=>false,'suffix'=>'.html',],]];

URL Management

echo \Yii::$app->urlManager->createUrl(['site/page','id'=>'about']);// /index.php/site/page/id/about/echo \Yii::$app->urlManager->createUrl(['date-time/fast-forward','id'=>105])// /index.php?r=date-time/fast-forward&id=105echo \Yii::$app->urlManager->createAbsoluteUrl('blog/post/index');// http://www.example.com/index.php/blog/post/index/
$route=[// ... path + params]; 
$url= \Yii::$app->urlManager;$url->createUrl($route);$url->createAbsoluteUrl($route); 
$url= Yii::$app->urlManager->createUrl($route);$url= Yii::$app->urlManager->createAbsoluteUrl($route);

Конфигурация

<?phpreturn[// ...'components'=>['urlManager'=>['enablePrettyUrl'=>true,'showScriptName'=>false,'enableStrictParsing'=>true,'suffix'=>'.html','rules'=>['<action:(login|logout|about)>'=>'site/<action>', 
                // ... 
                ['class'=>'app\components\CarUrlRule','connectionID'=>'db',...],],],],];

Url

yii\helpers\Url::toRoute

echo Url::toRoute([''],$schema=false);// currently active routeecho Url::toRoute(['view','id'=>'contact'],$schema=false);// same controller, different actionecho Url::toRoute(['post/index'],$schema=false);// same module, different controller and actionecho Url::toRoute(['/site/index'],$schema=false);// absolute route no matter what controller is making this callecho Url::toRoute(['post/read','id'=>100,'#'=>'title'],$schema=false)
echo Url::toRoute('',$schema=false);// currently active routeecho Url::toRoute('post/index',$schema=false);// same module, different controller and actionecho Url::toRoute('/site/index',$schema=false);// absolute route no matter what controller is making this call

yii\helpers\Url::to

echo Url::to('',$schema=false);// currently active routeecho Url::to('post/index',$schema=false);// same module, different controller and actionecho Url::to('/site/index',$schema=false);// absolute route no matter what controller is making this call
echo Url::to('@web',$schema=false);echo Url::canonical();// get canonical URL for the curent pageecho Url::home();// get home URLecho Url::remember();// save URL to be used laterecho Url::previous();// get previously saved URL
  • $schema = true - Абсолютный адрес
  • $schema = 'https' - Указание на испоользование шифрованного протокола

Синоним для yii\helpers\Url::toRoute

echo Url::to([''],$schema=false);// currently active routeecho Url::to(['view','id'=>'contact'],$schema=false);// same controller, different actionecho Url::to(['post/index'],$schema=false);// same module, different controller and actionecho Url::to(['/site/index'],$schema=false);// absolute route no matter what controller is making this callecho Url::to(['post/read','id'=>100,'#'=>'title'],$schema=false)

Примеры использоватия можно глянуть в тестах https://github.com/yiisoft/yii2/blob/master/tests/unit/framework/helpers/UrlTest.php

yii\helpers\Html::url (old)

echo Html::url(['']);// currently active routeecho Html::url(['view','id'=>'contact']);// same controller, different actionecho Html::url(['post/index']);// same module, different controller and actionecho Html::url(['/site/index']);// absolute route no matter what controller is making this callecho Html::url(['post/read','id'=>100,'#'=>'title'])
echo Html::url('');// currently active routeecho Html::url('post/index');// same module, different controller and actionecho Html::url('/site/index');// absolute route no matter what controller is making this call

вместо старых методов нада использовать yii\helpers\Url::to

Примеры использоватия можно глянуть в тестах https://github.com/yiisoft/yii2/blob/master/tests/unit/framework/helpers/UrlTest.php

createUrl

echo$this->createUrl([''],$schema=null);// currently active routeecho$this->createUrl(['view','id'=>'contact'],$schema=null);// same controller, different actionecho$this->createUrl(['post/index'],$schema=null);// same module, different controller and actionecho$this->createUrl(['/site/index'],$schema=null);// absolute route no matter what controller is making this callecho$this->createUrl(['post/read','id'=>100,'#'=>'title'],$schema=null)
echo$this->createUrl('',$schema=null);// currently active routeecho$this->createUrl('post/index',$schema=null);// same module, different controller and actionecho$this->createUrl('/site/index',$schema=null);// absolute route no matter what controller is making this call

createAbsoluteUrl (old)

Усли $this - это yii\web\Controller

echo$this->createAbsoluteUrl([''],$schema=null);// currently active routeecho$this->createAbsoluteUrl(['view','id'=>'contact'],$schema=null);// same controller, different actionecho$this->createAbsoluteUrl(['post/index'],$schema=null);// same module, different controller and actionecho$this->createAbsoluteUrl(['/site/index'],$schema=null);// absolute route no matter what controller is making this callecho$this->createAbsoluteUrl(['post/read','id'=>100,'#'=>'title'],$schema=null)

вместо старых методов надо использовать yii\helpers::toRoute

Усли $this - это yii\web\Controller

echo$this->createAbsoluteUrl('',$schema=null);// currently active routeecho$this->createAbsoluteUrl('post/index',$schema=null);// same module, different controller and actionecho$this->createAbsoluteUrl('/site/index',$schema=null);// absolute route no matter what controller is making this call

вместо старых методов надо использовать yii\helpers::toRoute

Request

GET

Yii::$app->request->get();
Yii::$app->request->getQueryParams();
Yii::$app->request->getQueryParam('File');
Yii::$app->request->get('File');

POST

Yii::$app->request->post();
Yii::$app->request->getBodyParams();
Yii::$app->request->getBodyParam('File');
Yii::$app->request->post('File');

View

CSS

$this->registerCssFile();

JS

$this->registerJsFile();

Вставка кода внутри представления

В примере производится вставка JS кода из assets c применением переменной в скрипте JS_FABRIC_CAR_URL

$this= Yii::$app->view;
<?php$this->registerJs('var JS_FABRIC_CAR_URL = "'. Html::url(['/core/ajax/fabric-car']).'";', View::POS_HEAD,'js-fabric-car-url');$publish= Yii::$app->assetManager->publish(Yii::getAlias('@app/modules/core/assets/js'));$this->registerJsFile($publish[1].'/block-select-car.js',[yii\web\JqueryAsset::className()],['position'=>View::POS_END]);?>

assetManager

'components'=>['assetManager'=>['class'=>'yii\web\AssetManager','forceCopy'=>true,],],
  • forceCopy - Включает постоянное обновление асетов

через ajaxSetup

Добавление csrfToken в Ajax запрос (Yii2)

$js_global_variables='
$.ajaxSetup({
        data: '. \yii\helpers\Json::encode([
            \yii::$app->request->csrfParam=> \yii::$app->request->csrfToken,]).'
    });'. PHP_EOL;$this->registerJs($js_global_variables, yii\web\View::POS_HEAD,'js_global_variables');

или через header

$js_global_variables='
$.ajaxPrefilter(function( options ) {
    if ( !options.beforeSend) {
        options.beforeSend = function (xhr) { 
            xhr.setRequestHeader("HTTP_X_CSRF_TOKEN", '. \yii::$app->request->csrfToken.');
        }
    }
});'. PHP_EOL;$this->registerJs($js_global_variables, yii\web\View::POS_HEAD,'js_global_variables');

или через JQuery

      $.ajax({
        url: 'http://site?controller/action',
        type: 'post',
        data: {payload: payload, _csrf: yii.getCsrfToken()},        
        dataType: 'json',
      }).success(function(response) {
      });

Form

Ajax

Pjax

use app\modules\cabinet\components\CabinetController;use app\models\Image; 
class CameraController extends CabinetController
{publicfunction actionFavorite(){$id=(int) Yii::$app->request->post('id'); 
        if(!$id){returnfalse;} 
        $image= Image::findOne($id); 
        if($image->f_fav){
            Image::updateAll(['f_fav'=>0],['id'=>$id]);return$this->renderPartial('favorite',['id'=>$id,'f_fav'=>0]);}else{
            Image::updateAll(['f_fav'=>1],['id'=>$id]);return$this->renderPartial('favorite',['id'=>$id,'f_fav'=>1]);} 
        returnfalse;}}

Вывод партиала в main.php

<?=$this->render('favorite',['id'=>1,'f_fav'=>true);?>

Отображаемая вьюха favorite.php

<?phpuse yii\widgets\Pjax;use yii\helpers\Html;?><?php Pjax::begin();?><?= Html::beginForm(['favorite'],'post',['data-pjax'=>'','class'=>'form-inline']);?><?= Html::hiddenInput('id',$id)?><?= Html::submitButton($f_fav ? '<i class="fa fa-star"></i>':'<i class="fa fa-star-o"></i>',[])?><?= Html::endForm()?><?php Pjax::end();?>

Виджеты / Widgets

Model / AR / DAO / Запросы к БД

Как получить модель из модуля

$user= Yii::$app->getModule("user")->model("User",["scenario"=>"register"]);$profile= Yii::$app->getModule("user")->model("Profile");

Active Record

class Post extends ActiveRecord
{publicfunction getCreator(){return$this->hasOne('User',array('id'=>'user_id'));}publicfunction getComments(){return$this->hasMany('Comment',array('post_id'=>'id'));}publicfunction getTrustComments($isTrust=true){return$this->hasMany('Comment',array('post_id'=>'id'))->where('status = :status',array(':status'=>$isTrust ? self::TRUST:self::UNTRUST,))->orderBy('id');}}
$price= PriceItem::find()->select(['price','create_time'=>'DATE_FORMAT(create_time, "%d.%m.%Y")'])->where(['and',['price_list_form_id'=>$price_list_form_ids],['>','create_time','2015.01.01']])->orderBy(['price'=> SORT_ASC])->asArray()->one();
// we receive an ActiveQuery instance$query= Post::find(); 
// all posts$posts=$query->all(); 
// looking for all the posts with a condition$posts=$query->where(array('status'=> Post::DRAFT))->orderBy('time')->all(); 
// looking for a post $post=$query->where(array('id'=>10,'status'=> Post::READ))->one(); 
// or easier: "where" condition can be transmitted directly to the factory method$post= Post::find(array('id'=>10,'status'=> Post::READ)); 
// having transmitted to the factory method not a massive, but a number equivalent to the primary key search $post= Post::find(10)->where(array('status'=> Post::READ))->one(); 
// we index the result to a necessary attribute$posts=$query->indexBy('title')->all(); 
// the result as an array$posts=$query->asArray()->all();

Ключи в эллементах коллекции AR

$query= SparesCategory::find()->where(['parent_id'=>0]);$query->indexBy=function($row){// Ключ в который будет помещена возвращаемая модельreturn$row->id;};$categories=$query->all();
$quey= CarMark::find()->indexBy(function($row){return$row->id;})->all();

Создание модели из возвращаемы данных Command (с помощью populateRecord())

$sql="SELECT * FROM `tbl_spares_category` c
            LEFT JOIN tbl_form_spares_category fc ON fc.category_id = c.id
            WHERE fc.form_id = :form_id AND fc.category_id = :category_id";$select_marks= Yii::$app->db->createCommand($sql,[':form_id'=>$form_id,':category_id'=>$category_id,])->queryAll(); 
        foreach($marksas$row){ 
            // Only yii2 alpha//$mark = SparesCategoryForm::create($row); 
            $mark=new SparesCategoryForm;
            SparesCategoryForm::populateRecord($mark,$row); 
 
            if(isset($mark->id)){ 
              // do somethig 
            }}

Join

with()

Не делает SQL JOIN(), применяется не только в реляционых БД (NoSql) Применяется только для построений конструкций вида WHERE IN(), плюс наполняют relation

leftJoin()

Добавляет SQL LEFT JOIN(), применяется только в реляционыых БД, плюс наполняют relation

$this->joinWith([[relation_name]],true,'LEFT JOIN')

joinWith()

Добавляет SQL JOIN(), применяется только в реляционыых БД, плюс наполняют relation

// Выбираем MyModel с relation1 и relation2.// Все три забираем запросом с JOIN.$query= MyModel::find()->joinWith(['relation1','relation2']); 
$countQuery= clone $query;$pages=new Pagination(['totalCount'=>$countQuery->count(),'pageSize'=>15]); 
$items=$query->orderBy($sort->orders)->offset($pages->offset)->limit($pages->limit)// Забираем дополнительно relation3 и relation4.// Фильтровать по ним нам не нужно, так что будут// запросы вида WHERE ID IN (1,2,3,4) или аналоги// для noSQL.->with(['relation3','relation4'])->all();

https://github.com/yiisoft/yii2/blob/master/docs/guide/active-record.md#joining-with-relations

innerJoinWith()

Validate (Rules)

class User extends \yii\db\ActiveRecord
{// ... 
    publicfunction rule(){return[['attribute1','attribute2',...],'validator class or alias',// specifies in which scenario(s) this rule is active.// if not given, it means it is active in all scenarios'on'=>['scenario1','scenario2',...],// the following name-value pairs will be used// to initialize the validator properties'property1'=>'value1','property2'=>'value2',// ...];} 
}

Пример использования в модели

if($User->load($_POST)){ 
      $User=new User;$Profile=new Profile; 
      // validate for ajax request$Profile->load($_POST);if(Yii::$app->request->isAjax){
          Yii::$app->response->format= Response::FORMAT_JSON;return ActiveForm::validate($User,$Profile);} 
      // validate for normal requestif($User->validate() and $Profile->validate()){// do somthing}}

Пример применения валидатора без использования модели

$email='test@example.com';$validator=new yii\validators\EmailValidator();if($validator->validate($email,$error)){echo'Email is valid.';}else{echo$error;}

Scenario

class User extends \yii\db\ActiveRecord
{// ... 
    publicfunction getProduct(){return$this->hasOne(Order::className(),['product_id'=>'id']);} 
    publicfunction scenarios(){return['userCreates'=>['attributes'=>['name','value'],'atomic'=>[self::OP_INSERT],],];} 
    publicfunction afterSave($insert){
        parent::afterSave($insert);if($this->getScenario()===='userCreates'){// FIXME: TODO: WIP, TBD}}}

Подробноhttps://github.com/yiisoft/yii2/blob/master/docs/guide/structure-models.md#scenarios-

Relation

class Customer extends \yii\db\ActiveRecord
{//publicfunction getOrders(){return$this->hasMany(Order::className(),['customer_id'=>'id']);} 
    //publicfunction getBigOrders($threshold=100){return$this->hasMany(Order::className(),['customer_id'=>'id'])->where('subtotal > :threshold',[':threshold'=>$threshold])->orderBy('id');} 
    // Вытащить данные из таблицы модели Item, используя связи из таблицы tbl_order_itempublicfunction getItems(){// Получить данные через таблицу tbl_order_itemreturn$this->hasMany(Item::className(),['id'=>'item_id'])->viaTable('tbl_order_item',['order_id'=>'id']);} 
    //public static function olderThan($query,$age=30){$query->andWhere('age > :age',[':age'=>$age]);}}
$customer= Customer::find(1);$orders=$customer->orders;$orders=$customer->getBigOrders(200)->all();$customers= Customer::find()->olderThan(50)->all();
$customer= Customer::find(1);$order=new Order();$order->comment='';$customer->link('orders',$customer);

Events

class Post extends ActiveRecord
{publicfunction init(){$this->on('beforeAction',function($event){// отменяем действие$event->isValid=false;});}}
$component->on('beforeAction',$handler);

Как получить SQL и Параметры из ActiveQuery

$query= Post::find()->where(array('id'=>10,'status'=> Post::READ))->createCommand(); 
// SQLecho$query->sql 
// Params:print_r($query->params)

Объекты доступа к данным (Data Access Objects, DAO)

Соеденение

Методы запроса

  • queryOne()
  • queryAll()
  • query()
  • queryScalar()
  • queryColumn()

Подробноhttps://github.com/yiisoft/yii2/blob/master/framework/db/Command.php

createCommand
$command=$connection->createCommand('SELECT * FROM tbl_post WHERE id=1');$post=$command->queryOne();
$connection->createCommand()->insert('tbl_user',['name'=>'Sam','age'=>30,])->execute();
$command=$connection->createCommand('UPDATE tbl_post SET status=1 WHERE id=1');$command->execute();
$connection->createCommand()->batchInsert('tbl_user',['name','age'],[['Tom',30],['Jane',20],['Linda',25],])->execute();
$connection->createCommand()->update('tbl_user',['status'=>1],'age > 30')->execute();
$connection->createCommand()->delete('tbl_user','status = 0')->execute();
$command=$connection->createCommand('SELECT * FROM tbl_post WHERE id=:id');$command->bindValue(':id',$_GET['id']);$post=$command->query();

Построитель запросов (Query Builder and Query)

$rows=(new \yii\db\Query())->select('id, name')->from('user')->limit(10)->all(); 
// which is equivalent to the following code: 
$query=(new \yii\db\Query())->select('id, name')->from('user')->limit(10); 
// Create a command. You can get the actual SQL using $command->sql$command=$query->createCommand(); 
// Execute the command:$rows=$command->queryAll();
$query=(new \yii\db\Query())->select('id, name')->from('user')->limit(10); 
// Create a command. You can get the actual SQL using $command->sql$command=$query->createCommand(Yii::$app->db); 
// Execute the command:$rows=$command->queryAll();

Простой спооб получить записи из указанной БД

$rows=(new \yii\db\Query())->select('id, name')->from('user')//->where([...])//->innerJoin('', '', [...])->limit(10)->createComand(Yii::$app->some_bd)->queryAll();

Подробно

Transactions

$transaction=$connection->beginTransaction();
try {$connection->createCommand($sql1)->execute();$connection->createCommand($sql2)->execute();// ... executing other SQL statements ...$transaction->commit();} catch(Exception $e){$transaction->rollback();}

Batch

Batch

foreach(Customer::find()->batch()as$customers){ 
} 
foreach(Customer::find()->batch(10)as$customers){// $customers — массив из 10 или менее объектов Customer}
$rows=[]; 
foreach($modelsas$model){if(!$model->validate()){// At least one model has invalid data 
        break;} 
    $rows[]=$model->attributes;}$rows=  \yii\helpers\ArrayHelper::getColumn($models,'attributes;');$postModel=new Post; 
Yii::$app->db->createCommand()->batchInsert(Post::tableName(),$postModel->attributes(),$rows)->execute();

Each

foreach(Customer::find()->each()as$customers){ 
} 
foreach(Customer::find()->each(10)as$customers){// $customers — массив из 10 или менее объектов Customer}

Controller

Как программно вызвать контроллер?

$className='backend\controllers\SiteController';$controller= Yii::createObject($className,[$id,$this]);

yii\helpers\Html (old)

// ['label' => 'Добавление', 'url' => ['/admin/user/create']]
Html::a("Log in here",["user/reset","hash"=>$hash,"sid"=>$sid]);
Html::url(["user/reset","hash"=>$hash,"sid"=>$sid]);

Подробноhttps://github.com/yiisoft/yii2/blob/master/docs/guide/url.md

Module

Submodule

Для работы сабмодуля, необходимо выполнить его подключение, через указание submodule namespace модуля

namespace mirocow\eav; 
class Module extends \yii\base\Module { 
    // ...publicfunction init(){ 
      // .. 
      $this->setModule('admin','yii\user\modules\admin\Module');} 
    // Пример перенаправления роута в саб модуль adminpublicfunction createController($route){ 
        return$this->getModule('admin')->createController(str_replace('admin/','',$route)); 
    } 
}

Helpers

Behaviors/Filters

publicfunction behaviors(){returnarray('access'=>array('class'=>'yii\web\AccessControl','rules'=>array(array('allow'=>true,'actions'=>array('admin'),'roles'=>array('@')),array('allow'=>false),),),);}

Behaviors/Date

publicfunction behaviors(){return[['class'=> TimestampBehavior::className(),'createdAtAttribute'=>'create_time',//'updatedAtAttribute' => 'update_time','value'=>new Expression('NOW()'),],];}

Session

Yii::$app->session->get('key');
Yii::$app->session->set('key','value');

setFlash

В контролере

Yii::$app->session->setFlash('info',$shell->output);return$this->redirect('/site');

return делать обязательно. инчаче после редиректа сообщение не выведется

Вывод стандартным способом

<?phpforeach(Yii::$app->session->getAllFlashes()as$key=>$message){echo'<div class="alert alert-'.$key.'">'.$message.'</div>';}?>

Вывод с помощью виджета loveorigami/yii2-notification-wrapper

<?= Wrapper::widget(['layerClass'=>'lo\modules\noty\layers\Noty',]);?>

Данный виджет поддерживает большое кол-во виджетов обображения таких как:

Library (Layer) Bower Project homepage Docs
Bootstrap Alert - http://getbootstrap.com/components/#alerts docs/Alert.md
Bootstrap Notify remarkable-bootstrap-notify https://github.com/mouse0270/bootstrap-notify docs/BootstrapNotify.md
Growl jquery-growl https://github.com/ksylvest/jquery-growl docs/Growl.md
iGrowl igrowl https://github.com/catc/iGrowl docs/Igrowl.md
jQuery Notify jquery.notify https://github.com/CreativeDream/jquery.notify docs/JqueryNotify.md
jQuery Notify Bar jqnotifybar https://github.com/dknight/jQuery-Notify-bar docs/JqueryNotifyBar.md
jQuery Toaster jquery.toaster https://github.com/scottoffen/jquery.toaster docs/JqueryToaster.md
jQuery Toast Plugin jquery-toast-plugin https://github.com/kamranahmedse/jquery-toast-plugin docs/JqueryToastPlugin.md
Lobibox lobibox https://github.com/arboshiki/lobibox docs/Lobibox.md
Notie notie https://github.com/jaredreich/notie docs/Notie.md
Notific8 notific8 https://github.com/ralivue/notific8 docs/Notific8.md
NotifIt notifit https://github.com/naoxink/notifIt docs/NotifIt.md
Notify.js notifyjs https://github.com/notifyjs/notifyjs docs/Notifyjs.md
Noty noty https://github.com/needim/noty docs/Noty.md
PNotify pnotify https://github.com/sciactive/pnotify docs/PNotify.md
Sweetalert sweetalert https://github.com/t4t5/sweetalert docs/Sweetalert.md
Toastr toastr https://github.com/CodeSeven/toastr docs/Toastr.md

Console

IsConsole

if(Yii::$app->request->isConsoleRequest){//}

Params / Параметры

<?php 
namespace console\controllers; 
use yii\console\Controller; 
class QueueController extends Controller
{public$pid_file=''; 
    publicfunction __get($name){$name=str_replace('-','_',$name); 
        return$this->$name;} 
    publicfunction __set($name,$value){$name=str_replace('-','_',$name); 
        $this->$name=$value;} 
 
    publicfunction options($actionID){return['pid-file'];} 
    publicfunction actionRun(){ 
    }}

User

RBAC

Access

'access'=>['class'=> \yii\web\AccessControl::className(),'rules'=>[['actions'=>['index'],'allow'=>false,'roles'=>['?'],],['actions'=>['index','update','view','create','delete'],'allow'=>true,'matchCallback'=>function(){return \Yii::$app->user->identity->role<= \Yii::$app->user->identity->MANAGER;}],],],

Components

Создание объекта компанента

$object= Yii::createObject(array('class'=>'MyClass','property1'=>'abc','property2'=>'cde',),$param1,$param2);

Theme

'view'=>array('theme'=>array('pathMap'=>array('@app/views'=>'@webroot/themes/basic'),'baseUrl'=>'@www/themes/basic',),),

Cache

// Создать зависимость от времени модификации файла example.txt.$dependency=new \yii\caching\FileDependency(['fileName'=>'example.txt']); 
// Данные устаревают через 30 секунд.// Данные могут устареть и раньше, если example.txt будет изменён.$cache->set($key,$data,30,$dependency); 
// Кэш будет проверен, если данные устарели.// Он также будет проверен, если указанная зависимость была изменена.// Вернется false, если какое-либо из этих условий выполнено.$data=$cache->get($key);

Зависимости

  • yii\caching\ChainedDependency: зависимость меняется, если любая зависимость в цепочке изменяется;
  • yii\caching\DbDependency: зависимость меняется, если результат некоторого определенного SQL запроса изменён;
  • yii\caching\ExpressionDependency: зависимость меняется, если результат определенного PHP выражения изменён;
  • yii\caching\FileDependency: зависимость меняется, если изменилось время последней модификации файла;
  • yii\caching\TagDependency: Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. invalidate();

Кэширование запросов

$result=$db->cache(function($db){ 
    // Результат SQL запроса будет возвращен из кэша если// кэширование запросов включено и результат запроса присутствует в кэшеreturn$db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne(); 
}); 
$result= Customer::getDb()->cache(function($db){return Customer::find()->where(['id'=>1])->one();});
$duration=60;// кэширование результата на 60 секунд$dependency=...;// параметры зависимости 
$result=$db->cache(function($db){ 
    // ... выполнять SQL запросы здесь ... 
    return$result; 
},$duration,$dependency);
$result=$db->cache(function($db){ 
    // SQL запросы, которые используют кэширование 
    $db->noCache(function($db){ 
        // SQL запросы, которые не используют кэширование 
    }); 
    // ... 
    return$result;});
// использовать кэширование запросов и установить срок действия кэша на 60 секунд$customer=$db->createCommand('SELECT * FROM customer WHERE id=1')->cache(60)->queryOne();
$result=$db->cache(function($db){ 
    // Используется кэширование SQL запросов 
    // не использовать кэширование запросов для этой команды$customer=$db->createCommand('SELECT * FROM customer WHERE id=1')->noCache()->queryOne(); 
    // ... 
    return$result;});

Локализация - i18N/intl

apt=get install php5-intl

Перевод (локализация проекта)

PHPUnit

добавить в конфигуратор композера composer.json

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}
  • php composer.phar update
  • php vendor/bin/phpunit vendor/yiisoft/yii2/yii/test/

Статьи

Описание

smtp-client.pl - Консольный клиент для отправки почты - [Отправка письма]

$
0
0

smtp-client.pl - Консольный клиент для отправки почты

Тест SMTP

smtp-cli is a powerful SMTP command line client with a support for advanced features, such as STARTTLS, SMTP-AUTH, or IPv6 and with a scriptable message composition capabilities supporting anything from simple plain-text messages right up to building complex HTML emails with alternative plain-text part, attachments and inline images. The MIME-Type of the attachments can either be guessed automatically or alternatively set on the command line, separately for each attachment if required.

http://www.logix.cz/michal/devel/smtp-cli/

Установка

$ apt-get install libio-socket-ssl-perl  libdigest-hmac-perl  libterm-readkey-perl libmime-lite-perl libfile-libmagic-perl libio-socket-inet6-perl
$ cd ~
$ wget http://www.logix.cz/michal/devel/smtp-cli/smtp-cli-3.6
$ mv smtp-cli-3.6 smtp-client.pl
$ cpan install YAML File::Type File::LibMagic IO::Socket::INET6 MIME::Lite Digest::HMAC_MD5 File::Type Term::ReadKey IO::Socket::SSL

Проверка

perl smtp-client.pl --verbose --host=localhost  

Отправка письма

$ perl smtp-client.pl --server=localhost --from noreplay@myhost.ru --to=test@yandex.ru --subject='Blah blah'--ipv4
$ perl smtp-client.pl --server=smtp.host.ru --from noreplay@myhost.ru --to=test@yandex.ru --subject='Blah blah'
$ perl smtp-client.pl --server=smtp.gmail.com --port=465--user=login--pass=888888
$ perl smtp-client.pl --subject='Blah'--body-plain='Message txt'
$ perl smtp-client.pl --subject='Blah'--body-html='Message txt'
$ perl smtp-client.pl --verbose--server='localhost'--from='noreply@my-server.ru'--to='my-email@yandex.ru'--subject='From SMTP'--body-plain='From SMTP'--ipv4

Параметры

        --server=<hostname>[:<port>]
                                Host name or IP address of the SMTP server.
                                May include the port after colon, alternatively
                                use --port.
        --port=<number>         Port where the SMTP server is listening.
                                (default: 25)

        -4 or --ipv4            Use standard IP (IPv4) protocol.
        -6 or --ipv6            Use IPv6 protocol. For hosts that have
                                both IPv6 and IPv4 addresses the IPv6
                                connection is tried first.

        --hello-host=<string>   String to use in the EHLO/HELO command.
        --disable-ehlo          Don't use ESMTP EHLO command, only HELO.
        --force-ehlo            Use EHLO even if server doesn't say ESMTP.

        Transport encryption (TLS)
        --disable-starttls      Don't use encryption even if the remote
                                host offers it.
        --ssl                   Start in SMTP/SSL mode (aka SSMTP).
                                Default when --port=465
        --disable-ssl           Don't start SSMTP even if --port=465
        --ssl-ca-file=<filename>
                                Verify the server's SSL certificate against
                                a trusted CA root certificate file.
        --ssl-ca-path=<dirname> Similar to --ssl-ca-file but will look for
                                the appropriate root certificate file in
                                the given directory. The certificates must
                                must be stored one per file with hash-links
                                generated by, for example, c_rehash script
                                from OpenSSL.

        Authentication options (AUTH)
        --user=<username>       Username for SMTP authentication.
        --pass=<password>       Corresponding password.
        --auth-login            Enable only AUTH LOGIN method.
        --auth-plain            Enable only AUTH PLAIN method.
        --auth-cram-md5         Enable only AUTH CRAM-MD5 method.
        --auth                  Enable all supported methods. This is
                                normally not needed, --user enables
                                everything as well.

        Sender / recipient
        --from=\"Display Name <add\@re.ss>\"
                                Sender's name address (or address only).
        --to=\"Display Name <add\@re.ss>\"
        --cc=\"Display Name <add\@re.ss>\"
        --bcc=\"Display Name <add\@re.ss>\"
                                Message recipients. Each parameter can be
                                used multiple times.
                                The --bcc addresses won't apprear in
                                the composed message.

        SMTP Envelope sender / recipient
        (rarely needed, use --from, --to, --cc and --bcc instead)
        --mail-from=<address>   Address to use in MAIL FROM command.
                                Use --from instead, unless you want
                                a different address in the envelope and
                                in the headers.
        --rcpt-to=<address>     Address to use in RCPT TO command. Can be
                                used multiple times. Normally not needed,
                                use --to, --cc and --bcc instead.
                                If set the --to, --cc and --bcc will only
                                be used for composing the message body and
                                not for delivering the messages.

        Send a complete RFC822-compliant email message:
        --data=<filename>       Name of file to send after DATA command.
                                With \"--data=-\" the script will read
                                standard input (useful e.g. for pipes).

        Alternatively build email a message from provided components:
        --subject=<subject>     Subject of the message
        --body-plain=<text|filename>
        --body-html=<text|filename>
                                Plaintext and/or HTML body of the message
                                If both are provided the message is sent
                                as multipart.
        --charset=<charset>     Character set used for Subject and Body,
                                for example UTF-8, ISO-8859-2, KOI8-R, etc.
        --text-encoding=<encoding>
                                Enforce Content-Transfer-Encoding for text
                                parts of the email, including body and
                                attachments. Must be one of:
                                ".join(", ", @valid_encodings)."
                                The default is: quoted-printable
        --attach=<filename>[\@<MIME/Type>]
                                Attach a given filename.
                                MIME-Type of the attachment is guessed
                                by default guessed but can optionally
                                be specified after '\@' delimiter.
                                For instance: --attach mail.log\@text/plain
                                Parameter can be used multiple times.
        --attach-inline=<filename>[\@<MIME/Type>]
                                Attach a given filename (typically a picture)
                                as a 'related' part to the above 'body-html'.
                                Refer to these pictures as <img src='cid:filename'>
                                in the 'body-html' contents.
                                See --attach for details about MIME-Type.
                                Can be used multiple times.
        --add-header=\"Header: value\"
        --replace-header=\"Header: value\"
        --remove-header=\"Header\"
                                Add, Replace or Remove pretty much any header
                                in the email. For example to set a different
                                Mailer use --replace-header=\"X-Mailer: Blah\",
                                to remove it altogether --remove-header=X-Mailer
                                or to add a completely custom header use
                                --add-header=\"X-Something: foo bar\".
        --print-only            Dump the composed MIME message to standard
                                output. This is useful mainly for debugging
                                or in the case you need to run the message
                                through some filter before sending.

        Other options
        --verbose[=<number>] | -v    Be more verbose, print the SMTP session.
        --missing-modules-ok    Don't complain about missing optional modules.
        --version               Print: smtp-cli version $version
        --help                  Guess what is this option for ;-)

Ошибки

Connect failed: IO::Socket::INET6: connect: timeout

Даж при наличии явного флага -4 или --ipv4 при отсутствии соеденения будет выдаваться эта ошибка

Connect failed: IO::Socket::INET6: connect: Connection refused

Данное сообщение выводится при невозможности установить соеденение с указанным IP в --server

dd:test-new - ↷ Имя страницы dd:dd-dd-vv изменено на dd:test-new

Заголовок

$
0
0

Заголовок

  1. ryrth5e
    1. httryjrt
      1. htyjtry
  2. yjtrjtr
  3. jrtyjrt
  1. Элемент нумерованного списка
    1. rthyht
      1. 6htyjtjh
      2. 6j6j76
  • gtrth5
    • y56y56uy56y
      • y56u5u5
        • tyrhtyuj5
          • tuytyujty

Скрипт установки для Debian 8 - [Скрипт установки для Debian 8]

$
0
0

Скрипт установки для Debian 8

$ apt install php5-cgi php5-cli php5-common php5-curl php5-dev php5-fpm php5-gd php5-intl php5-json php5-mcrypt php5-memcache php5-memcached php5-mongo php5-mysql php5-readline php5-redis php5-sqlite php5-xsl php5-geoip php5-ssh2

Описание

  • Автоматическая установка и обновление зависимых пакетов
  • Автоматическая устанока и настройка серверов GIT, PHP 5.6, PHP-FPM, Nginx, Redis, MySQL (mariadb), RabbitMQ, Exim4
  • Автоматическое конфигурирование пакетов
  • Установка автоматического бекапа БД MySQL (https://github.com/Mirocow/mysql_utils.git)
  • Устанока скрипта для создания сайта (https://github.com/Mirocow/site-create)

Установка

# nano debian-install.sh
# bash ./debian-install.sh

В debian-install.sh вставляем ниже следующий текст и нащимаем Ctrl-x, затем y (сохраняем и выходим)

#!/bin/shdistrib="jessie"hostname=""default_pass="" 
check_result(){if[$1-ne0]; thenecho"Error: $2"exit$1fi} 
promptyn (){whiletrue; doread-p"$1" yn
	    case$ynin[Yy]*)return0;;[Nn]*)return1;;*)echo"Please answer yes or no.";;esacdone} 
installpkg(){for pkg in $@doif[ $(dpkg-query -W-f='${Status}'$pkg2>/dev/null |grep-c"ok installed")-eq0];
  thenecho"Install $pkg ..."apt-get install-y$pkg;
  fidone} 
set_default_value(){evalvariable=\$$1if[-z"$variable"]; theneval$1=$2fiif["$variable"!= 'yes']&&["$variable"!= 'no']; theneval$1=$2fi} 
if["x$(id -u)"!= 'x0']; then
    check_result 1"Script can be run executed only by root"fi 
apt-get update&&apt-get upgrade-y
installpkg apt apt-utils wget chkconfig sudonano rename debconf-utils pwgen
 
default_pass=$(pwgen -s71) 
whileread-p'Enter the Internet domain name (e.g. nixcraft.com) : 'hostname&&[[-z"$hostname"]] ; doecho"No, please, no blank hostname!"done 
if promptyn "Do you wish to install default programs? " ; then 
	echo-e"Install default programs";
	installpkg mc git mercurial bash-completion bzip2 numactl -y 
fi 
if promptyn "Do you wish to install developers programs? "; then 
	echo-e"Install development soft";
	installpkg checkinstall gcc build-essential g++ libboost-dev libboost-program-options-dev libboost-all-dev libevent-dev uuid-dev clang cmake -y 
fi 
if promptyn "Do you wish to install system monitors? "; then 
	echo-e"Install system monitors";
	installpkg htop iptraf jnettop iftop -y 
fi 
if promptyn "Do you wish to uninstall systemd and install systemv? "; then 
	installpkg sysvinit-core sysvinit-utils -ycp/usr/share/sysvinit/inittab /etc/inittab
 
fi 
if promptyn "Do you wish to install FTP Server (PRO-Ftpd)? "; then
	installpkg proftpd
fi 
if promptyn "Do you wish to install MySql? "; then 
	installpkg software-properties-common
 
	if promptyn "Do you wish to install MySql (Percona) (y) or Mariadb (n)?"; then 
		apt-key adv--recv-keys--keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
 
		echo"
		# Percona
		#deb http://repo.percona.com/apt ${distrib} testing
		#deb-src http://repo.percona.com/apt ${distrib} testing
		"> etc/apt/sources.list.d/mysql.list
		apt-get update 
		installpkg percona-server-server-5.7 percona-server-client-5.7 percona-server-common-5.7 percona-toolkit -y
		sevice mysql start
		check_result $?"mysql start failed" 
		mysqladmin -u root password $default_passecho-e"[client]\npassword='$f'\n">/root/.my.cnf
		chmod600/root/.my.cnf
		mysql -e"DELETE FROM mysql.user WHERE User=''"
		mysql -e"DROP DATABASE test">/dev/null 2>&1
		mysql -e"DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
		mysql -e"DELETE FROM mysql.user WHERE user='' or password='';"
		mysql -e"FLUSH PRIVILEGES" 
		echo-e"Install MySQL (Percona)"
		chkconfig mysql on
		set_default_value 'mysql''true' 
	else# for sid		apt-key adv--recv-keys--keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8
		# for jessieapt-key adv--recv-keys--keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
 
		echo"
		# MariaDB 10.1 repository list - created 2016-08-05 19:23 UTC
		# http://downloads.mariadb.org/mariadb/repositories/
		deb [arch=amd64,i386] http://mirror.timeweb.ru/mariadb/repo/10.1/debian ${distrib} main
		deb-src http://mirror.timeweb.ru/mariadb/repo/10.1/debian ${distrib} main
		"> etc/apt/sources.list.d/mysql.list
		apt-get update 
		installpkg mariadb-server mariadb-client mariadb-common mytop -y
		service mysql start
		check_result $?"mysql start failed" 
		mysqladmin -u root password $default_passecho-e"[client]\npassword='$default_pass'\n">/root/.my.cnf
		chmod600/root/.my.cnf
		mysql -e"DELETE FROM mysql.user WHERE User=''"
		mysql -e"DROP DATABASE test">/dev/null 2>&1
		mysql -e"DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
		mysql -e"DELETE FROM mysql.user WHERE user='' or password='';"
		mysql -e"FLUSH PRIVILEGES" 
		echo-e"Install MySQL (Mariadb)"
		chkconfig mysql on
		set_default_value 'mysql''true' 
  fi 
fi 
if promptyn "Do you wish to install Nginx? "; then 
	wget-q http://nginx.org/keys/nginx_signing.key -O-|apt-key add -
 
	echo"
	# nginx
	deb http://nginx.org/packages/debian ${distrib} nginx
	deb-src http://nginx.org/packages/debian ${distrib} nginx
	"> etc/apt/sources.list.d/nginx.list
	apt-get update 
	service nginx stop >/dev/null 2>&1
	installpkg nginx -y
	service nginx start
	check_result $?"nginx start failed" 
	echo-e"Install Nginx"
	chkconfig nginx on
	set_default_value 'nginx''true' 
fi 
if promptyn "Do you wish to install PHP-FPM? "; then 
	wget-q http://www.dotdeb.org/dotdeb.gpg -O-|apt-key add -
 
	echo"
	# php-fpm dotdeb
	deb http://packages.dotdeb.org ${distrib} all
	deb-src http://packages.dotdeb.org ${distrib} all
	"> etc/apt/sources.list.d/php-fpm.list
	apt-get update 
	service php5-fpm stop >/dev/null 2>&1
	installpkg -u-t stable php5 php5-dev php5-sqlite php5-mcrypt php5-xsl php5-cli php5-common php5-mysql php5-gd php5-fpm \
	        php5-cgi php-pear php5-curl php5-xcache php5-redis -yecho"cgi.fix_pathinfo = 0">>/etc/php5/fpm/php.ini
	service php5-fpm start
	check_result $?"php5-fpm start failed" 
	echo-e"Install PHP-FPM"
	chkconfig php5-fpm on
	set_default_value 'php5-fpm''true' 
fi 
if promptyn "Do you wish to install RabbitMQ? "; then 
	wget-q http://packages.erlang-solutions.com/debian/erlang_solutions.asc -O-|apt-key add -
	wget-q https://www.rabbitmq.com/rabbitmq-signing-key-public.asc -O-|apt-key add -
 
	echo"
	# Erlang
	deb http://packages.erlang-solutions.com/debian ${distrib} contrib
 
	# RabbitMq
	deb http://www.rabbitmq.com/debian/ testing main
	"> etc/apt/sources.list.d/rabbitmq.list
	apt-get update 
	service rabbitmq-server start
	installpkg rabbitmq-server -y
	check_result $?"rabbitmq-server start failed" 
	echo-e"Install RabbitMQ"
	chkconfig rabbitmq-server on
	set_default_value 'rabbitmq-server''true' 
fi 
if promptyn "Do you wish to install Redis server? "; then 
	installpkg redis-server -y
	service redis-server start
	check_result $?"redis-server start failed" 
	echo-e"Install Redis"
	chkconfig redis-server on
	set_default_value 'redis-server''true' 
fi 
if promptyn "Do you wish to install DNS server? "; then 
	if promptyn "Do you wish to install bind (y) or pdns (n) server?"; then
		installpkg bind9 bind9utils bind9-libs -y
		service bind9 start
		echo-e"Install DNS Server"
		set_default_value 'bind''true'else
		installpkg pdns-server pdns-backend-mysql pdns-recursor -yecho-e"Install DNS Server"
		set_default_value 'pdns''true'fi 
fi 
if promptyn "Do you wish to install Shorewall? "; then 
	installpkg shorewall -y 
fi 
if promptyn "Do you wish to install Postfix/Exim4? "; then 
	installpkg exim4-daemon-heavy mailutils postfix -y
	service exim4 stop >/dev/null 2>&1
	gpasswd -a Debian-exim mail
 
	touch/etc/exim4/exim4.conf.template
	touch/etc/exim4/dnsbl.conf
	touch/etc/exim4/spam-blocks.conf
	touch/etc/exim4/white-blocks.conf
	chmod640/etc/exim4/exim4.conf.template
	rm-rf/etc/exim4/domains
	mkdir-p/etc/exim4/domains
 
	rm-f/etc/alternatives/mta
	ln-s/usr/sbin/exim4 /etc/alternatives/mta
	service sendmail stop >/dev/null 2>&1 
	service postfix stop >/dev/null 2>&1
	service exim4 start
 
	check_result $?"exim4 start failed"
	chkconfig exim4 on
	set_default_value 'exim''true' 
fi 
if promptyn "Do you wish to install Dovecot? "; then 
	gpasswd -a dovecot mail
	chown-R root:root /etc/dovecot*
	service dovecot stop >/dev/null 2>&1
	installpkg dovecot-imapd dovecot-pop3d dovecot-common -y
	service dovecot start
 
	check_result $?"dovecot start failed"
  chkconfig dovecot on
	set_default_value 'dovecot''true' 
fi 
if promptyn "Do you wish to install fail2ban? "; then 
	installpkg fail2ban -y 
	if["$exim" = 'no']; thenfline=$(cat/etc/fail2ban/jail.local |grep-n exim-iptables -A2)fline=$(echo"$fline"|grep enabled |tail-n1|cut-f1-d -)sed-i"${fline}s/true/false/"/etc/fail2ban/jail.local
	fi 
	chkconfig fail2ban on
	service fail2ban start
	check_result $?"fail2ban start failed" 
fi 
if promptyn "Do you wish to install Mysql backup system? "; then 
	echo-e"Install MySql backup system";
 
	apt-get update
	installpkg git-ygit clone https://github.com/Mirocow/mysql_utils.git /root/mysql_utils
 
	echo'
 
	# Run MySql backup system
	25 6    * * * root /bin/bash  ~/mysql_utils/backup.sh --dir="/var/backups/mysql" --compress=bzip2 --exclude="mysql" --lifetime="3 day ago"
	'>>/etc/crontab	
 
fi 
if promptyn "Do you wish to install create site script? "; then 
	echo-e"Install create site scriptm";
	wget https://raw.githubusercontent.com/Mirocow/site-create/master/site-create.sh -O/root/site-create.sh
 
fi 
rm/var/cache/apt/archives/*.deb -f 
if promptyn "Do you wish to set default shell settings? "; then 
echo-e"Base system configure"echo'
 
#
# My config
#
 
#search in history with arrows
bind '"\e[A": history-search-backward' 2>/dev/null
bind '"\e[B": history-search-forward' 2>/dev/null
 
alias nano="nano -u -w "
alias ls="ls --color=always"
alias grep='grep--color=auto'
alias fgrep='fgrep--color=auto'
alias egrep='egrep--color=auto'
HISTSIZE=50000
HISTFILESIZE=50000
export HISTCONTROL=ignoreboth
shopt -s cmdhist
shopt -s histappend
shopt -s checkwinsize
shopt -s extglob
ulimit -c 0
 
#
# Functions
#
 
#-----------------------------------
# Функции работы с историей комманд
#-----------------------------------
 
function h(){
  history| grep "$@";
}
 
# Включение магии bash
if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi
 
'>> ~/.bashrc
source ~/.bashrc
 
echo'
set tabsize "2"
'>> ~/.nanorc		
fi 
apt-get updateapt-get upgradeapt-get autoremove-y
Viewing all 1318 articles
Browse latest View live