- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libressl miniupnpc ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew outdated boost || brew upgrade boost ; fi
script:
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "cmake" ]]; then cd build && cmake -DCMAKE_BUILD_TYPE=Release -DWITH_UPNP=${UPNP} && make ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "make" ]]; then make USE_UPNP=${MAKE_UPNP} ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then make HOMEBREW=1 USE_UPNP=${MAKE_UPNP} ; fi
* Alpine, ArchLinux, openSUSE, Gentoo, Debian, Ubuntu, etc.
* Alpine, ArchLinux, openSUSE, Gentoo, Debian, Ubuntu, etc.
* Windows - [![Build on Windows](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml/badge.svg)](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml)
* Windows - [![Build on Windows](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml/badge.svg)](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml)
* Mac OS X - [![Build on OSX](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml/badge.svg)](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml)
* Mac OS X - [![Build on OSX](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml/badge.svg)](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml)
All the ports ( -p HOSTPORT:DOCKERPORT ) is optional. However the command above enable all features (Webconsole, HTTP Proxy, BOB, SAM, i2cp, etc)
The volume ( -v HOSTDIR:DOCKERDIR ) is also optional, but if you don't use it, your config, routerid and private keys will die along with the container.
**Options**
Options are set via docker environment variables. This can be set at run with -e parameters.
* **ENABLE_IPV6** - Enable IPv6 support. Any value can be used - it triggers as long as it's not empty.
* **LOGLEVEL** - Set the loglevel.
* **ENABLE_AUTH** - Enable auth for the webconsole. Username and password needs to be set manually in i2pd.conf cause security reasons.
**Logging**
Logging happens to STDOUT as the best practise with docker containers, since infrastructure systems like kubernetes with ELK integration can automatically forward the log to say, kibana or greylog without manual setup. :)
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.",
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.","<b>Примечание:</b> полученная строка может быть использована только для регистрации доменов второго уровня (example.i2p). Для регистрации поддоменов используйте i2pd-tools."},
"<b>Примечание:</b> полученная строка может быть использована только для регистрации доменов второго уровня. Для регистрации поддоменов используйте i2pd-tools."},
{"Address","Адрес"},
{"Address","Адрес"},
{"Type","Тип"},
{"Type","Тип"},
{"EncType","ТипШифр"},
{"EncType","ТипШифр"},
{"Inbound tunnels","Входящие туннели"},
{"Inbound tunnels","Входящие туннели"},
{"ms","мс"},
{"Outbound tunnels","Исходящие туннели"},
{"Outbound tunnels","Исходящие туннели"},
{"ms","мс"},// milliseconds
{"Tags","Теги"},
{"Tags","Теги"},
{"Incoming","Входящие"},
{"Incoming","Входящие"},
{"Outgoing","Исходящие"},
{"Outgoing","Исходящие"},
@ -152,14 +106,11 @@ namespace russian // language
{"Incoming Tags","Входящие Теги"},
{"Incoming Tags","Входящие Теги"},
{"Tags sessions","Сессии Тегов"},
{"Tags sessions","Сессии Тегов"},
{"Status","Статус"},
{"Status","Статус"},
// ShowLocalDestination
{"Local Destination","Локальное назначение"},
{"Local Destination","Локальное назначение"},
{"Streams","Стримы"},
{"Streams","Стримы"},
{"Close stream","Закрыть стрим"},
{"Close stream","Закрыть стрим"},
// ShowI2CPLocalDestination
{"I2CP session not found","I2CP сессия не найдена"},
{"I2CP session not found","I2CP сессия не найдена"},
{"I2CP is not enabled","I2CP не включен"},
{"I2CP is not enabled","I2CP не включен"},
// ShowLeasesSets
{"Invalid","Некорректный"},
{"Invalid","Некорректный"},
{"Store type","Тип хранилища"},
{"Store type","Тип хранилища"},
{"Expires","Истекает"},
{"Expires","Истекает"},
@ -168,51 +119,37 @@ namespace russian // language
{"<b>Note:</b> any action done here are not persistent and not changes your config files.",
{"<b>Note:</b> any action done here are not persistent and not changes your config files.","<b>Примечание:</b> любое действие произведенное здесь не является постоянным и не изменяет ваши конфигурационные файлы."},
"<b>Примечание:</b> любое действие произведенное здесь не является постоянным и не изменяет ваши конфигурационные файлы."},
{"cannot resolve upstream proxy","не удается определить вышестоящий прокси"},
{"hostname too long","имя хоста слишком длинное"},
{"cannot connect to upstream socks proxy","не удается подключиться к вышестоящему SOCKS прокси"},
{"Cannot negotiate with socks proxy","Не удается договориться с вышестоящим SOCKS прокси"},
{"CONNECT error","Ошибка CONNECT запроса"},
{"Failed to Connect","Не удалось подключиться"},
{"socks proxy error","ошибка SOCKS прокси"},
{"failed to send request to upstream","не удалось отправить запрос вышестоящему прокси"},
{"No Reply From socks proxy","Нет ответа от SOCKS прокси сервера"},
{"cannot connect","не удалось подключиться"},
{"http out proxy not implemented","поддержка внешнего HTTP прокси сервера не реализована"},
{"cannot connect to upstream http proxy","не удалось подключиться к вышестоящему HTTP прокси серверу"},
{"Host is down","Узел недоступен"},
{"Can't create connection to requested host, it may be down. Please try again later.","Не удалось установить соединение к запрошенному узлу, возможно он не в сети. Попробуйте повторить запрос позже."},
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.",
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.","<b>Примітка:</b> отриманий рядок може бути використаний тільки для реєстрації доменів другого рівня (example.i2p). Для реєстрації піддоменів використовуйте i2pd-tools."},
"<b>Примітка:</b> отриманий рядок може бути використаний тільки для реєстрації доменів другого рівня. Для реєстрації піддоменів використовуйте i2pd-tools."},
{"Address","Адреса"},
{"Address","Адреса"},
{"Type","Тип"},
{"Type","Тип"},
{"EncType","ТипШифр"},
{"EncType","ТипШифр"},
{"Inbound tunnels","Вхідні тунелі"},
{"Inbound tunnels","Вхідні тунелі"},
{"ms","мс"},
{"Outbound tunnels","Вихідні тунелі"},
{"Outbound tunnels","Вихідні тунелі"},
{"ms","мс"},// milliseconds
{"Tags","Теги"},
{"Tags","Теги"},
{"Incoming","Вхідні"},
{"Incoming","Вхідні"},
{"Outgoing","Вихідні"},
{"Outgoing","Вихідні"},
{"Destination","Призначення"},
{"Destination","Призначення"},
{"Amount","Кількість"},
{"Amount","Кількість"},
{"Incoming Tags","Вхідні Теги"},
{"Incoming Tags","Вхідні Теги"},
{"Tags sessions","Сесії тегів"},
{"Tags sessions","Сесії Тегів"},
{"Status","Статус"},
{"Status","Статус"},
// ShowLocalDestination
{"Local Destination","Локальні Призначення"},
{"Local Destination","Локальні Призначення"},
{"Streams","Потоки"},
{"Streams","Потоки"},
{"Close stream","Закрити потік"},
{"Close stream","Закрити потік"},
// ShowI2CPLocalDestination
{"I2CP session not found","I2CP сесія не знайдена"},
{"I2CP session not found","I2CP сесія не знайдена"},
{"I2CP is not enabled","I2CP не увікнуто"},
{"I2CP is not enabled","I2CP не увікнуто"},
// ShowLeasesSets
{"Invalid","Некоректний"},
{"Invalid","Некоректний"},
{"Store type","Тип сховища"},
{"Store type","Тип сховища"},
{"Expires","Завершується"},
{"Expires","Завершується"},
@ -167,51 +119,36 @@ namespace ukrainian // language
{"<b>Note:</b> any action done here are not persistent and not changes your config files.",
{"<b>Note:</b> any action done here are not persistent and not changes your config files.","<b>Примітка:</b> будь-яка зроблена тут дія не є постійною та не змінює ваші конфігураційні файли."},
"<b>Примітка:</b> будь-яка зроблена тут дія не є постійною та не змінює ваші конфігураційні файли."},
{"no transit tunnels currently built","немає побудованих транзитних тунелів"},
{"no transit tunnels currently built","немає побудованих транзитних тунелів"},
// ShowSAMSessions/ShowSAMSession
{"SAM disabled","SAM вимкнуто"},
{"SAM disabled","SAM вимкнуто"},
{"SAM session not found","SAM сесія не знайдена"},
{"no sessions currently running","немає запущених сесій"},
{"no sessions currently running","немає запущених сесій"},
{"SAM session not found","SAM сесія не знайдена"},
{"SAM Session","SAM сесія"},
{"SAM Session","SAM сесія"},
// ShowI2PTunnels
{"Server Tunnels","Серверні Тунелі"},
{"Server Tunnels","Серверні Тунелі"},
{"Client Forwards","Клієнтські Переспрямування"},
{"Client Forwards","Клієнтські Переспрямування"},
{"Server Forwards","Серверні Переспрямування"},
{"Server Forwards","Серверні Переспрямування"},
// HandlePage
{"Unknown page","Невідома сторінка"},
{"Unknown page","Невідома сторінка"},
// HandleCommand, ShowError
{"Invalid token","Невірний токен"},
{"Invalid token","Невірний токен"},
{"SUCCESS","УСПІШНО"},
{"SUCCESS","УСПІШНО"},
{"ERROR","ПОМИЛКА"},
{"Unknown command","Невідома команда"},
{"Command accepted","Команда прийнята"},
{"Back to commands list","Повернутися до списку команд"},
{"You will be redirected in 5 seconds","Ви будете переадресовані через 5 секунд"},
// HTTP_COMMAND_KILLSTREAM
{"Stream closed","Потік зачинений"},
{"Stream closed","Потік зачинений"},
{"Stream not found or already was closed","Потік не знайдений або вже зачинений"},
{"Stream not found or already was closed","Потік не знайдений або вже зачинений"},
{"Destination not found","Точка призначення не знайдена"},
{"Destination not found","Точка призначення не знайдена"},
{"StreamID can't be null","Ідентифікатор потоку не може бути порожнім"},
{"StreamID can't be null","Ідентифікатор потоку не може бути порожнім"},
{"Return to destination page","Повернутися на сторінку точки призначення"},
{"Return to destination page","Повернутися на сторінку точки призначення"},
{"You will be redirected back in 5 seconds","Ви будете переадресовані назад через 5 секунд"},
{"You will be redirected back in 5 seconds","Ви будете переадресовані назад через 5 секунд"},
// HTTP_COMMAND_LIMITTRANSIT
{"Transit tunnels count must not exceed 65535","Кількість транзитних тунелів не повинна перевищувати 65535"},
{"Transit tunnels count must not exceed 65535","Кількість транзитних тунелів не повинна перевищувати 65535"},
// HTTP_COMMAND_GET_REG_STRING
{"Back to commands list","Повернутися до списку команд"},
{"Register at reg.i2p","Зареєструвати на reg.i2p"},
{"Register at reg.i2p","Зареєструвати на reg.i2p"},
{"Description","Опис"},
{"Description","Опис"},
{"A bit information about service on domain","Трохи інформації про сервіс на домені"},
{"A bit information about service on domain","Трохи інформації про сервіс на домені"},
@ -219,12 +156,51 @@ namespace ukrainian // language
{"Domain can't end with .b32.i2p","Домен не може закінчуватися на .b32.i2p"},
{"Domain can't end with .b32.i2p","Домен не може закінчуватися на .b32.i2p"},
{"Domain must end with .i2p","Домен повинен закінчуватися на .i2p"},
{"Domain must end with .i2p","Домен повинен закінчуватися на .i2p"},
{"Such destination is not found","Така точка призначення не знайдена"},
{"Such destination is not found","Така точка призначення не знайдена"},
{"Unknown command","Невідома команда"},
{"Command accepted","Команда прийнята"},
{"You will be redirected in 5 seconds","Ви будете переадресовані через 5 секунд"},
{"Proxy error","Помилка проксі"},
{"Proxy info","Інформація проксі"},
{"Proxy error: Host not found","Помилка проксі: Адреса не знайдена"},
{"Remote host not found in router's addressbook","Віддалена адреса не знайдена в адресній книзі маршрутизатора"},
{"You may try to find this host on jump services below","Ви можете спробувати знайти дану адресу на джамп сервісах нижче"},
{"Invalid request","Некоректний запит"},
{"Proxy unable to parse your request","Проксі не може розібрати ваш запит"},
{"addresshelper is not supported","addresshelper не підтримується"},
{"Host","Адреса"},
{"added to router's addressbook from helper","доданий в адресну книгу маршрутизатора через хелпер"},
{"Click","Натисніть"},
{"here","тут"},
{"to proceed","щоб продовжити"},
{"Addresshelper found","Знайдено addresshelper"},
{"already in router's addressbook","вже в адресній книзі маршрутизатора"},
{"to update record","щоб оновити запис"},
{"Invalid Request","Некоректний Запит"},
{"invalid request uri","некоректний URI запиту"},
{"Can't detect destination host from request","Не вдалось визначити адресу призначення з запиту"},
{"Outproxy failure","Помилка зовнішнього проксі"},
{"bad outproxy settings","некоректні налаштування зовнішнього проксі"},
{"not inside I2P network, but outproxy is not enabled","не в I2P мережі, але зовнішній проксі не включений"},
{"unknown outproxy url","невідомий URL зовнішнього проксі"},
{"cannot resolve upstream proxy","не вдається визначити висхідний проксі"},
{"hostname too long","ім'я вузла надто довге"},
{"cannot connect to upstream socks proxy","не вдається підключитися до висхідного SOCKS проксі"},
{"Cannot negotiate with socks proxy","Не вдається домовитися з висхідним SOCKS проксі"},
{"CONNECT error","Помилка CONNECT запиту"},
{"Failed to Connect","Не вдалося підключитися"},
{"socks proxy error","помилка SOCKS проксі"},
{"failed to send request to upstream","не вдалося відправити запит висхідному проксі"},
{"No Reply From socks proxy","Немає відповіді від SOCKS проксі сервера"},
{"cannot connect","не вдалося підключитися"},
{"http out proxy not implemented","підтримка зовнішнього HTTP проксі сервера не реалізована"},
{"cannot connect to upstream http proxy","не вдалося підключитися до висхідного HTTP проксі сервера"},
{"Host is down","Вузол недоступний"},
{"Can't create connection to requested host, it may be down. Please try again later.","Не вдалося встановити з'єднання до запитаного вузла, можливо він не в мережі. Спробуйте повторити запит пізніше."},
("conf",value<std::string>()->default_value(""),"Path to main i2pd config file (default: try ~/.i2pd/i2pd.conf or /var/lib/i2pd/i2pd.conf)")
("conf",value<std::string>()->default_value(""),"Path to main i2pd config file (default: try ~/.i2pd/i2pd.conf or /var/lib/i2pd/i2pd.conf)")
("tunconf",value<std::string>()->default_value(""),"Path to config with tunnels list and options (default: try ~/.i2pd/tunnels.conf or /var/lib/i2pd/tunnels.conf)")
("tunconf",value<std::string>()->default_value(""),"Path to config with tunnels list and options (default: try ~/.i2pd/tunnels.conf or /var/lib/i2pd/tunnels.conf)")
("tunnelsdir",value<std::string>()->default_value(""),"Path to extra tunnels' configs folder (default: ~/.i2pd/tunnels.d or /var/lib/i2pd/tunnels.d")
("tunnelsdir",value<std::string>()->default_value(""),"Path to extra tunnels' configs folder (default: ~/.i2pd/tunnels.d or /var/lib/i2pd/tunnels.d")
("certsdir",value<std::string>()->default_value(""),"Path to certificates used for verifying .su3, families (default: ~/.i2pd/certificates or /var/lib/i2pd/certificates")
("pidfile",value<std::string>()->default_value(""),"Path to pidfile (default: ~/i2pd/i2pd.pid or /var/lib/i2pd/i2pd.pid)")
("pidfile",value<std::string>()->default_value(""),"Path to pidfile (default: ~/i2pd/i2pd.pid or /var/lib/i2pd/i2pd.pid)")
("log",value<std::string>()->default_value(""),"Logs destination: stdout, file, syslog (stdout if not set)")
("log",value<std::string>()->default_value(""),"Logs destination: stdout, file, syslog (stdout if not set)")
("logfile",value<std::string>()->default_value(""),"Path to logfile (stdout if not set, autodetect if daemon)")
("logfile",value<std::string>()->default_value(""),"Path to logfile (stdout if not set, autodetect if daemon)")
LogPrint(eLogError,"TunnelMessage: Fragment ",m.nextFragmentNum," of message ",msgID,"exceeds max I2NP message size, message dropped");
LogPrint(eLogError,"TunnelMessage: Fragment ",m_CurrentMessage.nextFragmentNum," of message ",m_CurrentMsgID,"exceeds max I2NP message size, message dropped");
m_IncompleteMessages.erase(it);
m_CurrentMsgID=0;m_CurrentMessage.data=nullptr;
}
}
}
}
else
voidTunnelEndpoint::AddIncompleteCurrentMessage()
{
{
LogPrint(eLogWarning,"TunnelMessage: Unexpected fragment ",(int)m.nextFragmentNum," instead ",(int)msg.nextFragmentNum," of message ",msgID,", saved");