Заметки в категории How To

Заставляем GitX подписывать коммиты

Я часто использую GitX, как вариант замены коммандной строки, т.к. в нем удобно добавлять несколько коммитов один за одним, выбирая разные файлы или группы файлов. Но вот незадача, он не умеет ставить на commit GPG подпись. Т.е. получается в истории коммитов часть подписана, а часть нет. Некрасиво.

Чтож, научить его это делать несложно, если написать простой wrapper.

Для начала в .gitconfig добавляем такие строки:

[commit]
  gpgsign = true

Теперь создаем враппер по пути что-то типа ~/bin/gitx-signed-commit с содержимым:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash

args=("$@")

if [[ "$1" = "commit-tree" ]] && [[ "$(git config --get commit.gpgsign)" = "true" ]]; then
  args=("commit-tree" "-S" "${args[@]:1}")
fi

git "${args[@]}"

Даем права на запуск:

$ chmod 755 ~/bin/gitx-signed-commit

Осталось подключить в GitX. Для этого идем в настройки, выбираем вкладку General, тыкаем на Git Executable и выбираем наш скрипт.

Все. С этого момента все коммиты будут подписываться корректно.

Очистка смердженных веток

По роду своей деятельности приходится создавать довольно много веток в репозитории с кодом инфраструктуры и поддерживать все это во вменяемом состоянии становится все сложнее.

Пришлось что-то придумывать.

Нет ничего лучше для этой цели, как алиасы в git. Итак, для начала разберем, что надо делать, а потом напишем алиас.

Первое - это забираем и подчищаем ветки из remote:

$ git fetch -p

Теперь можно посмотреть уже смердженные ветки:

$ git branch --merged

В результате мы получим все смердженные ветки, но в списке будет и master. Надо будет его отфильтровать.

Теперь можно удалить эти смердженные ветки:

$ git branch -d branch_name

Собираем это все в алиас. В ~/.gitconfig добавляем строку в секцию [alias]:

[alias]
    cleanup = "!git checkout master && git fetch -p && git branch --merged | grep -v '* ' | xargs -I {} git branch -d {}"

просто используем:

$ git cleanup

В результате получаем чистый репозиторий: все смердженные ветки будут вычищены полностью.

Восстановление пароля root для MySQL

Если вы забыли пароль для пользователя root в базе MySQL/MariaDB/PerconaDB, то вам понадобиться несколько простых действий, чтоб его сменить:

  • Останавливаем MySQL:
sudo service mysql stop
  • Создаем текстовый файл /tmp/init.sql:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
  • Запускаем сервер:
sudo mysqld_safe --skip-grant-tables
  • Открываем второй терминал, заходим в mysql и меняем пароль пользователю root:
mysql -u root mysql
UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
exit;

Осталось убить процесс mysqld. Для этого в первом терминале нажимаем Ctrl+C и стартуем:

sudo service mysql start

How To: Как создать MySQL пользователя с минимальными правами для бекапа

Использовать для бекапа пользователя root плохая мысль. Создадим пользователя с минимальными правами:

CREATE USER 'botbackup'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO 'botbackup'@'localhost';
GRANT LOCK TABLES ON *.* TO 'botbackup'@'localhost';

How To: 16 практических примеров команды ls

Команда ls применяется для просмотра списка файлов в каталоге. Хотя, если вы используете Unix-like систему, то вы это уже знаете не хуже меня.

Но все ли вы знаете об этой прекрасной команде? Может быть вы используете ее не до конца?

1. Показать все файлы в каталоге

Классический вариант команды ls - это:

ls -a

Вывод покажет все файлы и каталоги в текущем каталоге, включая скрытые. В том числе и служебные '.' и '..'

2. Скрыть служебные каталоги '.' и '..'

ls -A

3. Отображение файлов и каталого в обратном порядке

По умолчанию, ls возвращает список файлов и каталогов в алфавитном порядке. Если необходимо вернуть список в обратном порядке:

ls -r

4. Сортируем файлы по расширению

Это тоже можно легко сделать:

ls -X

Читать далее...

Улучшаем Gnome Shell (Gnome 3)

В связи с тем, что Canonical отказалась от развития Unity и фактически выбросила всех его приверженцев за борт, пришлось искать альтернативы. KDE когда-то я использовал достаточно плотно. Хорошо в памяти сидит его тормознутость и имено поэтому он был отвергнут на самом начальном этапе.

До Unity в Ubuntu использовалась оболочка Gnome, правда, версии 2. Потому и решил посмотреть, что же нового в Gnome3 нам приготовили разработчики. Т.к. ноут давно просился переустановить систему с нуля, то я и ставил сразу Gnome Ubuntu, но можно было сделать и вот так:

$ sudo apt install ubuntu-gnome-desktop

После этого нужно выйти из системы, выбрать сеанс Gnome и войти. Ничего сложного.

В принципе, оболочка вышла достаточно удобной, но некоторые моменты несколько непривычны. Это все очень легко исправляется расширениями для Gnome.

Pixel Saver

Расширение, которое объединяет заголовок окна с верхней панелью, как в Ubuntu. Это очень удобно и экономит место на ноутбуках.

Установить Pixel Saver

No Topleft Hot Corner

В Gnome при подведении мышки в верхний левый угол автоматически всплывает меню с приложениями и рабочими столами. Иногда это сильно раздражает. Видимо не только меня, т.к. ребята сделали расширение, которое отключает эту возможность.

Нажатие на клавишу 'Win' для активации этого меню остается и вы не будете ограничены в доступе. :)

Установить No Topleft Hot Corner

Top Icons

Трей с иконками приложений в Gnome находится не на привычном месте, а реализован как слацдер в левом нижнем углу. Если он открыт постоянно, то немного мешает. Если же его скрыть (такая возможность есть штатно), то не видно уведомлений. Странное немного решение, которое можно исправить с помощью Top Icons

Trash

Маленькое расширение, которое просто показывает значек корзинке в правом верхнем углу, если она не пуста.

Установить Trash

Panel OSD

Расширение, которое позволяет настроить, в каком месте экрана будут показываться уведомления.

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

Gnome 3 меня пока радует. :)

Как правильно удалить пользователя MySQL/MariaDB

ВНИМАНИЕ: Сделайте резервную копию ваших данных перед запуском команд из этой инструкции!

Шаг 1 - Подключение к серверу MySQL/MariaDB

Если у вас есть необходимость удалить какой-либо продукт типа WordPress или Drupal, то вы должны удалить пользователя из базы данных. Вам нужно удалить все выданные ранее права/разрешения и только после этого удалять пользователя.

Для начала вам необходимо подключиться к базе данных:

$ mysql -u root -p mysql

или

$ mysql -u root -h db.example.com -p mysql

Шаг 2 — список всех пользователей

Для того чтоб увидеть разрешения для пользователя bloguser введите:

mariadb> SHOW GRANTS FOR 'bloguser'@'localhost';

Где:

  • bloguser — имя пользователя MySQL/MariaDB
  • localhost — имя хоста, с которого разрешено подключаться этому пользователю
  • mywpblog — имя базы данных

Шаг 3 - отзыв всех разрешений

Введите следующую sql команду:

mariadb> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 4 - Удаление пользователя

Введите следующую команду:

mariadb> DROP USER 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 5 - удаление базы данных

Введите следующую команду:

mariadb> DROP DATABASE mywpblog;

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

На этом все. :) Вы удалили пользователя базы данных.

HTTP сервер для раздачи статики одной строкой

Иногда надо быстро поднять http сервер для отдачи какого-то одного или нескольких файликов.

Тут собраны несколько способов, как одной строкой запустить http сервер для раздачи статических файлов.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted

$ twistd -n web -p 8000 --path .

or

$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Ruby

$ ruby -run -ehttpd . -p8000

asdf

$ gem install adsf   # install dependency
$ adsf -p 8000

Sinatra

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

Perl

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Plack

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

PHP > 5.4

$ php -S 127.0.0.1:8000

busybox httpd

$ busybox httpd -f -p 8000

Свой NTP сервер в локальной сети

NTP (англ. Network Time Protocol — протокол сетевого времени) — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью.

NTP использует для своей работы протокол UDP и учитывает время передачи. Система NTP чрезвычайно устойчива к изменениям латентности среды передачи. В версии 4 способен достигать точности 10 мс (1/100 с) при работе через Интернет, и до 0,2 мс (1/5000 с) и лучше внутри локальных сетей.

Наиболее широкое применение протокол NTP находит для синхронизации серверов точного времени.

Установка на Ubuntu

sudo apt update
sudo apt install ntp

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

sudo mv /etc/ntp.conf{,.bak}
sudo nano /etc/ntp.conf

Добавляем в конфиг эти строки:

server 0.ru.pool.ntp.org iburst prefer
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

disable monitor

driftfile /var/db/ntpd.drift
logfile /var/log/ntpd.log

restrict 127.0.0.1

restrict 0.ru.pool.ntp.org noquery notrap
restrict 1.ru.pool.ntp.org noquery notrap
restrict 2.ru.pool.ntp.org noquery notrap
restrict 3.ru.pool.ntp.org noquery notrap

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap nopeer

Перезапускаем сервер:

sudo /etc/init.d/ntp restart

Проверяем пиры:

ntpq -c peers

Знак «+» перед пиром означает, что время было синхронизировано с этим пиром.

Теперь можно настроить свой маршрутизатор на выдачу клиентам нашего NTP сервера для синхронизации времени с ним.

Как передать статические маршруты клиентам с помощью ISC DHCP сервера

Для этого надо добавить в /etc/dhcp/dhcpd.conf строки:

option classless-routes code 121 = array of unsigned integer 8;
option classless-routes 24, 192,168,100, 192,168,1,2,
                        24, 10,4,0, 192,168,1,2;
option classless-routes-win code 249 = array of unsigned integer 8;
option classless-routes-win 24, 192,168,100, 192,168,1,2,
                            24, 10,4,0, 192,168,1,2;

Этим мы передаем клиентам два статических маршрута:

  1. Маршрут для 192.168.100.0/24 через 192.168.1.2
  2. Маршрут для 10.4.0.0/24 через 192.168.1.2

Остается перезагрузить сервис:

sudo service isc-dhcp-server restart

UPD: Есть проблема с маршрутом по умолчанию в такой конфигурации. Решение проблемы default route.