def _do_activate_quota(partitions, activate): fs = fstab.File() failed = [] for device in partitions: part = fs.find(spec=device) if not part: failed.append({ 'partitionDevice': partition.spec, 'success': False, 'message': _('Device could not be found') }) continue if activate: if not 'usrquota' in part.options: part.options.append('usrquota') fs.save() else: # operation successful: nothing to be done continue if part.type == 'xfs': failed.append(_activate_quota_xfs(part)) elif part.type in ('ext2', 'ext3'): failed.append(_activate_quota_ext(part, True)) else: if not 'usrquota' in part.options: continue else: part.options.remove('usrquota') fs.save() if part.type == 'xfs': failed.append(_activate_quota_xfs(part)) elif part.type in ('ext2', 'ext3'): failed.append(_activate_quota_ext(part, True)) return failed
def _check_error(self, request, partition_name): # TODO message = None try: fs = fstab.File() mt = mtab.File() except IOError as error: MODULE.error('Could not open %s' % error.filename) message = _('Could not open %s') % error.filename partition = fs.find(spec=partition_name) if partition: mounted_partition = mt.get(partition.spec) if mounted_partition: if 'usrquota' not in mounted_partition.options: MODULE.error('The following partition is mounted ' 'without quota support: %s' % partition_name) message = _('The following partition is mounted mounted ' 'without quota support: %s') % partition_name else: MODULE.error('The following partition is ' 'currently not mounted: %s' % partition_name) message = _('The following partition is currently ' 'not mounted: %s') % partition_name else: MODULE.error('No partition found (%s)' % partition_name) message = _('No partition found (%s)') % partition_name if message: request.status = MODULE_ERR self.finished(request.id, None, message)
def partitions_info(self, request): result = {} message = None try: fs = fstab.File() mt = mtab.File() except IOError as error: MODULE.error('Could not open %s' % error.filename) message = _('Could not open %s') % error.filename request.status = MODULE_ERR else: partition = fs.find(spec=request.options['partitionDevice']) if partition: mounted_partition = mt.get(partition.spec) if mounted_partition: result['mountPoint'] = mounted_partition.mount_point result['filesystem'] = mounted_partition.type result['options'] = mounted_partition.options request.status = SUCCESS else: request.status = MODULE_ERR message = _('This partition is currently not mounted') else: request.status = MODULE_ERR message = _('No partition found') self.finished(request.id, result, message)
def partitions_query(self, request): result = [] message = None try: fs = fstab.File() mt = mtab.File() except IOError as error: MODULE.error('Could not open %s' % error.filename) message = _('Could not open %s') % error.filename request.status = MODULE_ERR else: partitions = fs.get(['xfs', 'ext4', 'ext3', 'ext2'], False) for partition in partitions: list_entry = {} list_entry['partitionDevice'] = partition.spec list_entry['mountPoint'] = partition.mount_point list_entry['partitionSize'] = None list_entry['freeSpace'] = None list_entry['inUse'] = tools.quota_is_enabled(partition) mounted_partition = mt.get(partition.spec) if mounted_partition: partition_info = df.DeviceInfo(partition.mount_point) list_entry['partitionSize'] = tools.block2byte( partition_info.size(), 'GB', 1) list_entry['freeSpace'] = tools.block2byte( partition_info.free(), 'GB', 1) result.append(list_entry) request.status = SUCCESS self.finished(request.id, result, message)
def _do_activate_quota(partitions, activate): result = [] try: fs = fstab.File() except IOError as error: result.append({'partitionDevice': None, 'success': False, 'message': _('Could not open %s') % error.filename}) for device in partitions: fstab_entry = fs.find(spec=device) if not fstab_entry: result.append({'partitionDevice': device, 'success': False, 'message': _('Device could not be found')}) continue try: status = _do_activate_quota_partition(fs, fstab_entry, activate) except QuotaActivationError as exc: result.append({'partitionDevice': fstab_entry.spec, 'success': False, 'message': str(exc)}) continue if fstab_entry.mount_point == '/' and fstab_entry.type == 'xfs': try: enable_quota_in_kernel(activate) except QuotaActivationError as exc: result.append({'partitionDevice': fstab_entry.spec, 'success': False, 'message': str(exc)}) continue result.append(status) return result
def partitions_info(self, request): result = {} try: fs = fstab.File('/etc/fstab') mt = fstab.File('/etc/mtab') except IOError as error: MODULE.error('Could not open %s' % error.filename) raise UMC_Error(_('Could not open %s') % error.filename, 500) partition = fs.find(spec=request.options['partitionDevice']) if not partition: raise UMC_Error(_('No partition found')) mounted_partition = mt.find(spec=partition.spec) if not mounted_partition: raise UMC_Error(_('This partition is currently not mounted')) result['mountPoint'] = mounted_partition.mount_point result['filesystem'] = mounted_partition.type result['options'] = mounted_partition.options self.finished(request.id, result)
def usrquota_is_active(fstab_entry, mt=None): if not mt: try: mt = fstab.File('/etc/mtab') except IOError as error: raise QuotaActivationError(_('Could not open %s') % error.filename) mtab_entry = mt.find(spec=fstab_entry.spec) if not mtab_entry: raise QuotaActivationError(_('Device is not mounted')) # First remount the partition with option "usrquota" if it isn't already return bool(mtab_entry.hasopt('usrquota'))
def repquota(partition, callback): # find filesystem type fs = fstab.File() part = fs.find(spec=partition) args = [] if part.type == 'xfs': args = ['--format', 'xfs'] # -C == do not try to resolve all users at once # -v == verbose cmd = ['/usr/sbin/repquota', '-C', '-v', partition] + args proc = notifier.popen.RunIt(cmd, stdout=True) proc.signal_connect('finished', callback) proc.start()
def _check_error(self, request, partition_name): try: fs = fstab.File('/etc/fstab') mt = fstab.File('/etc/mtab') except IOError as error: MODULE.error('Could not open %s' % error.filename) raise UMC_Error(_('Could not open %s') % error.filename, 500) partition = fs.find(spec=partition_name) if partition: mounted_partition = mt.find(spec=partition.spec) if mounted_partition: if not mounted_partition.hasopt( 'usrquota') and not mounted_partition.hasopt( 'usrjquota=aquota.user'): raise UMC_Error( _('The following partition is mounted without quota support: %s' ) % partition_name) else: raise UMC_Error( _('The following partition is currently not mounted: %s') % partition_name) else: raise UMC_Error(_('No partition found (%s)') % partition_name)
def partitions_query(self, request): result = [] try: fs = fstab.File('/etc/fstab') mt = fstab.File('/etc/mtab') except IOError as error: MODULE.error('Could not open %s' % error.filename) raise UMC_Error(_('Could not open %s') % error.filename, 500) partitions = fs.get(['xfs', 'ext4', 'ext3', 'ext2'], False) for partition in partitions: list_entry = {} list_entry['partitionDevice'] = partition.spec list_entry['mountPoint'] = partition.mount_point list_entry['partitionSize'] = None list_entry['freeSpace'] = None list_entry['inUse'] = tools.quota_is_enabled(partition) mounted_partition = mt.find(spec=partition.spec) if mounted_partition: partition_info = df.DeviceInfo(partition.mount_point) list_entry['partitionSize'] = tools.block2byte(partition_info.size(), 'GB', 1) list_entry['freeSpace'] = tools.block2byte(partition_info.free(), 'GB', 1) result.append(list_entry) self.finished(request.id, result)
def _users_query(self, pid, status, callbackResult, id, partition, request): '''This function is invoked when a repquota process has died and there is output to parse that is restructured as UMC Dialog''' # general information devs = fstab.File() devs.find(spec=partition) # skip header header = 0 try: while not callbackResult[header].startswith('----'): header += 1 except IndexError: pass quotas = tools.repquota_parse(partition, callbackResult[header + 1:]) result = [q for q in quotas if request.options['filter'].match(q['user'])] self.finished(request.id, result)
def _check_error(self, request, partition_name): # TODO try: fs = fstab.File() mt = mtab.File() except IOError as error: MODULE.error('Could not open %s' % error.filename) raise ValueError(_('Could not open %s') % error.filename) partition = fs.find(spec=partition_name) if partition: mounted_partition = mt.get(partition.spec) if mounted_partition: if 'usrquota' not in mounted_partition.options and 'usrjquota=aquota.user' not in mounted_partition.options: raise UMC_Error(_('The following partition is mounted without quota support: %s') % partition_name) else: raise UMC_Error(_('The following partition is currently not mounted: %s') % partition_name) else: raise UMC_Error(_('No partition found (%s)') % partition_name)
def repquota(partition, callback, user=None): args = '' # find filesystem type fs = fstab.File() part = fs.find(spec=partition) if part.type == 'xfs': args += '--format xfs ' # grep a single user if user: args += "| /bin/grep '^%s '" % user # -C == do not try to resolve all users at once # -v == verbose cmd = '/usr/sbin/repquota -C -v %s %s' % (partition, args) proc = notifier.popen.Shell(cmd, stdout=True) proc.signal_connect('finished', callback) proc.start()
def _modify_extfs_option(options=[], activate=True, devices=[]): fs = fstab.File() target_partitions = [] if devices: for device in devices: fstab_partition = fs.find(spec=device) if fstab_partition and fstab_partition.type in ('ext3', 'ext4'): target_partitions.append(fstab_partition) else: print 'Device could not be found: %s' % device else: for fstype in ('ext2', 'ext3', 'ext4'): for fstab_partition in fs.get(fstype, ignore_root=False): target_partitions.append(fstab_partition) for fstab_partition in target_partitions: if _do_modify_extfs_option(fstab_partition, options, activate): fs.save() if subprocess.call(('mount', '-o', 'remount', fstab_partition.spec)): print 'Remounting partition failed: %s' % fstab_partition.spec
def _users_query(self, pid, status, callbackResult, id, partition, request): '''This function is invoked when a repquota process has died and there is output to parse that is restructured as UMC Dialog''' # general information devs = fstab.File() part = devs.find(spec=partition) # skip header try: header = 0 while not callbackResult[header].startswith('----'): header += 1 except: pass quotas = tools.repquota_parse(partition, callbackResult[header + 1:]) result = [] for list_entry in quotas: if fnmatch(list_entry['user'], request.options['filter']): result.append(list_entry) request.status = SUCCESS self.finished(request.id, result)
def _do_activate_quota(partitions, activate): result = [] try: fs = fstab.File() except IOError as error: raise UMC_Error(_('Could not open %s') % error.filename, 500) failed = [] for device in partitions: fstab_entry = fs.find(spec=device) if not fstab_entry: failed.append(_('Device %r could not be found') % (device, )) continue try: status = _do_activate_quota_partition(fs, fstab_entry, activate) except QuotaActivationError as exc: failed.append('%s: %s' % (fstab_entry.spec, exc)) continue if fstab_entry.mount_point == '/' and fstab_entry.type == 'xfs': try: enable_quota_in_kernel(activate) except QuotaActivationError as exc: failed.append('%s: %s' % (fstab_entry.spec, exc)) continue result.append(status) if failed: message = _('Failed to activate quota support: ') if activate else _( 'Failed to deactivate quota support: ') message += '\n'.join(failed) raise UMC_Error(message) message = _('Quota support successfully activated') if activate else _( 'Quota support successfully deactivated') raise UMC_Error(message, 200, {'objects': result})
def _users_query(self, pid, status, callbackResult, partition, request): '''This function is invoked when a repquota process has died and there is output to parse that is restructured as UMC Dialog''' if status != 0: MODULE.warn('repquota failed with exit code: %s' % (status, )) # general information devs = fstab.File() devs.find(spec=partition) # skip header header = 0 try: while not callbackResult[header].startswith(b'----'): header += 1 except IndexError: pass output = [ x.decode('UTF-8', 'replace') for x in callbackResult[header + 1:] ] quotas = tools.repquota_parse(partition, output) result = [ q for q in quotas if request.options['filter'].match(q['user']) ] self.finished(request.id, result)