def _stats(params): from contacts import contactsdb from p2p import contact_status from lib import diskspace result = {} result['suppliers'] = contactsdb.num_suppliers() result['max_suppliers'] = settings.getSuppliersNumberDesired() result['online_suppliers'] = contact_status.countOnlineAmong( contactsdb.suppliers()) result['customers'] = contactsdb.num_customers() result['bytes_donated'] = settings.getDonatedBytes() result['value_donated'] = diskspace.MakeStringFromBytes( settings.getDonatedBytes()) result['bytes_needed'] = settings.getNeededBytes() result['value_needed'] = diskspace.MakeStringFromBytes( settings.getNeededBytes()) result['bytes_used_total'] = backup_fs.sizebackups() result['value_used_total'] = diskspace.MakeStringFromBytes( backup_fs.sizebackups()) result['bytes_used_supplier'] = 0 if ( contactsdb.num_suppliers() == 0) else (int(backup_fs.sizebackups() / contactsdb.num_suppliers())) result['bytes_indexed'] = backup_fs.sizefiles() + backup_fs.sizefolders() result['files_count'] = backup_fs.numberfiles() result['folders_count'] = backup_fs.numberfolders() result['items_count'] = backup_fs.counter() result['timestamp'] = time.time() return { 'result': result, }
def __init__(self, supplier_idurl, customer_idurl, needed_bytes, key_id=None, queue_subscribe=True): """ """ self.supplier_idurl = supplier_idurl self.customer_idurl = customer_idurl self.needed_bytes = needed_bytes self.key_id = key_id self.queue_subscribe = queue_subscribe self.do_calculate_needed_bytes() name = 'supplier_%s_%s' % ( nameurl.GetName(self.supplier_idurl), diskspace.MakeStringFromBytes(self.needed_bytes).replace(' ', ''), ) self.request_packet_id = None self.callbacks = {} try: st = bpio.ReadTextFile(settings.SupplierServiceFilename( idurl=self.supplier_idurl, customer_idurl=self.customer_idurl, )).strip() except: st = 'DISCONNECTED' automat.Automat.__init__( self, name, state=st, debug_level=_DebugLevel, log_events=_Debug, log_transitions=_Debug, ) for cb in self.callbacks.values(): cb(self.supplier_idurl, self.state, self.state)
def __init__(self, supplier_idurl, customer_idurl, needed_bytes, key_id=None, queue_subscribe=True): """ """ self.supplier_idurl = supplier_idurl self.customer_idurl = customer_idurl self.needed_bytes = needed_bytes self.key_id = key_id self.queue_subscribe = queue_subscribe if self.needed_bytes is None: total_bytes_needed = diskspace.GetBytesFromString( settings.getNeededString(), 0) num_suppliers = -1 if self.customer_idurl == my_id.getLocalIDURL(): num_suppliers = settings.getSuppliersNumberDesired() else: known_ecc_map = contactsdb.get_customer_meta_info( customer_idurl).get('ecc_map') if known_ecc_map: num_suppliers = eccmap.GetEccMapSuppliersNumber( known_ecc_map) if num_suppliers > 0: self.needed_bytes = int( math.ceil(2.0 * total_bytes_needed / float(num_suppliers))) else: raise Exception( 'not possible to determine needed_bytes value to be requested from that supplier' ) # self.needed_bytes = int(math.ceil(2.0 * settings.MinimumNeededBytes() / float(settings.DefaultDesiredSuppliers()))) name = 'supplier_%s_%s' % ( nameurl.GetName(self.supplier_idurl), diskspace.MakeStringFromBytes(self.needed_bytes).replace(' ', ''), ) self.request_packet_id = None self.callbacks = {} try: st = bpio.ReadTextFile( settings.SupplierServiceFilename( idurl=self.supplier_idurl, customer_idurl=self.customer_idurl, )).strip() except: st = 'DISCONNECTED' automat.Automat.__init__( self, name, state=st, debug_level=_DebugLevel, log_events=_Debug, log_transitions=_Debug, ) for cb in self.callbacks.values(): cb(self.supplier_idurl, self.state, self.state)
def __init__(self, customer_idurl): """ Create customer_assistant() state machine for given customer. """ self.customer_idurl = customer_idurl self.donated_bytes = accounting.get_customer_quota(self.customer_idurl) name = "customer_%s_%s" % ( nameurl.GetName(self.customer_idurl), diskspace.MakeStringFromBytes(self.donated_bytes).replace(' ', ''), ) super(CustomerAssistant, self).__init__(name, 'AT_STARTUP', _DebugLevel, _Debug)
def getLabel(dirpath): """ A very smart way to show folder size - can change units, must use ``ask`` first. """ global _Dirs s = _Dirs.get(dirpath, '') if s not in ['counting size', 'not exist']: try: return diskspace.MakeStringFromBytes(int(s)) except: return str(s) return str(s)
def report_local_storage(): # TODO # if customers folder placed outside of BaseDir() # need to add: total = total + customers r = {} r['backups'] = bpio.getDirectorySize(settings.getLocalBackupsDir()) r['backups_str'] = diskspace.MakeStringFromBytes(r['backups']) r['temp'] = bpio.getDirectorySize(settings.getTempDir()) r['temp_str'] = diskspace.MakeStringFromBytes(r['temp']) r['customers'] = bpio.getDirectorySize(settings.getCustomersFilesDir()) r['customers_str'] = diskspace.MakeStringFromBytes(r['customers']) r['total'] = bpio.getDirectorySize(settings.GetBaseDir()) r['total_str'] = diskspace.MakeStringFromBytes(r['total']) dataDriveFreeSpace, dataDriveTotalSpace = diskusage.GetDriveSpace( settings.getCustomersFilesDir()) if dataDriveFreeSpace is None: dataDriveFreeSpace = 0 r['disktotal'] = int(dataDriveTotalSpace) r['disktotal_str'] = diskspace.MakeStringFromBytes(r['disktotal']) r['diskfree'] = int(dataDriveFreeSpace) r['diskfree_str'] = diskspace.MakeStringFromBytes(r['diskfree']) try: r['total_percent'] = misc.percent2string( float(r['total']) / float(r['disktotal']), 5) except: r['total_percent'] = '' try: r['diskfree_percent'] = misc.percent2string( float(r['diskfree']) / float(r['disktotal']), 5) except: r['diskfree_percent'] = '' return r
def report_consumed_storage(): result = {} result['suppliers_num'] = contactsdb.num_suppliers() result['needed'] = settings.getNeededBytes() result['needed_str'] = diskspace.MakeStringFromBytes(result['needed']) result['used'] = int(backup_fs.sizebackups() / 2) result['used_str'] = diskspace.MakeStringFromBytes(result['used']) result['available'] = result['needed'] - result['used'] result['available_str'] = diskspace.MakeStringFromBytes( result['available']) result['needed_per_supplier'] = 0 result['used_per_supplier'] = 0 result['available_per_supplier'] = 0 if result['suppliers_num'] > 0: result['needed_per_supplier'] = int( math.ceil(2.0 * result['needed'] / result['suppliers_num'])) result['used_per_supplier'] = int( math.ceil(2.0 * result['used'] / result['suppliers_num'])) result['available_per_supplier'] = result[ 'needed_per_supplier'] - result['used_per_supplier'] result['needed_per_supplier_str'] = diskspace.MakeStringFromBytes( result['needed_per_supplier']) result['used_per_supplier_str'] = diskspace.MakeStringFromBytes( result['used_per_supplier']) result['available_per_supplier_str'] = diskspace.MakeStringFromBytes( result['available_per_supplier']) try: result['used_percent'] = misc.percent2string( float(result['used']) / float(result['needed'])) except: result['used_percent'] = '0%' return result
def __init__(self, supplier_idurl, customer_idurl, needed_bytes, key_id=None, queue_subscribe=True): """ """ self.supplier_idurl = supplier_idurl self.customer_idurl = customer_idurl self.needed_bytes = needed_bytes self.key_id = key_id self.queue_subscribe = queue_subscribe if self.needed_bytes is None: total_bytes_needed = diskspace.GetBytesFromString( settings.getNeededString(), 0) num_suppliers = settings.getSuppliersNumberDesired() if num_suppliers > 0: self.needed_bytes = int( math.ceil(2.0 * total_bytes_needed / float(num_suppliers))) else: self.needed_bytes = int( math.ceil(2.0 * settings.MinimumNeededBytes() / float(settings.DefaultDesiredSuppliers()))) name = 'supplier_%s_%s' % ( nameurl.GetName(self.supplier_idurl), diskspace.MakeStringFromBytes(self.needed_bytes).replace(' ', ''), ) self.request_packet_id = None self.callbacks = {} try: st = bpio.ReadTextFile( settings.SupplierServiceFilename( idurl=self.supplier_idurl, customer_idurl=self.customer_idurl, )).strip() except: st = 'DISCONNECTED' automat.Automat.__init__( self, name, state=st, debug_level=_DebugLevel, log_events=_Debug, log_transitions=_Debug, ) for cb in self.callbacks.values(): cb(self.supplier_idurl, self.state, self.state)
def __init__(self, customer_idurl): """ Create customer_assistant() state machine for given customer. """ self.customer_idurl = customer_idurl self.donated_bytes = accounting.get_customer_quota( self.customer_idurl) or 0 name = "customer_%s_%s" % ( nameurl.GetName(self.customer_idurl), diskspace.MakeStringFromBytes(self.donated_bytes).replace(' ', ''), ) super(CustomerAssistant, self).__init__( name=name, state='AT_STARTUP', debug_level=_DebugLevel, log_events=False, log_transitions=_Debug, )
def __init__(self, supplier_idurl, customer_idurl, needed_bytes): """ """ self.supplier_idurl = supplier_idurl self.customer_idurl = customer_idurl self.needed_bytes = needed_bytes if self.needed_bytes is None: total_bytes_needed = diskspace.GetBytesFromString( settings.getNeededString(), 0) num_suppliers = settings.getSuppliersNumberDesired() if num_suppliers > 0: self.needed_bytes = int( math.ceil(2.0 * total_bytes_needed / float(num_suppliers))) else: self.needed_bytes = int( math.ceil(2.0 * settings.MinimumNeededBytes() / float(settings.DefaultDesiredSuppliers()))) name = 'supplier_%s_%s' % ( nameurl.GetName(self.supplier_idurl), diskspace.MakeStringFromBytes(self.needed_bytes).replace(' ', ''), ) self.request_packet_id = None self.callbacks = {} try: st = bpio.ReadTextFile( settings.SupplierServiceFilename( idurl=self.supplier_idurl, customer_idurl=self.customer_idurl, )).strip() except: st = 'DISCONNECTED' if st == 'CONNECTED': automat.Automat.__init__(self, name, 'CONNECTED', _DebugLevel, _Debug) elif st == 'NO_SERVICE': automat.Automat.__init__(self, name, 'NO_SERVICE', _DebugLevel, _Debug) else: automat.Automat.__init__(self, name, 'DISCONNECTED', _DebugLevel, _Debug) for cb in self.callbacks.values(): cb(self.supplier_idurl, self.state, self.state)
def reset(conf_obj): """ Configure default values for all BitDust local settings inside ~/.bitdust/config/ folder. Every option must have a default value, however there are exceptions possible. Here all items suppose to have some widget in UI to interact with human. Keep it simple and understandable. """ from lib import diskspace from main import settings conf_obj.setDefaultValue('interface/api/auth-secret-enabled', 'true') conf_obj.setDefaultValue('interface/api/rest-http-enabled', 'true') conf_obj.setDefaultValue('interface/api/rest-http-port', settings.DefaultRESTHTTPPort()) conf_obj.setDefaultValue('interface/api/web-socket-enabled', 'true') conf_obj.setDefaultValue('interface/api/web-socket-port', settings.DefaultWebSocketPort()) conf_obj.setDefaultValue('interface/ftp/enabled', 'true') conf_obj.setDefaultValue('interface/ftp/port', settings.DefaultFTPPort()) conf_obj.setDefaultValue('logs/api-enabled', 'false') conf_obj.setDefaultValue('logs/automat-transitions-enabled', 'false') conf_obj.setDefaultValue('logs/automat-events-enabled', 'false') conf_obj.setDefaultValue('logs/debug-level', settings.defaultDebugLevel()) conf_obj.setDefaultValue('logs/memdebug-enabled', 'false') conf_obj.setDefaultValue('logs/memdebug-port', '9996') conf_obj.setDefaultValue('logs/memprofile-enabled', 'false') conf_obj.setDefaultValue('logs/packet-enabled', 'false') conf_obj.setDefaultValue('logs/stream-enabled', 'false') conf_obj.setDefaultValue('logs/stream-port', settings.DefaultWebLogPort()) conf_obj.setDefaultValue('logs/traffic-enabled', 'false') conf_obj.setDefaultValue('logs/traffic-port', settings.DefaultWebTrafficPort()) conf_obj.setDefaultValue('paths/backups', '') conf_obj.setDefaultValue('paths/customers', '') conf_obj.setDefaultValue('paths/messages', '') conf_obj.setDefaultValue('paths/receipts', '') conf_obj.setDefaultValue('paths/restore', '') conf_obj.setDefaultValue('personal/private-key-size', settings.DefaultPrivateKeySize()) conf_obj.setDefaultValue('services/accountant/enabled', 'false') conf_obj.setDefaultValue('services/backup-db/enabled', 'true') conf_obj.setDefaultValue('services/backups/enabled', 'true') conf_obj.setDefaultValue( 'services/backups/block-size', diskspace.MakeStringFromBytes(settings.DefaultBackupBlockSize())) conf_obj.setDefaultValue( 'services/backups/max-block-size', diskspace.MakeStringFromBytes(settings.DefaultBackupMaxBlockSize())) conf_obj.setDefaultValue('services/backups/max-copies', '2') conf_obj.setDefaultValue('services/backups/keep-local-copies-enabled', 'true') conf_obj.setDefaultValue('services/backups/wait-suppliers-enabled', 'true') conf_obj.setDefaultValue('services/blockchain/enabled', 'false') conf_obj.setDefaultValue('services/blockchain/host', '127.0.0.1') conf_obj.setDefaultValue('services/blockchain/port', 9100) conf_obj.setDefaultValue('services/blockchain/seeds', '') conf_obj.setDefaultValue('services/blockchain/explorer/enabled', 'true') conf_obj.setDefaultValue('services/blockchain/explorer/port', 9180) conf_obj.setDefaultValue('services/blockchain/wallet/enabled', 'true') conf_obj.setDefaultValue('services/blockchain/wallet/port', 9280) conf_obj.setDefaultValue('services/blockchain/miner/enabled', 'false') conf_obj.setDefaultValue('services/broadcasting/enabled', 'false') conf_obj.setDefaultValue('services/broadcasting/routing-enabled', 'false') conf_obj.setDefaultValue('services/broadcasting/max-broadcast-connections', '3') conf_obj.setDefaultValue('services/contract-chain/enabled', 'false') conf_obj.setDefaultValue('services/customer/enabled', 'true') conf_obj.setDefaultValue( 'services/customer/needed-space', diskspace.MakeStringFromBytes(settings.DefaultNeededBytes())) conf_obj.setDefaultValue('services/customer/suppliers-number', settings.DefaultDesiredSuppliers()) conf_obj.setDefaultValue('services/customer-contracts/enabled', 'false') conf_obj.setDefaultValue('services/customer-family/enabled', 'true') conf_obj.setDefaultValue('services/customer-patrol/enabled', 'true') conf_obj.setDefaultValue('services/customer-patrol/customer-idle-days', 14) conf_obj.setDefaultValue('services/customer-support/enabled', 'true') conf_obj.setDefaultValue('services/data-disintegration/enabled', 'true') conf_obj.setDefaultValue('services/data-motion/enabled', 'true') conf_obj.setDefaultValue( 'services/data-motion/supplier-request-queue-size', 4) conf_obj.setDefaultValue( 'services/data-motion/supplier-sending-queue-size', 4) conf_obj.setDefaultValue('services/entangled-dht/enabled', 'true') conf_obj.setDefaultValue('services/entangled-dht/udp-port', settings.DefaultDHTPort()) conf_obj.setDefaultValue('services/entangled-dht/known-nodes', '') conf_obj.setDefaultValue('services/entangled-dht/attached-layers', '') conf_obj.setDefaultValue('services/employer/enabled', 'true') conf_obj.setDefaultValue( 'services/employer/replace-critically-offline-enabled', 'true') conf_obj.setDefaultValue('services/employer/candidates', '') conf_obj.setDefaultValue('services/gateway/enabled', 'true') conf_obj.setDefaultValue('services/http-connections/enabled', 'false') conf_obj.setDefaultValue('services/http-connections/http-port', settings.DefaultHTTPPort()) conf_obj.setDefaultValue('services/http-transport/enabled', 'false') # not done yet conf_obj.setDefaultValue('services/http-transport/receiving-enabled', 'true') conf_obj.setDefaultValue('services/http-transport/sending-enabled', 'true') conf_obj.setDefaultValue('services/http-transport/priority', 50) conf_obj.setDefaultValue('services/identity-server/enabled', 'false') conf_obj.setDefaultValue('services/identity-server/host', '') conf_obj.setDefaultValue('services/identity-server/tcp-port', settings.IdentityServerPort()) conf_obj.setDefaultValue('services/identity-server/web-port', settings.IdentityWebPort()) conf_obj.setDefaultValue('services/identity-propagate/enabled', 'true') conf_obj.setDefaultValue('services/identity-propagate/known-servers', '') conf_obj.setDefaultValue('services/identity-propagate/preferred-servers', '') conf_obj.setDefaultValue('services/identity-propagate/min-servers', 2) conf_obj.setDefaultValue('services/identity-propagate/max-servers', 5) conf_obj.setDefaultValue( 'services/identity-propagate/automatic-rotate-enabled', 'true') conf_obj.setDefaultValue( 'services/identity-propagate/health-check-interval-seconds', 60 * 5) conf_obj.setDefaultValue('services/ip-port-responder/enabled', 'true') conf_obj.setDefaultValue('services/keys-registry/enabled', 'true') conf_obj.setDefaultValue('services/keys-storage/enabled', 'true') conf_obj.setDefaultValue( 'services/keys-storage/reset-unreliable-backup-copies', 'true') conf_obj.setDefaultValue('services/list-files/enabled', 'true') conf_obj.setDefaultValue('services/message-broker/enabled', 'false') conf_obj.setDefaultValue('services/message-broker/archive-chunk-size', 100) conf_obj.setDefaultValue('services/message-broker/message-ack-timeout', 30) conf_obj.setDefaultValue( 'services/message-broker/broker-negotiate-ack-timeout', 30) conf_obj.setDefaultValue('services/message-broker/preferred-brokers', '') conf_obj.setDefaultValue('services/message-history/enabled', 'true') conf_obj.setDefaultValue('services/miner/enabled', 'false') conf_obj.setDefaultValue('services/my-data/enabled', 'true') conf_obj.setDefaultValue('services/my-ip-port/enabled', 'true') conf_obj.setDefaultValue('services/network/enabled', 'true') conf_obj.setDefaultValue('services/network/proxy/enabled', 'false') conf_obj.setDefaultValue('services/network/proxy/host', '') conf_obj.setDefaultValue('services/network/proxy/password', '') conf_obj.setDefaultValue('services/network/proxy/port', '') conf_obj.setDefaultValue('services/network/proxy/ssl', 'false') conf_obj.setDefaultValue('services/network/proxy/username', '') conf_obj.setDefaultValue('services/network/receive-limit', settings.DefaultBandwidthInLimit()) conf_obj.setDefaultValue('services/network/send-limit', settings.DefaultBandwidthOutLimit()) conf_obj.setDefaultValue('services/nodes-lookup/enabled', 'true') conf_obj.setDefaultValue('services/p2p-hookups/enabled', 'true') conf_obj.setDefaultValue('services/p2p-notifications/enabled', 'true') conf_obj.setDefaultValue('services/personal-messages/enabled', 'true') conf_obj.setDefaultValue('services/private-groups/enabled', 'true') conf_obj.setDefaultValue('services/private-groups/message-ack-timeout', 30) conf_obj.setDefaultValue('services/private-groups/broker-connect-timeout', 120) conf_obj.setDefaultValue('services/private-groups/preferred-brokers', '') conf_obj.setDefaultValue('services/private-messages/enabled', 'true') conf_obj.setDefaultValue( 'services/private-messages/acknowledge-unread-messages-enabled', 'true') conf_obj.setDefaultValue('services/proxy-server/enabled', 'false') conf_obj.setDefaultValue('services/proxy-server/routes-limit', 20) conf_obj.setDefaultValue('services/proxy-server/current-routes', '{}') conf_obj.setDefaultValue('services/proxy-transport/enabled', 'true') conf_obj.setDefaultValue('services/proxy-transport/sending-enabled', 'true') conf_obj.setDefaultValue('services/proxy-transport/receiving-enabled', 'true') conf_obj.setDefaultValue('services/proxy-transport/priority', 100) conf_obj.setDefaultValue('services/proxy-transport/preferred-routers', '') # conf_obj.setDefaultValue('services/proxy-transport/router-lifetime-seconds', 600) # TODO: those two settings needs to be removed. # if service require storing locally value which user should not modify be implemented # inside service (for example read/write to local file inside ~/.bitdust/*/ folder) # in the future we can split all files more structural way into ~/.bitdust/services/*/ sub folders conf_obj.setDefaultValue('services/proxy-transport/my-original-identity', '') conf_obj.setDefaultValue('services/proxy-transport/current-router', '') conf_obj.setDefaultValue('services/rebuilding/enabled', 'true') conf_obj.setDefaultValue('services/restores/enabled', 'true') conf_obj.setDefaultValue('services/shared-data/enabled', 'true') conf_obj.setDefaultValue('services/supplier/enabled', 'true') conf_obj.setDefaultValue( 'services/supplier/donated-space', diskspace.MakeStringFromBytes(settings.DefaultDonatedBytes())) conf_obj.setDefaultValue('services/supplier-contracts/enabled', 'false') conf_obj.setDefaultValue('services/tcp-connections/enabled', 'true') conf_obj.setDefaultValue('services/tcp-connections/tcp-port', settings.DefaultTCPPort()) conf_obj.setDefaultValue('services/tcp-connections/upnp-enabled', 'true') conf_obj.setDefaultValue('services/tcp-transport/enabled', 'true') conf_obj.setDefaultValue('services/tcp-transport/receiving-enabled', 'true') conf_obj.setDefaultValue('services/tcp-transport/sending-enabled', 'true') conf_obj.setDefaultValue('services/tcp-transport/priority', 10) conf_obj.setDefaultValue('services/udp-datagrams/enabled', 'true') conf_obj.setDefaultValue('services/udp-datagrams/udp-port', settings.DefaultUDPPort()) # TODO: UDP transport was temporary switched off conf_obj.setDefaultValue('services/udp-transport/enabled', 'false') conf_obj.setDefaultValue('services/udp-transport/receiving-enabled', 'true') conf_obj.setDefaultValue('services/udp-transport/sending-enabled', 'true') conf_obj.setDefaultValue('services/udp-transport/priority', 20)
def renderWizardStoragePage(self, request): template = 'pages/wizard_storage.html' req = {} if request is not None: req = request.REQUEST self.data['customersdir'] = unicode(req.get('customersdir', settings.getCustomersFilesDir())) self.data['localbackupsdir'] = unicode(req.get('localbackupsdir', settings.getLocalBackupsDir())) self.data['restoredir'] = unicode(req.get('restoredir', settings.getRestoreDir())) self.data['needed'] = req.get('needed', self.data['needed']) neededV = diskspace.GetBytesFromString(self.data['needed'] + ' Mb', settings.DefaultNeededBytes()) self.data['donated'] = req.get('donated', self.data['donated']) donatedV = diskspace.GetBytesFromString(self.data['donated'] + ' Mb', settings.DefaultDonatedBytes()) self.data['suppliers'] = req.get('suppliers', self.data['suppliers']) mounts = [] freeSpaceIsOk = True if bpio.Windows(): for d in bpio.listLocalDrivesWindows(): free, total = diskusage.GetWinDriveSpace(d[0]) if free is None or total is None: continue color = '#ffffff' if self.data['customersdir'][0].upper() == d[0].upper(): color = '#60e060' if donatedV >= free: color = '#e06060' freeSpaceIsOk = False if self.data['localbackupsdir'][0].upper() == d[0].upper(): color = '#60e060' if neededV >= free: color = '#e06060' freeSpaceIsOk = False mounts.append((d[0:2], diskspace.MakeStringFromBytes(free), diskspace.MakeStringFromBytes(total), color,)) elif bpio.Linux() or bpio.Mac(): for mnt in bpio.listMountPointsLinux(): free, total = diskusage.GetLinuxDriveSpace(mnt) if free is None or total is None: continue color = '#ffffff' if bpio.getMountPointLinux(self.data['customersdir']) == mnt: color = '#60e060' if donatedV >= free: color = '#e06060' freeSpaceIsOk = False if bpio.getMountPointLinux(self.data['localbackupsdir']) == mnt: color = '#60e060' if neededV >= free: color = '#e06060' freeSpaceIsOk = False mounts.append((mnt, diskspace.MakeStringFromBytes(free), diskspace.MakeStringFromBytes(total), color,)) ok = True out = '' if not freeSpaceIsOk: out += '<font color=red>you do not have enough free space on the disk</font><br/>\n' ok = False if donatedV < settings.MinimumDonatedBytes(): out += '<font color=red>you must donate at least %f MB</font><br/>\n' % ( round(settings.MinimumDonatedBytes() / (1024.0 * 1024.0), 2)) ok = False if not os.path.isdir(self.data['customersdir']): out += '<font color=red>directory %s not exist</font><br/>\n' % self.data['customersdir'] ok = False if not os.access(self.data['customersdir'], os.W_OK): out += '<font color=red>folder %s does not have write permissions</font><br/>\n' % self.data['customersdir'] ok = False if not os.path.isdir(self.data['localbackupsdir']): out += '<font color=red>directory %s not exist</font><br/>\n' % self.data['localbackupsdir'] ok = False if not os.access(self.data['localbackupsdir'], os.W_OK): out += '<font color=red>folder %s does not have write permissions</font><br/>\n' % self.data['localbackupsdir'] ok = False if int(self.data['suppliers']) not in settings.getECCSuppliersNumbers(): out += '<font color=red>incorrect number of suppliers, correct values are: %s</font><br/>\n' % ( str(settings.getECCSuppliersNumbers()).strip('[]')) ok = False context = {'output': out, 'mounts': mounts, 'needed': self.data['needed'], 'donated': self.data['donated'], 'localbackupsdir': self.data['localbackupsdir'], 'customersdir': self.data['customersdir'], 'restoredir': self.data['restoredir'], 'suppliers': self.data['suppliers'], } if request is None: return template, context, request action = request.REQUEST.get('action', None) if action == 'next': if ok: install_wizard.A(action, self.data) return None if action == 'back': install_wizard.A(action) return None return template, context, request
def report_donated_storage(): space_dict = read_customers_quotas() used_space_dict = read_customers_usage() r = {} r['customers_num'] = contactsdb.num_customers() r['customers'] = [] r['old_customers'] = [] r['errors'] = [] r['consumed'] = 0 r['donated'] = settings.getDonatedBytes() r['donated_str'] = diskspace.MakeStringFromBytes(r['donated']) r['real'] = bpio.getDirectorySize(settings.getCustomersFilesDir()) try: r['free'] = int(space_dict.pop('free')) except: r['free'] = 0 used = 0 for idurl in contactsdb.customers(): consumed_by_customer = 0 used_by_customer = 0 if idurl not in space_dict.keys(): r['errors'].append('space consumed by customer %s is unknown' % idurl) else: try: consumed_by_customer = int(space_dict.pop(idurl)) r['consumed'] += consumed_by_customer except: r['errors'].append( 'incorrect value of consumed space for customer %s' % idurl) if idurl in used_space_dict.keys(): try: used_by_customer = int(used_space_dict.pop(idurl)) used += used_by_customer except: r['errors'].append( 'incorrect value of used space for customer %s' % idurl) if consumed_by_customer < used_by_customer: r['errors'].append( 'customer %s currently using more space than requested' % idurl) c = {} c['idurl'] = idurl c['used'] = used_by_customer c['used_str'] = diskspace.MakeStringFromBytes(c['used']) c['consumed'] = consumed_by_customer c['consumed_str'] = diskspace.MakeStringFromBytes(c['consumed']) c['real'] = bpio.getDirectorySize(settings.getCustomerFilesDir(idurl)) c['real_str'] = diskspace.MakeStringFromBytes(c['real']) r['customers'].append(c) r['used'] = used r['used_str'] = diskspace.MakeStringFromBytes(r['used']) r['consumed_str'] = diskspace.MakeStringFromBytes(r['consumed']) if r['donated'] != r['free'] + r['consumed']: r['errors'].append( 'total consumed %d and known free %d (%d total) bytes not match with donated %d bytes' % (r['consumed'], r['free'], r['consumed'] + r['free'], r['donated'])) if r['used'] > r['donated']: r['errors'].append( 'total space used by customers exceed the donated limit') if len(space_dict) > 0: r['errors'].append('found %d incorrect records of consumed space' % len(space_dict)) if r['real'] != r['used']: r['errors'].append( 'current info needs update, known size is %d bytes but real is %d bytes' % (r['used'], r['real'])) for idurl in used_space_dict.keys(): real = bpio.getDirectorySize(settings.getCustomerFilesDir(idurl)) r['old_customers'].append({ 'idurl': idurl, 'used': used_space_dict['idurl'], 'used_str': diskspace.MakeStringFromBytes(used_space_dict['idurl']), 'real': real, 'real_str': diskspace.MakeStringFromBytes(real), }) try: r['used_percent'] = misc.percent2string( float(r['used']) / float(r['donated']), 5) except: r['used_percent'] = '' try: r['consumed_percent'] = misc.percent2string( float(r['consumed']) / float(r['donated']), 5) except: r['consumed_percent'] = '' return r