Тут такая штука - NX делает так:
let SAMBA_DISPLAY=$SESS_DISPLAY+3000
if error
let SESS_DISPLAY=$SESS_DISPLAY+1
вот этот тупой алгоритм и не позволит пробросить несколько произвольных портов, нужно что-то поумнее...
что-то вроде резервирования диапазона портов запрошенного клиентом.
Опять ага. На это уже было наступлено. На разных серверах приходится разный DISPLAY_BASE ставить, чтоб с одного клиента работать одновременно. Локи еще эти, которые отдельно чистить надо... Чапай будет думать на тему схемы анонс-запрос-установка, когда сервер анонсирует порты/диапазоны, клиент запрашивает, сервер выдает. Даже оставить старую угробищную схему получится для совместимости.
Предлагается неспешно заняться. 2Djelf: Не уделишь ли некоторое время описанию существующего протокола, чтобы легче думалось.
Что-то типа такого:
После установки ssh-соединения юзером nx с сервером на клиенте запускается то-то и сё-то, на сервер уходит строка: a=b&c=d&...
В ответ сервер запускает эту и эту фигню и высылает строку: e=f&g=h&...
...авторизация юзера
...и т.д.
...запрос на подключение шары
...
С нуля это все расковырять в принципе реально, только зачем, если есть такой дока по менеджменту сессий как ты.
Глядишь, еще кому поможет в понимании механизма.
согласен - могу помочь, чем смогу= как лицо в процессе заинтересованное
зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки nxnode - nxserver-у и опять nxnode => проблема крылась все-же в nxnode - в функции node_start_monitor - слишком она рано стартовала: временно вылечил слипом на 2 секунды, но это просто хак - который заменю на адекватного сторожа ), потому готов присоединится ....
Сам процесс логина не сложный, на самом деле его описывать дольше чем понять. Только вот из логов !M это совсем не очевидно. Лог OpenNX (по --trace=All) вполне достаточен для понимания последовательности команд и не избыточен.
Последовательность запуска на Win32:
выставление переменных среды
xautch (делает .Xauthority в !M отдельный xautch.exe в OpenNX вшит в клиент и делает аж 3 ключа для NXWin, для XMing и для Linux /да они немного разные/).
nxwin
nxssh
передача параметров между ними весьма мутная и к делу собственно не относится.
Дальше клиент начинает общаться с сервером, все строки общения вида "NX> Код Строка", все коды описаны в MyIPC.cpp (OpenNX), общение сделано уродливо т.к. нет стоп-битов или любых других ключей позволяющих серверу сказать что он все сделал, ответил и ждет команд. Из-за этого в клиенте при приеме команд сделан тайм аут, по истечении которого считается что сервер готов (вот вам и медленно, вот вам и сбои на плохих каналах).
Последовательность команд очень критична! Любое неверное движение - мгновенный обрыв связи.
Некоторые команды перехватывает nxssh например "NX> 299" занимается пробросом портов, что да как надо смотреть в исходниках nxssh.
Алгоритм проброса портов $SESS_DISPLAY+ХХХ зашит и в сервере и в клиенте, никакого общения не происходит... Кстати Фриц велосипеда изобретать не стал, все его расширения работают по этому же принципу.
Неизвестные команды в "NX> 105" проходят и ни на что не влияют из-за соображений совместности.
Т.е. расширение примерно так: по "NX> 105" - безопасный переговорный канал, посылаем строки которые ни клиент не сервер не понимает, делаем ответ, ловим его и что-то с ними опять делаем... например пробрасываем порты по "NX> 299"
зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки nxnode - nxserver-у и опять nxnode => проблема крылась все-же в nxnode - в функции node_start_monitor - слишком она рано стартовала: временно вылечил слипом на 2 секунды, но это просто хак - который заменю на адекватного сторожа ), потому готов присоединится ....
Сначала мы все вместе поймем/изучим этот веселый механизм. С таймингами действительно опа. Вступал в оную также, да только забыть уже успел. В связи с эти провокационный вопрос: Если логирование включать/выключать (NX_LOG_LEVEL=7/0), что-то меняется? В худшую строну? nxlog(), увы, вышла крайне времени-емкой.
общение сделано уродливо т.к. нет стоп-битов или любых других ключей позволяющих серверу сказать что он все сделал, ответил и ждет команд. Из-за этого в клиенте при приеме команд сделан тайм аут, по истечении которого считается что сервер готов (вот вам и медленно, вот вам и сбои на плохих каналах).
Последовательность команд очень критична! Любое неверное движение - мгновенный обрыв связи.
Можно ли предположить, что не протокол уродлив, а свободная реализация сервера его до конца "ниасилила"?
Вопрос пока на дилетантском уровне.
Можно ли предположить, что не протокол уродлив, а свободная реализация сервера его до конца "ниасилила"?
Нет, все соответствует офф серверу, разделителем от сервера должно было быть "NX> 105 " - приглашение на команду клиенту, давно не пробовал это вылавливать, может на OpenNX и заработает, а то "(AsyncProcess) IoThread outwatch timed out " немного напрягает... Скорее всего фокус не пройдет, насколько помню, nxssh как то не очень корректно это дело обрабатывает и возвращает например "NX> 105 bye", при таком вылавливании получается ерунда...
зело интересует - nxsshd меж прочим тоже собирается, да только не используется - к чему бы это?
Предполагаю: Он изначально должен был собираться. До модификации !M. После модификации он взял и тоже собрался, а !M его забыли/не захотели исключить из сборки...
зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки nxnode - nxserver-у и опять nxnode => проблема крылась все-же в nxnode - в функции node_start_monitor - слишком она рано стартовала: временно вылечил слипом на 2 секунды, но это просто хак - который заменю на адекватного сторожа ), потому готов присоединится ....
---------------------------------------------------------------------------------------------------------------------------------
Сначала мы все вместе поймем/изучим этот веселый механизм. С таймингами действительно опа. Вступал в оную также, да только забыть уже успел. В связи с эти провокационный вопрос: Если логирование включать/выключать (NX_LOG_LEVEL=7/0), что-то меняется? В худшую строну? nxlog(), увы, вышла крайне времени-емкой.
попробовал = изменение NX_LOG_LEVEL, на ситуацию не влияет, не в худшую , не в лудшую сторону.
А вот притормаживание коней на node_start_monitor - решает проблемы не только ремаунта шар и принтеров , но и (как оказалось) просыпания из суспенда на обоих клиентах (нативном и opennx), в том числе и на этерсофтовской сборке nx.
посему пока буду работать с регулируемым таймаутом , выведу его в конфиги = пока не разобрался чего именно должен дождаться node_start_monitor перед удачным стартом.
Скорее всего фокус не пройдет, насколько помню, nxssh как то не очень корректно это дело обрабатывает и возвращает например "NX> 105 bye", при таком вылавливании получается ерунда...
Неправда ваша. Не он это.
В процессе обнюхивания nxssh: grep -r "NX> " *.[ch] | cut -d\" -f2 | sed 's/\\r\\n//' | sort | uniq
Ну и славненько... если получится сделаю версию OpenNX без таймаутов (вернее с дополнительным отловом NX> 105). Там на 5 мин работы...
Это даже хорошо, что пять минут выросли во много дней. Потому как при текущем freenx скорее всего не получится. По коду nxserver сейчас "NX> 105 " (!пробел сзади) отдается как подтверждение получения команды, а не подтверждение ее выполнения. Отсюда и таймауты, как мыслю. А если в будущем это будет именно подтверждение выполнения, что на клиентской стороне может поломаться? Ась?