def test_locking(self): """Test inter-process-locking.""" delay = 1.0 ucr = ConfigRegistry() read_end, write_end = os.pipe() pid1 = os.fork() if not pid1: # child 1 os.close(read_end) ucr.lock() os.write(write_end, '1') time.sleep(delay) ucr.unlock() os._exit(0) pid2 = os.fork() if not pid2: # child 2 os.close(write_end) os.read(read_end, 1) ucr.lock() time.sleep(delay) ucr.unlock() os._exit(0) os.close(read_end) os.close(write_end) timeout = time.time() + delay * 3 while time.time() < timeout: pid, status = os.waitpid(0, os.WNOHANG) if (pid, status) == (0, 0): time.sleep(0.1) elif pid == pid1: self.assertTrue(os.WIFEXITED(status)) self.assertEqual(os.WEXITSTATUS(status), 0) pid1 = None elif pid == pid2: self.assertTrue(os.WIFEXITED(status)) self.assertEqual(os.WEXITSTATUS(status), 0) self.assertEqual(pid1, None, 'child 2 exited before child 1') break else: self.fail('Unknown child status: %d, %x' % (pid, status)) else: self.fail('Timeout')
def handler_unset(args, opts=dict()): """ Unset config registry variables in args. """ current_scope = ConfigRegistry.NORMAL reg = None if opts.get('ldap-policy', False): current_scope = ConfigRegistry.LDAP reg = ConfigRegistry(write_registry=current_scope) elif opts.get('force', False): current_scope = ConfigRegistry.FORCED reg = ConfigRegistry(write_registry=current_scope) elif opts.get('schedule', False): current_scope = ConfigRegistry.SCHEDULE reg = ConfigRegistry(write_registry=current_scope) else: reg = ConfigRegistry() reg.lock() try: reg.load() handlers = ConfigHandlers() handlers.load() changed = {} for arg in args: if reg.has_key(arg, write_registry_only=True): oldvalue = reg[arg] print 'Unsetting %s' % arg del reg[arg] changed[arg] = (oldvalue, '') k = reg.get(arg, None, getscope=True) replog('unset', current_scope, reg, arg, oldvalue) if k and k[0] > current_scope: print >> sys.stderr, \ 'W: %s is still set in scope "%s"' % \ (arg, SCOPE[k[0]]) else: msg = "W: The config registry variable '%s' does not exist" print >> sys.stderr, msg % (arg,) reg.save() finally: reg.unlock() handlers(changed.keys(), (reg, changed))
def handler_unset(args, opts=dict()): """ Unset config registry variables in args. """ current_scope = ConfigRegistry.NORMAL reg = None if opts.get('ldap-policy', False): current_scope = ConfigRegistry.LDAP reg = ConfigRegistry(write_registry=current_scope) elif opts.get('force', False): current_scope = ConfigRegistry.FORCED reg = ConfigRegistry(write_registry=current_scope) elif opts.get('schedule', False): current_scope = ConfigRegistry.SCHEDULE reg = ConfigRegistry(write_registry=current_scope) else: reg = ConfigRegistry() reg.lock() try: reg.load() handlers = ConfigHandlers() handlers.load() changed = {} for arg in args: if reg.has_key(arg, write_registry_only=True): oldvalue = reg[arg] print 'Unsetting %s' % arg del reg[arg] changed[arg] = (oldvalue, '') k = reg.get(arg, None, getscope=True) replog('unset', current_scope, reg, arg, oldvalue) if k and k[0] > current_scope: print >> sys.stderr, \ 'W: %s is still set in scope "%s"' % \ (arg, SCOPE[k[0]]) else: msg = "W: The config registry variable '%s' does not exist" print >> sys.stderr, msg % (arg, ) reg.save() finally: reg.unlock() handlers(changed.keys(), (reg, changed))
def handler_set(args, opts=dict(), quiet=False): """ Set config registry variables in args. Args is an array of strings 'key=value' or 'key?value'. """ handlers = ConfigHandlers() handlers.load() current_scope = ConfigRegistry.NORMAL reg = None if opts.get('ldap-policy', False): current_scope = ConfigRegistry.LDAP reg = ConfigRegistry(write_registry=current_scope) elif opts.get('force', False): current_scope = ConfigRegistry.FORCED reg = ConfigRegistry(write_registry=current_scope) elif opts.get('schedule', False): current_scope = ConfigRegistry.SCHEDULE reg = ConfigRegistry(write_registry=current_scope) else: reg = ConfigRegistry() reg.lock() try: reg.load() changed = {} for arg in args: sep_set = arg.find('=') # set sep_def = arg.find('?') # set if not already set if sep_set == -1 and sep_def == -1: print >> sys.stderr, \ "W: Missing value for config registry variable '%s'" % \ (arg,) continue else: if sep_set > 0 and sep_def == -1: sep = sep_set elif sep_def > 0 and sep_set == -1: sep = sep_def else: sep = min(sep_set, sep_def) key = arg[0:sep] value = arg[sep + 1:] old = reg.get(key) if (old is None or sep == sep_set) and validate_key(key): if not quiet: if reg.has_key(key, write_registry_only=True): print 'Setting %s' % key else: print 'Create %s' % key k = reg.get(key, None, getscope=True) if k and k[0] > current_scope: print >> sys.stderr, \ 'W: %s is overridden by scope "%s"' % \ (key, SCOPE[k[0]]) reg[key] = value changed[key] = (old, value) replog('set', current_scope, reg, key, old, value) else: if not quiet: if old is not None: print 'Not updating %s' % key else: print 'Not setting %s' % key reg.save() finally: reg.unlock() handlers(changed.keys(), (reg, changed))
def handler_set(args, opts=dict(), quiet=False): """ Set config registry variables in args. Args is an array of strings 'key=value' or 'key?value'. """ handlers = ConfigHandlers() handlers.load() current_scope = ConfigRegistry.NORMAL reg = None if opts.get('ldap-policy', False): current_scope = ConfigRegistry.LDAP reg = ConfigRegistry(write_registry=current_scope) elif opts.get('force', False): current_scope = ConfigRegistry.FORCED reg = ConfigRegistry(write_registry=current_scope) elif opts.get('schedule', False): current_scope = ConfigRegistry.SCHEDULE reg = ConfigRegistry(write_registry=current_scope) else: reg = ConfigRegistry() reg.lock() try: reg.load() changed = {} for arg in args: sep_set = arg.find('=') # set sep_def = arg.find('?') # set if not already set if sep_set == -1 and sep_def == -1: print >> sys.stderr, \ "W: Missing value for config registry variable '%s'" % \ (arg,) continue else: if sep_set > 0 and sep_def == -1: sep = sep_set elif sep_def > 0 and sep_set == -1: sep = sep_def else: sep = min(sep_set, sep_def) key = arg[0:sep] value = arg[sep + 1:] old = reg.get(key) if (old is None or sep == sep_set) and validate_key(key): if not quiet: if reg.has_key(key, write_registry_only=True): print 'Setting %s' % key else: print 'Create %s' % key k = reg.get(key, None, getscope=True) if k and k[0] > current_scope: print >> sys.stderr, \ 'W: %s is overridden by scope "%s"' % \ (key, SCOPE[k[0]]) reg[key] = value changed[key] = (old, value) replog('set', current_scope, reg, key, old, value) else: if not quiet: if old is not None: print 'Not updating %s' % key else: print 'Not setting %s' % key reg.save() finally: reg.unlock() handlers(changed.keys(), (reg, changed))