LINUX.ORG.RU
ФорумTalks

Убивание висячих цепочек


0

1

Лор,

есть скрипт/приложение, работающий по таким правилам:
1) оно может показывать пользователю свой собственный вывод (буковки, цифирки, итп), и принимать от него
2) оно может показывать пользователю вывод другого такого же скрипта, находящегося локально или удаленно, и перенаправлять ввод (тоже и локально и удаленно)
3) основной источник вывода и получатель ввода - ssh и bash

Таким образом мы получаем
1) что-то вроде терминала,
2) который может легко симулировать интерактивное поведение пользователя
3) и масштабировать это интерактивное поведение в большом объеме (внутри сети, между сетями, итп)
4) при этом не имея абсолютно никаких встроенных ограничений :)

Краеугольная фича этой штуки - авторизация ssh/bash прямым текстом из скрипта, что, естественно, абсолютно запрещено в «настоящем» ssh. Причем мы можем делать такие plaintext-логины даже внутрь защищенных сетей и впнов, и не только на конкретную машину - а на произвольное количество машин в сетевом графе. Это как бы десерт =)

Сейчас это реализовано на питоне (относительно хорошо), жаве (относительно плохо), си (нерабочий набросок). Это связано с распространенностью. Питон есть, скажем, на половине машин, жава - на 10%,.. си есть везде, но еще ниасилил разобраться как на нем это хорошо написать =)

А сейчас собсна проблема.

Допустим, у нас есть паразитный туннель A->B->C->D между компьютерами A,B,C,D. Точнее, даже не компьютерами, а пользователями, но не так важно. На каждом из звеньев выполняется наш паразитный ssh-прокси.

Абсолютно безопасный вариант, когда пользователь разлогинивается в обратном порядке - сначала на машине D, (осталась цепочка A->B->C), потом на C (осталась цепочка A->B), итп.

НО теперь допустим, пользователь закрыл соединение на машине A (нажал крестик в терминале). Цепочка B->C->D никуда не девалась! То же самое произойдет, если связь между A и B внезапно порвется (н-р по таймауту).

Как бы хорошо поступить с такими «висячими» цепочками?

Сейчас есть нечто под названием wiremon, являющееся частью паразитного ssh-прокси, которое отображает - какие цепочки соединений сейчас проходят через текущего пользователя/компьютер, какие цепочки начинаются, и какие заканчиваются на этом пользователе.

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

Мне кажется, что такой wiremon - вполне олдскульно, но не вполне удобно. Неудобно и вообще, и особенно неудобно при убивании родительских нод (как в случае нажатия крестика на «самом первом терминале»). Это так неудобно, что начиная с какого-то момента я начал логиниться с опцией «залогиниться и убить все сессии кроме текущей, где бы они ни находились».

Еще, я не совсем разобрался, как сделать удобную навигацию по циклам внутри графа сети. Я имею в виду ситуации типа вот таких цепочек: A->B->C->B->C->D. С одной стороны, нафиг это не нужно (сеть на которой идут эксперименты можно спокойно воспринимать как дерево, хотя это и не совсем так), и сейчас такие соединения запрещены. С другой стороны, для упрощения вещей людям, которые не хотят запоминать маршруты, это бы пригодилось.

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


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

★★★★☆
Ответ на: комментарий от rafister

даже в убунте по дефолту нет gcc. а если ты будешь бинарник распространять - дохлый номер. и вообще не осилил зачем это нужно. для авторизации из скрипта есть expect.

Komintern ★★★★★
()

Ощущение такое, что литература по garbage collection может помочь.

Miguel ★★★★★
()
Ответ на: комментарий от Komintern

> даже в убунте по дефолту нет gcc

есть :) иначе dkms нечем будет модули собирать

JB ★★★★★
()

> НО теперь допустим, пользователь закрыл соединение на машине A (нажал крестик в терминале). Цепочка B->C->D никуда не девалась! То же самое произойдет, если связь между A и B внезапно порвется (н-р по таймауту).

В знает, что он транзит от A до C. При закрытии любого ребра, второе грохать автоматически. В чем проблема? Определить что коннект уплыл?

Vit ★★★★★
()
Ответ на: комментарий от Vit

1) нужно ли это вообще делать. Допустим, у нас цепочка открывалась 10 минут из-за того, что сеть медленная. И тут, внезапно, из-за какого-то чертова уплывшего коннекта нам нужно оживлять всё заново, это займет пару минут на убивание старой цепочки и еще десять минут на повторное воссоздание. Пользователь может посмотреть на сайте домашний адрес автора вундервафли и выслать к нему доктора.

2) да, для определения уплывания нужно написать более сложный код :) Текущий получился сам собой в ходе нагораживания тонны костылей над кластером. «Сумма костылей» :) Если писать по-нормальному, для начала нужно воспринять всё сделанное как «прототип на выброс», выбросить сей прототип к чертям и написать заново.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от Tanger

В нутрях-то bash+expect. Но поверх него еще тонна кода для того, чтобы это было законченным решением, которое работает хорошо. Я не знаю ни одной системы (кроме ботнетов), которые бы реализовывали подобную инфраструктуру

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от rapid

ооо, чувак ты шаришь =) Вся фигота и сразу искаропки)

stevejobs ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.