configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_writer.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
from cone.public import exceptions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import crml_reader
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
from crml_model import *
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
class CenRepEntry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
    Class representing an entry in a CenRep text file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
    def __init__(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
        self.int            = kwargs.get('int')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
        self.crml_type      = kwargs.get('crml_type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
        self.confml_type    = kwargs.get('confml_type')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
        self.value          = kwargs.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
        self.orig_value     = kwargs.get('orig_value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        self.access         = kwargs.get('access')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
        self.backup         = kwargs.get('backup', False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    @property
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    def metadata(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        return _get_metadata(self.backup)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        return crml_reader.convert_num(self.int) < crml_reader.convert_num(other.int)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
class CenRepRfsRecord(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    Class representing an entry in the CenRep RFS text file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
    def __init__(self, repo_uid, key_uids=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        self.repo_uid = repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        self.key_uids = key_uids or []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        if type(self) == type(other):   return self.repo_uid == other.repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        else:                           return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        return not (self == other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        return  self.repo_uid < other.repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        return "CenRepRfsRecord(repo_uid=%s, key_uids=%r)" % (self.repo_uid, self.key_uids)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
class CrmlTxtWriter(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    Writer class for generating CenRep .txt files based on a CRML model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
    def __init__(self, configuration, log):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
        self.configuration = configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        self.log = log
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    def get_cenrep_txt_data(self, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        Return the text data for the CenRep txt generated based on the given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        CRML repository model.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        @return: Text data for the CenRep text file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        data = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        # Generate header lines 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        data.extend(self.get_header_lines(repository))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        self._check_repository_attrs(repository)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        # Generate CenRep entries for all keys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        cenrep_entries = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        for key in repository.keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
            cenrep_entries.extend(self.get_cenrep_entries(key))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        # Generate entry lines based on the entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        cenrep_entries.sort()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        for entry in cenrep_entries:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
            data.append(self.get_cenrep_entry_line(entry))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        data.append('')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        # Remove Nones from the line list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        data = filter(lambda val: val is not None, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        return '\r\n'.join(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    def get_cenrep_rfs_txt_data(self, rfs_records):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        Return the text data for the CenRep RFS txt generated based on the given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        CenRep RFS record list.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        data = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        # Make a distinct and sorted array of the records
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        records = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        for r in rfs_records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
            if r not in records: records.append(r)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        records.sort()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        for record in records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
            repo_uid = record.repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
            # Add padding zeros to the UID
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
            if len(repo_uid) < 8:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                repo_uid = (8 - (len(repo_uid) % 8)) * '0' + repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            temp = "CR %s" % repo_uid
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
            if record.key_uids:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
                temp += " %s" % ' '.join(record.key_uids)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
            data.append(temp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        return '\r\n'.join(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    def get_cenrep_rfs_record(self, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        Return the RFS record for the given CRML repository.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        @return: A CenRepRfsRecord object if the repository should be listed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            in cenrep_rfs.txt, None if not.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        # Get the UID as a hex value without the leading 0x
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        repo_uid = _translate_key_uid(repository.uid_value)[2:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        # Check if the whole repository has RFS=true
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        if repository.rfs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
            return CenRepRfsRecord(repo_uid)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        # Collect the UIDs of the keys that should be listed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        rfs_key_uids = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        for key in repository.keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
            if self._key_is_rfs(key) and key.int:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                # Get the UID as a hex value without the leading 0x
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                uid = _translate_key_uid(key.int)[2:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                rfs_key_uids.append(uid)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        if rfs_key_uids:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
            return CenRepRfsRecord(repo_uid, rfs_key_uids)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
    def _key_is_rfs(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        @return: True if the key UID should be listed in cenrep_rfs.txt
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        if isinstance(key, CrmlSimpleKey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
            return bool(self._get_rfs_value(key.ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        elif isinstance(key, CrmlBitmaskKey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
            for bit in key.bits:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
                if self._get_rfs_value(bit.ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
                    return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
    def _get_rfs_value(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        @return: The RFS value for the given setting, or None if not available.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        if ref is None: return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
            feature = self._get_feature(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            # Feature not found in the configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        return feature.get_value(attr='rfs')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
    def get_header_lines(self, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        Return a list of lines to be written in the header section of the CenRep text file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        data = ['cenrep',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
                'version %s' % repository.version]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        if repository.owner:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
            data.append('[owner]')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
            data.append(repository.owner)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        data.append('[defaultmeta]')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        data.append(' %d' % _get_metadata(repository.backup))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        for key in repository.keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
            data.append(self.get_defaultmeta_line(key))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        data.append('[platsec]')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        acc_text = self.get_access_line(repository.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        if acc_text: acc_text = ' ' + acc_text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        data.append(acc_text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        for key in repository.keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
                data.append(self.get_platsec_line(key, repository))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        data.append('[Main]')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
    def get_cenrep_entries(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        Generate CenRep entries based on the given CRML key object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        @return: A list of CenRepEntry objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        if isinstance(key, CrmlSimpleKey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
            feature = self._get_feature(key.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            entry = CenRepEntry(int          = key.int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
                                crml_type    = key.type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
                                confml_type  = feature.get_type(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
                                value        = feature.get_value(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
                                orig_value   = feature.get_original_value(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
                                backup       = key.backup,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
                                access       = key.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            return [entry]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        elif isinstance(key, CrmlBitmaskKey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
            return self.get_bitmask_key_cenrep_entries(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        elif isinstance(key, CrmlKeyRange):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
            return self.get_key_range_cenrep_entries(key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
            raise TypeError("Unsupported CRML key object type %s" % type(key))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
    def get_key_range_cenrep_entries(self, key_range):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        Generate CenRep entries based on the given CrmlKeyRange object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        @return: A list of CenRepEntry objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        entries = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        # Generate the countInt entry if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        if key_range.count_int is not None and key_range.ref is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
                feature = self._get_feature(key_range.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
                # For CT2 output compatibility
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
                if feature.get_type() != 'sequence':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
                    return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
                values = feature.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
            except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
                values = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
            count = len(values)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
            entry = CenRepEntry(int         = key_range.count_int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
                                crml_type   = 'int',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
                                confml_type = 'int',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
                                value       = count,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
                                backup      = key_range.backup,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
                                access      = key_range.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
            entries.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
        # Generate entries based on the sequence values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        for subkey in key_range.subkeys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
            full_ref = "%s.%s"% (key_range.ref, subkey.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
                feature = self._get_feature(full_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
                values = feature.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
                confml_type = feature.get_type()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
                backup = key_range.backup
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
            except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
                # For CT2 output compatibility
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
                values = ['null' for i in xrange(count)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
                confml_type = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
                backup = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
            for i, value in enumerate(values):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
                # Calculate the index of the entry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
                index = self.get_index(crml_reader.convert_num(key_range.first_int),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
                                       crml_reader.convert_num(key_range.first_index),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
                                       crml_reader.convert_num(key_range.index_bits),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
                                       i,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                                       crml_reader.convert_num(subkey.int))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
                entry = CenRepEntry(int         = "0x%x" % index,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
                                    crml_type   = subkey.type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
                                    confml_type = confml_type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
                                    value       = value,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
                                    orig_value  = value,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
                                    backup      = backup,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
                                    access      = key_range.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
                entries.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        return entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
    def get_bitmask_key_cenrep_entries(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        Generate CenRep entries based on the given CrmlBitmaskKey object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        @return: A list of CenRepEntry objects.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        # Calculate the value based on the bit values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        # -------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        value = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        for bit in key.bits:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
            feature = self._get_feature(bit.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
            bit_value = feature.get_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
            if bit.invert:  bit_value = not bit_value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
            if bit_value:   value |= 1 << (bit.index - 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        # Generate the textual representation of the bitmask value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        # This is done at this point because in get_cenrep_entry_line()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        # we don't know anymore if the key was a bitmask key or a
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        # simple key.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        # -------------------------------------------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        if key.type == 'binary':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            orig_value = "%X" % value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
            # Add padding zeroes so that the number of digits
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
            # is divisible by 8 (done manually since the length
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            # of a binary bitmask is unbounded).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
            padding_zeroes = (8 - len(orig_value) % 8) * '0' 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            # 4 is a special case for CT2 output compatibility
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
            if len(orig_value) != 4:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
                orig_value = padding_zeroes + orig_value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
            orig_value = str(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        entry = CenRepEntry(int         = key.int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
                            crml_type   = key.type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
                            confml_type = 'int',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
                            value       = value,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
                            orig_value  = orig_value,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
                            backup      = key.backup,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
                            access      = key.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        return [entry]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
    def get_defaultmeta_line(self, key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        Return the defaultmeta section line for the given CRML key object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        if not isinstance(key, CrmlKeyRange): return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        return "%s %s %d" % (key.first_int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
                             key.last_int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
                             _get_metadata(key.backup))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
    def get_platsec_line(self, key, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        Return the platsec section line for the given CRML key object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        if not isinstance(key, CrmlKeyRange): return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        # In a key range platsec entry something must be present, so if
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
        # the access object is empty, use cap_rd and cap_wr from the repository's
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        # global access definition
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        access = key.access.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        is_empty = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        for attrname in ('sid_rd', 'cap_rd', 'sid_wr', 'cap_wr'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
            if getattr(access, attrname) not in ('', None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
                is_empty = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        if is_empty:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
            access.cap_rd = repository.access.cap_rd
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
            access.cap_wr = repository.access.cap_wr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
        acc_text = self.get_access_line(access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        if acc_text: acc_text = ' ' + acc_text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        return "%s %s%s" % (key.first_int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
                             key.last_int,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
                             acc_text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
    def get_cenrep_entry_line(self, entry):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        Return the text line for a CenRepEntry object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
        value = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
        if entry.crml_type in ('string', 'string8'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
            if entry.confml_type is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
                pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
                if entry.orig_value is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
                    value = '""'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
                    value = '"%s"' % entry.orig_value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        elif entry.crml_type == 'int':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
            if entry.confml_type == 'boolean':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
                if entry.value: value = '1'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
                else:           value = '0'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
                value = entry.orig_value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
        elif entry.crml_type == 'real':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
            value = entry.orig_value or ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        elif entry.crml_type == 'binary':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
            # Empty binary values are denoted by a single dash
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            value = entry.orig_value or '-'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            if value != '-':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
                # Make sure that the number of digits is divisible by two
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
                if len(value) % 2 != 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
                    value = '0' + value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
        if value is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
            value = unicode(entry.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        self._check_value(entry, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        acc_text = self.get_access_line(entry.access)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        if acc_text: acc_text = ' ' + acc_text
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
        return '%s %s %s %d%s' % (_translate_key_uid(entry.int),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
                                  entry.crml_type,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
                                  value,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
                                  entry.metadata,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
                                  acc_text)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
    def _check_value(self, entry, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        Check that the given value is valid for the given CenRep entry,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        and log a warning if it is not.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
        if entry.crml_type == 'int':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
            # Check if the value is a string, since it may already
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
            # be an integer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
            if not isinstance(value, basestring):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
                return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
                value = value.strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
                if value.lower().startswith('0x'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
                    long(value, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
                    long(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
            except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
                self.log.warn("Key %s: Invalid integer value '%s'" % (entry.int, value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        elif entry.crml_type == 'real':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
                float(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
            except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
                self.log.warn("Key %s: Invalid real value '%s'" % (entry.int, value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
        elif entry.crml_type == 'binary':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
            if value != '-' and re.match(r'^(0[xX])?[0-9a-fA-F]+$', value) is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
                self.log.warn("Key %s: Invalid binary value '%s'" % (entry.int, value))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
    def _check_repository_attrs(self, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
        Check that the attributes of the given repository are valid and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        log warnings if not.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
        if repository.owner is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
            owner = repository.owner.strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
            # An empty owner UID is OK, it doesn't generate anything
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
            # invalid into the output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
            if owner != '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
                try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
                    if owner.lower().startswith('0x'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
                        long(owner, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
                    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
                        long(owner)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
                except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
                    self.log.warn("Invalid owner UID '%s'" % owner)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
    def get_access_line(self, access):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
        Generate a line containing access information based on a CrmlAccess object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        # Write the access information in a specific order, because it
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        # won't work otherwise
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
        var_order = ['sid_rd', 'cap_rd', 'sid_wr', 'cap_wr']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        data = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
        for varname in var_order:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
            val = getattr(access, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
            if val not in ('', None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
                # Using _translate_capability_string() on all, since a SID should
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
                # not contain anything that could be messed up by the function
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
                data.append('%s=%s' % (varname, _translate_capability_string(val)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
        return ' '.join(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
    def _get_feature(self, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
        return self.configuration.get_default_view().get_feature(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
    def get_index(cls,firstInt,firstIndex,indexBits,seqIndex, subIndex):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
        @param firstIndex: The first value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
        @param lastInt: The last value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
        @param indexBits: The index bits or mask for sequence index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        @param seqIndex: The sequence index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
        @param subIndex: The sequence sub element index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
        @return: an numeric value for the encoded index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
        rangeshift = cls.get_range_shift(indexBits)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
        return (((seqIndex+firstIndex) << rangeshift) + firstInt) + subIndex
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
    def get_seqid(cls,firstInt,firstIndex,indexBits,cenrepkey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
        @param firstIndex: The first value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
        @param lastInt: The last value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        @param indexBits: The index bits or mask for sequence index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
        @param cenrepkey: Crml key id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
        @return: an numeric value for the encoded index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
        rangeshift = cls.get_range_shift(indexBits)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
        return (((cenrepkey & indexBits) -firstInt) >> rangeshift)-firstIndex
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
    def get_subseqid(cls,firstInt,firstIndex,indexBits,cenrepkey):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        @param firstIndex: The first value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
        @param lastInt: The last value available in the keyrange 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
        @param indexBits: The index bits or mask for sequence index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
        @param cenrepkey: Crml key id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
        @return: an numeric value for the encoded index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
        range = cls.get_range(indexBits)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
        return (cenrepkey - firstInt) & range
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
    def get_range_shift(cls,indexBits):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
        """ Get the bit left to the """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
        seqrange = cls.get_range(indexBits)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
        shiftamount = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        for i in range(0,32):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
            if (seqrange >> i)  == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
                shiftamount = i
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
                break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
        return shiftamount
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
    def get_range(cls,indexBits):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
        """ Get the bit left to the """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
        indexshift = 0 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
        for i in range(0,32):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
            if (indexBits >> i)  == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
                indexshift = i
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
                break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
        return ((0x1 << indexshift) - indexBits)-1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
# =============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
# Utility functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
# =============================================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
def _get_metadata(backup):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
    metadata = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
    if backup: metadata |= 0x1000000
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
    return metadata
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
def _translate_key_uid(uid):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
    """Translate a key UID given in CRML so that it matches the output of CT2."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
    if uid.lower().startswith("0x"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
        prefix = uid[:2]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
        temp = uid[2:]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
        if int(temp, 16) == 0:  return prefix + "0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
        else:                   return prefix + uid[2:].lstrip('0')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
        if int(uid) == 0:       return "0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        else:                   return uid.lstrip('0')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
def _translate_capability_string(cap_str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
    Translate a capability string so that it is
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
    suitable for writing to a CenRep txt file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
    cap_str = cap_str.replace('AlwaysPass', 'alwayspass').replace('AlwaysFail', 'alwaysfail')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
    # The capability string can be a list separated either by
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    # whitespace or commas
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
    if ',' in cap_str:  caps = cap_str.split(',')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
    else:               caps = cap_str.split()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   572
    # The output must always be comma-separated
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   573
    return ','.join(caps)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   574