LINUX.ORG.RU

Сообщения WoozyMasta

 

SSH RemoteCommand

 ,

Приветствую!

Собственно хочу сразу в контейнере оказаться выполнив ssh %container_name%

В контейнере ssh может не оказаться, проксирование и портфорвард не предлагать.

В ~/.ssh/config воткнул это:

Host mycontainer
     HostName 10.10.0.51
     User woo
     RemoteCommand /usr/bin/lxc exec mycontainer bash

ничего не происходит, lxc хочет иметь управляющий терминал, руками используя -t все ок.

ssh 10.10.0.51 -t "/usr/bin/lxc exec mycontainer bash"

Вопросы:

  • 1 - Не вижу впритык как в конфиге ssh указать использование аргумента -t
  • 2 - Как бы так изловчится что бы не плодить для каждого контейнера правило в конфиге (ну очень много их), а к примеру задать массив имен и подставлять команду, по типу:
    Host [foo bar baz]
         HostName 10.10.0.51
         User woo
         RemoteCommand /usr/bin/lxc exec $Host bash
    
WoozyMasta
()

BTRFS на SSD для LXC

 , , ,

Приветствую! Есть несколько одинаковых серверов с LXD, хранилища на SSD в BTRFS. Все сервера выполняют разные задачи но нагруженость ФС приблизительно одинакова.

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

btrfs fi df

Data, single: total=223.46GiB, used=119.09GiB
System, single: total=32.00MiB, used=48.00KiB
Metadata, single: total=5.00GiB, used=2.92GiB
GlobalReserve, single: total=512.00MiB, used=0.00B

btrfs fi show

Label: 'datastore'  uuid: e5570b60-0000-0000-0000-ffffffffffff
	Total devices 1 FS bytes used 122.00GiB
	devid    1 size 238.47GiB used 228.49GiB path /dev/sdc

Делаю трим для ssd и балансировку

fstrim -v "$mountpoint"

if /bin/btrfs fi balance start -dusage=55 "$mountpoint"; then
    echo 'BTRFS balancing compleate'
else
    echo 'Running rescue balancing'

    mount -oremount,clear_cache "$mountpoint"

    for size in 0 1 2 3 4 5 10 20 30 40 50 60 70 80 90; do
        time /bin/btrfs balance start -v -musage=$size -dusage=$size "$mountpoint" 2>&1 
    done

    echo 'Rescue BTRFS balancing finished'
fi

Получаю:

/var/lib/lxd/storage-pools/datastore: 11,1 GiB (11877240832 bytes) trimmed
Done, had to relocate 99 out of 230 chunks

btrfs fi df

Data, single: total=133.46GiB, used=119.08GiB
System, single: total=32.00MiB, used=48.00KiB
Metadata, single: total=5.00GiB, used=2.89GiB
GlobalReserve, single: total=512.00MiB, used=0.00B

btrfs fi show

Label: 'datastore'  uuid: e5570b60-0000-0000-0000-ffffffffffff
	Total devices 1 FS bytes used 121.97GiB
	devid    1 size 238.47GiB used 138.49GiB path /dev/sdc

Подскажите знакомые с BTRFS, куда копать и чем смотреть?

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

WoozyMasta
()

letsencrypt wildcart + domain на разных хостах

 ,

Имеется два публичных хоста:

  • на одном wildcard сертификат letsencrypt *.site.com и domain сертификат site.com.
  • на втором планирую развернуть api.site.com и сделать ему domain сертификат letsencrypt

На какой камень напорюсь в таком случае? Я думаю все должно быть хорошо но испытываю некоторые сомнения.

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

WoozyMasta
()

yad и тайлинг кастомной иконки уведомления

 ,

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

Дано:

  • yad 0.38.2
  • GTK+ 3.22.30
  • XFCE 4.12

Проблема в одной картинке https://pasteboard.co/HMGI6og.png

К примеру кастуем уведомление указав путь к файлу изображения

yad --notification --command='echo hello world' --listen --text="Hi" --image=/usr/share/vlc/vlc.ico

В результате изображение тайлится по рамке, пробовал другие пикчи от 8х8 до 256х256, svg, и ключ --icon-size= - все тщетно. А если используем каст иконки по алиасу, все красиво. В чем подвох?

yad --notification --command='echo hello world' --listen --text="Hi" --image=vlc

Есть у кого какие мысли? Документация и гугл по диагонали прочитаны, зацепок не нашел.

WoozyMasta
()

CGI bash и вывод переменных

 , ,

Привет, делаю простенькую панельку с информацией, решил делать на bash, просто так захотел. Верчу через lighttpd.

Дано:

  • index.sh
    #!/bin/bash
    template=$(<template.html)
    title="From bash"
    eval echo "$template"
    
  • template.html
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>${title}</title>
      </head>
      <body>
        <h1>Hi</h1>
      </body>
    </html>
    

Увы в ответ 500 статус, если не использовать eval в заголовке страницы ${title}, как бы обработать это изящнее, просто прочитать шаблон и подставить куда нужно выхлопы от утилит?

Пробовал иначе, эффект тот-же

printf '%b\n' "$(cat template.html)"
cat template.html | xargs echo -e
eval echo \$template

Цель:

Лыжи не едут, ищу наводку как заставить работать такую конструкцию в данном контексте:

var="Hi $username"; username="John Doe"; eval echo $var
без eval переменная не обрабатывается, а используя его парсится что-то из html тегов и страничка падает.

Падает из-за проблемы с newline, смена IFS не помогает(

WoozyMasta
()

grc и сохранение подсветки

 , ,

Есть утилита grc, разукрашивает логи и выхлопы. Каким способом можно сохранить подсветку от исходного выхлопа команды или сохранить подсветку от grc при последующем grep?

1) ls -la разукрашивает файлы по mime типу, а grc ls -la разукрашивает права и пользователя но затирает подсветку самого ls.

2) grc zcat syslog.3.gz отдает красивый пёстрый лог, а если по нему пройтись grep - красота исчезает, тот же tail или head через пайп цвета сохраняют.

Как совместить обе подсветки?

UPD. с grep всё ок, забыл про --color=always

UPD2. с ls тоже всё ок, забыл про тот же --color=always решено xD

WoozyMasta
()

Mirotik failover, wan port in bridge

 , ,

Здравствуйте, господа.

Хочу услышать совет по поводу автоматического переключения канала при условии, что WAN порты объедены в bridge и все правила файервола настроены на этот мост.

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

Если же я хочу использовать решение с пингом, мне необходимо запретить пинг разных назначений для разных WAN портов. Но как быть если все WAN в одном бридже и NAT таблица общая?

Если же уйти от фаервола, а указать конкретный интерфейс для использования пинга - он не проходит с WAN портов.

ping 8.8.8.8 count=1 interface=wan1
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                                 timeout
ping 8.8.8.8 count=1 interface=wan2
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                                 timeout
но через бридж все отрабатывает
ping 8.8.8.8 count=1 interface=bridge
  SEQ HOST                                     SIZE TTL TIME  STATUS
    0 8.8.8.8                                    56  56 2ms

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

Вариант с выносом WAN из бриджа не интересен, ищу решение для текущего конфига, куда мне копать?

WoozyMasta
()

Nginx - если rewrite для сабдомена возвращает 404, вернуть другую страницу.

 ,

У меня есть rewrite для старых неиспользуемых поддоменов, и 90% URL существуют как на корневом домне, так и на субдомене, но некоторые URL-адреса уникальны для поддоменов.

Как мне сделать условие?

если поддомен соответсвует шаблону то направляем на основной домен
если это перенаправление вернуло 404 вернуть пользовательскую страницу 

Это так, набросок, location в условии разместить так нельзя, я знаю.

if ($host ~* (sub1|sub2|sub3)\.mysite\.loc) {
  rewrite ^(.+)$ http://mysite.loc$1 permanent;
  location / {
    error_page 404 =301 http://mysite.loc/lost-sub;
  }
}

P.S. 404 отдельно обрабатывает приложение на своей стороне.

Решение

Элегантного решения не нашел, сделал так:

if ($host ~* (sub1|sub2|sub3)\.mysite\.loc) {
  rewrite ^(.+)$ http://mysite.loc$1 permanent;

}

location / {
  if ($request_uri ~ ^.*(pepyaki|pyani|zhirchik).*) {
    return 301 http://mysite.loc/custom;
  }
}

где ^.*(pepyaki|pyani|zhirchik).* - это проблемные вхождения взятые из лога

WoozyMasta
()

Mikrotik и блокировка nmap

 , ,

Здравствуйте, господа. Блокирую сканирование портов на микроте по каноническому мануалу

# Создаем цепочку для сканеров портов
/ip firewall filter
add chain=input protocol=tcp psd=21,3s,3,1 action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="Port scanners to list " disabled=no

# Разделяем по типу сканирования
add chain=input protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="NMAP FIN Stealth scan"
add chain=input protocol=tcp tcp-flags=fin,syn action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="SYN/FIN scan"
add chain=input protocol=tcp tcp-flags=syn,rst action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="SYN/RST scan"
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="FIN/PSH/URG scan"
add chain=input protocol=tcp tcp-flags=fin,syn,rst,psh,ack,urg action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="ALL/ALL scan"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg action=add-src-to-address-list address-list="port scanners" address-list-timeout=1h comment="NMAP NULL scan"

# Блокируем сканеров
add chain=input src-address-list="port scanners" action=drop comment="dropping port scanners" disabled=no
add chain=forward src-address-list="port scanners" action=drop comment="dropping port scanners" disabled=no

И захотелось мне добавить белый список адресов, кто может сканить порты безнаказанно.

# Вайтлистим адрес
/ip firewall address-list
add address=10.0.0.1 disabled=no list=whitelist

# Разрешаем вайтлисту всё
/ip firewall filter
add action=accept chain=input in-interface=wan-bridge connection-state=new src-address-list=whitelist

Данный accept воткнул в самый верх списка и надеялся, что как только он сработает остальные правила ему уже будут ни по чём, но не тут то было :(

Собственно сабж, как accept-ить вайтлист так, чтобы он не попадал под другие правила блокировки.

WoozyMasta
()

Перенаправить трафик с источника к назначение:порт на адрес:порт

 

Приветствую господа! Имею вопрос, и надеюсь на помощь от знатоков.

Есть два сервера: 10.0.0.2 (основной) и 10.0.0.3 (запасной) также машина выступающая в роли шлюза 10.0.0.100

необходимо адресу 10.0.0.8 подменить назначение только в случае обращения к адресу 10.0.0.2:80 на 10.0.0.3:80 и ответ вернуть обратно.

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

Пробую сырой вариант без --source и --dport просто подменить назначение.

iptables -t nat -A PREROUTING -d 10.0.0.2 -j DNAT --to-destination 10.0.0.3
iptables -t nat -A POSTROUTING -s 10.0.0.3 -j SNAT --to-source 10.0.0.3
Отправка отрабатывает, пинги уходят на 10.0.0.3, но обратной связи уже нет. Пробовал маскарадить но так не сработало. Чувствую, что решение на поверхности но не понимаю.

Будьте любезны, пните в нужном направлении.

WoozyMasta
()

iptables, прозрачный squid и один интерфейс.

 ,

Здравствуйте, господа!

Появилась задача, но увы с iptables я знаком поверхностно.

Имеется:

  • Шлюз 192.168.0.1 (DNS, DHCP, iptables)
  • Прокси 192.168.0.222 (прозрачный squid)
  • Сервера 192.168.0.2-10 (трафик проксировать не нужно)
  • Клиенты 192.168.0.100-110 (пул DHCP, пускаем через squid)

На машине прокси с одним интерфейсом развернут прозрачный squid. Хочется весь трафик от клиентов по 80 и 443 порту пускать через него, а все что осталось отправлять прямиком на шлюз.

Вижу 2 варианта реализации:

1) На серверах статикой указан основным шлюзом 192.168.0.1, а клиенты в свою очередь получают DHCP с шлюзом 192.168.0.222 (sqid). Тем самым сервера минуют squid, а клиенты ходят к основному шлюзу через него.

На прокси необходимо пробросить входящий трафик 80/443 через кальмара, все остальное пропускаем дальше на шлюз

net.ipv4.ip_forward в sysctl включил

В данный момент пробовал так, но не удалось:

# Чистим iptable
iptables -F
iptables -X
iptables --table nat -F
iptables --table nat -X
iptables --table mangle -F
iptables --table mangle -X

# Направляем 80 и 443 порт через squid
iptables -t nat -A PREROUTING -i ens192 -s 192.168.0.0/24 -d 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i ens192 -s 192.168.0.0/24 -d 192.168.0.0/24 -p tcp --dport 443 -j ACCEPT

iptables -t nat -A PREROUTING -i ens192 -s 192.168.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.222:3128
iptables -t nat -A PREROUTING -i ens192 -s 192.168.0.0/24 -p tcp --dport 443 -j DNAT --to 192.168.0.222:3129

# Пропускаем DNS c шлюза
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 192.168.0.1:53
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 192.168.0.1:53

iptables -t nat -I POSTROUTING -o ens192 -s 192.168.0.0/24 -d 192.168.0.222 -p tcp -j SNAT --to 192.168.0.1

iptables -I FORWARD -i ens192 -o ens192 -s 192.168.0.0/24 -d 192.168.0.222 -p tcp --dport 3128 -j ACCEPT
iptables -I FORWARD -i ens192 -o ens192 -s 192.168.0.0/24 -d 192.168.0.222 -p tcp --dport 3129 -j ACCEPT

2) Второй вариант, на шлюзе пишется правило, что необходимо для диапазана 192.168.0.100-110 входящий трафик по 80/443 завернуть на 192.168.0.222:3128

Набросал что-то такое.

iptables -t nat -A PREROUTING -s ! 192.168.0.100-110 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.222:3128
iptables -t nat -A PREROUTING -s ! 192.168.0.100-110 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.222:3129

iptables -t nat -A POSTROUTING -s ! 192.168.0.222 -p tcp -d 192.168.0.222 -j SNAT --to-source 192.168.0.1
iptables -A FORWARD -s 192.168.0.100-110 -j ACCEPT
Гуру iptables пните плз в нужную сторону. Какой вариант более логичный. И как лучше всего быть в случае падения кальмара?

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

WoozyMasta
()

jdb2 99% io NFS, а на самбашаре все ок.

 , ,

Здравствуйте господа. Нужен совет куда копать, имеется программный рейд 10, EXT4.

Есть раздел 4ТБ самбашары, запись/чтение ~63MB/sec что есть норма для гигабитного линка.

Но если монтирую NFS шару получаю в iotop 99% загрузки jdb2 и load avg в 8 раз выше лимитов. А NFS нужен для ESXi, чтоб хранить vmdk.

WoozyMasta
()

Вывод stdout дочернего скрипта в POST

 , ,

Здравствуйте господа. Имеется вопрос, как из вызываемого скрипта передать stdout в POST BaseHTTPServer.

    def do_POST(self):
        self._set_headers()
        self.wfile.write("Задание принято на отправку. ")
        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
        self.send_response(200)
        self.end_headers()
        email = json.loads(self.data_string)
        with open('request.json', 'w') as outfile:
            json.dump(email, outfile)
        os.system('python relay.py')
        return

собственно как выхлоп от os.system('python relay.py') выдать в POST

WoozyMasta
()

Кодировки в питоне

 , , ,

Здравствуйте. В задаче имеется REST API сервиса SendPulse, и некая прослойка в виде минимального вебсервиса принимающего JSON и передающего данные через API. Все на питоне.

Собственно сама проблема:

Если JSON запрос находится непосредственно в коде, то все выполняется корректно. Если же я его беру из файла:

    with open('mail.json') as js:    
        data = json.load(js)
в ответ получаю

UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-9: ordinal not in range(128)

если же декодирую словарь:

data = {k: unicode(v).encode("utf-8") for k,v in data.iteritems()}
в ответ дэбаг говорит:

Request response: {u'message': u'Empty «From» email', u'error_code': 10}

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

Вот сама функция которая из API.

    def smtp_send_mail(self, email):
        logging.info("Function call: smtp_send_mail")
        if not email.get('html') or not email.get('text'):
            return self.__handle_error('Seems we have empty body')
        elif not email.get('subject'):
            return self.__handle_error('Seems we have empty subject')
        elif not email.get('from') or not email.get('to'):
            return self.__handle_error("Seems we have empty some credentials 'from': '{}' or 'to': '{}' fields".format(email.get('from'), email.get('to')))
        email['html'] = base64.b64encode(email.get('html'))
        return self.__handle_result(self.__send_request('smtp/emails', 'POST', {'email': json.dumps(email)}))
GitHub API

Пример JSON

{
    "subject": "Это тестовое письмо отправленное через REST API sendpulse",
    "html": "<h1>Привет!</h1><p>Это тестовое письмо</p>",
    "text": "Привет!\nЭто тестовое письмо",
    "from": {"name": "Test SMTP Python", "email": "my@mail.xyz"},
    "to": [
        {"name": "SMTP test", "email": "first@mail.xyz"}
    ],
    "bcc": [
        {"name": "SMTP test", "email": "second@mail.xyz"}
    ]
}

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

WoozyMasta
()

Gajim и end-to-end шифрование

 ,

Доброго времени суток господа!

Имеется корпоративный жабер, на десктопах установлен Gajim. Данный месенджер активно шифрует сообщения при помощи end-to-end шифрования, ищу ответ как можно православно отключить данный функционал?

На данный момент пользуюсь не хитрым способом

dpkg -r --force-all python-crypto

но минусом данного метода является постоянно неразрешенная зависимость.

Пните пожалуйста в нужную сторону.

WoozyMasta
()

rsync пропускает файл

 

Запускаю синхронизации с такими параметрами:

--recursive --times --verbose --update --delete --max-size=50M --exclude-from=exclude.list /tmp/from/ /tmp/to

В итоге один файл находящийся на каталогов 6 глубже, не обновляется из источника, в логе пишет, что в каталог он заглянул но файл не взял, если файл удалить все ок. Также пробовал запускать с ключами --ignore-times, --size-only и --checksum, ничего не изменилось. И файл размером меньше 50М, в разы.

Куда копать? Такое чувство, что не совсем не смотрит на размер и время.

WoozyMasta
()

Автоматическое скрытие значков рабочего стола в XFCE

 , ,

Приветствую.

Необходима помощь в реализации небольшой задачи. В окнах очень доставляет небольшая утилита AutoHideDesktopIcons, функционал таков: цикл, если в течении n сек. к десктопу небыло обращения (ПКМ, ЛКМ) значки скрываются, при первом взаимодействии вновь отображаются.

Зачем? Довольно неплохо лицезреть красивые обои, особенно в том случае когда рабочий стол используется как папка темп с обильным количеством файлов. Хочется реализовать схожий функционал для XFCE (хотя и в другие DE перенести не составит труда)

  • Куда копать, как отлавливать клик по десктопу?
  • Как отключить всё одним махом, в xconf вижу только параметры для значков корзины, файловой системы и т.п.
WoozyMasta
()

RSS подписка на новые темы