From 49384338d2ac8afcfdfdc976ddbd42f0871284e0 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Wed, 1 Jul 2020 06:01:48 +0500 Subject: [PATCH] Remove host "rpi-01.dyn.crypto-libertarian.com" and unnecessary code --- apps/dyndns/.ruby-gemset | 1 - apps/dyndns/.ruby-version | 1 - apps/dyndns/Gemfile | 6 - apps/dyndns/Gemfile.lock | 27 --- apps/dyndns/exe/crypto_libertarian-dyndns | 57 ------- apps/report_ip/.gitignore | 5 - apps/report_ip/.ruby-gemset | 1 - apps/report_ip/.ruby-version | 1 - apps/report_ip/Gemfile | 9 - apps/report_ip/Gemfile.lock | 41 ----- apps/report_ip/config.ru | 7 - apps/report_ip/config/application.rb | 57 ------- apps/report_ip/config/boot.rb | 7 - apps/report_ip/config/environment.rb | 4 - apps/report_ip/config/puma/production.rb | 36 ---- apps/report_ip/public/.keep | 0 apps/report_ip/tmp/pids/.keep | 0 apps/report_ip/tmp/sockets/.keep | 0 files/dyndns.service | 19 --- files/report_ip.service | 18 -- files/wiki.jpg | Bin 20365 -> 0 bytes .../host_vars/misc.crypto-libertarian.com.yml | 22 --- .../rpi-01.dyn.crypto-libertarian.com.yml | 18 -- inventories/production/hosts | 4 - playbooks/deploy/misc.yml | 158 ------------------ playbooks/deploy/raspberrypi.yml | 21 --- playbooks/deploy/site.yml | 3 - requirements.yml | 2 - templates/crypto_libertarian.cron | 2 - 29 files changed, 527 deletions(-) delete mode 100644 apps/dyndns/.ruby-gemset delete mode 100644 apps/dyndns/.ruby-version delete mode 100644 apps/dyndns/Gemfile delete mode 100644 apps/dyndns/Gemfile.lock delete mode 100755 apps/dyndns/exe/crypto_libertarian-dyndns delete mode 100644 apps/report_ip/.gitignore delete mode 100644 apps/report_ip/.ruby-gemset delete mode 100644 apps/report_ip/.ruby-version delete mode 100644 apps/report_ip/Gemfile delete mode 100644 apps/report_ip/Gemfile.lock delete mode 100644 apps/report_ip/config.ru delete mode 100644 apps/report_ip/config/application.rb delete mode 100644 apps/report_ip/config/boot.rb delete mode 100644 apps/report_ip/config/environment.rb delete mode 100644 apps/report_ip/config/puma/production.rb delete mode 100644 apps/report_ip/public/.keep delete mode 100644 apps/report_ip/tmp/pids/.keep delete mode 100644 apps/report_ip/tmp/sockets/.keep delete mode 100644 files/dyndns.service delete mode 100644 files/report_ip.service delete mode 100644 files/wiki.jpg delete mode 100644 inventories/production/host_vars/rpi-01.dyn.crypto-libertarian.com.yml delete mode 100644 playbooks/deploy/raspberrypi.yml delete mode 100644 templates/crypto_libertarian.cron diff --git a/apps/dyndns/.ruby-gemset b/apps/dyndns/.ruby-gemset deleted file mode 100644 index 89ee9a0..0000000 --- a/apps/dyndns/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -crypto_libertarian-dyndns diff --git a/apps/dyndns/.ruby-version b/apps/dyndns/.ruby-version deleted file mode 100644 index ccfb6ef..0000000 --- a/apps/dyndns/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -ruby-2.7.0 diff --git a/apps/dyndns/Gemfile b/apps/dyndns/Gemfile deleted file mode 100644 index b4c3d49..0000000 --- a/apps/dyndns/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -gem 'redis', '~> 4.1' -gem 'rubydns', '~> 2.0' diff --git a/apps/dyndns/Gemfile.lock b/apps/dyndns/Gemfile.lock deleted file mode 100644 index f96124a..0000000 --- a/apps/dyndns/Gemfile.lock +++ /dev/null @@ -1,27 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - async (1.24.2) - console (~> 1.0) - nio4r (~> 2.3) - timers (~> 4.1) - async-dns (1.2.5) - async-io (~> 1.15) - async-io (1.27.3) - async (~> 1.14) - console (1.8.1) - nio4r (2.5.2) - redis (4.1.3) - rubydns (2.0.2) - async-dns (~> 1.0) - timers (4.3.0) - -PLATFORMS - ruby - -DEPENDENCIES - redis (~> 4.1) - rubydns (~> 2.0) - -BUNDLED WITH - 2.1.2 diff --git a/apps/dyndns/exe/crypto_libertarian-dyndns b/apps/dyndns/exe/crypto_libertarian-dyndns deleted file mode 100755 index 6849bbc..0000000 --- a/apps/dyndns/exe/crypto_libertarian-dyndns +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -Warning[:deprecated] = false - -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. - -require 'redis' -require 'rubydns' - -IN = Resolv::DNS::Resource::IN - -INTERFACES = [ - [:udp, '0.0.0.0', 53], - [:tcp, '0.0.0.0', 53], -].freeze - -DYN_DOMAIN_ROOT = 'dyn.crypto-libertarian.com' -DYN_DOMAIN_RE = /\A([^.]+)\.dyn\.crypto-libertarian\.com\z/.freeze - -RubyDNS.run_server INTERFACES do - match DYN_DOMAIN_RE, IN::A do |tx, m| - redis = Redis.new url: ENV['REDIS_URL'] - - domain = "#{m[1]}.#{DYN_DOMAIN_ROOT}" - - ip = redis.hget('ipv4s', domain).to_s.strip.freeze - ip = nil if ip.empty? - - if ip.nil? - tx.fail! :NXDomain - else - tx.respond! ip - end - end - - match DYN_DOMAIN_RE, IN::AAAA do |tx, m| - redis = Redis.new url: ENV['REDIS_URL'] - - domain = "#{m[1]}.#{DYN_DOMAIN_ROOT}" - - ip = redis.hget('ipv6s', domain).to_s.strip.freeze - ip = nil if ip.empty? - - if ip.nil? - tx.fail! :NXDomain - else - tx.respond! ip - end - end - - otherwise do |tx| - tx.fail! :NXDomain - end -end diff --git a/apps/report_ip/.gitignore b/apps/report_ip/.gitignore deleted file mode 100644 index 7fdc976..0000000 --- a/apps/report_ip/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/tmp/sockets/* -!/tmp/sockets/.keep - -/tmp/pids/* -!/tmp/pids/.keep diff --git a/apps/report_ip/.ruby-gemset b/apps/report_ip/.ruby-gemset deleted file mode 100644 index e761ec5..0000000 --- a/apps/report_ip/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -crypto_libertarian-report_ip diff --git a/apps/report_ip/.ruby-version b/apps/report_ip/.ruby-version deleted file mode 100644 index ccfb6ef..0000000 --- a/apps/report_ip/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -ruby-2.7.0 diff --git a/apps/report_ip/Gemfile b/apps/report_ip/Gemfile deleted file mode 100644 index fe6c0cd..0000000 --- a/apps/report_ip/Gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -gem 'puma', '~> 4.3' -gem 'rack', '~> 2.2' -gem 'redis', '~> 4.1' -gem 'sinatra', '~> 2.0' -gem 'sinatra-contrib', '~> 2.0' diff --git a/apps/report_ip/Gemfile.lock b/apps/report_ip/Gemfile.lock deleted file mode 100644 index 119cf70..0000000 --- a/apps/report_ip/Gemfile.lock +++ /dev/null @@ -1,41 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - backports (3.16.0) - multi_json (1.14.1) - mustermann (1.1.1) - ruby2_keywords (~> 0.0.1) - nio4r (2.5.2) - puma (4.3.1) - nio4r (~> 2.0) - rack (2.2.1) - rack-protection (2.0.8.1) - rack - redis (4.1.3) - ruby2_keywords (0.0.2) - sinatra (2.0.8.1) - mustermann (~> 1.0) - rack (~> 2.0) - rack-protection (= 2.0.8.1) - tilt (~> 2.0) - sinatra-contrib (2.0.8.1) - backports (>= 2.8.2) - multi_json - mustermann (~> 1.0) - rack-protection (= 2.0.8.1) - sinatra (= 2.0.8.1) - tilt (~> 2.0) - tilt (2.0.10) - -PLATFORMS - ruby - -DEPENDENCIES - puma (~> 4.3) - rack (~> 2.2) - redis (~> 4.1) - sinatra (~> 2.0) - sinatra-contrib (~> 2.0) - -BUNDLED WITH - 2.1.2 diff --git a/apps/report_ip/config.ru b/apps/report_ip/config.ru deleted file mode 100644 index 3228f1c..0000000 --- a/apps/report_ip/config.ru +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -# This file is used by Rack-based servers to start the application. - -require_relative 'config/environment' - -run CryptoLibertarian::ReportIP::Application diff --git a/apps/report_ip/config/application.rb b/apps/report_ip/config/application.rb deleted file mode 100644 index 99cd639..0000000 --- a/apps/report_ip/config/application.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -require_relative 'boot' - -# Require the gems listed in Gemfile. -Bundler.require - -module CryptoLibertarian - module ReportIP - IPV4_RE = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/.freeze - IPV6_RE = /\A(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\z/i.freeze - - class Application < Sinatra::Application - get '/' do - redis = Redis.new url: ENV['REDIS_URL'] - - json( - redis.hgetall('secrets').keys.map do |domain| - [ - domain, - { - ipv4: redis.hget('ipv4s', domain), - ipv6: redis.hget('ipv6s', domain), - }, - ] - end.to_h, - ) - end - - post '/:domain/:secret' do - redis = Redis.new url: ENV['REDIS_URL'] - - domain = params[:domain].to_s.strip - got_secret = params[:secret].to_s.strip - - expected_secret = redis.hget('secrets', domain).to_s.strip - - if got_secret != expected_secret || expected_secret.empty? - halt 401, 'Unauthorized' - end - - ip = request.ip.to_s.strip - ip = nil if ip.empty? - - if IPV4_RE.match? ip - redis.hset 'ipv4s', domain, ip - json ipv4: ip - elsif IPV6_RE.match? ip - redis.hset 'ipv6s', domain, ip - json ipv6: ip - else - halt 500, 'Invalid IP address' - end - end - end - end -end diff --git a/apps/report_ip/config/boot.rb b/apps/report_ip/config/boot.rb deleted file mode 100644 index 7a2e071..0000000 --- a/apps/report_ip/config/boot.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -Warning[:deprecated] = false - -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/apps/report_ip/config/environment.rb b/apps/report_ip/config/environment.rb deleted file mode 100644 index 9dcbc35..0000000 --- a/apps/report_ip/config/environment.rb +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -# Load the Sinatra application. -require_relative 'application' diff --git a/apps/report_ip/config/puma/production.rb b/apps/report_ip/config/puma/production.rb deleted file mode 100644 index ff8f28f..0000000 --- a/apps/report_ip/config/puma/production.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -root_dir = File.expand_path '../..', __dir__ - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked webserver processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -workers 1 - -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum; this matches the default thread size of Active Record. -# -threads 5, 5 - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. -# -# preload_app! - -# Bind the server to "url". "tcp://", "unix://" and "ssl://" are the only -# accepted protocols. -# -bind "unix://#{File.join(root_dir, 'tmp', 'sockets', 'puma.sock')}" - -# Use "path" as the file to store the server info state. This is -# used by "pumactl" to query and control the server. -# -state_path File.join(root_dir, 'tmp', 'pids', 'puma.state') diff --git a/apps/report_ip/public/.keep b/apps/report_ip/public/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/report_ip/tmp/pids/.keep b/apps/report_ip/tmp/pids/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/report_ip/tmp/sockets/.keep b/apps/report_ip/tmp/sockets/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/files/dyndns.service b/files/dyndns.service deleted file mode 100644 index 2ba70a6..0000000 --- a/files/dyndns.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -After=network.target -Description=DynDns app - -[Service] -AmbientCapabilities=CAP_NET_BIND_SERVICE -ExecStart=/usr/local/rvm/bin/rvm ruby-2.7.0@crypto_libertarian-dyndns do /opt/dyndns/exe/crypto_libertarian-dyndns -Group=dyndns -Restart=always -RestartSec=1 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=dyndns -Type=simple -User=dyndns -WorkingDirectory=/opt/dyndns - -[Install] -WantedBy=multi-user.target diff --git a/files/report_ip.service b/files/report_ip.service deleted file mode 100644 index 42392c8..0000000 --- a/files/report_ip.service +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -After=network.target -Description=Report IP web app - -[Service] -ExecStart=/usr/local/rvm/bin/rvm ruby-2.7.0@crypto_libertarian-report_ip do puma --environment production -Group=report_ip -Restart=always -RestartSec=1 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=report_ip -Type=simple -User=report_ip -WorkingDirectory=/opt/report_ip - -[Install] -WantedBy=multi-user.target diff --git a/files/wiki.jpg b/files/wiki.jpg deleted file mode 100644 index 2b96681fb5fae71218c47916a768447c3f8459df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20365 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 - /bin/bash --login -c - 'rvm use ruby-2.7.0@crypto_libertarian-report_ip' - ignore_errors: true - register: check_rvm_gemset_result_for_report_ip - changed_when: false - - - name: Check RVM gemset - shell: > - /bin/bash --login -c - 'rvm use ruby-2.7.0@crypto_libertarian-dyndns' - ignore_errors: true - register: check_rvm_gemset_result_for_dyndns - changed_when: false - - - name: Create RVM gemset - shell: > - /bin/bash --login -c - 'rvm use ruby-2.7.0@crypto_libertarian-report_ip --create' - when: check_rvm_gemset_result_for_report_ip.rc != 0 - - - name: Create RVM gemset - shell: > - /bin/bash --login -c - 'rvm use ruby-2.7.0@crypto_libertarian-dyndns --create' - when: check_rvm_gemset_result_for_dyndns.rc != 0 - - - name: Check Bundler - shell: > - /bin/bash --login -c - "rvm ruby-2.7.0@crypto_libertarian-report_ip do - gem info bundler --installed --version '~> 2.0'" - ignore_errors: true - register: check_bundler_result_for_report_ip - changed_when: false - - - name: Check Bundler - shell: > - /bin/bash --login -c - "rvm ruby-2.7.0@crypto_libertarian-dyndns do - gem info bundler --installed --version '~> 2.0'" - ignore_errors: true - register: check_bundler_result_for_dyndns - changed_when: false - - - name: Install Bundler - shell: > - /bin/bash --login -c - "rvm ruby-2.7.0@crypto_libertarian-report_ip do - gem install bundler -v '~> 2.0'" - when: check_bundler_result_for_report_ip.rc != 0 - - - name: Install Bundler - shell: > - /bin/bash --login -c - "rvm ruby-2.7.0@crypto_libertarian-dyndns do - gem install bundler -v '~> 2.0'" - when: check_bundler_result_for_dyndns.rc != 0 - - - name: Copy application - copy: - src: '../../apps/{{ item }}/' - dest: '/opt/{{ item }}/' - owner: '{{ item }}' - group: '{{ item }}' - with_items: - - report_ip - - dyndns - - - name: Copy executable - copy: - src: ../../apps/dyndns/exe/crypto_libertarian-dyndns - dest: /opt/dyndns/exe/crypto_libertarian-dyndns - owner: dyndns - group: dyndns - mode: 'u=rwx,g=rx,o=rx' - - - name: Install gems - shell: > - /bin/bash --login -c - "rvm ruby-2.7.0@crypto_libertarian-{{ item }} do - bundle install --gemfile /opt/{{ item }}/Gemfile" - changed_when: false - with_items: - - report_ip - - dyndns - - - name: Install systemd service "report_ip" - copy: - src: ../../files/report_ip.service - dest: /etc/systemd/system/report_ip.service - owner: root - group: root - mode: 'u=rw,g=r,o=r' - register: install_systemd_service_result_for_report_ip - - - name: Install systemd service "dyndns" - copy: - src: ../../files/dyndns.service - dest: /etc/systemd/system/dyndns.service - owner: root - group: root - mode: 'u=rw,g=r,o=r' - register: install_systemd_service_result_for_dyndns - - - name: Disable and stop systemd service "systemd-resolved" - systemd: - name: systemd-resolved.service - enabled: false - state: stopped - - - name: Update systemd service "report_ip" - systemd: - daemon_reload: true - name: report_ip.service - enabled: true - when: install_systemd_service_result_for_report_ip.changed - - - name: Update systemd service "dyndns" - systemd: - daemon_reload: true - name: dyndns.service - enabled: true - when: install_systemd_service_result_for_dyndns.changed - - - name: Restart systemd service - systemd: - name: '{{ item }}.service' - state: restarted - changed_when: false - with_items: - - report_ip - - dyndns diff --git a/playbooks/deploy/raspberrypi.yml b/playbooks/deploy/raspberrypi.yml deleted file mode 100644 index 530d2b7..0000000 --- a/playbooks/deploy/raspberrypi.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -- hosts: raspberrypi - module_defaults: - apt: - force_apt_get: true - update_cache: true - cache_valid_time: 86400 - roles: - - kotovalexarian.common - tasks: - - name: Install system packages - apt: - name: miniupnpc - - - name: Install cron jobs - template: - src: ../../templates/crypto_libertarian.cron - dest: /etc/cron.d/crypto_libertarian - owner: root - group: root - mode: 'u=rw,g=r,o=' diff --git a/playbooks/deploy/site.yml b/playbooks/deploy/site.yml index 56e4f12..7cdd95d 100644 --- a/playbooks/deploy/site.yml +++ b/playbooks/deploy/site.yml @@ -1,6 +1,3 @@ --- - import_playbook: git.yml - import_playbook: misc.yml - -- import_playbook: raspberrypi.yml - tags: rpi diff --git a/requirements.yml b/requirements.yml index 790967f..8dbdf1a 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,5 +1,3 @@ --- - src: kotovalexarian.common version: v0.0.34 -- src: rvm.ruby - version: v2.1.2 diff --git a/templates/crypto_libertarian.cron b/templates/crypto_libertarian.cron deleted file mode 100644 index 6e7df5c..0000000 --- a/templates/crypto_libertarian.cron +++ /dev/null @@ -1,2 +0,0 @@ -* * * * * root /usr/bin/curl -X POST -d '' "https://report-ip.crypto-libertarian.com/$(hostname)/{{ report_ip_secret }}" -* * * * * root /usr/bin/upnpc -r {{ ansible_port }} tcp