def __which_job_is_running(self): # first check running at jobs for atjob in atjobs.list(True): for job, inst in INSTALLERS.iteritems(): cmd = inst['command'].split('%')[0] if cmd in atjob.command: self._current_job = job try: self._logfile_start_line = int( atjob.comments.get('lines', 0)) except ValueError: pass return job # no atjob found, parse process list (if univention-upgrade was started via CLI) commands = [ ('/usr/share/univention-updater/univention-updater-umc-dist-upgrade', 'distupgrade'), ('/usr/share/univention-updater/univention-updater', 'release'), ('/usr/sbin/univention-upgrade', 'distupgrade' ) # we don't know if it is a dist-upgrade or a release upgrade ] for cmd, job in commands: for process in psutil.process_iter(): try: cmdline = process.cmdline() if callable( process.cmdline) else process.cmdline except psutil.NoSuchProcess: pass if cmd in cmdline: self._current_job = job self._logfile_start_line = 0 return job return ''
def settings_get(self): """Return the current settings for a room""" if not self._italc.school or not self._italc.room: raise UMC_Error('no room selected') ucr.load() rule = ucr.get('proxy/filter/room/%s/rule' % self._italc.room, 'none') if rule == self._username: rule = 'custom' shareMode = ucr.get('samba/sharemode/room/%s' % self._italc.room, 'all') # load custom rule: key_prefix = 'proxy/filter/setting-user/%s/domain/whitelisted/' % self._username custom_rules = [] for key in ucr: if key.startswith(key_prefix): custom_rules.append(ucr[key]) printMode = ucr.get('samba/printmode/room/%s' % self._italc.room, 'default') # find AT jobs for the room and execute it to remove current settings jobs = atjobs.list(extended=True) for job in jobs: if job.comments.get(Instance.ATJOB_KEY, False) == self._italc.room: if job.execTime >= datetime.datetime.now(): self._ruleEndAt = job.execTime break else: self._ruleEndAt = None if rule == 'none' and shareMode == 'all' and printMode == 'default': self._ruleEndAt = None # find end of lesson period = self._lessons.current if period is None: if self._lessons.next: # between two lessons period = self._lessons.next.end else: # school is out ... 1 hour should be good (FIXME: configurable?) period = datetime.datetime.now() + datetime.timedelta(hours=1) period = period.time() else: period = period.end if self._ruleEndAt: time = self._ruleEndAt.time() for lesson in self._lessons.lessons: if time == lesson.begin: period = lesson break return { 'internetRule': rule, 'customRule': '\n'.join(custom_rules), 'shareMode': shareMode, 'printMode': printMode, 'period': str(period), }
def test_time_settings(self, client): self.aquire_room(client) settings = self.get_room_settings(client) period = datetime.time.strftime( (datetime.datetime.now() + datetime.timedelta(0, 120)).time(), '%H:%M') new_settings = { 'customRule': '', 'printMode': 'none', 'internetRule': 'none', 'shareMode': 'home', 'period': period } ula_length = len(ula.list()) time_out = 30 # seconds self.set_room_settings(client, new_settings) for i in xrange(time_out, 0, -1): print i if len(ula.list()) > ula_length: break else: time.sleep(1) continue # Checking Atjobs list self.check_atjobs(period, True) # TODO FAILS because of Bug #35195 # self.check_displayTime(client, period) print '*** Waiting 2 mins for settings to expire.............' time.sleep(2 * 60 + 2) current_settings = self.get_room_settings(client) # Time field is not considered in the comparision current_settings['period'] = settings['period'] if current_settings != settings: utils.fail( 'Current settings (%r) are not reset back after the time out, expected (%r)' % (current_settings, settings)) # Checking Atjobs list self.check_atjobs(period, False)
def check_atjobs(self, period, expected_existence): exist = False for item in ula.list(): if period == datetime.time.strftime(item.execTime.time(), '%H:%M'): exist = True break if exist == expected_existence: print 'Atjob result at(%r) existance is expected (%r)' % (period, exist) else: print 'FAIL: Atjob result at(%r) is unexpected (should_exist=%r exists=%r)' % ( period, expected_existence, exist) print 'Found the following atjobs:' for i, item in enumerate(ula.list()): print 'Job %s: %s owner=%s\n%s' % (i, item, item.owner, item.command) utils.fail( 'Atjob result at(%r) is unexpected (should_exist=%r exists=%r)' % (period, expected_existence, exist))
def _settings_set(self, printMode, internetRule, shareMode, period=None, customRule=None): """Defines settings for a room""" if not self._italc.school or not self._italc.room: raise UMC_Error('no room selected') # find AT jobs for the room and execute it to remove current settings jobs = atjobs.list(extended=True) for job in jobs: if job.comments.get(Instance.ATJOB_KEY, False) == self._italc.room: job.rm() subprocess.call(shlex.split(job.command)) roomInfo = _readRoomInfo(self._italc.roomDN) in_exam_mode = roomInfo.get('exam') # for the exam mode, remove current settings before setting new ones if in_exam_mode and roomInfo.get('cmd'): MODULE.info('unsetting room settings for exam (%s): %s' % (roomInfo['exam'], roomInfo['cmd'])) try: subprocess.call(shlex.split(roomInfo['cmd'])) except (OSError, IOError): MODULE.warn( 'Failed to reinitialize current room settings: %s' % roomInfo['cmd']) _updateRoomInfo(self._italc.roomDN, cmd=None) # reset to defaults. No atjob is necessary. if internetRule == 'none' and shareMode == 'all' and printMode == 'default': self._ruleEndAt = None self.reset_smb_connections() self.reload_cups() return # collect new settings vset = {} vappend = {} vunset = [] vunset_now = [] vextract = [] hosts = self._italc.ipAddresses(students_only=True) # print mode if printMode in ('none', 'all'): vextract.append('samba/printmode/hosts/%s' % printMode) vappend[vextract[-1]] = hosts vextract.append('cups/printmode/hosts/%s' % printMode) vappend[vextract[-1]] = hosts vunset.append('samba/printmode/room/%s' % self._italc.room) vset[vunset[-1]] = printMode else: vunset_now.append('samba/printmode/room/%s' % self._italc.room) # share mode if shareMode == 'home': vunset.append('samba/sharemode/room/%s' % self._italc.room) vset[vunset[-1]] = shareMode vextract.append('samba/othershares/hosts/deny') vappend[vextract[-1]] = hosts vextract.append('samba/share/Marktplatz/hosts/deny') vappend[vextract[-1]] = hosts else: vunset_now.append('samba/sharemode/room/%s' % self._italc.room) # internet rule if internetRule != 'none': vextract.append('proxy/filter/room/%s/ip' % self._italc.room) vappend[vextract[-1]] = hosts if internetRule == 'custom': # remove old rules i = 1 while True: var = 'proxy/filter/setting-user/%s/domain/whitelisted/%d' % ( self._username, i) if var in ucr: vunset_now.append(var) i += 1 else: break vunset.append('proxy/filter/room/%s/rule' % self._italc.room) vset[vunset[-1]] = self._username vset['proxy/filter/setting-user/%s/filtertype' % self._username] = 'whitelist-block' i = 1 for domain in (customRule or '').split('\n'): MODULE.info('Setting whitelist entry for domain %s' % domain) if not domain: continue parsed = urlparse.urlsplit(domain) MODULE.info('Setting whitelist entry for domain %s' % str(parsed)) if parsed.netloc: vset[ 'proxy/filter/setting-user/%s/domain/whitelisted/%d' % (self._username, i)] = parsed.netloc i += 1 elif parsed.path: vset[ 'proxy/filter/setting-user/%s/domain/whitelisted/%d' % (self._username, i)] = parsed.path i += 1 else: vunset.append('proxy/filter/room/%s/rule' % self._italc.room) vset[vunset[-1]] = internetRule else: vunset_now.append('proxy/filter/room/%s/ip' % self._italc.room) vunset_now.append('proxy/filter/room/%s/rule' % self._italc.room) # write configuration # remove old values handler_unset(vunset_now) # append values ucr.load() MODULE.info('Merging UCR variables') for key, value in vappend.items(): if ucr.get(key): old = set(ucr[key].split(' ')) MODULE.info('Old value: %s' % old) else: old = set() MODULE.info('Old value empty') new = set(value) MODULE.info('New value: %s' % new) new = old.union(new) MODULE.info('Merged value of %s: %s' % (key, new)) if not new: MODULE.info('Unset variable %s' % key) vunset.append(key) else: vset[key] = ' '.join(new) # Workaround for bug 30450: # if samba/printmode/hosts/none is not set but samba/printmode/hosts/all then all other hosts # are unable to print on samba shares. Solution: set empty value for .../none if no host is on deny list. varname = 'samba/printmode/hosts/none' if varname not in vset: ucr.load() if not ucr.get(varname): vset[varname] = '""' else: # remove empty items ('""') in list vset[varname] = ' '.join( [x for x in vset[varname].split(' ') if x != '""']) if varname in vunset: vunset.remove(varname) # set values ucr_vars = sorted('%s=%s' % x for x in vset.items()) MODULE.info('Writing room rules: %s' % '\n'.join(ucr_vars)) handler_set(ucr_vars) # create at job to remove settings unset_vars = ['-r %s' % quote(x) for x in vunset] MODULE.info('Will remove: %s' % ' '.join(unset_vars)) extract_vars = ['-e %s' % quote(x) for x in vextract] MODULE.info('Will extract: %s' % ' '.join(extract_vars)) cmd = '/usr/share/ucs-school-umc-computerroom/ucs-school-deactivate-rules %s %s %s' % ( ' '.join(unset_vars), ' '.join(extract_vars), ' '.join( quote(x) for x in hosts)) MODULE.info('command for reinitialization is: %s' % (cmd, )) if in_exam_mode: # Command for the exam mode to be executed manually when changing the settings again... _updateRoomInfo(self._italc.roomDN, cmd=cmd) else: starttime = datetime.datetime.now() MODULE.info('Now: %s' % starttime) MODULE.info('Endtime: %s' % period) starttime = starttime.replace(hour=period.hour, minute=period.minute, second=0, microsecond=0) while starttime < datetime.datetime.now( ): # prevent problems due to intra-day limit starttime += datetime.timedelta(days=1) # AT job for the normal case MODULE.info('Remove settings at %s' % (starttime, )) atjobs.add(cmd, starttime, {Instance.ATJOB_KEY: self._italc.room}) self._ruleEndAt = starttime self.reset_smb_connections() self.reload_cups()