Feat: Refactor tor services
authorMicah Anderson <micah@riseup.net>
Tue, 19 Sep 2017 19:36:06 +0000 (15:36 -0400)
committerMicah Anderson <micah@riseup.net>
Thu, 5 Oct 2017 23:24:50 +0000 (19:24 -0400)
In order to refactor the tor services, we need to split them out into three
different services. This adds the hidden service class that is necessary to
support the previous commits. Fixes #8864.

13 files changed:
provider_base/services/hidden_service.rb [deleted file]
provider_base/services/tor_exit.rb
provider_base/services/tor_hidden_service.json [moved from provider_base/services/hidden_service.json with 100% similarity]
provider_base/services/tor_hidden_service.rb [new file with mode: 0644]
provider_base/services/tor_relay.rb
puppet/manifests/site.pp
puppet/modules/site_static/manifests/hidden_service.pp
puppet/modules/site_static/manifests/init.pp
puppet/modules/site_tor/manifests/hidden_service.pp [new file with mode: 0644]
puppet/modules/site_webapp/manifests/hidden_service.pp
puppet/modules/site_webapp/manifests/init.pp
tests/platform-ci/ci-build.sh
tests/platform-ci/provider/nodes/catalogtest.json

diff --git a/provider_base/services/hidden_service.rb b/provider_base/services/hidden_service.rb
deleted file mode 100644 (file)
index 5070168..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-if self.services.include?("tor_exit") || self.services.include?("tor_relay")
-  LeapCli.log :error, "service `hidden_service` is not compatible with tor_exit or tor_relay (node #{self.name})."
-end
-self.tor['type'] = "hidden_service"
\ No newline at end of file
index 05c6743..bd801a3 100644 (file)
@@ -1,5 +1,5 @@
-if self.services.include?("hidden_service") || self.services.include?("tor_relay")
-  LeapCli.log :error, "service `tor_exit` is not compatible with tor_relay or hidden_service (node #{self.name})."
+if self.services.include?("tor_hidden_service") || self.services.include?("tor_relay")
+  LeapCli.log :error, "service `tor_exit` is not compatible with tor_relay or tor_hidden_service (node #{self.name})."
   exit(1)
 end
 apply_partial("_tor_common")
diff --git a/provider_base/services/tor_hidden_service.rb b/provider_base/services/tor_hidden_service.rb
new file mode 100644 (file)
index 0000000..8b8eb24
--- /dev/null
@@ -0,0 +1,4 @@
+if self.services.include?("tor_exit") || self.services.include?("tor_relay")
+  LeapCli.log :error, "service `tor_hidden_service` is not compatible with tor_exit or tor_relay (node #{self.name})."
+end
+self.tor['type'] = "hidden_service"
index 42bafb9..7fce6ae 100644 (file)
@@ -1,6 +1,6 @@
 
-if self.services.include?("tor_exit") || self.services.include?("hidden_service")
-  LeapCli.log :error, "service `tor_relay` is not compatible with tor_exit or hidden_service (node #{self.name})."
+if self.services.include?("tor_exit") || self.services.include?("tor_hidden_service")
+  LeapCli.log :error, "service `tor_relay` is not compatible with tor_exit or tor_hidden_service (node #{self.name})."
 end
 apply_partial("_tor_common")
 self.tor['type'] = "relay"
index f3e752c..1f80c47 100644 (file)
@@ -52,7 +52,7 @@ node default {
     include site_tor::relay
   }
 
-  if member($services, 'hidden_service') {
+  if member($services, 'tor_hidden_service') {
     include site_tor::hidden_service
   }
 
index dcf3785..f23727f 100644 (file)
@@ -1,13 +1,15 @@
 # create hidden service for static sites
 class site_static::hidden_service ( $single_hop = false ) {
+  Class['site_tor::hidden_service'] -> Class['site_static::hidden_service']
+  include site_tor::hidden_service
 
-  include site_tor
   tor::daemon::hidden_service { 'static':
     ports      => [ '80 127.0.0.1:80'],
     single_hop => $single_hop
   }
+
   file {
-    '/var/lib/tor/webapp/':
+    '/var/lib/tor/static/':
       ensure => directory,
       owner  => 'debian-tor',
       group  => 'debian-tor',
index 4ddce5e..40c6a28 100644 (file)
@@ -7,12 +7,13 @@ class site_static {
   include site_config::x509::key
   include site_config::x509::ca_bundle
 
-  $static         = hiera('static')
-  $domains        = $static['domains']
-  $formats        = $static['formats']
-  $bootstrap      = $static['bootstrap_files']
-  $tor            = hiera('tor', false)
-  if $tor and member($services, 'hidden_service') {
+  $services  = hiera('services', [])
+  $static    = hiera('static')
+  $domains   = $static['domains']
+  $formats   = $static['formats']
+  $bootstrap = $static['bootstrap_files']
+  $tor       = hiera('tor', false)
+  if $tor and member($services, 'tor_hidden_service') {
     $onion_active = true
   } else {
     $onion_active = false
diff --git a/puppet/modules/site_tor/manifests/hidden_service.pp b/puppet/modules/site_tor/manifests/hidden_service.pp
new file mode 100644 (file)
index 0000000..87a7b69
--- /dev/null
@@ -0,0 +1,13 @@
+# This class simply makes sure a base tor is installed and configured
+# It doesn't configure any specific hidden service functionality,
+# instead that is configured in site_webapp::hidden_service and
+# site_static::hidden_service.
+#
+# Those could be factored out to make them more generic.
+class site_tor::hidden_service {
+  tag 'leap_service'
+  Class['site_config::default'] -> Class['site_tor::hidden_service']
+
+  include site_config::default
+  include site_tor
+}
index 658d62f..1f87da6 100644 (file)
@@ -1,5 +1,7 @@
 # Configure tor hidden service for webapp
 class site_webapp::hidden_service {
+  Class['site_tor::hidden_service'] -> Class['site_webapp::hidden_service']
+  include site_tor::hidden_service
   $tor              = hiera('tor')
   $hidden_service   = $tor['hidden_service']
   $onion_domain     = "${hidden_service['address']}.onion"
@@ -10,7 +12,6 @@ class site_webapp::hidden_service {
   include apache::module::expires
   include apache::module::removeip
 
-  include site_tor
   tor::daemon::hidden_service { 'webapp':
     ports      => [ '80 127.0.0.1:80'],
     single_hop => $hidden_service['single_hop']
index 968859b..605d71b 100644 (file)
@@ -1,6 +1,7 @@
 # configure webapp service
 class site_webapp {
   tag 'leap_service'
+  $services         = hiera('services', [])
   $definition_files = hiera('definition_files')
   $provider         = $definition_files['provider']
   $eip_service      = $definition_files['eip_service']
@@ -177,7 +178,7 @@ class site_webapp {
       notify  => Service['apache'];
   }
 
-  if $tor and member($services, 'hidden_service') {
+  if $tor and member($services, 'tor_hidden_service') {
     $hidden_service = $tor['hidden_service']
     include ::site_webapp::hidden_service
   }
index 4710bc8..06af59c 100755 (executable)
@@ -71,6 +71,13 @@ test() {
 }
 
 build_from_scratch() {
+  # allow passing into the function the services, use a default set if empty
+  SERVICES=$1
+  if [ -z "$SERVICES" ]
+  then
+      SERVICES='couchdb,soledad,mx,webapp,tor_relay,monitor'
+  fi
+
   # when using gitlab-runner locally, CI_JOB_ID is always 1 which
   # will conflict with running/terminating AWS instances in subsequent runs
   # therefore we pick a random number in this case
@@ -78,10 +85,7 @@ build_from_scratch() {
 
   # create node(s) with unique id so we can run tests in parallel
   NAME="citest${CI_JOB_ID:-0}"
-
-
   TAG='single'
-  SERVICES='couchdb,soledad,mx,webapp,tor,monitor'
 
   # leap_platform/tests/platform-ci/provider
   PROVIDERDIR="${ROOTDIR}/provider"
@@ -184,7 +188,7 @@ upgrade_test() {
 
   cd "$PROVIDERDIR"
 
-  build_from_scratch
+  build_from_scratch 'couchdb,soledad,mx,webapp,tor,monitor'
   deploy
   test
 
@@ -200,6 +204,11 @@ upgrade_test() {
   /usr/local/bin/bundle install
 
   cd "$PROVIDERDIR"
+
+  # due to the 'tor' service no longer being valid in 0.10, we need to change
+  # that service to 'tor_relay'. This is done by changing the services array
+  # with jq to be set to the full correct list of services
+  jq '.services = ["couchdb","soledad","mx","webapp","tor_relay","monitor"]' < nodes/${NAME}.json
   deploy
   test
 
index 0570366..bbf79d9 100644 (file)
@@ -10,7 +10,7 @@
     "webapp",
     "monitor",
     "openvpn",
-    "tor",
+    "tor_relay",
     "obfsproxy",
     "static"
   ],