by default, new providers will now require invites. requires leap_cli 4173154a177b00c...
authorelijah <elijah@riseup.net>
Fri, 30 Jun 2017 07:24:38 +0000 (00:24 -0700)
committerMicah Anderson <micah@riseup.net>
Tue, 18 Jul 2017 22:42:00 +0000 (15:42 -0700)
lib/leap_cli/commands/run.rb
lib/leap_cli/config/object_list.rb
provider_base/templates/provider.json [new file with mode: 0644]

index cad9b7a..9149d59 100644 (file)
@@ -3,13 +3,27 @@ module LeapCli; module Commands
   desc 'Run a shell command remotely'
   long_desc "Runs the specified command COMMAND on each node in the FILTER set. " +
             "For example, `leap run 'uname -a' webapp`"
-  arg_name 'COMMAND FILTER'
   command :run do |c|
     c.switch 'stream', :default => false, :desc => 'If set, stream the output as it arrives. (default: --stream for a single node, --no-stream for multiple nodes)'
     c.flag 'port', :arg_name => 'SSH_PORT', :desc => 'Override default SSH port used when trying to connect to the server.'
-    c.action do |global, options, args|
-      run_shell_command(global, options, args)
+
+    c.desc 'Run an arbitrary shell command.'
+    c.arg_name 'FILTER', optional: true
+    c.command :command do |command|
+      command.action do |global, options, args|
+        run_shell_command(global, options, args)
+      end
+    end
+
+    c.desc 'Generate one or more new invite codes.'
+    c.arg_name '[COUNT] [ENVIRONMENT]'
+    c.command :invite do |invite|
+      invite.action do |global_options,options,args|
+        run_new_invites(global_options, options, args)
+      end
     end
+
+    c.default_command :command
   end
 
   private
@@ -27,6 +41,39 @@ module LeapCli; module Commands
     end
   end
 
+  CMD_NEW_INVITES="cd /srv/leap/webapp; RAILS_ENV=production bundle exec rake \"generate_invites[NUM,USES]\""
+
+  def run_new_invites(global, options, args)
+    require 'leap_cli/ssh'
+    count = 1
+    uses  = 1
+    env   = nil
+    arg1  = args.shift
+    arg2  = args.shift
+    if arg1 && arg2
+      env   = manager.env(arg2)
+      count = arg1
+    elsif arg1
+      env = manager.env(arg1)
+    else
+      env = manager.env(nil)
+    end
+    unless env
+      bail! "Environment name you specified does not match one that is available. See `leap env ls` for the available names"
+    end
+
+    env_name = env.name == 'default' ? nil : env.name
+    webapp_nodes = env.nodes[:environment => env_name][:services => 'webapp'].first
+    if webapp_nodes.empty?
+      bail! "Could not find a webapp node for the specified environment"
+    end
+    stream_command(
+      webapp_nodes,
+      CMD_NEW_INVITES.sub('NUM', count.to_s).sub('USES', uses.to_s),
+      options
+    )
+  end
+
   def capture_command(nodes, cmd, options)
     SSH.remote_command(nodes, options) do |ssh, host|
       output = ssh.capture(cmd, :log_output => false)
index 80f89d9..815864e 100644 (file)
@@ -49,6 +49,10 @@ module LeapCli
         end
       end
 
+      def first
+        ObjectList.new(self.values.first)
+      end
+
       def exclude(node)
         list = self.dup
         list.delete(node.name)
diff --git a/provider_base/templates/provider.json b/provider_base/templates/provider.json
new file mode 100644 (file)
index 0000000..297327d
--- /dev/null
@@ -0,0 +1,19 @@
+//
+// This file defines global aspects of your service provider
+// See https://leap.se/provider-configuration
+//
+{
+  "domain": "<%= domain %>",
+  "name": {
+    "en": "<%= name %>"
+  },
+  "description": {
+    "en": "You really should change this text"
+  },
+  "contacts": {
+    "default": "<%= contacts %>"
+  },
+  "languages": ["en"],
+  "default_language": "en",
+  "enrollment_policy": "invite"
+}