linux

Fedora: сброс политик SELinux в дефолт

getenforceSELinux штука очень мощная и полезная. Но вот незадача: иногда ее настроить бывает слишком тяжело. И можно просто довести систему до состояния, когда она не загружается (особенно если играться с политикой доступа к каталогам :)).
Для таких случаев нужно уметь сбрасывать политики в дефолтное состояние.
Сначала загружаем систему в failback-режиме (там selinux отключен).

Теперь

setenforce 0
# dnf erase selinux-policy selinux-policy-targeted
# dnf mv /etc/selinux/targeted{,.backup}
# reboot

После перезагрузки системы selinux будет отключен.

Нужно поставить пакеты, которые мы удаляли.

# dnf install selinux-policy selinux-policy-targeted

И теперь включить сам механизм. Для этого отредактируем файл /etc/selinux/config и заменим

SELINUX=disabled

на

SELINUX=enforcing

После очередной перезагрузки мы увидим, что с SELinux все хорошо.

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

Документация.

Разработка, linux

Nginx: редирект на другую платформу/площадку при 404

nginx_with_two_upstreamКазалось бы: что может быть проще, чем взять два бекенда и одну точку входа.
Когда первый бекенд не отвечает (или отвечает, но 404), то перенаправлять запрос (как можно прозначнее для пользователя) на второй бекенд.
Правильно! 🙂 Проще быть ничего не может.

location / {
    # Отправляем все 404 на @backendB
    error_page 404 = @backendB;
    proxy_intercept_errors on;
    log_not_found  off;
    # Try the proxy like normal
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_pass http://127.0.0.1:8081;
}



location @backendB {
    # Резервный бекенд
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_pass http://127.0.0.1:8082;

    # Настоящую 404ую мы уже получим от этого бекенда.

}
HowTo

GitLab: обновление бандлов ruby

gitlab bundle updateПосле очередного «незапланированного» обновления у меня вдруг отвалился gitlab.
В логах

/home/git/gitlab/vendor/bundle/ruby/2.1.0/gems/activesupport-4.1.9/lib/active_su
pport/dependencies.rb:247:in `require': Incorrect MySQL client library version! 
This gem was compiled for 5.5.42 but the client library is 5.6.25. (RuntimeError
)

Надо обновлять.
Беда в том, что в ruby я не нашел аналога pip update или что-то в таком духе.

Для обновления предустановленных бандлов нужно удалить старые и поставить новые (заново).

$ sudo -u git mv /home/git/gitlab/vendor/bundle{,.bkp}
sudo -u git -H bundle install --without development test postgres --deployment

Мануал по обновлению гитлаба: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/patch_versions.md.

HowTo

PyCharm заставляем terminal работать с virtualenv

pycharm terminal with virtualenv Создаем виртуальное окружение как указано в доке.
Путь к окружению должен выглядеть как

<путь к проекту>/.venv

И не забудьте добавить эту папку в .gitignore.

Теперь в корне проекта создаем файл .pycharmrc

source ~/.bashrc
source .venv/bin/activate

Осталось добавить запуск нашего окружения в настройках Tools -> Terminal.

Прописываем свойство Shell path как

/bin/bash --rcfile .pycharmrc
linux

Raspbian: swapfile

Вот чего точно не думал, так это того, что свопфайл в raspbian (не партиция, а именно файл) подключается не так, как в нормальных дистрибутивах.

Мы же с вами привыкли к тому, что в случае использования свопфайла в /etc/fstab будет запись подобная этой.

/swapfile none swap defaults 0 0

Так нет. Все не так. Вернее такой формат-то работает, но разработчики дистра очень рекомендуют использовать dphys-swapfile. Даже комментарий оставили (может я чего упустил и в дебиане теперь такое повсеместно?).

А вообще эта штука призвана инициализировать своп только после того, как смонтированы все файловые системы. Эдакая защита.

# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

Ок. Сделаем.

$ sudo fallocate -l 1024M /swapfile
$ sudo dphys-swapfile swapon /swapfile

Теперь нужно систему сконфигурировать. Пишем в /etc/dphys-swapfile следующее.

CONF_SWAPSIZE=1024
CONF_SWAPFILE=/swapfile

Теперь все отлично.

$ free -h
             total       used       free     shared    buffers     cached
Mem:          435M       418M        17M         0B       106M        28M
-/+ buffers/cache:       283M       152M
Swap:         1,0G         0B       1,0G
Разработка

Symfony2: страница 404 и авторизация

Все знают, что в symfony2 404я страница не попадает под действие фаерволов. А это значит, что даже пытаясь кастомизировать 404ую страницу мы не сможем получить имя пользователя и его роль в системе. Так как механизм авторизации попросту не загружается.

Однако, существует решение, которое позволяет кастомизировать страницу 404 с учетом пользовательских данных.

Для этого нам надо завести роут подпадающий под действия фаерволлов и при этом откликающийся на любой (!) введенный адрес перехода.

Экшн будет отдавать эксепшн NotFoundHttpException. Таким образом мы получим ситуацию, когда при переходе на 404ую все фаерволы запущены и данные пользователя загружены.

namespace ProjectBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class DefaultController extends Controller
{
    //...

    /**
     * Данный роут перехватывает все переходы в системе, которые не охвачены другими роутами.
     * @Route("/{path}", name="_inner404Redirect")
     */
    public function inner404Redirect()
    {
        throw new NotFoundHttpException();
    }
}

Источник