def _parse_backup_stats(self, number, client, forward=False, agent=None):
        ret = {}
        backup = {'windows': 'unknown', 'number': int(number)}
        if forward:
            backup['name'] = client
        translate = {
            'time_start': 'start',
            'time_end': 'end',
            'time_taken': 'duration',
            'bytes': 'totsize',
            'bytes_received': 'received',
            'bytes_estimated': 'estimated_bytes',
            'files': 'files',
            'files_encrypted': 'files_enc',
            'directories': 'dir',
            'soft_links': 'softlink',
            'hard_links': 'hardlink',
            'meta_data': 'meta',
            'meta_data_encrypted': 'meta_enc',
            'special_files': 'special',
            'efs_files': 'efs',
            'vss_headers': 'vssheader',
            'vss_headers_encrypted': 'vssheader_enc',
            'vss_footers': 'vssfooter',
            'vss_footers_encrypted': 'vssfooter_enc',
            'total': 'total',
            'grand_total': 'total',
        }
        counts = {
            'new': 'count',
            'changed': 'changed',
            'unchanged': 'same',
            'deleted': 'deleted',
            'total': 'scanned',
            'scanned': 'scanned',
        }
        single = ['time_start', 'time_end', 'time_taken', 'bytes_received', 'bytes_estimated', 'bytes']
        query = self.status('c:{0}:b:{1}:l:backup_stats\n'.format(client, number), agent=agent)
        if not query:
            return ret
        try:
            back = query['clients'][0]['backups'][0]
        except KeyError as e:
            self._logger('warning', 'No backup found')
            return ret
        if 'backup_stats' not in back['logs']:
            self._logger('warning', 'No stats found for backup')
            return ret
        stats = None
        try:
            stats = json.loads(''.join(back['logs']['backup_stats']))
        except:
            stats = back['logs']['backup_stats']
        if not stats:
            return ret
        # server was upgraded but backup comes from an older version
        if 'counters' not in stats:
            return super(Burp, self)._parse_backup_stats(number, client, forward, stats, agent)
        counters = stats['counters']
        for counter in counters:
            name = counter['name']
            if name in translate:
                name = translate[name]
            if counter['name'] in single:
                backup[name] = counter['count']
            else:
                backup[name] = {}
                for (k, v) in iteritems(counts):
                    if v in counter:
                        backup[name][k] = counter[v]
                    else:
                        backup[name][k] = 0
        if 'start' in backup and 'end' in backup:
            backup['duration'] = backup['end'] - backup['start']

        return backup

    # TODO: support old clients
    # def _parse_backup_log(self, fh, number, client=None, agent=None):
    #    """
    #    parse_backup_log parses the log.gz of a given backup and returns a dict
    #    containing different stats used to render the charts in the reporting view
    #    """
    #    return {}

    # def get_clients_report(self, clients, agent=None):
The :func:`burpui.misc.backend.burp2.Burp._parse_backup_stats`
dataset/ETHPy150Open ziirish/burp-ui/burpui/misc/backend/burp2.py/Burp._parse_backup_stats