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

Обновление нескольких git-репозитариев в папке

2016-03-08-22:48:31_580x134 Порой у нас в каталоге накапливается много-много git-репозитариев, которые хочется обновить в один заход. Для этого есть маленький скрипт, который обновляет все репозитарии, которые сможет найти в папке, переданной в качестве аргумента.

#!/bin/bash

if test "$#" -ne 1; then
    echo "usage: $0 <dirname>"
		echo "Find and update all git repos in specified folder"
    exit 1
fi

if [ -d $1 ]; then
	find $1 -type d -name .git | xargs -n 1 dirname | sort | while read line; do echo "Update repo $line" && pushd `pwd` > /dev/null && cd $line && git pull && popd > /dev/null; done
else
	echo "\"$1\" does not exists"
fi

Использование очень простое

$ gitup ~/projects

Репозитарий на github.

linux

PHPStorm (PyCharm и др.) и XMonad

2016-02-28-23:48:47_708x493После запуска PHPStorm вместо самое среды появляется лишь серое окно без ничего.
Работаю я в xmonad и произошло это после очередной правки конфига под себя.
В документации сказано, что для java-приложений нужен

startupHook = setWMName "LG3D"

Но этот хук перестал почему-то оказывать должный эффект (без него в ряде java-приложений тоже был пустой экран).
А все оказалось просто: я добавил хук ewmhDesktopsEventHook.

handleEventHook = do
  ewmhDesktopsEventHook -- вот он
  docksEventHook
  fullscreenEventHook -- Full screen setup

Хук нужен для перехвата сообщений по активации окна, перемещению его на другой рабочий стол и переключении рабочих столов. Можно почитать документацию и код.

Но беда в том, что этот хук трет имя wm, которое устанавливается в конфиге (ставит «xmonad»). Этот wmname (который lg3d) служит решением для бага из awt.

Чтобы использовать ewmhDesktopsEventHook нужно указать java окольными путями, что она работает в «non reparenting» (не подобрал я нормального перевода :)) окружении.

Для этого служит переменная окружения _JAVA_AWT_WM_NONREPARENTING.

Пишем в ~/.bashrc или ~/.profile

export _JAVA_AWT_WM_NONREPARENTING=1

И теперь все хорошо.

2016-02-28-23:50:36_708x495

linux

Raspbian — это не Debian

img_raspbian_logo Raspbian — это не Debian. Хотя картинка нас убежлает в обратном.

В чем проблема? Проблема в обозначении архитектуры.

Давеча захотел я поставить на малинку пакет из репозитария собранного под Debian.

Прописал как положено в /etc/apt/sources.list.d/<repository>.list

deb <repourl> wheezy main

Установил и получил segmentation fault. Казалось бы — архитектура armhf (как на малинке), но почему-то не работает.

А дело все в том, что разработчики raspbian перекомпилировали дебиановский armhf (ARMv7) для совместимости с ARMv6, но название архитектуры не поменяли. В итоге попытки установить какой-нибудь пакет *.armhf из дебиана может закончится сегментейшнфаултом.

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

В итоге конфигурация репозитариев deb будет выглядеть так:

deb [arch=armel] <repourl> wheezy main

Ключевое здесь — добавить спецификацию архитектуры как [arch=armel] и таким образом можно успешно подключать даже репозитарии с какого-нибудь ланчпада.

Пруф

linux

MC (midnight commander): вы не умеете его готовить.

2016-02-06-14:38:03_337x97Да-да. Вы все делаете неверно. MC — хоть и не заменяет консоль, но часто бывает полезен и для некоторых даже незаменим. Пусть он и является лишь оболочкой для ползанья по файловой системе, но очень функциональной оболочкой.
Обычно ведь как: f5 (скопировать), f6 (переместить), f3 (посмотреть), f4 (отредактировать), f8 (удалить), f7 (создать катало) и f10 (выйти).
Это тот набор команд, которым чаще всего пользователь и ограничивается.
Ах да — еще TAB чтобы переключиться из одной панели в другую.

Остаемся в текущей папке при выходе из mc.

Вы замечали, что при выходе из mc вы всегда возвращаетесь в ту папку, в которой были до его запуска. Одним это нравится, а другим нет.

В любом случае такое поведение можно поменять. А служит для этого опция -P, которой передается имя файла, в котором сейчас находится mc.

Зная имя файла по завершению процесса можно всегда вернуться в нужный катало. Для этого есть скрипт mc-wrapper.sh. Прописываем у себя в .bashrc.

alias mc='. /usr/libexec/mc/mc-wrapper.sh'

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

Выбор файлов

  • [insert] (или [ctrl-t]) — выбор текущего файла или снятие выбора с текущего файла (так же позволяет выбирать несколько файлов/папок)
  • [+] — выбор файлов и папок имена которых попадают под введенный паттерн
  • [/] — убирает выбор с файлов и папок име
  • [*] — реверсивное выделение файлов. Инвертирует состояние выбран\не выбран для всех файлов в текущем окне (именно файлов. не папок)

Доступ в шелл

  • вы можете вводить любую команду — просто начинаете печатать и она появляется внизу в маленьком приглашении ввода вашего шелла. Нажатие на [enter] запустит ее на исполнение.
  • не пытайтесь нажать [tab] в попытках вызвать автодополнение — вы просто смените текущую панель. Чтобы вызвать автодополнение надо нажать последовательность [esc tab]. Тут все как в обычном шелле — первый раз оно пытается дополнить максимально возможную часть команды, а повторное нажатие последовательности показывает ве возможные варианты (да еще и с выбором как в zsh).2016-02-06-15:00:22_395x202
  • а если надо показать большой терминал? На надо выходить из mc — нажимаете [ctrl-o] и панели файловый менеджер скрывается оставляя вас наедине с консолью. Чтобы его вернуть заново нажимает [ctrl-o].
  • [alt-enter] — копирует имя текущего выбранного файла в строку терминала (удобно для передачи имени каким-нибудь командам)

Встроенный просмотрщик [f3] и редактор [f4]

  • Встроенный вьювер умеет показывать содержимое разных файлов не просто в сыром режиме (когда в pdf будут видны управляющие инструкции, а в гифке — байты), а в виде документа, который адаптирован для отображения в текстовом виде (конечно если у вас есть сопутствующий софт вроде pdf2text).
  • Чтобы увидеть сырые данные жмем [f8] в самом просмотрщике, либо [shift-f3] при открытии файла (а не [f3]).
  • Так же mc умеет использовать внешние редакторы и просмотрщики (задаются переменными PAGER и EDITOR в вашем .bashrc). Чтобы включить использование внешних редакторов выбираем соответствующую опцию в настройках2016-02-06-15:15:53_664x389

Работа с панелями

  • [alt-,] — переключить режим разбиения с вертикального на горизонтальный
  • [alt-t] — циклическая смена режима отображения панели
  • [alt-i] — синхронизирует вторую панель с текущей (полезно если вам надо быстро открыть одну и ту же папку в двух панелях)
  • [ctrl-u] — поменять панели местами
  • [alt-o] — если текущий элемент директория, то откроет ее во второй панели и сместит выделение на один элемент вперед. Если же текущий элемент файл — откроет содержимое родительской директории в соседней панели и сместит выделение.
  • [ctrl-pgup] — перейти к родительской директории (если включена навигация в стиле lynx, то просто стрелка влево)
  • [alt-shift-h] — показать историю перемещения по папкам
  • [alt-y] — перейти в предыдущую папку из истории
  • [alt-u] — перейти в следующую папку из истории

Поиск

  • [alt-?] — открывает диалог поиска файлов
  • [alt-s] — быстрый поиск элемента в текущем каталоге по регулярному выражению
  • [ctrl-s] — бысрый поиск в текущем каталоге по совпадению

Основные сочетания

  • [ctrl-space] — посчитать объем каталога под выделением
  • [ctrl-x s] — создать символическую ссылку
  • [ctrl-x h] — создать жесткую ссылку
  • [ctrl-x o] — открыть редактор сhown на элемент
  • [ctrl-x c] — открыть редактор chmod на элемент
  • [alt-.] — скрыть\отобразить dot-файлы

Виртуальные файловые системы (vfs)

Эта концепция относительно mc позволяет нам путешествовать по архивам, sftp-серверам, rpm-файлам так, словно мы работаем с локальной файловой системой.

Попробуйте в mc набрать команду

cd ftp://mirror.yandex.ru/

2016-02-06-15:42:03_506x328

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

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

Введите cd без параметров и вы попадете в домашнюю директорию.

Полезные команды

  • [ctrl-x d] — сраврение директорий
  • [ctrl-\] — переход в директорию быстрого доступа (и управление этим списком)

Полезные настройки

2016-02-06-15:56:46_435x242

  • левая\правая панель — формат списка. позволяет задать пользовательский формат вывода информации (чтобы посмотреть доступные поля нажмите [f1]

2016-02-06-15:47:26_301x229

  • Конфигурация
    • детали операции/подсчитывать размер — в совокупности эти две опции дадут более информативное окно копирования файлов (а если убрать, то копирование будет работать гораздо быстрее)
    • Автоматически сохранять настройки — полезно чтобы постоянно не нажимать «сохранить настройки»
  • Внешний вид
    • строка подсказки — дасть немного больше места на экране если убрать (скроется совет дня)
    • равный размер панелей — если мы включим разный режим отображения в каждой из панелей (древовидный и подробный), то получим проводник 🙂
  • Настройка панелей
    • автосохранение настроек панелей — будут удобно чтобы каждый раз не выбирать режим отображения панели заново
    • навигация в тиле lynx — быстрая навигация стрелками

 

 

HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 4 — конфигурация клиента.

 

 

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

В первой части было сказано, что клиенту потребуются следующие файлы ключей:

 ~/CA/pki/issued/User.crt
 ~/CA/pki/private/User.key
 ~/CA/pki/ca.crt
 /etc/openvpn/keys/ta.key

Скопируем их в отдельный каталог. Так же в этом каталоге создадим файл connect.ovpn следующего содержания:

client
dev tun
proto udp
remote X.X.X.X 1194
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind

Где X.X.X.X — это айпишник вашего сервера.

Передаем пять этих файлов пользователю и теперь на клиенте можно подключаться:

$ sudo openvpn connect.ovpn
HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 3 — iptables

В предыдущей части мы наконец-то сервер запустили. Но достучаться до него возможности нет поскольку iptables все еще не настроены и блокируют все подряд.

Как сказали на одном из формумов: в сети есть множество руководств по iptables для openvpn, но ни одно из них не работает.

В продолжении еще одно 🙂

Разрешаем коннекты к серверу (в прошлый раз мы настроили дефолтный впн через udp. Поэтому здесь мы открываем только подключение udp.

iptables -I INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT

Обратите внимание, что нужно использовать модификатор -I, который добавит это правило первым к цепочке. Если же использовать -A как рекомендуют некоторые, то правило будет добавлено к цепочке последним. А как мы знаем — последним правилом в цепочке стоит reject. И это значит, что добавляй после него или не добавляй правила — ничего не заработает.

Кстати из-за подобной ошибки (способа добавления правила в цепочку можно порой у некоторых видеть такую ошибку:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed

Это как раз значит, что сервер не смог ответить на «рукопожатие». Т.е. порт заблокирован или где-то на пути к серверу не работает форвардинг пакетов.

Теперь разрешим интерфейсу tun коммуникацию с другими интерфейсами в системе.

iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

Включим nat (как вы помните из предыдущей части — сервер настроен в режиме роутера, а не моста — поэтому nat обязателен).

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

В цепочке POSTROUTE чаще всего нет reject. Поэтому смело используем -A.

И последний шаг — разрешить исходящий трафик на tun-инмерфейсе.

iptables -A OUTPUT -o tun+ -j ACCEPT

Теперь самый важный шаг: проверить, что все заработало

$ sudo nmap -sU -p1194 X.X.X.X

Starting Nmap 7.00 ( https://nmap.org ) at 2016-01-24 21:33 MSK
Nmap scan report for X.X.X.X
Host is up (0.089s latency).
PORT     STATE         SERVICE
1194/udp open|filtered openvpn

Nmap done: 1 IP address (1 host up) scanned in 1.08 seconds

Если у вас похожий вывод — сохраняем правила iptables и генерируем клиентский конфиг в следующей части.

$ sudo /usr/libexec/iptables.init save

Ниже конфиг /etc/sysconfig/iptables, который я приведу для сравнения (если у вас что-то не заработало).

*nat
:PREROUTING ACCEPT [80:8210]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [24:11832]
:POSTROUTING ACCEPT [24:11832]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:10292]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o tun+ -j ACCEPT
COMMIT
HowTo, linux

OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.

 

 

Ключи сгенерировали. Теперь можно запускать сервер.

Обращаю внимание, что дальше речь пойдет о дефолтной настройке openvpn в режиме роутера. Это тот режим, когда вам нет необходимости интегрировать подключенных клиентов в локальную сеть.

В случае необхоидмости пустить клиентов в локальную сеть вам потребуется режим моста.

Поддробнее про разные режимы работы можно почитать в официальной документации: https://community.openvpn.net/openvpn/wiki/BridgingAndRouting.

Копируем конфиг сервера

$ sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

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

# пути к сертификатам ставим свои
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key  # This file should be kept secret
dh /etc/openvpn/keys/dh.pem

# заставляем клиент направлять весь трафик через сервер (чтобы избежать всяких утечек днс-запросов)
push "redirect-gateway def1 bypass-dhcp"

# пропишем собственные dns
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# защита от флуда
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret

# сразу после запуска у сервера будут отобраны рутовые права (безопасности больше)
user nobody
group nobody

Если есть желание — можно поправить порт.

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

$ sudo systemctl -f enable openvpn@server.service
$ sudo systemctl start openvpn@server.service