GrandTorrino или второе дыхание Torrero
пост написан и отправлен в печать 2011-05-29 примерно в 15:01
Малопонятный заголовок, согласен, но позвольте мне объясниться: когда-то в прошлом, будучи под воздействием опиатов или каких-то других тяжелых наркотиков, позволяющих мне почувствовать себя чуточку счастливее, я сделал проигрыватель видеофайлов, распространяемых по пиринговым сетям протокола torrent без необходимости их полной загрузки. В двух словах, ждете 10% подгрузки и потом смотрите себе киношку без необходимости ожидания загрузки остального, вполне удобно, особенно для всяких там сериалов. Но, как и всё, что я делаю бесплатно и под воздействием галюциногенов и эйфоретиков, работало это из рук вон хуйово -  были проблемы с линейным алгоритмом загрузки, когда миниатюрные куски по 1-5 килобайт выпадали из piecepicking query, а декодер плеера на этом захлебывался за милую душу. Были проблемы с mplayer-ом, который очень нехотя цеплялся через hid windows forms компонента. Но, как ни странно, нашлись и дорчитатели этого бложика, которым очень даже понравилось. И вот они начали забрасывать меня багрепортами, мол не работают сабтитры, нельзя выбрать звуковую дорожку, нельзя выбрать, какой именно файл из торрента смотреть. На все это я отвечал, что удивительно, что оно вообще работает, любезно предлагая предоставить исходники. Но, увы, энтузиастов, готовых хоть сколько-то помочь в разработке, в наличии не оказалось, а письма все продолжали капать и капать - давать дельные советы, как известно, это вам не мешки ворочать. Ну теперь можно все вышеперечисленное, короче говоря. Открываю вам страшную тайну, для себя месяца 2-3 тому назад я написал отдельную версию, так сказать, исправленное и облегченное издание, лишенное большинства недостатков оригинала. И даже основного - ужасное GUI было начисто заменено ламповым черным консольным окном. К тому же, был полностью переписан алгоритм загрузки, он работает чуточку медленнее по причине необходимости подтягивать куски последовательно, зато файлы не ломает и позволяет даже использовать перемотку в пределах загруженного отрезка видео файла (все еще в экспериментальном режиме, как я не пытался сделать byte by byte, все равно идет разбивка на куски и параллельная загрузка, в этом весь битторрент). Называется эта версия GrandTorrino и, билдани я эту версию году так в 2007, всем мог бы говорить, что фильм Клинта Иствуда назван именно в честь нее. Но, кажись, все наоборот. Использование очень простое - drag and drop torrent файл на exe-шник GrandTorrino, ждем 10% буферизации и готово. Если в торренте 1 файл - все пройдет само собой, если больше 1го - вас спросят, какой именно вы хотели бы посмотреть. Все хоткеи для mplayer можно узнать в прилагаемом файле mplayer.html, они немного необычные. Скачать последнюю версию можно тут. Для работы необходим .net framework 3.5, и запас алчности, позволяющий вам воровать чеcтно заработанные деньги из дырявого кармана нищих правообладателей. 

А теперь, давайте по сути. Мне очень нравятся подобная идея - нарушение авторских прав без ожидания и очень печалит факт отсутствия нормальной реализации. Нет, конечно моя версия работает и с поставленной задачей справляется, но хотелось бы чего-то большего, интуитивно-удобного и приятного, а у меня для для такого не хватает ни знаний, ни времени, ни мотивации - работает же и сейчас, зачем мне что-то большое? Так вот, я отдам все исходники по запросу на email или в скайп, указанный в заголовке этого блога. Вы сможете делать с ними все, что душа пожелает - продавайте, воруйте, убивайте, делайте стартап, но я всегда должен буду иметь доступ к исходникам, природное любопытство и все дела. Написано все на C#, код конечно не ахти какой, но я постараюсь все приаккуратить к передаче, чтобы стыдно не было моим стареньким учителям информатики, которых у меня конечно же не было. В качестве проверки, что вы не какой-то хер с горы, вам нужно будет показать технику гроула рассказать, как можно рассчитать необходимый процент буферизации, имея скорость загрузки за последние 10 секунд, вес файла и его аудио-видео битрейт и как определить, что проигрывание идет быстрее скачивания файла с помощью стандартного mplayer вывода. А вообще, шучу конечно. Без проблем вышлю и так + модифицированную библиотеку MonoTorrent в довесок. Спасибопожалуйста.

Пишем свой caching nameserver с фильтрацией
пост написан и отправлен в печать 2011-04-09 примерно в 10:58
Прежде чем начинать свое повествование, маленькое сообщение для всех, кто прочитал топик поста и закачал убеленной сединой\лысиной головой с неприкрытым укором: да, я знаю о существовании BIND и да, я знаю про MySQL BIND SDB, или даже про MyDNS тоже слышал, и настроить кеширующий child неймсервер умею. Увы, реализация такой комбинации не виделась мне целесообразной по ряду причин о которых я не буду тут писать. В любом случае, мне нужно было сделать DNS с фильтрацией определенных доменных имен с хранением списка этих имен на центральном сервере в MySQL базе данных. Нужно было сделать его не намного медленней родного варианта, что было вполне нетривиальной задачей. Думаю, что для начала мне стоит объяснить, зачем это все задумывалось. Как упоминалось в прошлом посте, я работаю в компании основным направление деятельности которой является предоставление сервиса защищенного VPN туннеля для обхода корпоративных фаерволов, шифрования трафика, защиты от man-in-the-middle и прочих мерзких снифферов, получения своего личного реального IP где-то в странах экваториальной Америки, ну и для защиты от вирусов с помощью решений от тов. Касперского. В качестве серверных площадок используются разнообразные virtual dedicated и root dedicated от разных провайдеров по всему миру. И вот тут возникает основная проблема, которая загубила большинство подобных сервисов - торренты. Да, в большинстве TOS-ов большинства хостеров ясно прописано, что если с вашего сервера будет замечена подозрительная активность по загрузке из интернета нелегального контента, то вы автоматически лишаетесь предоставляемой услуги без какой-либо надежды на материальное возмещение. Звучит достаточно печально, учитывая предоплату на целый год. В итоге, часто получаешь подобные письма, рассылаемые полуавтоматическими системами правозащитных ищеек, что не добавляет хорошего настроения в твой и так не особо веселый рабочий день. Каким образом они отслеживают попытку скачивания торрента? Fake Seed к примеру? Или просто фильтруют запросы к торрент трекерам? Я без понятия, но вот если правильным образом не среагировать на подобное письмо, убедив хостера, что этот мудак, качающий Спанжбоба, физически устранен, а вся его семья стерилизована - можно получить серьезные проблемы. Вплоть даже до судебного разбирательства, все мы новости читаем. Это проблема, теперь поговорим о решении. Любой системный администратор скажет вам, что не существует оптимального решения перекрытия кислорода p2p трафику. Да, можно ограничивать количество udp сессий одного хоста (что достаточно глупое решение, учитывая саму природу протокола с неявным закрытием соединения), можно вообще закрыть udp (что еще глупее, одним махом лишаем пользователя всяких скайпов\сипов, а торрент клиенты могут спокойно и через TCP работать), можно использовать всякие модули фильтрации уровня iptables вроде ipp2p, OpenDPI, l7-filter (на сайте пишут про высокий perfomance, но у меня la вскакивал до 1 при 10 соединениях и иногда всплывали defunct зомби) или вообще пускать весь трафик OpenVPN  в лоб через фильтрующий прокси сервер (мною было опробовано все из списка, увы, все решения крайне требовательны к системным ресурсами из-за необходимости прочесывания регулярками большого потока данных и по этой причине не подошли, не все сервера в сети могли позволить себе такую роскошь). Есть еще решения для дураков: закрытие типичных портов, что не работает в условиях современных клиентов и тот вариант, который выбрал я - DNS блокировка главных торрент трекеров. Защита ужасная, ничто не мешает клиенту после подключения выставить вместо присваиваемого неймсервера какой-то другой, данное решение к тому же не помогает, если пользователь начал скачивание торрента до подключения к нашему VPN-у (хотя моя практика показывает, что в таких случаях правозащитные ищейки молчат, что еще раз служит подтверждением конспирологической теории, что софт копирайтеров просто отслеживает announce запросы к трекерам), и конечно же данный вариант не спасает от DHT, которому вообще ничего не нужно: ни трекеры, ни днсы. Но работает же, количество писем от правообладателей сократилось до 1-2х за 3 месяца, возвращаем NXDOMAIN для всех доменных имен в блеклисте и живем припеваючи. Кстати, если кто имеет идеи, как побороть bittorrent в сети - скиньте мне хоть пару строк на mail@smirnoff.sumy.ua, чтоб я примерно знал, куда копать. С меня благодарности в приемном для вас эквиваленте.

Возвращаемся к теме реализации. Прежде всего, отвечаю на вопрос: зачем мне нужно много неймсерверов, а не один центральный без всех этих заморочек с MySQL и т.д. В качестве master мы будем использовать Google Public DNS, на нем был замечен load balancing для некоторых крупных сайтов, на запрос по тому же ютубу с разных географических точек отдавались разные A-записи. К тому же, проводить NS query с гонконгского сервера через туннель на центральный сервер где-то в Люксембурге или США - очень медленно, поэтому наши DNS-ы будут отвечать по тому же адресу, что и шлюз. Языком реализации стал Perl. Почему? Да просто в нем есть все необходимые нам компоненты. Использовать мы будем Net::DNS для резолвера и Net::DNS::Nameserver для сервера. Разумеется, без кеширования никуда. В качестве решения я советую смотреть в сторону Cache::Bounded, которое является по сути оберткой вокруг Cache::MemoryCache с оптимизацией и обнулением кеша по достижению определенного размера, что спасет нас от переполнения памяти. В результате получилось что-то вроде такого кода. Сразу замечу, что 3 цикла for при чтении ответа из кеша - необъяснимая мною мистика. Казалось бы с помощью тех же элементов исходного массива путем перебора формируем новый, а вот простое присваивание - не работает. И хоть ты тресни. По скорости вполне нормально, первый запрос конечно отнимает определенное время, но в дальнейшем из кеша в памяти все читается очень быстро. В качестве бонуса, держите список из 1800 самых крупных торрент трекеров для блокировки.

Как по мне, сервисы vpn туннелей должны служить исключительно 2м целям: скачивание торрентов в странах, где за это находят и бьют по рукам; и просмотр католическими священниками детской порнографии там, где это тоже не особо приветствуется. Первых случаев становится все больше, а последних - все меньше. Мы же нашим TOS-ом запрещаем основные приоритетные направления. А все остальные истории с  защитой вашей информации, все это сказки для детей. Мы то с вами знаем, что от паяльника еще ни один фаерволл или канал с шифрованием не спасал. 

Torrero Video Player
пост написан и отправлен в печать 2010-05-30 примерно в 12:59
Как-то раз наткнулся я на обсасываемый топик на хабре о софте под названием Torrent Stream. За пафосными фразочками "лучшие и зарекомендовавшие себя программные разработки авторитетных учреждений и команд разработчиков со всего мира и которому по функциональным и эксплуатационным возможностям, на сегодняшний день, нет равных в мире" скрывался легкоуловимый смысл: данное ПО давало возможность смотреть видео с торрентов не дожидаясь их полной загрузки. Как раз это мне и было нужно, вот только оказалось, что техническая реализация немного прихрамывает: все было реализовано в виде плагина к браузеру, все ужасно тормозило и файл с того же лостфильма и огромным количеством пиров слвался очень неспешно, переодически подвисая на "буферизацию". Вот поэтому я и написал свой плеер видео-файлов с торрента с цыганами и пасьянсом. Прошу любить и жаловать: Torrero Movie Stream Player. Ну или просто Torrero.

Кому лень читать дальше - большая ссылка скачать (с автообновлением и плюшками)

А для остальных, продолжим. Как всегда, сперва техническая часть. Написано приложение на С# и WinForms в Visual C# 2010 Express под .NET 3,5. Почему не WPF? Все очень просто, WPF контролсы не имеют своего собственного window handle, что было необходимо для встраивания mplayer-а в окно формы. Перепробывал сотни варинантов, но максимум что удалось получать, это handle окна, а нужен был hwnd панели или текстлейбла. Ну, вообщем, такая канитель. В качестве Torrent библиотеки был выбран велосипед MonoTorrent, который просто божественный. Поддержка на форуме и уровень возможностей позволяет писать все: начиная обычным парсером торрент файлов и заканчивая собственным трекером. Едиственная проблема, это практически полное отсутствие документации. Приходится копаться в исходниках, благо они отлично комментированны. Плеером был выбран MPlayer по следующим причинам: возможность встраивания без activex и прочих финтов ушами, как у VLC например, небольшой размер и встроенные декодеры, возможность проигрывания недокачанных файлов.

Парочка ответов на парочку вопросов. Все это будет бесплатно? Разумеется и даже opensource. Вот только второе будет чуть позднее, в настоящее время код ужасен, некоментирован и захламлен мусором. После парочки рефакторингов открою для анонимного доступа svn проекта. Почему Torrero, что это значит? Значит это производное от слова torero, матадор. Почему? Ну не знаю, хотелось присутствия в названии чего-то похожего на Torrent. Изначальная версия "torrantino", полученная объединением Torrent + Tarantion оказалась уже забита. Будет ли дальше развиваться проект, а что что-то все виснет и лагает? Да, разумеется, планов море. Это и переделать интерфейс, и сделать поддержку проигрывания нескольких файлов в торренте, и еще куча всего, вот только времени у меня в обрез, но в скорости появится отдельная страница, где можно будет смотреть change-лог, планы развития и узнавать об обновлениях.

Если вы нашли ошибку или хотите получить исходники немедленно, пишите мне в твиттер @middlesizetit либо же на почту mail@smirnoff.sumy.ua. Обязательно отвечу всем желающим.