💾 Archived View for any-key.press › vostok › reports › 0.0.1.gmi captured on 2023-11-04 at 11:30:47. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-09-08)

➡️ Next capture (2024-05-10)

-=-=-=-=-=-=-

vostok: простой сервер Gemini на C++11

Столкнувшись в очередной раз с протоколом Gemini я перед сном решил почитать его спецификацию.

Project Gemini (Speculative specification)

В целом мне очень понравилось то, что автор называет протокол простым и на самом деле протокол оказался несложным. Хотя и тут стоит отметить, что использование прослойки TLS в качестве транспортного уровня делает эту самую простоту весьма условной. В противовес этому, например, протокол Spartan работает поверх обычного TCP. Наверное, если бы я сейчас сел писать реализацию заново, то выбрал бы spartan. А может быть и до него дойдут когда-нибудь руки.

The Spartan Protocol Homepage

Что-то в спецификации протокола меня зацепило и я написал свою реализацию сервера Gemini на C++11 - vostok (Восток). Название отсылает к имени советского космического корабля "Восток-1", на котором Юрий Алексеевич Гагарин совершил первый полёт человека в космос.

Сборка проекта

Итак, собственная реализация сервера Gemini. Язык выбран C++, точнее С++11. Причина выбора языка и его редакции - моя личная "вкусовщина". Целевая платформа: Unix-like, без привязки к какой-то конкретной реализации. Сам собираю-запускаю-проверяю на двух платформах:

Кстати: g++ не входит в базовую систему Alpine Linux, поэтому нужно установить его из одноименного пакета.

Единственная внешняя зависимость - libtls, так как я сторонник не городить свои "велосипеды" в области криптографии. libtls это библиотека из состава LibreSSL:

LibreSSL

На OpenBSD, соответственно, libtls есть "из коробки". А, например, в Alpine Linux требуется установить пакет libressl-dev.

Для запуска серверу нужен ключ и сертификат, которые можно сгенерировать в под-директории cert/ командой openssl:

$ mkdir cert
$ openssl req -newkey rsa:4096 -nodes -keyout cert/server.key -x509 -days 36500 -out cert/server.crt

После этого всё готово к тому, что бы собрать-запустить сервер командой "make run_server". Если при сборке и запуске не произойдёт ошибок, то на экране появится строка, обозначающая, что сервер готов принимать входящие запросы:

$ make run_server
make -C vostok
c++ -Wall -Wextra -std=c++11 -I../shared transport.cc error.cc gemini.cc args.cc parse_url.cc vostok.cc -ltls -o vostok
./vostok/vostok -c cert/server.crt -k cert/server.key -f ./
🚀 Vostok server listening...

Возможности сервера

Первая версия сервера vostok обладает весьма скромными возможностями. Это сервер, который отдает содержимое статических файлов с файловой системы. Все файлы отдаются с пустой строкой META, что подразумевает содержимое в формате "text/gemini; charset=utf-8".

Запускаемый исполняемый файл принимает следующие параметры командной строки:

На моем OpenBSD сервере я оформил демон запуска следующим образом:

# cat /etc/rc.d/vostok                                                                                                                          
#!/bin/ksh

daemon_args="-a 5.23.49.151 -k /var/vostok/cert/server.key -c /var/vostok/cert/server.crt -f /var/vostok/static"
daemon_user="_vostok"
daemon="/home/_vostok/src/vostok/vostok ${daemon_args}"

. /etc/rc.d/rc.subr

pexp="${daemon}.*"
rc_reload=NO
rc_bg=YES

rc_cmd $1

Gemini клиент

Изначально я планировал проект vostok, как пару: сервер статики и собственный клиент (простой браузер). Но потом я понял, что лично для меня утилиты openssl в паре с less вполне хватает, что бы смотреть Gemini страницы. Что бы отобразить Gemini содержимое я пользуюсь примерно такой командной строкой:

openssl s_client -crlf -quiet -connect -no_ssl3 -no_tls1 -no_tls1_1 -connect vostok.any-key.press:1965 <<< "gemini://vostok.any-key.press/reports/0.0.1.gmi" | less

Если вам хочется более функциональный браузер, то я рекомендую присмотреться к консольному amfora.

https://github.com/makew0rld/amfora

Браузеры для Gemini с графическим пользовательским интерфейсом я никогда не пробовал, поэтому посоветовать ничего не могу.

Планы на будущее

Для начала я хочу немного привести код в порядок:

Затем немного нарастить функционал самого сервера:

Исходный код

Git репозиторий с исходным кодом сервера (C++11):

ssh://anonymous@got.any-key.press/vostok 

WEB интерфейс git репозитория с исходным кодом

Обратная связь

Ваши патчи, вопросы и предложения присылайте на электронную почту

vostok@to.any-key.press

Если вы не знакомы с практикой отсылки git-патчей через элетронную почту, то рекомендую к ознакомлению ресурс:

Learn to use email with git

Следующая запись блога разработки