Протокол пилим? (opennx+freenx)

Модераторы: dimbor, Модераторы разделов

Ответить
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Протокол пилим?

Сообщение dimbor »

Некоторое время назад вырвалось:
dimbor писал(а):
07.11.2010 13:48
Djelf писал(а):
07.11.2010 11:22
Тут такая штука - 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&...
...авторизация юзера
...и т.д.
...запрос на подключение шары
...

С нуля это все расковырять в принципе реально, только зачем, если есть такой дока по менеджменту сессий как ты.
Глядишь, еще кому поможет в понимании механизма.
Спасибо сказали:
oldbay
Сообщения: 283
ОС: gentoo, cenos

Re: Протокол пилим?

Сообщение oldbay »

dimbor писал(а):
11.12.2010 06:48
Некоторое время назад вырвалось:

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

dimbor писал(а):
11.12.2010 06:48
Предлагается неспешно заняться.


согласен - могу помочь, чем смогу= как лицо в процессе заинтересованное


зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки nxnode - nxserver-у и опять nxnode => проблема крылась все-же в nxnode - в функции node_start_monitor - слишком она рано стартовала: временно вылечил слипом на 2 секунды, но это просто хак - который заменю на адекватного сторожа :) ), потому готов присоединится ....
Спасибо сказали:
Djelf
Сообщения: 615
ОС: Гигтег+Цшт32

Re: Протокол пилим?

Сообщение Djelf »

Сам процесс логина не сложный, на самом деле его описывать дольше чем понять. Только вот из логов !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"
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Протокол пилим?

Сообщение dimbor »

oldbay писал(а):
13.12.2010 21:11
зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки nxnode - nxserver-у и опять nxnode => проблема крылась все-же в nxnode - в функции node_start_monitor - слишком она рано стартовала: временно вылечил слипом на 2 секунды, но это просто хак - который заменю на адекватного сторожа :) ), потому готов присоединится ....

Сначала мы все вместе поймем/изучим этот веселый механизм. С таймингами действительно опа. Вступал в оную также, да только забыть уже успел. В связи с эти провокационный вопрос: Если логирование включать/выключать (NX_LOG_LEVEL=7/0), что-то меняется? В худшую строну? nxlog(), увы, вышла крайне времени-емкой.

Djelf писал(а):
13.12.2010 22:27
общение сделано уродливо т.к. нет стоп-битов или любых других ключей позволяющих серверу сказать что он все сделал, ответил и ждет команд. Из-за этого в клиенте при приеме команд сделан тайм аут, по истечении которого считается что сервер готов (вот вам и медленно, вот вам и сбои на плохих каналах).
Последовательность команд очень критична! Любое неверное движение - мгновенный обрыв связи.

Можно ли предположить, что не протокол уродлив, а свободная реализация сервера его до конца "ниасилила"?
Вопрос пока на дилетантском уровне.

Djelf писал(а):
13.12.2010 22:27
Некоторые команды перехватывает nxssh например "NX> 299" занимается пробросом портов, что да как надо смотреть в исходниках nxssh.

Вот туда-то уже и полез колупаться. В ту же кучу зело интересует - nxsshd меж прочим тоже собирается, да только не используется - к чему бы это?
Спасибо сказали:
Djelf
Сообщения: 615
ОС: Гигтег+Цшт32

Re: Протокол пилим?

Сообщение Djelf »

dimbor писал(а):
14.12.2010 02:27
Можно ли предположить, что не протокол уродлив, а свободная реализация сервера его до конца "ниасилила"?

Нет, все соответствует офф серверу, разделителем от сервера должно было быть "NX> 105 " - приглашение на команду клиенту, давно не пробовал это вылавливать, может на OpenNX и заработает, а то "(AsyncProcess) IoThread outwatch timed out " немного напрягает... Скорее всего фокус не пройдет, насколько помню, nxssh как то не очень корректно это дело обрабатывает и возвращает например "NX> 105 bye", при таком вылавливании получается ерунда...

dimbor писал(а):
14.12.2010 02:27
зело интересует - nxsshd меж прочим тоже собирается, да только не используется - к чему бы это?

Предполагаю: Он изначально должен был собираться. До модификации !M. После модификации он взял и тоже собрался, а !M его забыли/не захотели исключить из сборки...

p.s. вот: http://offog.org/darcs/misccode/nxminiclient самый простой nxclient ;)
Спасибо сказали:
oldbay
Сообщения: 283
ОС: gentoo, cenos

Re: Протокол пилим?

Сообщение oldbay »

dimbor писал(а):
14.12.2010 02:27
зы: свои вопросы с сервером уже решил (правда пришлось попутно переворошить кишки 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 перед удачным стартом.
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Протокол пилим?

Сообщение dimbor »

Djelf писал(а):
14.12.2010 10:02
Скорее всего фокус не пройдет, насколько помню, nxssh как то не очень корректно это дело обрабатывает и возвращает например "NX> 105 bye", при таком вылавливании получается ерунда...

Неправда ваша. ;) Не он это.
В процессе обнюхивания nxssh: grep -r "NX> " *.[ch] | cut -d\" -f2 | sed 's/\\r\\n//' | sort | uniq

Код: Выделить всё

NX> 200 Connected to address: %.200s on port: %.200s
NX> 200 Connected to web proxy at address: %.200s on port: %.200s
NX> 202 Authenticating user: %.200s
NX> 203 NXSSH running with pid: %d
NX> 204 Authentication failed.\n
NX> 205
NX> 205 %.30s@%.128s's password:
NX> 206 ssh-userauth2 successful: method %s\n
NX> 207 nxssh: connect to address %s port %s: %s
NX> 207 nxssh: connect to address %s port %s: %s\n
NX> 207 %s: %.100s: %s
NX> 207 %s: %.100s: %s\n
NX> 208 Using auth method: %s\n
NX> 209 Remote host identification has changed.
NX> 210 Enter passphrase for key '%.100s':
NX> 211 The authenticity of host '%.200s (%s)' can't be
NX> 280 Adding: %d bytes to the returned buffer
NX> 280 Adding: %d bytes to the temporary buffer
NX> 280 Analyzing command string:
NX> 280 Calling the NX select in context: 7
NX> 280 Calling the NX select in context: 9
NX> 280 Can't determine the name of the proxy log
NX> 280 Can't handle exception fds in select
NX> 280 Can't open log file: %s error is: %d, '%s'
NX> 280 Can't redirect the log to file: %s
NX> 280 Channel in descriptor is selected
NX> 280 Channel opened with in: %d out: %d err: %d
NX> 280 Checking command with length: %d
NX> 280 Completed execution of the NX loop
NX> 280 Content of the temporary buffer:
NX> 280 Creating proxy with null options
NX> 280 Creating proxy with options: %s
NX> 280 Dumping content of the temporary buffer:
NX> 280 Entering select at: %s
NX> 280 Error reading from descriptor: %d at: %s
NX> 280 Error writing to descriptor: %d at: %s
NX> 280 Exiting from the server side loop
NX> 280 Exiting on signal: %d
NX> 280 Failed select on input descriptors
NX> 280 Going to prepare a new NX loop
NX> 280 Going to read from descriptor: %d at: %s
NX> 280 Going to run a new NX loop
NX> 280 Got error: %d in read: '%s' at: %s
NX> 280 Got error: %d in select: '%s' at: %s
NX> 280 Got error: %d in write: '%s' at: %s
NX> 280 Ignoring CLOSE on the monitored channel
NX> 280 Ignoring EOF on the monitored channel
NX> 280 Left: %d bytes in the temporary buffer
NX> 280 Lefthand remaining bytes are: %d
NX> 280 NX transport successfully terminated
NX> 280 Out of select with result: %d at: %s after: %d ms
NX> 280 Processing the escape chars in context: 1
NX> 280 Processing the escape chars in context: 2
NX> 280 Processing the escape chars in context: 3
NX> 280 Proxy in descriptor is selected
NX> 280 Proxy in: %d out: %d transport in: %d out: %d
NX> 280 Proxy opened with local: %d remote: %d
NX> 280 Read: %d bytes error: %d in context: 1
NX> 280 Read: %d bytes error: %d in context: 2
NX> 280 Read: %d bytes error: %d in context: 3
NX> 280 Read: %d bytes error: %d in context: 4
NX> 280 Read: %d bytes error: %d in context: 5
NX> 280 Read: %d bytes error: %d in context: 6
NX> 280 Read: %d bytes error: %d in context: 7
NX> 280 Read: %d bytes from descriptor: %d at: %s
NX> 280 Reading: %d bytes from fd: %d in context: 1
NX> 280 Reading: %u bytes from fd: %d in context: 2
NX> 280 Reading: %u bytes from fd: %d in context: 3
NX> 280 Reading: %u bytes from fd: %d in context: 4
NX> 280 Reading: %u bytes from fd: %d in context: 5
NX> 280 Reading: %u bytes from fd: %d in context: 6
NX> 280 Reading: %u bytes from fd: %d in context: 7
NX> 280 Righthand remaining bytes are: %d
NX> 280 Searching newline with: %d bytes remaining
NX> 280 Searching with matching string:
NX> 280 Selecting channel descriptor
NX> 280 Selecting proxy descriptor
NX> 280 Should enable NX memory-to-memory agent transport
NX> 280 SSH connection established with fd: %d
NX> 280 Switch command maybe found at position: %d
NX> 280 Switch proxy is: %d
NX> 280 The NX transport is not running
NX> 280 TIME! Spent: %d ms handling messages
NX> 280 TIME! Spent: %d ms waiting for data
NX> 280 Total remaining bytes are: %d
NX> 280 Using local end: %d remote end: %d
NX> 280 Using log file: %s
NX> 280 Using proxy log file: %s
NX> 280 Waiting for the NX transport to terminate
NX> 280 Writing: %d bytes to fd: %d in context: 1
NX> 280 Writing: %d bytes to fd: %d in context: 2
NX> 280 Writing: %d bytes to fd: %d in context: 3
NX> 280 Writing: %d bytes to fd: %d in context: 4
NX> 280 Writing: %d bytes to fd: %d in context: 5
NX> 280 Writing: %d bytes to fd: %d in context 6
NX> 280 Writing: %d bytes to fd: %d in context 7
NX> 280 Writing: %d bytes to fd: %d in context: 8
NX> 280 Written: %d bytes error: %d in context: 1
NX> 280 Written: %d bytes error: %d in context: 2
NX> 280 Written: %d bytes error: %d in context: 3
NX> 280 Written: %d bytes error: %d in context: 4
NX> 280 Written: %d bytes error: %d in context: 5
NX> 280 Written: %d bytes error: %d in context: 6
NX> 280 Written: %d bytes error: %d in context: 7
NX> 280 Written: %d bytes error: %d in context: 8
NX> 280 Written: %d bytes to descriptor: %d at: %s
NX> 282 Skipping the server alive check
NX> 285 Client side loop completed
NX> 285 Detected authentication agent connection
NX> 285 Duplicated descriptor: %d to: %d
NX> 285 Enabling check on switch command
NX> 285 Enabling redirection of debug output
NX> 285 Enabling skip of SSH config files
NX> 285 Entering the client side NX loop
NX> 285 Entering the server side NX loop with proxy at: %s:%d
NX> 285 Exiting from the client side loop
NX> 285 Going to check input for fd: %d
NX> 285 Identified cookie: %s
NX> 285 Identified descriptors in: %d out: %d
NX> 285 Identified host: %s port: %d
NX> 285 Identified internal connection
NX> 285 Identified mode: %s
NX> 285 Identified options: %s
NX> 285 Identified port: %d accept: %s
NX> 285 Searching switch parameters in command:
NX> 285 Sending authentication cookie: %s
NX> 285 Setting the preferred NX options
NX> 285 Switching descriptors: %d and: %d to: %d
NX> 285 Using default mode encrypted
NX> 286 Called packet_set_interactive() for fd: %d interactive is: %d
NX> 286 Failed to reset O_NONBLOCK on descriptor: %d
NX> 286 Failed to set IPTOS_LOWDELAY on descriptor: %d
NX> 286 Failed to set O_NONBLOCK on descriptor: %d
NX> 286 Failed to set SO_KEEPALIVE on descriptor: %d
NX> 286 Failed to set TCP_NODELAY on descriptor: %d
NX> 286 Forcing interactive to: %d for fd: %d
NX> 286 Option IPTOS_LOWDELAY not supported on: %d
NX> 286 Option TCP_NODELAY not supported on: %d
NX> 286 Reset O_NONBLOCK on descriptor: %d
NX> 286 Resetting O_NONBLOCK on descriptor: %d
NX> 286 Set IPTOS_LOWDELAY on descriptor: %d
NX> 286 Set O_NONBLOCK on descriptor: %d
NX> 286 Set SO_KEEPALIVE on descriptor: %d
NX> 286 Set TCP_NODELAY on descriptor: %d
NX> 286 Setting O_NONBLOCK on descriptor: %d
NX> 286 Setting %s on fd: %d
NX> 286 SSH is setting TCP_NODELAY on descriptor: %d
NX> 286 SSH reports TCP_NODELAY already set on descriptor: %d
NX> 286 Trying IPTOS_LOWDELAY on descriptor: %d
NX> 286 Trying SO_KEEPALIVE on descriptor: %d
NX> 286 Trying TCP_NODELAY on descriptor: %d
NX> 286 WARNING! Not setting TOS on fd: %d with IP_TOS: %d IP_TOS_IS_BROKEN: %d
NX> 287 Redirected I/O to channel descriptors
NX> 288 Buffer length of: %d bytes exceeded
NX> 289 Discarding spurious data: '%s'
NX> 290 Can't duplicate descriptor: %d to: %d error: '%s'
NX> 290 Can't find the terminating newline in buffer:
NX> 290 Can't switch communication to in: %d out: %d
NX> 290 Can't switch communication to: %s:%d
NX> 290 Don't use the -B option with binary data
NX> 290 End of input received before switch command
NX> 290 Error while switching communication
NX> 290 Failed connection to: %s:%d
NX> 290 Failed read on channel descriptor
NX> 290 Failed read on proxy descriptor
NX> 290 Failed to create the internal connection
NX> 290 Failed write on channel descriptor
NX> 290 Failed write on proxy descriptor
NX> 290 Failure creating the socket pair: %s
NX> 290 Not supported mode: %s
NX> 291 Accepted connection from: %s with port: %d
NX> 291 Connecting to: %s:%d
NX> 291 Waiting for remote connection on port: %d from: %s
NX> 292 Can't redirect I/O to channel descriptors
NX> 294 Connected to proxy at: %s:%d
NX> 294 Connection to: %s:%d failed. Retrying
NX> 295 Can't set the SO_REUSEADDR on socket
NX> 296 Can't create the connecting socket
NX> 297 Call to accept failed error: %s
NX> 297 Call to select failed error: %s
NX> 297 Cannot accept connections from unknown host: %s
NX> 297 Can't bind to port: %i error: %s
NX> 297 Can't create socket error: %s
NX> 297 Can't listen on port: %i error: %s
NX> 297 Can't redirect port to channel descriptors
NX> 297 Can't resolve address of host: %s
NX> 297 Connection with remote host: %s could not be established
NX> 297 Missing data to perform the switch
NX> 297 Refused connection from: %s with port: %d
NX> 298 Out of memory checking the command string
NX> 298 Out of memory creating the temporary string
NX> 298 Parse error in the switch parameters
NX> 299 Switch connection to:


В процессе...
Спасибо сказали:
Djelf
Сообщения: 615
ОС: Гигтег+Цшт32

Re: Протокол пилим?

Сообщение Djelf »

dimbor писал(а):
15.12.2010 08:55
Неправда ваша. ;) Не он это.
В процессе...

Ну и славненько... если получится сделаю версию OpenNX без таймаутов (вернее с дополнительным отловом NX> 105). Там на 5 мин работы...
Спасибо сказали:
dimbor
Ведущий рубрики
Сообщения: 1569
Статус: Подвинутый участник

Re: Протокол пилим?

Сообщение dimbor »

Djelf писал(а):
15.12.2010 14:21
Ну и славненько... если получится сделаю версию OpenNX без таймаутов (вернее с дополнительным отловом NX> 105). Там на 5 мин работы...

Это даже хорошо, что пять минут выросли во много дней. Потому как при текущем freenx скорее всего не получится. По коду nxserver сейчас "NX> 105 " (!пробел сзади) отдается как подтверждение получения команды, а не подтверждение ее выполнения. Отсюда и таймауты, как мыслю. А если в будущем это будет именно подтверждение выполнения, что на клиентской стороне может поломаться? Ась?
Спасибо сказали:
Djelf
Сообщения: 615
ОС: Гигтег+Цшт32

Re: Протокол пилим?

Сообщение Djelf »

Т.е. сервер получает команду, выдает NX>105, выполняет команду? Странновато мне это...
На клиентской стороне IMHO ничего не должно сломаться.
Спасибо сказали:
Ответить