Содержание статьи
Расшарить между компьютерами какой-либо документ — просто. Предоставить удаленный доступ к рабочему столу — нет проблем. Но почему-то до сих пор нельзя просто «поделиться» запущенным приложением — взять и быстро перенести его окно из одной системы в другую. С появлением проекта WinSwitch это стало возможным.
Что такое WinSwitch?
Если ты часто имеешь дело с виртуальными машинами, то наверняка знаешь о такой замечательной возможности как перенос окон из гостевой операционной системы, запущенной в виртуальном окружении, в хостовую ОС (основную систему на компьютере). То есть если на виртуальной машине крутится винда, а сама виртуальная машина работает на Ubuntu, то любые запущенные приложения можно «перенести» из Windows в Ubuntu. Что самое прикольное, — они будут работать так, как если бы были запущены самым обычным способом. У меня давно возникла идея реализовать что-то подобное, но не в плоскости виртуальной машины, а с точки зрения протоколов для доступа к удаленному рабочему столу. RDP или VNC без проблем позволяют получить картинку с компьютера, который может находиться за тысячи километров, и вполне комфортно с ним взаимодействовать. Но зачем нужна картинка полного рабочего стола, когда работать приходится с одним или двумя конкретными приложениями? Ведь можно же отображать только их окна? Удивительно, но реализации такой простой идеи долго не было. Пока не появился WinSwitch!
Хакер #159. Подделка контрольной суммы и ЭЦП с помощью коллизий
Как это выглядит? Запустив какое-либо приложение через специальный сервер, ты сможешь напрямую перенести его на любое устройство, где будет установлен соответствующий клиент. Тут нужно понимать — не файлы приложения, а именно окно программы, с которым можно работать. Теперь, если нужно продолжить работу над текущим документом в Microsoft Word или, скажем, над проектом в Visual Studio на другом компьютере, можно просто «перетащить» туда окно. А поскольку проект кроссплатформенный, то это еще и отличный способ работать с приложением в том случае, когда для нужной системы нет подходящей версии. Или вот еще пример: у меня дома рядом стоят компьютер на Windows и ноутбук на Ubuntu, — теперь я без проблем могу перекидывать приложения с одной системы на другую (ну и с одного экрана на другой). Хоть даже Visual Studio. В результате можно расшарить не документ, а приложение.
Установка
Теперь, когда понятно, о чем идет речь, попробуем WinSwitch в действии. Для примера организуем связь между двумя машинами, выбрав в качестве плацдарма две разных ОС — Ubuntu Natty Narwhal (11.04) и Windows XP.
Windows. Тут все довольно примитивно: на официальном сайте winswitch.org скачиваем инсталлятор, который все сделает за нас. Для корректной работы программе понадобится mDNS-сервер (подробней об mDNS смотри во врезке) — если на машине он не установлен (а он, скорее всего, не установлен), то инсталлятор выдаст соответствующее сообщение и предоставит ссылку на дистрибутив.
Linux. Я, как уже было отмечено выше, буду использовать Ubuntu, но, само собой, подойдет и любой другой дистрибутив тукса. В убунте приложение можно установить через менеджер пакетов, предварительно прописав цифровую подпись репозитория с нужными нам пакетами:
sudo su -
wget -O — https://winswitch.org/gpg.asc | apt-key add -
echo "deb http://winswitch.org/ natty main" > /etc/apt/sources.list.d/winswitch.list
apt-get update
apt-get install winswitch
Проект находится в стадии активной разработки и пока представляет собой решение скорее для гиков, чем для обычных людей, поэтому чтобы заставить его работать придется немного повозиться с настройкой.
Настройка
WinSwitch состоит из двух частей: сервера и клиента (так называемого апплета). Клиент необходим в системе, чтобы в нее можно было «перетащить» приложения — его можно запустить сразу после установки через меню. Также при старте апплета автоматически запускается локальный сервер, чтобы иметь возможность расшарить приложения с локальной машины. При запуске клиент пытается определить все доступные сервера в сети при помощи mDNS.
Конфигурирование как клиента, так и сервера осуществляется через конфигурационные файлы. При первом запуске программа создает необходимые папки и генерирует конфиги, что может занять некоторое время. Как только программа запустилась, идем искать конфиги сервера. В *nix они будут в папке ~/.winswitch/server/server.conf, а в Windows — *\Application Data\Window-Switch\server\server.conf. Рассмотрим наиболее важные для нас параметры. Каждый сервер имеет свой идентификатор, имя и тип, — все это автоматически генерируется при запуске и выглядит примерно так:
# Identity
ID="8796747538515"
name="testpc"
type="workstation"
Тут можно все оставлять без изменений. Далее в конфиге идут публичный и приватный ключи, используемые для шифрования трафика. Нас же, прежде всего, будет интересовать параметр listen_on, определяющий, на каком интерфейсе и порту сервер будет ожидать подключений. Его, в принципе, тоже можно оставить в состоянии «по умолчанию», но я для порядка все же поставил listen_on="*:32123" (это означает, что сервер будет ожидать подключения на 32123 порту на всех сетевых интерфейсах). Далее идет еще один интересный параметр allow_root_logins, который в целях безопасности рекомендуется установить в значение False. Он определяет, можно ли будет подключиться к данному серверу под администратором/рутом. Параметр allow_root_authentication дает возможность соединиться с сервером под любым пользователем, не зная его пароля. Его я тоже отключил из соображений безопасности. Следующая интересная секция — mDNS settings — позволяет включать/отключать сервис mDNS, используемый для того, чтобы клиенты при запуске могли самостоятельно находить в сети доступные сервера. Если установить параметр mDNS_publish в значение False, то автоматический поиск серверов будет отключен и их придется добавлять вручную. Чтобы клиенты обнаруживали не только сервера, но и имя пользователя, под которым можно зайти, есть опция mDNS_publish_username. Еще одна полезная возможность — запуск сервера в режиме отладки — может сильно помочь, когда надо прояснить, почему что-то не работает. Остальные опции в случае необходимости ты можешь изучить сам, так как они достаточно хорошо прокомментированы в самом файле.
Тест-драйв
Наша задача — запустить какую-нибудь программу и «отправить» ее с одного компьютера на другой. В идеальном случае все заработает без лишних заморочек. Сначала поработаем на машине с Windows XP. Открываем меню «Пуск» и запускаем клиент Window-Switch. Как уже обсуждалось выше, при запуске апплета автоматически запустился и сервер. Апплет его тут же обнаружил и подключился к нему. Теперь идем в Ubuntu. Открываем стартовое меню и выбираем «Internet -> WindowSwitch». Апплет стартует, запускается сервер. Появляется окно, в котором сообщается, что найден сервер с именем testpc и ID=8796747538515. Подтверждаем, что мы хотим с ним соединиться, после чего нас попросят ввести пароль для пользователя user. В винде появилось такое же окно, сообщающее, что найден сервер ant-vb и просьбой ввести пароль пользователя ant для соединения. Связь установлена — попробуем отправить приложение с одной системы на другую. Идем в линукс, жмем на значок WinSwitch в трее и выбираем «Start Application -> Games -> Mines». Появляется аналог виндового сапера (можно чуть поломать голову), – теперь мы готовы его расшарить. Опять жмем на иконку приложения в трее, выбираем «Mines -> Send to user on testpc». И приложение исчезает. Переходим в винду и видим, что оно появилось там. Вуаля!
Надо сказать, что WinSwitch уже содержит список предопределенных приложений, рассортированных по категориям, которые можно расшарить. Но можно запустить и свое приложение, если выбрать «Start Application -> Custom Command». Для удобства эта фича также интегрируется в контекстное меню, так что будет достаточно выбрать нужную программу, щелкнуть по ней правой клавишей и выбрать «Open in Window Switch». Кроме приложений, можно получить доступ к самому рабочему столу («Main Unix Display -> VNC Copy»). Помимо непосредственно окна можно форвардить также и звук (для этого используется библиотека GStreamer).
Отладка
Я не зря сделал выше ремарку «в идеальном случае», — с первого раза у меня система не запустилась. Нажав на значок апплета в трее, я понял, что он видит только локальный сервер. Можно, конечно, добавить сервер вручную, но тогда весь смысл автоматизации теряется. Поэтому вернусь к этому моменту и расскажу, в чем было дело.
Прежде всего надо бы посмотреть логи. Начал я с винды. Лог клиента располагался здесь: *\Application Data\Window-Switch\client\applet.log. Ситуации он не прояснил, так как в нем я не увидел информации о какой-либо ошибке. Ну что ж, тогда проверим сервер. К сожалению, логов сервера я не нашел. Пообщавшись с документацией на официальном сайте, было решено следующее: чтобы посмотреть отладочные сообщения сервера, надо запустить его в консоли с параметром --debug-mode. Запускаем консоль, переходим в папку программы (C:\Program Files\WinSwitch) и запускаем сервер:
Switch-Server.exe --debug-mode
Покопавшись в сообщениях сервера, ничего криминального я снова не обнаружил. Так что, скорее всего, проблема кроется в Linux-версии. Переходим в линукс. Заходим в консоль и запускаем уже линуксовый сервер в отладочном режиме:
winswitch_server --debug-mode
В результате вываливаемся с ошибкой:
[EE] 2012/23/02 19:13:18 WinSwitchServer.check() running as root (uid=0) is currently broken
И снова общение с официальным сайтом прояснило ситуацию. Оказывается, сервер и апплет нельзя запускать под рутом (а у меня как раз была открыта консоль с правами рута). Ну что ж, попробуем проделать тот же трюк под обычным пользователем. Запускаем сервер в режиме отладки под обычным пользователем. И ищем в консоли все строки, начинающиеся на [DD] (отладочные сообщения). Пролистывая лог из конца в начало, обратим внимание на стек вызовов функций. Похоже, тут произошла какая-то ошибка, и программа выкинула нам traceback. Смотрим, что вызывалось последним:
AvahiPublisher.__init__(Window Switch for ant on ant-vb,32123,_shifter._tcp.,,,['username=ant', 'ssh_tunnel=False', 'version=0.12.11', 'ID=8796747971533'],-1)
Немного поясню. Avahi — это система, производящая анализ локальной сети на предмет выявления различных сервисов. К примеру, можно подключить ноутбук к локальной сети и сразу получить информацию об имеющихся принтерах, разделяемых ресурсах, сервисах обмена сообщениями и прочих услугах. Подобная технология существует в Mac OS X (Rendezvous, Bonjour) и отлично себя зарекомендовала. Avahi во многом базируется на реализации протокола mDNS — flexmdns. Так как в конфиге сервера у нас включена возможность обнаружения через mDNS, а сам mDNS-сервер у нас не запущен или не установлен, то автоматическое обнаружение и не срабатывает. Смотрим список процессов – действительно, Avahi нет. Но в списке установленных приложений он фигурирует, — значит, придется просто запустить его вручную:
avahi-daemon
Сообщение «Service ant-vb (/services/udisks.service) successfully established» свидетельствует о том, что avahi стартанул успешно. Может теперь все заработает? Запускаем сервер WinSwitch заново. Сообщение об ошибке инициализации mDNS уже не присутствует. На всякий случай проверим лог-файл апплета, который можно найти по следующему пути ~/.winswitch/client/applet.log. Там тоже обнаруживаются записи, свидетельствующие о наличии проблем с mDNS. Записей о других критических ошибках — не обнаружено. Так как проблему с mDNS мы уже решили, запустив демон ahavi, то теперь вроде бы все должно быть нормально. Выключаем сервер, который мы запустили вручную, и идем в меню, чтобы запустить апплет. Бинго! С этого момента все заработало.
Что такое mDNS?
Multicast DNS (mDNS) является способом использования привычных программных интерфейсов DNS в небольших сетях, где нет необходимости в обычном DNS-сервере. Проще говоря, использование mDNS позволяет клиенту определить IP-адрес хоста без помощи централизованного DNS-сервера. Машина, ищущая конкретный хост, посылает широковещательный mDNS-запрос. Соответствующий хост отвечает на этот запрос широковещательным ответом, «представляя» себя другим участникам сети. Таким образом все машины в сети обновляют свой mDNS-кэш и получают информацию и о новых хостах/сервисах. Чтобы аннулировать свое «представление» (например, в случае выключения машины) хост должен отправить response-пакет с TTL = 0. По умолчанию mDNS использует зарезервированную зону «.local». Протокол mDNS используют такие системы обнаружения сервисов как Bonjour (Apple) и Avahi (Linux).
Использовать или нет?
WinSwich – это вполне работоспособная реализация отличной идеи, которую я успешно использую уже несколько недель. Уверен, что очень скоро появятся коммерческие проекты, эксплуатирующие подобный подход, но уже с более человеческим интерфейсом, простой настройкой и — в идеальном варианте — прозрачным переносом окон из одной системы в другую (на случай, если два компьютера стоят рядом). Последнее несложно реализовать, если скомбинировать проект WinSwitch и Direct Input, позволяющий расшарить между стоящими рядом компьютерами клавиатуру и мышку.