|
34 |
import cPickle |
34 |
import cPickle |
35 |
import copy |
35 |
import copy |
36 |
import os |
36 |
import os |
|
|
37 |
import re |
37 |
import random |
38 |
import random |
38 |
import string |
39 |
import string |
39 |
import sys |
40 |
import sys |
|
569 |
_d = ud.function('ldap._get_config_items') |
570 |
_d = ud.function('ldap._get_config_items') |
570 |
return self.config.items(section) |
571 |
return self.config.items(section) |
571 |
|
572 |
|
572 |
def _save_rejected_ucs(self, filename, dn): |
573 |
def _save_rejected_ucs(self, filename, dn, resync=True, reason=''): |
573 |
_d = ud.function('ldap._save_rejected_ucs') |
574 |
_d = ud.function('ldap._save_rejected_ucs') |
|
|
575 |
if not resync: |
576 |
# Note that unescaped <> are invalid in DNs. See also: |
577 |
# `_list_rejected_ucs()`. |
578 |
dn = '<NORESYNC{}>;{}'.format('=' + reason if reason else '', dn) |
574 |
modstring_dn = univention.s4connector.s4.compatible_modstring(dn) |
579 |
modstring_dn = univention.s4connector.s4.compatible_modstring(dn) |
575 |
self._set_config_option('UCS rejected', filename, modstring_dn) |
580 |
self._set_config_option('UCS rejected', filename, modstring_dn) |
576 |
|
581 |
|
|
582 |
_d = ud.function('ldap._remove_rejected_ucs') |
587 |
_d = ud.function('ldap._remove_rejected_ucs') |
583 |
self._remove_config_option('UCS rejected', filename) |
588 |
self._remove_config_option('UCS rejected', filename) |
584 |
|
589 |
|
|
|
590 |
def list_rejected_ucs(self, filter_noresync=False): |
591 |
rejected = self._get_config_items('UCS rejected') |
592 |
if filter_noresync: |
593 |
no_resync = re.compile('^<NORESYNC(=.*?)?>;') |
594 |
return [(fn, dn) for (fn, dn) in rejected if |
595 |
no_resync.match(dn) is None] |
596 |
return rejected |
597 |
|
585 |
def _list_rejected_ucs(self): |
598 |
def _list_rejected_ucs(self): |
586 |
_d = ud.function('ldap._list_rejected_ucs') |
599 |
_d = ud.function('ldap._list_rejected_ucs') |
587 |
result = [] |
600 |
return self.list_rejected_ucs(filter_noresync=True) |
588 |
for i in self._get_config_items('UCS rejected'): |
|
|
589 |
result.append(i) |
590 |
return result |
591 |
|
601 |
|
592 |
def _list_rejected_filenames_ucs(self): |
602 |
def _list_rejected_filenames_ucs(self): |
593 |
_d = ud.function('ldap._list_rejected_filenames_ucs') |
603 |
_d = ud.function('ldap._list_rejected_filenames_ucs') |
594 |
result = [] |
604 |
return [fn for (fn, dn) in self.list_rejected_ucs()] |
595 |
for filename, dn in self._get_config_items('UCS rejected'): |
|
|
596 |
result.append(filename) |
597 |
return result |
598 |
|
599 |
def list_rejected_ucs(self): |
600 |
return self._get_config_items('UCS rejected') |
601 |
|
605 |
|
602 |
def _encode_dn_as_config_option(self, dn): |
606 |
def _encode_dn_as_config_option(self, dn): |
603 |
return dn |
607 |
return dn |
|
748 |
return True # file not found so there's nothing to sync |
752 |
return True # file not found so there's nothing to sync |
749 |
except (cPickle.UnpicklingError, EOFError) as e: |
753 |
except (cPickle.UnpicklingError, EOFError) as e: |
750 |
message = 'file emtpy' if isinstance(e, EOFError) else e.message |
754 |
message = 'file emtpy' if isinstance(e, EOFError) else e.message |
751 |
ud.debug(ud.LDAP, ud.WARN, |
755 |
ud.debug(ud.LDAP, ud.ERROR, |
752 |
'__sync_file_from_ucs: invalid pickle file {}: {}'.format(filename, message)) |
756 |
'__sync_file_from_ucs: invalid pickle file {}: {}'.format(filename, message)) |
753 |
# ignore corrupted pickle file, but save as rejected to not try again |
757 |
# ignore corrupted pickle file, but save as rejected to not try again |
754 |
self._save_rejected_ucs(filename, 'unknown') |
758 |
self._save_rejected_ucs(filename, 'unknown', resync=False, reason='broken file') |
755 |
return False |
759 |
return False |
756 |
|
760 |
|
757 |
if dn == 'cn=Subschema': |
761 |
if dn == 'cn=Subschema': |
|
1098 |
continue # file not found so there's nothing to sync |
1102 |
continue # file not found so there's nothing to sync |
1099 |
except (cPickle.UnpicklingError, EOFError) as e: |
1103 |
except (cPickle.UnpicklingError, EOFError) as e: |
1100 |
message = 'file emtpy' if isinstance(e, EOFError) else e.message |
1104 |
message = 'file emtpy' if isinstance(e, EOFError) else e.message |
1101 |
ud.debug(ud.LDAP, ud.WARN, |
1105 |
ud.debug(ud.LDAP, ud.ERROR, |
1102 |
'poll_ucs: invalid pickle file {}: {}'.format(filename, message)) |
1106 |
'poll_ucs: invalid pickle file {}: {}'.format(filename, message)) |
1103 |
# ignore corrupted pickle file, but save as rejected to not try again |
1107 |
# ignore corrupted pickle file, but save as rejected to not try again |
1104 |
self._save_rejected_ucs(filename, 'unknown') |
1108 |
self._save_rejected_ucs(filename, 'unknown', resync=False, reason='broken file') |
1105 |
continue |
1109 |
continue |
1106 |
|
1110 |
|
1107 |
for i in [0, 1]: # do it twice if the LDAP connection was closed |
1111 |
for i in [0, 1]: # do it twice if the LDAP connection was closed |
1108 |
- |
|
|