kantor

Под конец нового года (когда я это пишу) нужно разрулить кучу дел, это даже аргументировать не нужно. И, как правило, движ коллективный, а значит возникает необходимость что-то решать. Короче, это подводка, вы и сами это понимаете. Настоящая причина, по которой я пишу этот текст — меня достало видеть бездарные опросники в телеграме. Конечно, вред от них чаще всего наносится создателю оных, но если факт наличия косяка легко понять, то пофиксить его не всегда очень очевидно. Постараюсь помочь. Всё сказанное ниже так или иначе почерпнуто из моего или чужого опыта и текст тоже будет максимально практичным и, поэтому, телегам-ориентированным, хотя советы по большинству универсальные. Впрочем, всё сами увидите.

Какой птиц нужен?

Что нужно уяснить сразу же — у вас должно быть своё собственное мнение о том, что вы организуете. Нет смысла тешить себя иллюзиями, medium is the message, НЕ БЫВАЕТ абсолютно нейтральных голосований. И уж тем более не бывает успешных нейтральных голосований. Чем раньше вы это поймёте — тем легче вам будет жить. И я сейчас не только про телеграм. Возможно, про голосования и нейтральность у меня будет отдельный текст, но для целей этого поста будем считать, что вы в чатике на 15 голов и хотите организовать их на футбол (иначе текст разрастётся до невозможности). Из этого вытекает несколько голосовалок.

  1. Хотим ли мы вообще?
  2. Если да, то кто конкретно хочет?
  3. Как мы разделимся на команды?
  4. Когда и где?

Кто хочет X?

В идеале, такие опросы требуют крайней лаконичности. Сделайте один вариант, назовите его «Я» и дело в шляпе. Если нужно узнать общий вайб, или площадка голосования публичная, то можно сделать опрос анонимным, но если у вас есть возможность спросить всех по отдельности — спросите.

Почему так: на данном этапе вам важно узнать больше всего мнений, а значит, максимально упростить взаимодействие. Чем тупее и проще — тем лучше. Это раз.

Во-вторых, вам нужно самостоятельное мнение каждого по-отдельности, а значит голосующий не должен сразу видеть результат — это включит стадное чувство и один вариант сильно перевесит, несмотря на то, что по факту дела участники не против. Как следствие, никаких «посмотреть результат» или «йа креведко!» — лаконичность всё ещё ваш друг. Конечно, конкретно в случае телеграма можно проголосовать и откатить, но это ментальное усилие, а стадное чувство против любого ментального усилия.

А кто конкретно?

Кейс предполагает, что исходных участников 15, а футбол предлагается играть уличный, 6 на 6, а значит трое минус. Однако, вы уже решили, что хотите, и, скажем, хотельцев где-то в районе нужной дюжины участников, весь вопрос в том, чтобы довести до абстрактную хотелку до конкретики. Но это потребует переголосования, а это ментальное усилие, человек ленив, понимаете, да? Так что на данном этапе в ваших интересах избежать оного переголосования любой ценой.

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

Если переголосование неизбежно — попытайтесь, всё-таки, преподать это как не то же самое. Можете текстом спросить, можете в личке спросить, можете в чате спросить, мол, а кто точно не хочет, на сколько фантазии хватит.

Как мы разделимся

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

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

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

Тем не менее, вам абсолютно следует ожидать, что похуистов будет ощутимое количество, по тем или иным причинам. У вас чат на 15 человек, вы по умолчанию в детском саду: кто-то кого-то ненавидит, но без активной конфронтации, кто-то вписан на игру исключительно, чтобы сыграть с тяночкой в одной команде и выудить момент к ней подкатить, но постеснялся и вписал обе команды, третий уверен, что никакой игры не будет, попиздят и разойдутся, но ему интересно следить за драмой и так далее. Честные похуисты тоже есть, не волнуйтесь. Ваша задача — не дать ситуации развалиться, но и не выглядеть как тиран или деспот.

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

А суть следущая — :dice:, игральная кость в телеграме. Она даёт математически корректный рандом 1/6 и этого должно быть достаточно, чтобы разрулить ситуацию с похуистами справедливым образом без того, чтобы все друг с другом перессорились. Нет кости? random.org в помощь, но чем интегрированнее всё в платформу, тем лучше.

Крайне желательно знать внутренние противоречия в команде заранее и прикинуть, кого можно с кем перетасовать/заменить, если комбинация выйдет фатальная, но, в целом, ваша цель не в том, чтобы все были довольны, а в том, чтобы никто не был КРАЙНЕ недоволен и не сливался.

Что, где, когда?

Самый отвратительный пункт. Желательно сделать рисёрч ещё до начала всего этого процесса, прикинуть пару удобных мест, посмотреть прогноз погоды, узнать у кого когда работа — в общем, чем лучше вы подготовитесь к этому этапу, тем легче всё будет.

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

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

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

О времени: скажем, ответственное лицо позвонило, обкашляло вопросики и вернулось со списком возможных таймслотов. Если их мало — так и впишите. Если много, либо точки свободны большинство времени — сделайте «грубое» голосование: «пятницей вечером», «субботой после обеда» и т.д. Опять же, вам критично, чтобы создавалось хотя бы ощущение договорённости и вся инициатива не ушла на дно из-за каких-то мелких ссор. После голосования уже можно будет сказать «жду вас к трём субботой» и работать с конкретными недовольными.

На десерт: вам придётся сделать «все ли в силе» где-то за 12 часов до события. Желательно не делать это голосованием, а стучаться в ЛС всем или хотя бы тем, кто имеет привычку тихо сливаться/в целом не отсвечивал. При этом, лучше создать ощущение, что вы спрашиваете у всех, а не только у него — напишите сообщение себе и перешлите его, даже если таких лиц двое.

Если вы всё сделали правильно — наслаждайтесь игрой и делитесь этим постом. Мне всегда интересно мнение сообщества, но в конкретном случае — особенно. Скорее всего, связанная с этим вторая часть с анализом не за горами.

Я, как и многие из читающих, имею домашний сервер, уже довольно долго как. Привык к нему, обустроился, знаете ли. Раньше он был на Arch Linux, но потом я решил, что недостаточно стабильно и перекатился на Федору. Смейтесь, но за два с чем-то года ни разу никакое обновление ничего не сломало.

Правда, с обновлениями есть одна маленькая проблема — ядро тоже обновляется, а после таких вещей принято перезагружаться. Но у меня headless-сервер где-то в дальнем углу и острая паранойя, поэтому / наглухо зашифрован. И я каждый раз откладывал апдейты до последнего, потом приходил, перезагружался, вслепую вводил пароль на подключённой клавиатуре в надежде, что я всё правильно сделал и сейчас всё забутится. Долгое время считал, что иного варианта и нет, разве если какой-нибудь PiKVM подключить, который тоже эмулирует клавиатуру. Но в ночь описываемых событий я был в романтическом настроении и решил погуглить. А вдруг.

Что-то действительно было. Оказалось, что можно сразу после загрузки ядра вызвать dropbear (который один из вариантов имплементации SSH) как хук initramfs и ввести пароль через него. Просто, логично, понятно даже. Только проблема в том, что я на Федоре и тут никакого mkinitcpio нет. Тут прогрессивный и загадочный dracut.

Но на него тоже что-то есть! Встречайте, dracut-crypt-ssh. Это, по сути, те же яйца, но для дракута, которые подключаются как модули на него. За подробностями читайте сорцы, т.к. я сам, к сожалению, ещё не особо разбираюсь в тонкостях работы дракута, но по сути всю тяжёлую работу выполняет модуль 60crypt-ssh, который читает конфиги и запускает dropbear в определённом этапе инициализации, разрешает две-три команды, а потом вырубает его, как разблокировка LUKS станет успешной. Казалось, что может пойти не так?

Так Readme выглядит

Я старательно прочитал хороший, годный Readme и принялся за работу — сделал апдейт (а чего зря перезагружаться), нагенерил ключей, создал отдельный ключ ssh только под разблокировку LUKS, прописал authorized_keys, прописал в /etc/default/grub параметры ядра ip=dhcp rd.neednet=1, чтобы у меня сеть запустилась сразу же, а потом перебилдил initramfs через dracut --force. Ещё раз всё проверив, решил перезагрузиться. Работает! С первого раза! Вводишь console_auth, скармливаешь пароль и бут идёт дальше. Никакой беготни, никаких клавиатур по USB.

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

Спустя ещё 15 минут до меня дошло, что дело — табак. Docker-контейнеры не были доступны извне, а т.к. на этой машине у меня также крутится DNS-сервер — у меня тоже сломалась сеть. Когда-нибудь я всё это сетевое вынесу в отдельный роутер, но пока руки не добрались. Ну ладно, не впервой, зарядив свой компьютер другим DNS-сервером, я пошёл разбираться.

Сперва я на DNS и грешил, т.к. демон докера ругался на то, что в /etc/resolv.conf нет никаких не-локальных резолверов, поэтому будем резолвиться через 8.8.8.8. Да откуда ж им взяться, /etc/resolv.conf же давно является stub-симлинком на systemd-resolved, который специально для программ, привыкших искать резолвер там, запускает локальный DNS-сервер. Странно, конечно, можно заоверрайдить и попробовать. Чтобы было понятно, сейчас положение вещей примерно такое (в порядке понижения авторитативности, так сказать):

Рутовые сервера → авторитативный DNS-сервер на Docker → systemd-resolved → stub-resolver → собственный DNS докера

Docker за меня решает, что гугловские серверы резолва дороже DNS на локалхосте

Учитывая, что DNS-сервер на докере лежит, было решено временно перекинуть всё на четыре восьмёрки в systemd-resolved. И вуаля, в консоли сеть работает, резолв идёт, уже какой-то прогресс. Но контейнеры как не отвечали, так и не отвечаю. В логах ничего странного, обычная инициализация, но как будто бы они забыли про существование портов.

Зараза, я ж апдейт делал! Неужели что-то сломалось? С поникшим сердцем я открываю поисковик, ищу docker update port bug и вариации на это за последний месяц. Ни-че-го. В багтрекере на гитхабе тоже ничего релевантного. Это может быть апдейт, а может и не быть апдейт. Но если б это был апдейт, то об этом бы наверное говорили, так? Реверснуть всё назад никак, я бэкапов не сделал, да и это не решение проблемы в долгосрочной перспективе. Думаем дальше.

Захожу в один из работающих контейнеров и начинаю пробовать curl. Таймаут. nslookup — тоже таймаут. Пинги? Не, пинги тоже не проходят. Это не DNS, тут вообще сети нет.

Так может конфликт нетворкинга внутри Docker? Странно, по этой части тоже не было ломающих апдейтов в последнее время. Тем не менее, тщательно прочитав логи демона Docker я обнаружил конфликт IP между нетворками двух не связанных друг с другом контейнеров. Странно. Снёс обе сети, пересоздал контейнеры, конфликт вроде бы разрешился. Тем не менее, так происходить не должно.

Хмммм… а ведь сети Docker работают через виртуальные интерфейсы. Может дело в этом? Быстрый поиск вывел меня на Arch Wiki, где в траблшуте есть вот такой абзац:

When systemd-networkd tries to manage the network interfaces created by Docker, e.g. when you configured Name=* in the Match section, this can lead to connectivity issues. Try disabling management of those interfaces. I.e. networkctl list should report unmanaged in the SETUP column for all networks created by Docker. 

Ага, значит systemd-networkd не должен лезть в работу интерфейсов Docker. А лезет ли? networkctl status говорит, что да, лезет.

На всякий случай решил свериться с основным хостом, поднял докер, проверил аналогично — нет, на нём всё OK, unmanaged. Так что же проихсодит? Время глядеть логи systemd-networkd:

Логи systemd-networkd

Так, а это ещё кто? Кто-то конфижит мои интерфейсы мимо меня? Причём из /run/? Это не может быть правильно… Открываем файл и лицезреем такую картину:

Конфиг systemd-network-generator по умолчанию

Опять Поттеринг подкрался. Какой ещё network-generator? А вот такой. Согласно ману, это сервис, который читает параметры ядра при запуске и, если там есть сетевые параметры, авто-генерирует сетевые конфиги в /run/, а из-за того, что я сам явно не конфигурирую br, docker и прочие интерфейсы помимо моего основного сетевого адаптера, эта штука начинает конфигурировать их сама по вайлдкард-маске. Но почему Name=*? А потому, что я не указал интерфейс, когда прописывал параметр! Всё это время это было из-за параметра ядра!

К счастью, есть фикс. Меняем абстрактный ip=dhcp на конкретный ip=enp1s0:dhcp и всё должно быть в ажуре. Регенерирую грубовский конфиг, ребутаюсь, всё должно работать. Но нет. Не работает ничего. Поттеринг не мог обойтись без последнего ножа в псину.

Получается, что systemd-network-generator достаточно умный, чтобы увидеть dhcp в поле ip и запустить DHCP, но (пока что) недостаточно умный, чтобы спарсить интерфейс и не конфижить вообще всё неправильно. Из ситуации есть два выхода:

  1. Создать отдельные .network файлы под нужные докеру интерфейсы и прописать там явно Unmanaged=true как сделал этот товарищ. Из плюсов: точечное решение. Из минусов: не знаешь, какие ещё завтра будут нужны виртуальные интерфейсы и будешь ли ты тогда помнить про существование этого бага.
  2. Вырубить systemd-network-generator. Из плюсов: точно не забудется. Из минусов: в перспективе network-generator позволит избавиться от .network файлов вообще, учитывая простоту моей сетевой конфигурации. Но, зная как долго матерел systemd-networkd, дела в сетевой сфере так быстро не делаются…

Нет, на самом деле траблшут занял сильно больше описанного, а половину времени я грешил на какой-то баг в имплементации iptables_nft, из-за чего пакеты неправильно ходят по интерфейсам и ломается сеть, но эта статья и так получилась достаточно долгой. Мораль же басни в том, что с сервисами systemd нужно быть осторожнее, даже если кажется, что с этим-то сервисом никогда не придётся сталкиваться.

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

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

Всё началось с этой фотографии

Создаёт массу вопросов? Да. Но лично мне первым делом в глаза бросился QR-код в углу листовки, который получилось сосканить и открыть — он ведёт на p2024.online. Сайт на момент публикации текста таки всё ещё online и на нём красуется очень некрасивое с точки зрения нынешней коньюктуры всплывающее окно, призывающее почему-то быть на Манеже в 11 утра, прикрепляет войс Пригожина и говорит, что через какой-то там чат можно будет самоорганизоваться.

Смотрите сами

В остальных, с виду, это самая ни на что есть типичная предвыборка. Три-четыре броско расписанных тезиса, разбавленные картинками и одним видео, внизу кнопка «Поддержать» — это не представляло бы никакого интереса, если бы это была не предвыборка Пригожина. В тексте прямо не указано, на какую он метит должность, но намекается довольно жирно. Я обязан был узнать больше.

Наверное, самой бесперспективной с этой точки зрения является форма обратной связи, которая ведёт на тоже всё ещё активного бота в телеграме (@P2024bot). Бот сперва довольно бесцеремонно смазывает пользователя теми же тезисами предвыборки, потом спрашивает город, номер и провозглашает, что «в ближайшее время с вами свяжется куратор», но, что интереснее, что «если вы не чувствуете себя безопасно, удалите переписку с этим ботом».

Боты в Телеграме анонимны, по крайней мере, должны быть таковыми. Всё, что связывает бота с его создателем это хостинг, на котором крутится вся логика бота, а ещё API-токен, который генерируется через другого бота. Этот максимально незамысловатый — никаких кнопочек, стикеров, приватных emoji-паков, единственная команда /help, которая отличается от /start тем, что отправляет тот же текст, просто без первого из четырёх сообщений. Поиск других ботов с похожими названиями вывел только на замаскированный под предвыборку клон Глаза Бога (@prigozhin2024_bot), что, наверное, отражает всю суть телеграма как платформы.

Ладно, там ещё есть опция «поделиться контактом» и он ругается, если ввести номер не в международном формате

Но, что забавно, на сайте не всегда была форма обратной связи через Телеграм. Да, заходим на web.archive.org, вбиваем адрес и смотрим самый ранний бэкап — от 8 мая — и видим в том же месте внизу уже форму обратной связи. К сожалению, тут тоже мало интересного: меня удивило только использование multipart/form-data, обычно используемого для загрузки файлов на сайт, вместо application/x-www-form-urlencoded. Интересно, что потом форму заменили.

Я попробовал поиск в разных вариациях и вышел, что месяцем-двумя ранее на этот сайт и на его клон в лице p2024.site натыкались ещё несколько граждан с ЖЖ и Твиттера, правда далеко дело не пошло. Ещё я наткнулся на несколько явных ботов и видео на ютубе, которые кратко пробегались по тому же тексту и крепили ссылку, но ничего фундаментально нового обнаружить не удалось.

Однако, есть фундаментально старое — я вспомнил про то, что началом марта оный Пригожин уже выкатывал видео, где оповещал, что намерен баллотироваться на пост президента Украины в 2024-м году. Тогда посмеялись и замяли дело, но осадочек, очевидно, остался — я пробежался по DNS-данным домена и обнаружил, что домены для обоих сайтов зарегистрированы с разницей в несколько минут 22-го апреля 2023-го года, оба сидят за cloudflare, что делает последующий анализ по IP и ASN несколько бессмысленным.

Сайты выглядят идентичными, что наталкивает мысль на возможное упреждение блокировок. Ну я и подумал — а может другие сайты есть на том же доменном имени? Чего мелочиться — давайте возьмём список всех TLD и пробежимся по нему, чтобы наверняка. И действительно, выбило два других сайта Пригожинской тематики — совсем плохо выглядящий p2024.ru на вордпрессе с доменом из reg.ru, а также p2024.tech, который также является идентичной копией своих соседей с одним отличием, что домен на него зарегистрирован уже первого июня. Хуизы всех перечисленных сайтов анонимизированы, так что мы не знаем ничего о том, кто их зарегистрировал.

Кстати, из забавного — кто бы ни админил сайты из тройки .online, .site и .tech — явно обладает очень, ммм, нестандартным мышлением. Зайдите на любой субдомен, скажем, foo.p2024.online — и вы попадёте на сайт организации «Рождённые жить», которая, якобы, лечит от алкогольной и наркотической зависимости. Их телеграм-канал появился 11 марта, что наталкивает на мысль, что и сайт Пригожина, и этот сайт изначально хостились на одном и том же сервере каким-нибудь чуваком, который делает сайты на заказ и он просто взял два заказа примерно в одно время. Ныне сайт реабилитационного центра находится по igle-net.ru и выглядит ощутимо иначе, хоть и с тем же брендингом. В теории, можно было бы им позвонить и спросить, кто им делал сайт, но российской симкой я не владею и не собираюсь.

Накидываем финальные штрихи безуспешного расследования — 404 сайтов любезно сообщает нам, что они работают на ныне старом и уязвимом nginx 1.18.0 на Убунте (однако, я закон нарушать тоже не собираюсь), сайт очень простой и написан на обычном html с вкраплениями необходимого js, у него есть субдиректория img, в которой хранятся использованные на сайте фото и видео. Кстати, о видео — оно тоже снято в двадцатых числах 2023, если верить метаданным. Бойцы с виду не опознаются, местность тоже. Печаль.

Соглашусь, что анализ, проведённый мною, на какой-то профессионализм или полноту не претендует, но я очень хотел бы узнать больше и добраться до дна этой истории, поэтому если кто-то из вас что-то знает или имеет идеи насчёт дальнейшей идентификации — дайте знать. Но чего точно нельзя отрицать — всё обнаруженное далеко не тянет на пранк ради видоса или публичности. Арендованы домены, нанят вебдев, напечатаны и расклеиваются листовки, какие-то движения насчёт Манежа в 11 часов утра — я не говорю, что это и был план Пригожина (или, заметьте, что это вообще сайт Пригожина), но история мутная и заслуживает дополнительного внимания.