Esempio n. 1
0
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
Esempio n. 2
0
 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)
Esempio n. 5
0
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)
Esempio n. 7
0
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'))
Esempio n. 8
0
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()
Esempio n. 9
0
    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)
Esempio n. 11
0
	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)
Esempio n. 12
0
	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
Esempio n. 15
0
    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)
Esempio n. 16
0
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})
Esempio n. 17
0
    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)