В статье будут рассмотрены и проанализированы существующие подходы к решению задачи удаленной компиляции и предложен альтернативный подход, сочетающий в себе простоту и безопасность использования, высокую скорость работы.
Ключевые слова: удаленная разработка, сокеты, TLS.
Сейчас на рынке можно найти много готовых решений, позволяющих вести удаленную разработку и в том числе производить удаленную компиляцию. Условно решения данной задачи можно разделить на несколько классов. Один из них — это полноценные интегрированные среды разработки (IDE), предоставляющие широкие возможности, в том числе удаленную разработку (например NetBeans, CLion). К сожалению, часто для комфортной работы с большим проектом в таком приложении требуется мощный компьютер.
Другим классом решений являются утилиты, автоматизирующие сборку, с функционалом распределенных вычислений (например FASTBuild, IncrediBuild, Distcc). При наличии большого количества вычислительных мощностей данные утилиты многократно ускоряют процесс компиляции и сборки программного обеспечения, что является их главным плюсом. Среди недостатков можно отметить требование серьезной настройки программного окружения, узкий круг поддерживаемых языков (чаще всего только С/С++).
Для устранения недостатков существующих подходов, а также для обеспечения простоты и безопасности использования была разработана собственная система, представляющая из себя консольное клиент-серверное приложение, разрабатываемое на языке С под OC Linux. Ее работа состоит из нескольких этапов:
- Инициализация соединения клиента с сервером
- Архивация и сжатие выбранных файлов (опционально)
- Инициализация работы протокола TLS (опционально)
- Отправка данных на сервер
- Компиляция файлов / сборка проекта
- Отправка результата клиенту.
Для всех сетевых взаимодействий был использован зарекомендовавший себя интерфейс сокетов Беркли. Сокет позволяет управлять сетевым адресом, транспортом (то есть выбирать протокол транспортного уровня), а также предоставляет базовые операции ввода вывода (открытие/закрытие соединения, отправка/получение данных). В качестве протокола транспортного уровня при создании сокета было решено использовать TCP, так как в отличие от UDP он обеспечивает надежную доставку данных. Для того, чтобы отслеживать несколько клиентских сокетов, не блокируясь на них, использовался мультиплексор select. Он работает как обработчик прерываний, который активируется, как только на любой из сокетов приходят какие-либо данные. Если запрос пришел на исходный серверный сокет, он трактуется как запрос на новое соединение. Иначе происходит взаимодействие с уже существующим клиентом.
Рис. 1: Интерфейс сокетов Беркли, мультиплексор select
Для удобства пользователя была добавлена возможность архивации данных. Если требуется обработать 1–2 файла, не составляет труда ввести их имена. В противном случае, этот процесс может быть трудоемким, поэтому вместо файла пользователь может указать папку с файлами, содержащими исходный код. В этом случае с помощью архиватора tar создается архив. Далее при помощи утилиты gzip производится сжатие. В полученном виде информацию можно удобно и быстро передать на сервер для последующей работы.
Поскольку компилируемая программа может представлять коммерческий интерес, в разрабатываемую систему была добавлена возможность шифрования данных. Для этих целей использовалась широко известная криптографическая библиотека с открытым исходным кодом OpenSSL. Использованный в системе протокол TLS версии 1.2 является стандартом на рынке и гарантирует что данные, передаваемые между сервером и клиентом, защищены и не повреждены. TLS использует асимметричные алгоритмы шифрования. Рассмотрим процесс установки соединения. После того, как стороны договорились использовать TLS, согласование деталей соединения происходит с помощью представленной на Рис. 2 процедуры рукопожатия. В начале клиент отправляет запрос на установление безопасного соединения и указывает в нем доступный ему набор шифров и хэш функций. Сервер выбирает шифр и хэш-функцию, отправляет подтверждение, а также свой цифровой сертификат, содержащий имя сервера, публичный ключ и название центра сертификации. Затем в случае, если клиент подтвердил действительность сертификата, он шифрует случайное число публичным ключом сервера и отправляет его. Последним этапом сервер расшифровывает переданное случайное число своим приватным ключом и обе стороны с помощью данного числа генерируют сеансовый ключ для последующего шифрования и дешифрования данных во время сеанса. Таким образом обеспечивается защита данных даже в случае, если они были перехвачены третьей стороной.
Рис. 2. Процедура рукопожатия TLS
Были протестированы базовый и расширенный функционал приложения. Создан каталог с тестами и версиями системы для отслеживания изменений в работе приложения. В базовом режиме на сервер передавались однофайловые и многофайловые проекты. Тесты подразумевали как корректный пользовательский ввод, так и нет (например, содержащий ошибки в названиях файлов). Для тестирования расширенного функционала были выбраны проекты и разной структурой. Тесты показали, что текущая версия системы без ошибок работает с проектами с одноуровневой структурой, обработка многоуровневых проектов требует участия пользователя.
Благодаря тому, что основной функционал приложения написан на языке C, есть возможность реализовать кроссплатформенную версию приложения. Для этого потребуется доработать модуль архивации и добавить аналоги системных вызовов для соответствующих платформ.
Литература:
- W. Richard Stevens; Bill Fenner & Andrew M. Rudoff (2003). Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition). Addison-Wesley Professional.
- Advanced Programming in the UNIX environment, third edition, W. Richard Stevens and Stephen A. Rago, Addison-Wesley, 2013
- Postel, Jon, «Transmission Control Protocol — DARPA Internet Program Protocol Specification», RFC 793 , DARPA, September 1981.
- Berkeley sockets — URL: https://en.wikipedia.org/wiki/Berkeley_sockets
- OpenSSL Cryptography and SSL/TLS toolkit — URL: https://www.openssl.org
- SSL/TLS cryptographic protocols — URL: https://en.wikipedia.org/wiki/Transport_Layer_Security