summaryrefslogtreecommitdiffstats
path: root/cli-tools/cura/cura_client_user.py
blob: b0b21fc4b1356a2ae23da504f3f09143a9ea9a6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python
# Copyright (C) 2012  Peter Hatina <phatina@redhat.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.

import sys
import pywbem

class CuraUserClient():
    USER_CLASS_NAME = "LMI_Account"
    GROUP_CLASS_NAME =  "LMI_Group"
    MEMBER_OF_GROUP_CLASS_NAME = "LMI_MemberOfGroup"
    ASSIGNED_IDENTITY_CLASS_NAME = "LMI_AssignedAccountIdentity"

    def __init__(self, hostname, username = "", password = ""):
        self.m_hostname = hostname
        self.m_username = username
        self.m_password = password
        self.m_cliconn = pywbem.WBEMConnection("https://" + self.m_hostname,
            (self.m_username, self.m_password))

    def __getInstances(self, klass, filter_name = ""):
        try:
            inst_name_list = self.m_cliconn.EnumerateInstanceNames(klass)
        except pywbem.cim_operations.CIMError, e:
            return (None, e.args[1])
        except pywbem.cim_http.AuthError, e:
            return (None, e.args[0])
        inst_names = inst_name_list
        if len(filter_name):
            inst_names = filter(lambda n: n["Name"] == filter_name, inst_name_list)
        inst_list = []
        for i in inst_names:
            inst_list.append(self.m_cliconn.GetInstance(i, LocalOnly = False))
        if not len(inst_list):
            return (None, "Not found")
        return (inst_list, "")

    def __getUserInstances(self):
        return self.__getInstances(CuraUserClient.USER_CLASS_NAME)

    def __getGroupInstances(self):
        return self.__getInstances(CuraUserClient.GROUP_CLASS_NAME)

    def __getMemberGroups(self, inst):
        members = []
        identities = self.m_cliconn.Associators(inst.path,
            AssocClass = CuraUserClient.ASSIGNED_IDENTITY_CLASS_NAME)
        for identity in identities:
            accounts = self.m_cliconn.Associators(identity.path,
                AssocClass = CuraUserClient.MEMBER_OF_GROUP_CLASS_NAME)
            members.extend(accounts)
        return members

    def __getGroupMembers(self, inst):
        members = []
        for g in inst:
            identities = self.m_cliconn.Associators(g.path,
                AssocClass = CuraUserClient.MEMBER_OF_GROUP_CLASS_NAME)
            for i in identities:
                accounts = self.m_cliconn.Associators(i.path,
                    AssocClass = CuraUserClient.ASSIGNED_IDENTITY_CLASS_NAME)
                for a in accounts:
                    members.append(a["Name"])
        return members

    def listUsers(self):
        (inst_list, rparam) = self.__getUserInstances()
        if not inst_list:
            return (False, "No users found")
        sys.stdout.write("%s:\n" % self.m_hostname)
        try:
            for i in inst_list:
                groups = self.__getMemberGroups(i)
                gid = groups[0]["InstanceID"].split(":")[-1]
                sys.stdout.write("%s:x:%s:%s:%s:%s:%s\n" %
                    (i["Name"], i["UserID"], gid, i["ElementName"],
                    i["HomeDirectory"], i["LoginShell"]))
        except pywbem.cim_operations.CIMError, e:
            return (False, e.args[1])
        return (True, "")

    def listGroups(self):
        (inst_list, rparam) = self.__getGroupInstances()
        if not inst_list:
            return (False, "No groups found")
        for i in inst_list:
            sys.stdout.write("%s:%s\n" %
                (i["Name"], i["InstanceID"].split(":")[-1]))
        return (True, "")

    def listGroupMembers(self, member):
        (inst_list, rparam) = self.__getInstances(
            CuraUserClient.GROUP_CLASS_NAME, member)
        if not inst_list:
            return (False, "No such group '%s' found" % member)
        members = self.__getGroupMembers(inst_list)
        for m in members:
            sys.stdout.write("%s\n" % m)
        return (True, "")