[elbe-devel] [PATCH v2 03/10] soap: implement add_user action

Torben Hohn torben.hohn at linutronix.de
Tue Apr 17 12:39:34 CEST 2018


Adding users is only possible via elbe db commands.

When we want to automate management of the initvm, and also
allow sharing of the initvm, its necessary to be able to create
a user via add_user.

This patch exposes ElbeDB.add_user via the soap interface.
add_user is only exposed to an Admin User (mainly root:root)

For our current usecase, we only want to make sure, the user exists.
So an Exception because of an already existing User is ignored, in
the client side code.

Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
---
 elbepack/daemons/soap/esoap.py |  6 ++++++
 elbepack/soapclient.py         | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/elbepack/daemons/soap/esoap.py b/elbepack/daemons/soap/esoap.py
index 03fcffc4..62e8e72d 100644
--- a/elbepack/daemons/soap/esoap.py
+++ b/elbepack/daemons/soap/esoap.py
@@ -68,6 +68,12 @@ class ESoap (ServiceBase):
     def list_users(ctx):
         return [u.name for u in ctx.app.pm.db.list_users()]
 
+    @rpc(String,String,String,String,Boolean)
+    @soap_faults
+    @authenticated_admin
+    def add_user(self, name, fullname, password, email, admin):
+        self.app.pm.db.add_user(name, fullname, password, email, admin)
+
     @rpc(_returns=Array(SoapProject))
     @soap_faults
     @authenticated_admin
diff --git a/elbepack/soapclient.py b/elbepack/soapclient.py
index f1fcf28f..785e217c 100644
--- a/elbepack/soapclient.py
+++ b/elbepack/soapclient.py
@@ -27,6 +27,7 @@ import fnmatch
 import deb822   # package for dealing with Debian related data
 
 from suds.client import Client
+from suds import WebFault
 from datetime import datetime
 from urllib2 import URLError
 from httplib import BadStatusLine
@@ -189,6 +190,37 @@ class ListUsersAction(ClientAction):
 
 ClientAction.register(ListUsersAction)
 
+class AddUserAction(ClientAction):
+    tag = 'add_user'
+
+    def __init__(self, node):
+        ClientAction.__init__(self, node)
+
+    def execute(self, client, opt, args):
+        if len(args) != 4:
+            print(
+                "usage: elbe control add_user <name> <fullname> <password> <email>",
+                file=sys.stderr)
+            sys.exit(20)
+
+        name     = args[0]
+        fullname = args[1]
+        password = args[2]
+        email    = args[3]
+
+        try:
+            client.service.add_user(name, fullname, password, email, False)
+        except WebFault as e:
+            if not hasattr(e.fault, 'faultstring'):
+                raise
+
+            if not e.fault.faultstring.endswith('already exists in the database'):
+                raise
+
+            # when we get here, the user we wanted to create already exists.
+            # that is fine, and we dont need to do anything now.
+
+ClientAction.register(AddUserAction)
 
 class CreateProjectAction(ClientAction):
 
-- 
2.11.0




More information about the elbe-devel mailing list