commit 95e6ac377e511188923353ffb25f1d664c3c1745 Author: Bastian Doetsch Date: Sun Mar 6 15:55:58 2022 +0100 init diff --git a/.dcignore b/.dcignore new file mode 100644 index 0000000..9dc099e --- /dev/null +++ b/.dcignore @@ -0,0 +1,1547 @@ +# Write glob rules for ignored files. +# Check syntax on https://deepcode.freshdesk.com/support/solutions/articles/60000531055-how-can-i-ignore-files-or-directories- +# Check examples on https://github.com/github/gitignore + +# Hidden directories +.*/ + +# FuelPHP +/fuel/vendor +/docs/ +/fuel/app/logs/*/*/* +/fuel/app/cache/*/* + +# Godot +data_*/ + +# Lilypond +*~ + +# Nim +nimcache/ +nimblecache/ +htmldocs/ + +# Android +bin/ +gen/ +out/ +build/ +proguard/ +captures/ +freeline/ +fastlane/screenshots +fastlane/test_output +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ + +# UnrealEngine +Binaries/* +Plugins/*/Binaries/* +Build/* +!Build/*/ +Build/*/** +Saved/* +Intermediate/* +Plugins/*/Intermediate/* +DerivedDataCache/* + +# Zephir +ext/build/ +ext/modules/ +ext/Makefile* +ext/config* +ext/autom4te* +ext/install-sh +ext/missing +ext/mkinstalldirs +ext/libtool + +# Typo3 +/fileadmin/user_upload/ +/fileadmin/_temp_/ +/fileadmin/_processed_/ +/uploads/ +/typo3conf/temp_CACHED* +/typo3conf/ENABLE_INSTALL_TOOL +/FIRST_INSTALL +/typo3 +/Packages +/typo3temp/ + +# Actionscript +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# WordPress +!wp-content/ +wp-content/* +!wp-content/mu-plugins/ +!wp-content/plugins/ +!wp-content/themes/ +wp-content/themes/twenty*/ +node_modules/ + +# Lithium +libraries/* +resources/tmp/* + +# Python +__pycache__/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +MANIFEST +htmlcov/ +cover/ +instance/ +docs/_build/ +target/ +profile_default/ +__pypackages__/ +celerybeat-schedule +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +/site +cython_debug/ + +# VVVV +bin/ + +# CodeIgniter +*/config/development +*/cache/* +application/logs/* +/vendor/ + +# AppEngine +appengine-generated/ + +# Objective-C +xcuserdata/ +build/ +DerivedData/ +Carthage/Build/ +fastlane/test_output +iOSInjectionProject/ + +# GWT +war/gwt_bree/ +gwt-unitCache/ +war/WEB-INF/deploy/ +war/WEB-INF/classes/ +www-test/ + +# Delphi +__history/ +__recovery/ +modules/ + +# ROS +devel/ +logs/ +build/ +bin/ +lib/ +msg_gen/ +srv_gen/ +build_isolated/ +devel_isolated/ +/cfg/cpp/ +qtcreator-* +/planning/cfg +/planning/docs +*~ +CATKIN_IGNORE + +# Stella +obj/ + +# Jekyll +_site/ + +# MetaProgrammingSystem +classes_gen +source_gen +test_gen + +# JENKINS_HOME +!/jobs +jobs/** +!jobs/**/ +builds +indexing +jobs/**/*workspace + +# Leiningen +/lib/ +/classes/ +/target/ +/checkouts/ + +# Laravel +/vendor/ +node_modules/ +app/storage/ +public/storage +public/hot +public_html/storage +public_html/hot + +# R +/*.Rcheck/ +*_cache/ +/cache/ +docs/ +po/*~ + +# Processing +applet +out + +# GitBook +node_modules +_book + +# LemonStand +/config/* +/controllers/* +/init/* +/logs/* +/phproad/* +/temp/* +/uploaded/* +/installer_files/* +/modules/backend/* +/modules/blog/* +/modules/cms/* +/modules/core/* +/modules/session/* +/modules/shop/* +/modules/system/* +/modules/users/* + +# ArchLinuxPackages +pkg/ + +# Swift +xcuserdata/ +build/ +DerivedData/ +Carthage/Build/ +Dependencies/ +fastlane/test_output +iOSInjectionProject/ + +# Packer +packer_cache/ + +# Elixir +/_build +/cover +/deps +/doc + +# Phalcon +/cache/ +/config/development/ + +# Unity +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ +/[Mm]emoryCaptures/ +/[Aa]ssets/Plugins/Editor/JetBrains* +ExportedObj/ +/[Aa]ssets/[Ss]treamingAssets/aa/* + +# Scrivener +*/QuickLook/ + +# Kohana +application/cache/* +application/logs/* + +# Prestashop +/cache/* +!/cache/push/activity +!/cache/push/trends +/download/* +/img/* +!/img/jquery-ui +!/img/scenes +/upload/* +/vendor/* +/docs/phpdoc-sf/ +/admin-dev/autoupgrade/* +/admin-dev/backups/* +/admin-dev/import/* +/admin-dev/export/* +themes/*/cache/* +config/xml/* +config/themes/* +modules/* +override/* +themes/*/ +!themes/classic +!themes/_core +!themes/_libraries +bower_components/ +node_modules/ +php-cs-fixer +translations/* +mails/* +!mails/themes/ +!mails/_partials/ +themes/default-bootstrap/lang/* +themes/default-bootstrap/mails/* +!themes/default-bootstrap/mails/en/ +themes/default-bootstrap/modules/*/mails/* +!themes/default-bootstrap/modules/*/mails/en +/bin/ +/app/Resources/translations/* +!/app/Resources/translations/default +/build/ +/var/* +!/var/cache +/var/cache/* +!/var/logs +/var/logs/* +!/var/sessions +/var/sessions/* +/vendor/ +/web/bundles/ + +# ExtJs +build/ +ext/ + +# CMake +CMakeFiles +CMakeScripts +Testing +Makefile +_deps + +# Umbraco +**/App_Data/Logs/ +**/App_Data/[Pp]review/ +**/App_Data/TEMP/ +**/App_Data/NuGetBackup/ +!**/App_Data/[Pp]ackages/* +!**/[Uu]mbraco/[Dd]eveloper/[Pp]ackages/* +!**/[Uu]mbraco/[Vv]iews/[Pp]ackages/* +**/App_Data/cache/ + +# CakePHP +/vendor/* +/tmp/cache/models/* +!/tmp/cache/models/empty +/tmp/cache/persistent/* +!/tmp/cache/persistent/empty +/tmp/cache/views/* +!/tmp/cache/views/empty +/tmp/sessions/* +!/tmp/sessions/empty +/tmp/tests/* +!/tmp/tests/empty +/logs/* +!/logs/empty +/app/tmp/* +/vendors/* + +# Java +hs_err_pid* + +# Symfony +/app/cache/* +/app/logs/* +/app/spool/* +/var/cache/* +/var/logs/* +/var/sessions/* +/var/log/* +/bin/* +!bin/console +!bin/symfony_requirements +/vendor/ +/web/bundles/ +/web/uploads/ +/build/ +**/Entity/*~ + +# Composer +/vendor/ + +# SymphonyCMS +manifest/cache/ +manifest/logs/ +manifest/tmp/ +symphony/ +workspace/uploads/ + +# JBoss6 +/server/all/data +/server/all/log +/server/all/tmp +/server/all/work +/server/default/data +/server/default/log +/server/default/tmp +/server/default/work +/server/minimal/data +/server/minimal/log +/server/minimal/tmp +/server/minimal/work +/server/jbossweb-standalone/data +/server/jbossweb-standalone/log +/server/jbossweb-standalone/tmp +/server/jbossweb-standalone/work +/server/standard/data +/server/standard/log +/server/standard/tmp +/server/standard/work + +# JBoss4 +/server/all/data +/server/all/log +/server/all/tmp +/server/all/work +/server/default/data +/server/default/log +/server/default/tmp +/server/default/work +/server/minimal/data +/server/minimal/log +/server/minimal/tmp +/server/minimal/work + +# Red +quick-test/runnable/ +system/tests/source/units/auto-tests/ +tests/source/units/auto-tests/ + +# Snap +parts/ +prime/ +stage/ + +# Splunk +local + +# Hugo +/public/ +/resources/_gen/ + +# Bazel +/bazel-* + +# Nikola +cache/ +output/ + +# JupyterNotebooks +profile_default/ + +# Puppet +pkg/* +spec/fixtures/* +coverage/* +vendor/* + +# Racket +compiled/ + +# Phoenix +/tmp +/node_modules +/assets/node_modules +/priv/static/ +/installer/_build +/installer/tmp +/installer/doc +/installer/deps + +# Logtalk +lgt_tmp/ +logtalk_tester_logs/ +logtalk_doclet_logs/ + +# NWjs +locales/ +pnacl/ + +# Cordova +/platforms + +# Vue +docs/_book +test/ + +# Kentico +!CMS/CMSAdminControls/*/ +!CMS/CMSModules/System/*/ +!CMS/App_Data/CIRepository/** +CMS/App_Data/AzureCache +CMS/App_Data/AzureTemp +CMS/App_Data/CMSTemp +CMS/App_Data/Persistent +CMS/CMSSiteUtils/Export +CMS/CMSSiteUtils/Import +CMS/App_Data/CMSModules/SmartSearch/** +!CMS/App_Data/CMSModules/SmartSearch/*/ +!CMS/App_Data/CMSModules/SmartSearch/_StopWords/** +!CMS/App_Data/CMSModules/SmartSearch/_Synonyms/** +CMS/App_Data/DancingGoat +CMS/App_Data/Templates/CommunitySite +CMS/App_Data/Templates/CorporateSite +CMS/App_Data/Templates/DancingGoat +CMS/App_Data/Templates/EcommerceSite +CMS/App_Data/Templates/IntranetPortal +CMS/App_Data/Templates/PersonalSite +CMS/App_Themes/CommunitySite +CMS/App_Themes/CorporateSite +CMS/App_Themes/EcommerceSite +CMS/App_Themes/IntranetPortal* +CMS/App_Themes/PersonalSite +CMS/CMSTemplates/CorporateSite +CMS/CommunitySite +CMS/CorporateSite +CMS/DancingGoat +CMS/EcommerceSite +CMS/IntranetPortal +CMS/PersonalSite + +# InforCMS +[Mm]odel/[Dd]eployment +!Model/Portal/*/SupportFiles/[Bb]in/ +!Model/Portal/PortalTemplates/*/SupportFiles/[Bb]in + +# Xilinx +*_synth_* +*/*/bd/*/hdl +*/*/*/bd/*/hdl +*/*/bd/*/ip/*/*/ +*/*/*/bd/*/ip/*/*/ +hw_handoff +ipshared + +# Pimcore +/pimcore +/website/var/assets/* +/website/var/backup/* +/website/var/cache/* +/website/var/classes/Object* +!/website/var/classes/objectbricks +/website/var/config/Geo* +/website/var/config/object/* +/website/var/config/portal/* +/website/var/config/sqlreport/* +/website/var/email/* +/website/var/recyclebin/* +/website/var/search/* +/website/var/system/* +/website/var/tmp/* +/website/var/versions/asset/* +/website/var/versions/document/* +/website/var/versions/object/* +/website/var/user-image/* + +# Magento2 +/sitemap +/pub/sitemap +/app/config_sandbox +/app/code/Magento/TestModule* +/pub/media/attribute/* +/pub/media/analytics/* +/pub/media/catalog/* +/pub/media/customer/* +/pub/media/downloadable/* +/pub/media/favicon/* +/pub/media/import/* +/pub/media/logo/* +/pub/media/theme/* +/pub/media/theme_customization/* +/pub/media/wysiwyg/* +/pub/media/tmp/* +/pub/media/captcha/* +/pub/static/* +/var/* +/vendor/* +/generated/* + +# Bitrix +/bitrix/* +!/bitrix/templates +!/bitrix/components +/bitrix/components/bitrix +!/bitrix/gadgets +/bitrix/gadgets/bitrix +!/bitrix/php_interface/ +/upload/ + +# Drupal7 +files/ +sites/*/files +sites/*/private +sites/*/translations +/includes +/misc +/modules +/profiles +/scripts +/themes + +# CodeSniffer +/wpcs/* + +# Jigsaw +build_* + +# Magento1 +/media/* +!/media/customer +/media/customer/* +!/media/dhl +/media/dhl/* +!/media/downloadable +/media/downloadable/* +!/media/xmlconnect +/media/xmlconnect/* +!/media/xmlconnect/custom +/media/xmlconnect/custom/* +!/media/xmlconnect/original +/media/xmlconnect/original/* +!/media/xmlconnect/system +/media/xmlconnect/system/* +/var/* +!/var/package +/var/package/* + +# ThinkPHP +/Application/Runtime/ + +# AtmelStudio +[Dd]ebug/ +[Rr]elease/ + +# IAR_EWARM +EWARM/**/Obj +EWARM/**/List +EWARM/**/Exe +EWARM/settings + +# esp-idf +build/ +sdkconfig + +# Concrete5 +error_log +files/cache/* +files/tmp/* +/application/files/* +/updates/* + +# Drupal +/sites/*/files +/sites/*/public +/sites/*/private +/sites/*/files-public +/sites/*/files-private +/sites/*/translations +/sites/*/tmp +/sites/*/cache +/sites/simpletest +/core +/vendor + +# Mercury +Mercury/ + +# Joomla +/administrator/cache/* +/administrator/components/com_actionlogs/* +/administrator/components/com_admin/* +/administrator/components/com_ajax/* +/administrator/components/com_associations/* +/administrator/components/com_banners/* +/administrator/components/com_cache/* +/administrator/components/com_categories/* +/administrator/components/com_checkin/* +/administrator/components/com_config/* +/administrator/components/com_contact/* +/administrator/components/com_content/* +/administrator/components/com_contenthistory/* +/administrator/components/com_cpanel/* +/administrator/components/com_fields/* +/administrator/components/com_finder/* +/administrator/components/com_installer/* +/administrator/components/com_joomlaupdate/* +/administrator/components/com_languages/* +/administrator/components/com_login/* +/administrator/components/com_media/* +/administrator/components/com_menus/* +/administrator/components/com_messages/* +/administrator/components/com_modules/* +/administrator/components/com_newsfeeds/* +/administrator/components/com_plugins/* +/administrator/components/com_postinstall/* +/administrator/components/com_privacy/* +/administrator/components/com_redirect/* +/administrator/components/com_search/* +/administrator/components/com_tags/* +/administrator/components/com_templates/* +/administrator/components/com_users/* +/administrator/help/* +/administrator/includes/* +/administrator/language/overrides/* +/administrator/logs/* +/administrator/modules/mod_custom/* +/administrator/modules/mod_feed/* +/administrator/modules/mod_latest/* +/administrator/modules/mod_latestactions/* +/administrator/modules/mod_logged/* +/administrator/modules/mod_login/* +/administrator/modules/mod_menu/* +/administrator/modules/mod_multilangstatus/* +/administrator/modules/mod_online/* +/administrator/modules/mod_popular/* +/administrator/modules/mod_privacy_dashboard/* +/administrator/modules/mod_quickicon/* +/administrator/modules/mod_sampledata/* +/administrator/modules/mod_stats_admin/* +/administrator/modules/mod_status/* +/administrator/modules/mod_submenu/* +/administrator/modules/mod_title/* +/administrator/modules/mod_toolbar/* +/administrator/modules/mod_unread/* +/administrator/modules/mod_version/* +/administrator/templates/hathor/* +/administrator/templates/isis/* +/administrator/templates/system/* +/bin/* +/cache/* +/cli/* +/components/com_ajax/* +/components/com_banners/* +/components/com_config/* +/components/com_contact/* +/components/com_content/* +/components/com_contenthistory/* +/components/com_fields/* +/components/com_finder/* +/components/com_mailto/* +/components/com_media/* +/components/com_menus/* +/components/com_modules/* +/components/com_newsfeeds/* +/components/com_privacy/* +/components/com_search/* +/components/com_tags/* +/components/com_users/* +/components/com_wrapper/* +/images/banners/* +/images/headers/* +/images/sampledata/* +/images/joomla* +/includes/* +/installation/* +/language/overrides/* +/layouts/joomla/* +/layouts/libraries/* +/layouts/plugins/* +/libraries/cms/* +/libraries/fof/* +/libraries/idna_convert/* +/libraries/joomla/* +/libraries/legacy/* +/libraries/php-encryption/* +/libraries/phpass/* +/libraries/phpmailer/* +/libraries/phputf8/* +/libraries/simplepie/* +/libraries/vendor/* +/media/cms/* +/media/com_associations/* +/media/com_contact/* +/media/com_content/* +/media/com_contenthistory/* +/media/com_fields/* +/media/com_finder/* +/media/com_joomlaupdate/* +/media/com_menus/* +/media/com_modules/* +/media/com_wrapper/* +/media/contacts/* +/media/editors/* +/media/jui/* +/media/mailto/* +/media/media/* +/media/mod_languages/* +/media/mod_sampledata/* +/media/overrider/* +/media/plg_captcha_recaptcha/* +/media/plg_captcha_recaptcha_invisible/* +/media/plg_quickicon_extensionupdate/* +/media/plg_quickicon_joomlaupdate/* +/media/plg_quickicon_privacycheck/* +/media/plg_system_highlight/* +/media/plg_system_stats/* +/media/plg_twofactorauth_totp/* +/media/system/* +/modules/mod_articles_archive/* +/modules/mod_articles_categories/* +/modules/mod_articles_category/* +/modules/mod_articles_latest/* +/modules/mod_articles_news/* +/modules/mod_articles_popular/* +/modules/mod_banners/* +/modules/mod_breadcrumbs/* +/modules/mod_custom/* +/modules/mod_feed/* +/modules/mod_finder/* +/modules/mod_footer/* +/modules/mod_languages/* +/modules/mod_login/* +/modules/mod_menu/* +/modules/mod_random_image/* +/modules/mod_related_items/* +/modules/mod_search/* +/modules/mod_stats/* +/modules/mod_syndicate/* +/modules/mod_tags_popular/* +/modules/mod_tags_similar/* +/modules/mod_users_latest/* +/modules/mod_whosonline/* +/modules/mod_wrapper/* +/plugins/actionlog/joomla/* +/plugins/authentication/cookie/* +/plugins/authentication/example/* +/plugins/authentication/gmail/* +/plugins/authentication/joomla/* +/plugins/authentication/ldap/* +/plugins/captcha/recaptcha/* +/plugins/captcha/recaptcha_invisible/* +/plugins/content/confirmconsent/* +/plugins/content/contact/* +/plugins/content/emailcloak/* +/plugins/content/example/* +/plugins/content/fields/* +/plugins/content/finder/* +/plugins/content/geshi/* +/plugins/content/joomla/* +/plugins/content/loadmodule/* +/plugins/content/pagebreak/* +/plugins/content/pagenavigation/* +/plugins/content/vote/* +/plugins/editors/codemirror/* +/plugins/editors/none/* +/plugins/editors/tinymce/* +/plugins/editors-xtd/article/* +/plugins/editors-xtd/contact/* +/plugins/editors-xtd/fields/* +/plugins/editors-xtd/image/* +/plugins/editors-xtd/menu/* +/plugins/editors-xtd/module/* +/plugins/editors-xtd/pagebreak/* +/plugins/editors-xtd/readmore/* +/plugins/extension/example/* +/plugins/extension/joomla/* +/plugins/fields/calendar/* +/plugins/fields/checkboxes/* +/plugins/fields/color/* +/plugins/fields/editor/* +/plugins/fields/imagelist/* +/plugins/fields/integer/* +/plugins/fields/list/* +/plugins/fields/media/* +/plugins/fields/radio/* +/plugins/fields/repeatable/* +/plugins/fields/sql/* +/plugins/fields/text/* +/plugins/fields/textarea/* +/plugins/fields/url/* +/plugins/fields/user/* +/plugins/fields/usergrouplist/* +/plugins/finder/categories/* +/plugins/finder/contacts/* +/plugins/finder/content/* +/plugins/finder/newsfeeds/* +/plugins/finder/tags/* +/plugins/installer/folderinstaller/* +/plugins/installer/packageinstaller/* +/plugins/installer/urlinstaller/* +/plugins/privacy/actionlogs/* +/plugins/privacy/consents/* +/plugins/privacy/contact/* +/plugins/privacy/content/* +/plugins/privacy/message/* +/plugins/privacy/user/* +/plugins/quickicon/extensionupdate/* +/plugins/quickicon/joomlaupdate/* +/plugins/quickicon/phpversioncheck/* +/plugins/quickicon/privacycheck/* +/plugins/sampledata/blog/* +/plugins/search/categories/* +/plugins/search/contacts/* +/plugins/search/content/* +/plugins/search/newsfeeds/* +/plugins/search/tags/* +/plugins/search/weblinks/* +/plugins/system/actionlogs/* +/plugins/system/cache/* +/plugins/system/debug/* +/plugins/system/fields/* +/plugins/system/highlight/* +/plugins/system/languagecode/* +/plugins/system/languagefilter/* +/plugins/system/log/* +/plugins/system/logout/* +/plugins/system/logrotation/* +/plugins/system/p3p/* +/plugins/system/privacyconsent/* +/plugins/system/redirect/* +/plugins/system/remember/* +/plugins/system/sef/* +/plugins/system/sessiongc/* +/plugins/system/stats/* +/plugins/system/updatenotification/* +/plugins/twofactorauth/totp/* +/plugins/twofactorauth/yubikey/* +/plugins/user/contactcreator/* +/plugins/user/example/* +/plugins/user/joomla/* +/plugins/user/profile/* +/plugins/user/terms/* +/templates/beez3/* +/templates/protostar/* +/templates/system/* +/tmp/* + +# Yii +assets/* +protected/runtime/* +themes/classic/views/ + +# Rust +debug/ +target/ + +# Node +logs +pids +lib-cov +coverage +bower_components +build/Release +node_modules/ +jspm_packages/ +web_modules/ +out +dist + +# PureScript +bower_components +node_modules +output + +# JBoss +jboss/server/all/tmp/**/* +jboss/server/all/data/**/* +jboss/server/all/work/**/* +jboss/server/default/tmp/**/* +jboss/server/default/data/**/* +jboss/server/default/work/**/* +jboss/server/minimal/tmp/**/* +jboss/server/minimal/data/**/* +jboss/server/minimal/work/**/* + +# Grails +/web-app/WEB-INF/classes +/test/reports +/logs +/plugins +/web-app/plugins +/target + +# C +*.dSYM/ + +# ZendFramework +vendor/ +data/logs/ +data/cache/ +data/sessions/ +data/tmp/ +temp/ +data/DoctrineORMModule/Proxy/ +data/DoctrineORMModule/cache/ +demos/ +extras/documentation + +# PlayFramework +bin/ +/db +/lib/ +/logs/ +/modules +/project/project +/project/target +/target +tmp/ +test-result +/dist/ + +# SugarCRM +/cache/* +/custom/history/ +/custom/modulebuilder/ +/custom/working/ +/custom/modules/*/Ext/ +/custom/application/Ext/ +/upload/* +/upload_backup/ + +# ExpressionEngine +images/avatars/ +images/captchas/ +images/smileys/ +images/member_photos/ +images/signature_attachments/ +images/pm_attachments/ +sized/ +thumbs/ +_thumbs/ +*/expressionengine/cache/* + +# KiCad +*~ +_autosave-* +fp-info-cache + +# Plone +bin/ +build/ +develop-eggs/ +downloads/ +eggs/ +fake-eggs/ +parts/ +dist/ +var/ + +# D +docs/ + +# CFWheels +plugins/**/* +files +db/sql +javascripts/bundles +stylesheets/bundles + +# Yeoman +node_modules/ +bower_components/ +build/ +dist/ + +# Nanoc +output/ +tmp/nanoc/ + +# Erlang +rel/example_project +deps +_build/ +_checkouts/ + +# VisualStudio +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +Generated\ Files/ +[Tt]est[Rr]esult*/ +[Dd]ebugPS/ +[Rr]eleasePS/ +BenchmarkDotNet.Artifacts/ +artifacts/ +_Chutzpah* +ipch/ +$tf/ +_ReSharper*/ +_TeamCity* +_NCrunch_* +nCrunchTemp_* +AutoTest.Net/ +[Ee]xpress/ +DocProject/buildhelp/ +DocProject/Help/Html2 +DocProject/Help/html +publish/ +PublishScripts/ +**/[Pp]ackages/* +!**/[Pp]ackages/build/ +csx/ +ecf/ +rcf/ +AppPackages/ +BundleArtifacts/ +!?*.[Cc]ache/ +ClientBin/ +~$* +*~ +Generated_Code/ +_UpgradeReport_Files/ +Backup*/ +ServiceFabricBackup/ +FakesAssemblies/ +node_modules/ +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.Server/GeneratedArtifacts +_Pvt_Extensions +paket-files/ +__pycache__/ +OpenCover/ +ASALocalRun/ +healthchecksdb +MigrationBackup/ + +# Perl +!Build/ +cover_db/ +_build/ +Build +inc/ +/blib/ +/_eumm/ +/Makefile +/pm_to_blib + +# OCaml +_build/ +_opam/ + +# Agda +MAlonzo/** + +# Clojure +/lib/ +/classes/ +/target/ +/checkouts/ + +# OpenCart +download/ +image/data/ +image/cache/ +system/cache/ +system/logs/ +system/storage/ +vqmod/logs/* +vqmod/vqcache/* + +# Kotlin +hs_err_pid* + +# Julia +deps/downloads/ +deps/usr/ +docs/build/ +docs/site/ + +# Opa +_build +_tracks +opa-debug-js + +# Windows +$RECYCLE.BIN/ + +# MonoDevelop +test-results/ + +# JDeveloper +temp/ +classes/ +deploy/ +javadoc/ + +# CodeKit +/min + +# VirtualEnv +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts + +# Tags +TAGS +!TAGS/ +tags +!tags/ +GTAGS +GRTAGS +GPATH +GSYMS + +# Virtuoso +lvsRunDir/* +drcRunDir/* + +# PSoCCreator +Debug/ +Release/ +Export/ +*/codegentemp +*/Generated_Source + +# Calabash +rerun/ +reports/ +screenshots/ +test-servers/ +vendor + +# TextMate +tmtags + +# Lazarus +backup/ +lib/ +*.app/ + +# macOS +Icon + +Network Trash Folder +Temporary Items + +# EiffelStudio +EIFGENs + +# MATLAB +helpsearch*/ +slprj/ +sccprj/ +codegen/ +octave-workspace + +# FlexBuilder +bin/ +bin-debug/ +bin-release/ + +# Eclipse +bin/ +tmp/ + +# Vim +*~ +tags + +# SynopsysVCS +simv +simv.daidir/ +simv.db.dir/ +simv.vdb/ +urgReport/ +DVEfiles/ + +# Emacs +*~ +\#*\# +auto-save-list +tramp +*_archive +/eshell/history +/eshell/lastdir +/elpa/ +/auto/ +dist/ +/server/ + +# Momentics +x86/ +arm/ +arm-p/ + +# Linux +*~ + +# SublimeText +Package Control.cache/ +Package Control.ca-certs/ + +# CVS +/CVS/* +**/CVS/* + +# Dreamweaver +_notes +_compareTemp +configs/ + +# Xcode +xcuserdata/ +build/ +DerivedData/ + +# WebMethods +**/IntegrationServer/datastore/ +**/IntegrationServer/db/ +**/IntegrationServer/DocumentStore/ +**/IntegrationServer/lib/ +**/IntegrationServer/logs/ +**/IntegrationServer/replicate/ +**/IntegrationServer/sdk/ +**/IntegrationServer/support/ +**/IntegrationServer/update/ +**/IntegrationServer/userFtpRoot/ +**/IntegrationServer/web/ +**/IntegrationServer/WmRepository4/ +**/IntegrationServer/XAStore/ +**/IntegrationServer/packages/Wm*/ + +# ModelSim +[_@]* +wlf* +cov*/ +transcript* + +# NetBeans +**/nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ + +# JetBrains +cmake-build-*/ +out/ + +# Octave +helpsearch*/ +slprj/ +sccprj/ +codegen/ +octave-workspace + +# SBT +dist/* +target/ +lib_managed/ +project/boot/ +project/plugins/project/ + +# XilinxISE +iseconfig/ +xlnx_auto_0_xdb/ +xst/ +_ngo/ +_xmsgs/ + +# Smalltalk +/package-cache +/play-cache +/play-stash +/github-cache + +# Magento +/media/* +!/media/customer +/media/customer/* +!/media/dhl +/media/dhl/* +!/media/downloadable +/media/downloadable/* +!/media/xmlconnect +/media/xmlconnect/* +!/media/xmlconnect/custom +/media/xmlconnect/custom/* +!/media/xmlconnect/original +/media/xmlconnect/original/* +!/media/xmlconnect/system +/media/xmlconnect/system/* +/var/* +!/var/package +/var/package/* + +# TurboGears2 +data/* +dist +build + +# ChefCookbook +/cookbooks +bin/* + +# TeX +latex.out/ +*-gnuplottex-* +*-tikzDictionary +_minted* +sympy-plots-for-*.tex/ +pythontex-files-*/ +TSWLatexianTemp* +*~[0-9]* + +# Rails +/public/system +/coverage/ +/spec/tmp +/log/* +/tmp/* +/vendor/bundle +/vendor/assets/bower_components +node_modules/ +/public/packs +/public/packs-test +/public/assets +/storage/* +/public/uploads + +# Dart +build/ +doc/api/ + +# Ruby +/coverage/ +/InstalledFiles +/pkg/ +/spec/reports/ +/test/tmp/ +/test/version_tmp/ +/tmp/ +build/ +build-iPhoneOS/ +build-iPhoneSimulator/ +/_yardoc/ +/doc/ +/rdoc/ +/vendor/bundle +/lib/bundler/man/ + +# Textpattern +rpc/ +sites/site*/admin/ +sites/site*/private/ +sites/site*/public/admin/ +sites/site*/public/setup/ +sites/site*/public/theme/ +textpattern/ + +# Autotools +/ar-lib +/mdate-sh +/py-compile +/test-driver +/ylwrap +/compile +/configure +/depcomp +/install-sh +/missing +/stamp-h1 +Makefile + +# Qooxdoo +cache +cache-downloads +inspector +api + +# Maven +target/ + +# Waf +waf-*-*/ +waf3-*-*/ + +# Qt +Makefile* +*build-* + +# ForceDotCom +Referenced Packages + +# SeamGen +/bootstrap/data +/bootstrap/tmp +/classes/ +/dist/ +/exploded-archives/ +/test-build/ +/test-output/ +/test-report/ +/target/ + +# RhodesRhomobile +rholog-* +sim-* +bin/libs +bin/RhoBundle +bin/tmp +bin/target + +# Xojo +Builds* +Debug*/Debug*\ Libs + +# Haskell +dist +dist-* +cabal-dev + +# Elm +elm-stuff +repl-temp-* + +# AppceleratorTitanium +build/ + +# CraftCMS +/craft/storage/* +!/craft/storage/rebrand + +# Gradle +**/build/ + +# Elisp +*~ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f35717 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ + +dist/ +.idea +*.iml +*.eml \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..68f8c33 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,33 @@ +project_name: mullvad-best-server +# This is an example .goreleaser.yml file with some sensible defaults. +# Make sure to check the documentation at https://goreleaser.com +before: + hooks: + # You may remove this if you don't use go modules. + - go mod tidy + # you may remove this if you don't need go generate + - go generate ./... +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - windows + - darwin +archives: + - replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ incpatch .Version }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f0f5f62 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module github.com/bastiandoetsch/mullvad-best-server + +go 1.17 + +require ( + github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534 + github.com/rs/zerolog v1.26.1 +) + +require ( + github.com/google/uuid v1.2.0 // indirect + golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b9151c6 --- /dev/null +++ b/go.sum @@ -0,0 +1,41 @@ +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534 h1:dhy9OQKGBh4zVXbjwbxxHjRxMJtLXj3zfgpBYQaR4Q4= +github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= +github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c2dd93a --- /dev/null +++ b/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "encoding/json" + "github.com/go-ping/ping" + "github.com/rs/zerolog/log" + "io" + "io/ioutil" + "net/http" + "time" +) + +var pings = make(map[string]time.Duration) + +func main() { + + servers := getServers() + bestIndex := selectBestServerIndex(servers) + log.Info().Interface("best", servers[bestIndex]).Msg("Best Latency Server found.") +} + +func selectBestServerIndex(servers []server) int { + best := servers[0].Hostname + bestIndex := 0 + allowedCountries := map[string]string{} + allowedCountries["de"] = "1" + allowedCountries["ch"] = "1" + allowedCountries["at"] = "1" + for i, server := range servers { + if server.Active && allowedCountries[server.CountryCode] != "" { + duration, err := serverLatency(server) + if err == nil { + pings[server.Hostname] = duration + if best == "" || pings[best] > pings[server.Hostname] { + best = server.Hostname + bestIndex = i + } + } + } + } + return bestIndex +} + +func getServers() []server { + resp, err := http.Get("https://api.mullvad.net/www/relays/wireguard/") + if err != nil { + log.Fatal().Err(err) + } + responseBody, err := ioutil.ReadAll(resp.Body) + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Err(err) + } + }(resp.Body) + var servers []server + err = json.Unmarshal(responseBody, &servers) + if err != nil { + log.Fatal().Err(err) + } + return servers +} + +func serverLatency(s server) (time.Duration, error) { + pinger, err := ping.NewPinger(s.Ipv4AddrIn) + pinger.Count = 1 + if err != nil { + return 0, err + } + var duration time.Duration + pinger.OnRecv = func(pkt *ping.Packet) { + log.Info().Str("Server", s.Hostname).IPAddr("IP", pkt.IPAddr.IP).Dur("RTT", pkt.Rtt).Msg("Added server latency.") + duration = pkt.Rtt + } + err = pinger.Run() + return duration, err +} + +type server struct { + Hostname string `json:"hostname"` + CountryCode string `json:"country_code"` + CountryName string `json:"country_name"` + CityCode string `json:"city_code"` + CityName string `json:"city_name"` + Active bool `json:"active"` + Owned bool `json:"owned"` + Provider string `json:"provider"` + Ipv4AddrIn string `json:"ipv4_addr_in"` + Ipv6AddrIn string `json:"ipv6_addr_in"` + NetworkPortSpeed int `json:"network_port_speed"` + Pubkey string `json:"pubkey"` + MultihopPort int `json:"multihop_port"` + SocksName string `json:"socks_name"` +}