1
0
mirror of https://github.com/dkmstr/openuds.git synced 2025-03-12 04:58:34 +03:00

* Fixing up a couple of minor things

* Adding checking of ldap of domain controller for machine removal on service release
This commit is contained in:
Adolfo Gómez 2013-02-15 03:34:53 +00:00
parent 50ff0c1da1
commit 140be8fc27
3 changed files with 118 additions and 3 deletions

View File

@ -14,6 +14,9 @@ from uds.core.ui.UserInterface import gui
from uds.core.managers.CryptoManager import CryptoManager from uds.core.managers.CryptoManager import CryptoManager
from uds.core import osmanagers from uds.core import osmanagers
from WindowsOsManager import WindowsOsManager, scrambleMsg from WindowsOsManager import WindowsOsManager, scrambleMsg
from uds.core.util import log
import dns.resolver
import ldap
import logging import logging
@ -26,7 +29,7 @@ class WinDomainOsManager(WindowsOsManager):
iconFile = 'wosmanager.png' iconFile = 'wosmanager.png'
# Apart form data from windows os manager, we need also domain and credentials # Apart form data from windows os manager, we need also domain and credentials
domain = gui.TextField(length=64, label = _('Domain'), order = 1, tooltip = _('Domain to join machines to (better use dns form of domain)'), required = True) domain = gui.TextField(length=64, label = _('Domain'), order = 1, tooltip = _('Domain to join machines to (use FQDN form, netbios name not allowed)'), required = True)
account = gui.TextField(length=64, label = _('Account'), order = 2, tooltip = _('Account with rights to add machines to domain'), required = True) account = gui.TextField(length=64, label = _('Account'), order = 2, tooltip = _('Account with rights to add machines to domain'), required = True)
password = gui.PasswordField(length=64, label = _('Password'), order = 3, tooltip = _('Password of the account'), required = True) password = gui.PasswordField(length=64, label = _('Password'), order = 3, tooltip = _('Password of the account'), required = True)
ou = gui.TextField(length=64, label = _('OU'), order = 4, tooltip = _('Organizational unit where to add machines in domain (check it before using it)')) ou = gui.TextField(length=64, label = _('OU'), order = 4, tooltip = _('Organizational unit where to add machines in domain (check it before using it)'))
@ -38,6 +41,8 @@ class WinDomainOsManager(WindowsOsManager):
if values != None: if values != None:
if values['domain'] == '': if values['domain'] == '':
raise osmanagers.OSManager.ValidationException(_('Must provide a domain!!!')) raise osmanagers.OSManager.ValidationException(_('Must provide a domain!!!'))
if values['domain'].find('.') == -1:
raise osmanagers.OSManager.ValidationException(_('Must provide domain in FQDN'))
if values['account'] == '': if values['account'] == '':
raise osmanagers.OSManager.ValidationException(_('Must provide an account to add machines to domain!!!')) raise osmanagers.OSManager.ValidationException(_('Must provide an account to add machines to domain!!!'))
if values['password'] == '': if values['password'] == '':
@ -52,10 +57,121 @@ class WinDomainOsManager(WindowsOsManager):
self._account = "" self._account = ""
self._password = "" self._password = ""
self._ou = self._ou.replace(' ', '')
if self._domain != '' and self._ou != '':
lpath = 'dc=' + ',dc='.join(self._domain.split('.'))
if self._ou.find(lpath) == -1:
self._ou += ',' + lpath
def __getLdapError(self, e):
logger.debug('Ldap Error: {0} {1}'.format(e, e.message))
_str = ''
if type(e.message) == dict:
#_str += e.message.has_key('info') and e.message['info'] + ',' or ''
_str += e.message.has_key('desc') and e.message['desc'] or ''
else :
_str += str(e)
return _str
def __connectLdap(self):
'''
Tries to connect to LDAP
Raises an exception if not found:
dns.resolver.NXDOMAIN
ldap.LDAPError
'''
servers = reversed(sorted(dns.resolver.query('_ldap._tcp.'+self._domain, 'SRV'), key=lambda i: i.priority * 10000 + i.weight))
for server in servers:
_str = ''
try:
uri = "%s://%s:%d" % ('ldap', str(server.target)[:-1], server.port)
logger.debug('URI: {0}'.format(uri))
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) # Disable certificate check
l = ldap.initialize(uri=uri)
l.set_option(ldap.OPT_REFERRALS, 0)
l.network_timeout = l.timeout = 5
l.protocol_version = ldap.VERSION3
l.simple_bind_s(who = self._account+'@'+self._domain, cred = self._password)
return l
except ldap.LDAPError as e:
_str = self.__getLdapError(e)
raise ldap.LDAPError(_str)
def release(self, service): def release(self, service):
'''
service is a db user service object
'''
super(WinDomainOsManager,self).release(service) super(WinDomainOsManager,self).release(service)
try:
ldap = self.__connectLdap()
except dns.resolver.NXDOMAIN: # No domain found, log it and pass
logger.warn('Could not find _ldap._tcp.'+self._domain)
log.doLog(service, log.WARN, "Could not remove machine from domain (_ldap._tcp.{0] not found)".format(self._domain), log.OSMANAGER);
except ldap.LDAPError as e:
log.doLog(service, log.WARN, "Could not remove machine from domain (invalid credentials for {0})".format(self._account), log.OSMANAGER);
# TODO: remove machine from active directory os, under ou or default location if not specified # TODO: remove machine from active directory os, under ou or default location if not specified
def check(self):
try:
l = self.__connectLdap()
except ldap.LDAPError as e:
return _('Check error: {0}').format(self.__getLdapError(e))
except dns.resolver.NXDOMAIN:
return [True, _('Could not find server parameters (_ldap._tcp.{0} can\'r be resolved)').format(self._domain)]
except Exception as e:
logger.exception('Exception ')
return [False, str(e)]
try:
r = l.search_st(self._ou, ldap.SCOPE_BASE)
except ldap.LDAPError as e:
return _('Check error: {0}').format(self.__getLdapError(e))
return _('Server check was successful')
@staticmethod
def test(env, data):
logger.debug('Test invoked')
try:
wd = WinDomainOsManager(env, data)
logger.debug(wd)
try:
l = wd.__connectLdap()
except ldap.LDAPError as e:
return [False, _('Could not access AD using LDAP ({0})').format(wd.__getLdapError(e))]
ou = wd._ou
if ou == '':
ou = 'cn=Computers,dc='+',dc='.join(wd._domain.split('.'))
logger.debug('Checking {0} with ou {1}'.format(wd._domain,ou))
r = l.search_st(ou, ldap.SCOPE_BASE)
logger.debug('Result of search: {0}'.format(r))
except ldap.LDAPError:
if wd._ou == '':
return [False, _('The default path {0} for computers was not found!!!').format(ou)]
else:
return [False, _('The ou path {0} was not found!!!').format(ou)]
except dns.resolver.NXDOMAIN:
return [True, _('Could not check parameters (_ldap._tcp.{0} can\'r be resolved)').format(wd._domain)]
except Exception as e:
logger.exception('Exception ')
return [False, str(e)]
return [True, _("All parameters seems to work fine.")]
def infoVal(self, service): def infoVal(self, service):
return 'domain:{0}\t{1}\t{2}\t{3}\t{4}'.format( self.getName(service), self._domain, self._ou, self._account, self._password) return 'domain:{0}\t{1}\t{2}\t{3}\t{4}'.format( self.getName(service), self._domain, self._ou, self._account, self._password)

View File

@ -111,7 +111,6 @@ def needs_credentials(xmlrpc_func):
cred = validateCredentials(request, credentials) cred = validateCredentials(request, credentials)
if cred is not None: if cred is not None:
logger.debug('Credentials valid, executing') logger.debug('Credentials valid, executing')
logger.debug('args: {0}'.format(args))
return xmlrpc_func(cred, *args, **kwargs) return xmlrpc_func(cred, *args, **kwargs)
raise AuthException(_('Credentials no longer valid')) raise AuthException(_('Credentials no longer valid'))
return _wrapped_xmlrcp_func return _wrapped_xmlrcp_func

View File

@ -61,7 +61,7 @@ def getDeployedServiceCounters(credentials, id, counter_type, since, to, points,
all = False all = False
val = [] val = []
for x in counters.getCounters(us, counter_type, since=since, to=to, limit=points, use_max=use_max, all=all): for x in counters.getCounters(us, counter_type, since=since, to=to, limit=points, use_max=use_max, all=all):
val.append({ 'stamp': x[0], 'value': x[1] }) val.append({ 'stamp': x[0], 'value': int(x[1]) })
if len(val) > 2: if len(val) > 2:
cache.put(cacheKey, cPickle.dumps(val).encode('zip'), 3600) cache.put(cacheKey, cPickle.dumps(val).encode('zip'), 3600)
else: else: