Esempio n. 1
0
    def test_dont_mutate_meta(self):
        """Make sure the load method does not mutate the meta info
        in the descriptor.
        """
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        desc.load(cache)
        desc.write()
        expected = '''<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
'''
        self.assert_equals_long(expected, open('test.xml').read())
Esempio n. 2
0
    def test_dont_mutate_meta(self):
        """Make sure the load method does not mutate the meta info
        in the descriptor.
        """
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        desc.load(cache)
        desc.write()
        expected = '''<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
'''
        self.assert_equals_long(expected, open('test.xml').read())
Esempio n. 3
0
    def test_load_fields(self):
        """compdesc.load populates id, name, etc. fields"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0"?>
<component>
  <id>resolveme</id>
  <name>Resolve Me</name>
  <description>
    I need to be resolved
  </description>
  <requires>a</requires>
  <requires>b</requires>
  <provides>c</provides>
  <provides>d</provides>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        component = desc.load(None)
        self.assert_equals('resolveme', component.id)
        self.assert_equals('Resolve Me', component.name)
        self.assert_equals('\n    I need to be resolved\n  ',
                           component.description)
        self.assert_equals(['a', 'b'], component.requires)
        self.assert_equals(['c', 'd'], component.provides)
Esempio n. 4
0
    def test_load_sub_component_meta(self):
        """Be sure metadata gets loaded from subcomponents even if
        the toplevel component has none.
        """
        open('test1.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <component>test2.xml</component>
  </contents>
</component>
''')
        open('test2.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
''')
        cache = ShamCache()
        package = MockPackage('a', '1', deb, 'sha-1:aaa')
        cache.add(package)
        desc = ComponentDescriptor('test1.xml')
        comp = desc.load(cache)
        assert package in list(comp.iter_packages())
        self.assert_equal("mandatory", package[('pdk', 'necessity')])
Esempio n. 5
0
    def test_load_sub_component_meta(self):
        """Be sure metadata gets loaded from subcomponents even if
        the toplevel component has none.
        """
        open('test1.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <component>test2.xml</component>
  </contents>
</component>
''')
        open('test2.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
</component>
''')
        cache = ShamCache()
        package = MockPackage('a', '1', deb, 'sha-1:aaa')
        cache.add(package)
        desc = ComponentDescriptor('test1.xml')
        comp = desc.load(cache)
        assert package in list(comp.iter_packages())
        self.assert_equal("mandatory", package[('pdk', 'necessity')])
Esempio n. 6
0
    def test_load_fields(self):
        """compdesc.load populates id, name, etc. fields"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0"?>
<component>
  <id>resolveme</id>
  <name>Resolve Me</name>
  <description>
    I need to be resolved
  </description>
  <requires>a</requires>
  <requires>b</requires>
  <provides>c</provides>
  <provides>d</provides>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        component = desc.load(None)
        self.assert_equals('resolveme', component.id)
        self.assert_equals('Resolve Me', component.name)
        self.assert_equals('\n    I need to be resolved\n  ',
                           component.description)
        self.assert_equals(['a', 'b'], component.requires)
        self.assert_equals(['c', 'd'], component.provides)
Esempio n. 7
0
    def test_parse_link(self):
        '''Check that we can parse entities at all.'''
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <meta>
        <pdk.link>
          <some-meta>can-do</some-meta>
        </pdk.link>
      </meta>
    </deb>
  </contents>
</component>
''')

        desc = ComponentDescriptor('test.xml')
        self.assert_equal([('some-meta', 'can-do')],
                          desc.contents[0].links)
        cache = ShamCache()
        package = MockPackage('a', '1', deb, 'sha-1:aaa')
        cache.add(package)
        comp = desc.load(cache)
        package = comp.iter_packages().next()
        self.assert_equals([('some-meta', 'can-do')], package.links)
Esempio n. 8
0
    def test_load_empty(self):
        """compdesc.load returns an empty component"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component/>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        descriptor = desc.load(None)
        assert isinstance(descriptor, Component)
Esempio n. 9
0
    def test_load_empty(self):
        """compdesc.load returns an empty component"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component/>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        descriptor = desc.load(None)
        assert isinstance(descriptor, Component)
Esempio n. 10
0
    def test_conditional_include(self):
        os.system('''
cat >b.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <name>apache</name>
    </deb>
    <deb ref="sha-1:bbb">
      <name>libc6</name>
    </deb>
    <deb ref="sha-1:ccc">
      <name>ls</name>
    </deb>
  </contents>
</component>
EOF
''')
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <component>
      <file>b.xml</file>
      <limit>apache</limit>
      <exclude>ls</exclude>
    </component>
  </contents>
</component>
EOF
cp a.xml c.xml
''')
        apache = MockPackage('apache', '1', deb, 'sha-1:aaa',
                             arch = 'i386')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb', arch = 'i386')
        ls = MockPackage('ls', '1', deb, 'sha-1:ccc', arch = 'i386')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)
        cache.add(ls)

        desc_a = ComponentDescriptor('a.xml')
        desc_a.write()
        self.assert_equals_long(open('c.xml').read(), open('a.xml').read())
        component_a = desc_a.load(cache)
        assert isinstance(component_a, Component)
        expected = [ apache ]
        actual = list(component_a.iter_packages())
        self.assert_equal(expected, actual)
Esempio n. 11
0
    def test_conditional_include(self):
        os.system('''
cat >b.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <name>apache</name>
    </deb>
    <deb ref="sha-1:bbb">
      <name>libc6</name>
    </deb>
    <deb ref="sha-1:ccc">
      <name>ls</name>
    </deb>
  </contents>
</component>
EOF
''')
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <component>
      <file>b.xml</file>
      <limit>apache</limit>
      <exclude>ls</exclude>
    </component>
  </contents>
</component>
EOF
cp a.xml c.xml
''')
        apache = MockPackage('apache', '1', deb, 'sha-1:aaa', arch='i386')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb', arch='i386')
        ls = MockPackage('ls', '1', deb, 'sha-1:ccc', arch='i386')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)
        cache.add(ls)

        desc_a = ComponentDescriptor('a.xml')
        desc_a.write()
        self.assert_equals_long(open('c.xml').read(), open('a.xml').read())
        component_a = desc_a.load(cache)
        assert isinstance(component_a, Component)
        expected = [apache]
        actual = list(component_a.iter_packages())
        self.assert_equal(expected, actual)
Esempio n. 12
0
    def test_meta_implicit_ref(self):
        """Check that implicit references in metadata are supported and
        correctly resolve to references to self.
        """
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <necessity>mandatory</necessity>
  </meta>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        comp = desc.load(Cache(os.path.join(self.work_dir, 'cache')))
        self.assert_equal('mandatory', comp.meta[('pdk', 'necessity')])
Esempio n. 13
0
    def test_meta_implicit_ref(self):
        """Check that implicit references in metadata are supported and
        correctly resolve to references to self.
        """
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <necessity>mandatory</necessity>
  </meta>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        comp = desc.load(Cache(os.path.join(self.work_dir, 'cache')))
        self.assert_equal('mandatory', comp.meta[('pdk', 'necessity')])
Esempio n. 14
0
    def test_load_component_meta(self):
        """compdesc.load finds component metadata"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <necessity>optional</necessity>
  </meta>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        component = desc.load(None)
        self.assert_equals(component.meta['pdk', 'necessity'], 'optional')
Esempio n. 15
0
    def test_load_component_meta(self):
        """compdesc.load finds component metadata"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <necessity>optional</necessity>
  </meta>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        component = desc.load(None)
        self.assert_equals(component.meta['pdk', 'necessity'], 'optional')
Esempio n. 16
0
    def test_complement(self):
        """compdesc.load returns a component with packages"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <deb ref="sha-1:aaa"/>
      <deb ref="sha-1:bbb"/>
      <dsc ref="sha-1:ccc"/>
    </deb>
    <dsc>
      <dsc ref="sha-1:ccc"/>
      <deb ref="sha-1:aaa"/>
      <deb ref="sha-1:bbb"/>
      <deb ref="sha-1:ddd"/>
    </dsc>
  </contents>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        cache = ShamCache(make_copies=True)
        a = MockPackage('a', '1', deb, 'sha-1:aaa', arch='i386')
        b = MockPackage('b', '1', deb, 'sha-1:bbb', arch='i386')
        c = MockPackage('c', '1', dsc, 'sha-1:ccc', arch='any')
        d = MockPackage('b', '1', deb, 'sha-1:ddd', arch='i386')
        cache.add(a)
        cache.add(b)
        cache.add(c)
        cache.add(d)
        component = desc.load(cache)
        packages = list(component.iter_packages())
        self.assert_equal([c], packages[0].complement)
        self.assert_equal([c], packages[1].complement)
        self.assert_equal([a, b], packages[2].complement)
        self.assert_equal([a, b, d], packages[3].complement)
        self.assert_equal([c], packages[4].complement)
        self.assert_equal([c], packages[5].complement)
        self.assert_equal([c], packages[6].complement)
Esempio n. 17
0
    def test_complement(self):
        """compdesc.load returns a component with packages"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <deb ref="sha-1:aaa"/>
      <deb ref="sha-1:bbb"/>
      <dsc ref="sha-1:ccc"/>
    </deb>
    <dsc>
      <dsc ref="sha-1:ccc"/>
      <deb ref="sha-1:aaa"/>
      <deb ref="sha-1:bbb"/>
      <deb ref="sha-1:ddd"/>
    </dsc>
  </contents>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        cache = ShamCache(make_copies = True)
        a = MockPackage('a', '1', deb, 'sha-1:aaa', arch='i386')
        b = MockPackage('b', '1', deb, 'sha-1:bbb', arch='i386')
        c = MockPackage('c', '1', dsc, 'sha-1:ccc', arch='any')
        d = MockPackage('b', '1', deb, 'sha-1:ddd', arch='i386')
        cache.add(a)
        cache.add(b)
        cache.add(c)
        cache.add(d)
        component = desc.load(cache)
        packages = list(component.iter_packages())
        self.assert_equal([c], packages[0].complement)
        self.assert_equal([c], packages[1].complement)
        self.assert_equal([a, b], packages[2].complement)
        self.assert_equal([a, b, d], packages[3].complement)
        self.assert_equal([c], packages[4].complement)
        self.assert_equal([c], packages[5].complement)
        self.assert_equal([c], packages[6].complement)
Esempio n. 18
0
    def test_load_file_object(self):
        """compdesc.load returns a component with packages"""
        handle = stringio('''<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa"/>
  </contents>
</component>
''')
        desc = ComponentDescriptor('a.xml', handle)
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        component = desc.load(cache)
        assert isinstance(component, Component)
        self.assert_equal('a.xml', desc.filename)
        self.assert_equal(1, len(list(component.iter_packages())))
        self.assert_equal(1, len(list(component.iter_direct_packages())))
        self.assert_equal(['sha-1:aaa'],
                          [p.blob_id for p in component.iter_packages()])
        self.assert_equal(0, len(list(component.iter_direct_components())))
        self.assert_equal(0, len(list(component.iter_components())))
Esempio n. 19
0
    def test_load_file_object(self):
        """compdesc.load returns a component with packages"""
        handle = stringio('''<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa"/>
  </contents>
</component>
''')
        desc = ComponentDescriptor('a.xml', handle)
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        component = desc.load(cache)
        assert isinstance(component, Component)
        self.assert_equal('a.xml', desc.filename)
        self.assert_equal(1, len(list(component.iter_packages())))
        self.assert_equal(1, len(list(component.iter_direct_packages())))
        self.assert_equal(['sha-1:aaa'],
                          [ p.blob_id for p in component.iter_packages() ])
        self.assert_equal(0, len(list(component.iter_direct_components())))
        self.assert_equal(0, len(list(component.iter_components())))
Esempio n. 20
0
    def test_parse_entity(self):
        '''Check that we can parse entities at all.'''
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <entities>
    <some-ent id="can-do">
      <a.name>hello</a.name>
      <b.description>whodo whodo whodo</b.description>
    </some-ent>
  </entities>
</component>
''')

        desc = ComponentDescriptor('test.xml')
        entity1 = desc.entities[('some-ent', 'can-do')]
        self.assert_equal('hello', entity1[('a', 'name')])
        self.assert_equal('whodo whodo whodo', entity1[('b', 'description')])
        cache = ShamCache()
        comp = desc.load(cache)
        entity2 = comp.entities[('some-ent', 'can-do')]
        self.assert_equal('hello', entity2[('a', 'name')])
        self.assert_equal('whodo whodo whodo', entity2[('b', 'description')])
Esempio n. 21
0
    def test_load(self):
        """compdesc.load returns a component with packages"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa"/>
  </contents>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        component = desc.load(cache)
        assert isinstance(component, Component)
        self.assert_equal(1, len(list(component.iter_packages())))
        self.assert_equal(1, len(list(component.iter_direct_packages())))
        self.assert_equal(['sha-1:aaa'],
                          [p.blob_id for p in component.iter_packages()])
        self.assert_equal(0, len(list(component.iter_direct_components())))
        self.assert_equal(0, len(list(component.iter_components())))
Esempio n. 22
0
    def test_load(self):
        """compdesc.load returns a component with packages"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:aaa"/>
  </contents>
</component>
EOF
''')
        desc = ComponentDescriptor('a.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        component = desc.load(cache)
        assert isinstance(component, Component)
        self.assert_equal(1, len(list(component.iter_packages())))
        self.assert_equal(1, len(list(component.iter_direct_packages())))
        self.assert_equal(['sha-1:aaa'],
                          [ p.blob_id for p in component.iter_packages() ])
        self.assert_equal(0, len(list(component.iter_direct_components())))
        self.assert_equal(0, len(list(component.iter_components())))
Esempio n. 23
0
    def test_parse_entity(self):
        '''Check that we can parse entities at all.'''
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <entities>
    <some-ent id="can-do">
      <a.name>hello</a.name>
      <b.description>whodo whodo whodo</b.description>
    </some-ent>
  </entities>
</component>
''')

        desc = ComponentDescriptor('test.xml')
        entity1 = desc.entities[('some-ent', 'can-do')]
        self.assert_equal('hello', entity1[('a', 'name')])
        self.assert_equal('whodo whodo whodo',
                          entity1[('b', 'description')])
        cache = ShamCache()
        comp = desc.load(cache)
        entity2 = comp.entities[('some-ent', 'can-do')]
        self.assert_equal('hello', entity2[('a', 'name')])
        self.assert_equal('whodo whodo whodo',
                          entity2[('b', 'description')])
Esempio n. 24
0
    def test_parse_link(self):
        '''Check that we can parse entities at all.'''
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <contents>
    <deb ref="sha-1:aaa">
      <meta>
        <pdk.link>
          <some-meta>can-do</some-meta>
        </pdk.link>
      </meta>
    </deb>
  </contents>
</component>
''')

        desc = ComponentDescriptor('test.xml')
        self.assert_equal([('some-meta', 'can-do')], desc.contents[0].links)
        cache = ShamCache()
        package = MockPackage('a', '1', deb, 'sha-1:aaa')
        cache.add(package)
        comp = desc.load(cache)
        package = comp.iter_packages().next()
        self.assert_equals([('some-meta', 'can-do')], package.links)
Esempio n. 25
0
def audit(args):
    """\\fB%prog\\fP
.PP
Load the component,
and verify that it and it's parts are well-formed.
    """
    ##specialization code starts here

    def note_problem(fact, prediction, prediction_basis,
                     evidence, evidence_basis):
        """A mismatch handler for Arbiter

        Handle the case of a prediction that doesn't pan out
        by reporting the mismatch to stdout, in a format
        suitable for: cut -d'|'
        """
        note_problem.called = True
        fields = fact.get_problem_description(prediction, prediction_basis,
                                         evidence, evidence_basis)
        result = string_together(fields, '|')
        print result

    note_problem.called = False

    my_cache = workspace.current_workspace().cache
    arbiter = Arbiter(note_problem)

    for component_name in args.args:
        def _note_blob_id(blob_id):
            """Make common predictions and warrants for blob_id.

            Predict that a blob_id will be in cache
            Warrant the blob_id will be needed by the component.
            """
            arbiter.predict(InCache(blob_id), True, component_name)

        # Get the set of packages in the component
        descriptor = ComponentDescriptor(component_name)
        component = descriptor.load(my_cache)

        # predict expected blob_ids and headers
        for package in component.iter_packages():
            _note_blob_id(package.blob_id)
            arbiter.predict(InCache(package.blob_id + '.header'),
                            True, component_name)
            for package_tuple in package.extra_files:
                blob_id = package_tuple[0]
                _note_blob_id(blob_id)

        # predict upcoming source packages
        for package in component.iter_packages():
            if package.role == 'binary':
                fact = HasSource(package.format, package.pdk.sp_name,
                                 package.pdk.sp_version.full_version)
                arbiter.predict(fact, True, component_name)

        # warrant source packages found
        for package in component.iter_packages():
            if package.role == 'source':
                fact = HasSource(package.format, package.name,
                                 package.version.full_version)
                arbiter.warrant(fact, True, component_name)

    # predict upcoming cache checksums
    # pre-warrant found inodes
    # note inode -> filename relationships for later
    found_by_inode = {}
    for blob_id in my_cache:
        inode = my_cache.get_inode(blob_id)
        if blob_id.endswith('.header'):
            arbiter.warrant(InCache(blob_id), True, 'cache')
            continue

        entry = found_by_inode.setdefault(inode, Set([]))
        entry.add(blob_id)

        # ? Won't this create repeated predictions?
        for blob_id in found_by_inode[inode]:
            arbiter.predict(ChecksumMatches(blob_id), blob_id, 'cache')

    for inode, blob_ids in found_by_inode.iteritems():
        for blob_id in blob_ids:
            arbiter.warrant(InCache(blob_id), True, 'cache')

        # warrant cache checksums
        one_id = tuple(blob_ids)[0]
        handle = open(my_cache.file_path(one_id))
        sha1_digest = sha.new()
        md5_digest = md5.new()
        read_size = 8196
        while 1:
            block = handle.read(read_size)
            if not block:
                break
            sha1_digest.update(block)
            md5_digest.update(block)
        handle.close()

        prefixes = []
        for blob_id in blob_ids:
            if blob_id.startswith('sha-1'):
                prefixes.append('sha-1')
                arbiter.warrant(ChecksumMatches(blob_id),
                                'sha-1:' + sha1_digest.hexdigest(),
                                'cache')
            elif blob_id.startswith('md5'):
                prefixes.append('md5')
                arbiter.warrant(ChecksumMatches(blob_id),
                                'md5:' + md5_digest.hexdigest(), 'cache')
            else:
                # note unknown prefixes
                arbiter.note_problem(
                    blob_id
                    , ('md5:', 'sha-1:')
                    , 'unknown prefix'
                    )
        prefixes.sort()
        if prefixes != ['md5', 'sha-1']:
            digests = (md5_digest.hexdigest(), sha1_digest.hexdigest())
            arbiter.note_problem(tuple(blob_ids), digests,
                                 'not hard linked properly')

    arbiter.note_leftovers()

    if note_problem.called:
        raise IntegrityFault, "Audit detected fault(s)"
Esempio n. 26
0
def audit(args):
    """\\fB%prog\\fP
.PP
Load the component,
and verify that it and it's parts are well-formed.
    """

    ##specialization code starts here

    def note_problem(fact, prediction, prediction_basis, evidence,
                     evidence_basis):
        """A mismatch handler for Arbiter

        Handle the case of a prediction that doesn't pan out
        by reporting the mismatch to stdout, in a format
        suitable for: cut -d'|'
        """
        note_problem.called = True
        fields = fact.get_problem_description(prediction, prediction_basis,
                                              evidence, evidence_basis)
        result = string_together(fields, '|')
        print result

    note_problem.called = False

    my_cache = workspace.current_workspace().cache
    arbiter = Arbiter(note_problem)

    for component_name in args.args:

        def _note_blob_id(blob_id):
            """Make common predictions and warrants for blob_id.

            Predict that a blob_id will be in cache
            Warrant the blob_id will be needed by the component.
            """
            arbiter.predict(InCache(blob_id), True, component_name)

        # Get the set of packages in the component
        descriptor = ComponentDescriptor(component_name)
        component = descriptor.load(my_cache)

        # predict expected blob_ids and headers
        for package in component.iter_packages():
            _note_blob_id(package.blob_id)
            arbiter.predict(InCache(package.blob_id + '.header'), True,
                            component_name)
            for package_tuple in package.extra_files:
                blob_id = package_tuple[0]
                _note_blob_id(blob_id)

        # predict upcoming source packages
        for package in component.iter_packages():
            if package.role == 'binary':
                fact = HasSource(package.format, package.pdk.sp_name,
                                 package.pdk.sp_version.full_version)
                arbiter.predict(fact, True, component_name)

        # warrant source packages found
        for package in component.iter_packages():
            if package.role == 'source':
                fact = HasSource(package.format, package.name,
                                 package.version.full_version)
                arbiter.warrant(fact, True, component_name)

    # predict upcoming cache checksums
    # pre-warrant found inodes
    # note inode -> filename relationships for later
    found_by_inode = {}
    for blob_id in my_cache:
        inode = my_cache.get_inode(blob_id)
        if blob_id.endswith('.header'):
            arbiter.warrant(InCache(blob_id), True, 'cache')
            continue

        entry = found_by_inode.setdefault(inode, Set([]))
        entry.add(blob_id)

        # ? Won't this create repeated predictions?
        for blob_id in found_by_inode[inode]:
            arbiter.predict(ChecksumMatches(blob_id), blob_id, 'cache')

    for inode, blob_ids in found_by_inode.iteritems():
        for blob_id in blob_ids:
            arbiter.warrant(InCache(blob_id), True, 'cache')

        # warrant cache checksums
        one_id = tuple(blob_ids)[0]
        handle = open(my_cache.file_path(one_id))
        sha1_digest = sha.new()
        md5_digest = md5.new()
        read_size = 8196
        while 1:
            block = handle.read(read_size)
            if not block:
                break
            sha1_digest.update(block)
            md5_digest.update(block)
        handle.close()

        prefixes = []
        for blob_id in blob_ids:
            if blob_id.startswith('sha-1'):
                prefixes.append('sha-1')
                arbiter.warrant(ChecksumMatches(blob_id),
                                'sha-1:' + sha1_digest.hexdigest(), 'cache')
            elif blob_id.startswith('md5'):
                prefixes.append('md5')
                arbiter.warrant(ChecksumMatches(blob_id),
                                'md5:' + md5_digest.hexdigest(), 'cache')
            else:
                # note unknown prefixes
                arbiter.note_problem(blob_id, ('md5:', 'sha-1:'),
                                     'unknown prefix')
        prefixes.sort()
        if prefixes != ['md5', 'sha-1']:
            digests = (md5_digest.hexdigest(), sha1_digest.hexdigest())
            arbiter.note_problem(tuple(blob_ids), digests,
                                 'not hard linked properly')

    arbiter.note_leftovers()

    if note_problem.called:
        raise IntegrityFault, "Audit detected fault(s)"
Esempio n. 27
0
    def test_load_multilevel(self):
        """test loading a component that refers to another"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <name>libc6</name>
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
    <deb>
      <name>apache</name>
      <meta>
        <necessity>default</necessity>
      </meta>
    </deb>
    <component>b.xml</component>
  </contents>
</component>
EOF
''')
        os.system('''
cat >b.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <name>libc6</name>
      <meta>
        <necessity>optional</necessity>
      </meta>
    </deb>
    <deb ref="sha-1:aaa">
      <name>apache</name>
      <meta>
        <necessity>optional</necessity>
      </meta>
    </deb>
    <component>c.xml</component>
  </contents>
</component>
EOF
''')
        os.system('''
cat >c.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:bbb">
      <name>libc6</name>
      <meta>
        <necessity>mandatory</necessity>
        <some-random-key>42</some-random-key>
      </meta>
    </deb>
  </contents>
</component>
EOF
''')

        apache = MockPackage('apache', '1', deb, 'sha-1:aaa')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)

        desc_b = ComponentDescriptor('b.xml')
        component_b = desc_b.load(cache)
        assert isinstance(component_b, Component)
        self.assert_equal('b.xml', desc_b.filename)
        self.assert_equal('b.xml', component_b.ref)
        self.assert_equal(2, len(list(component_b.iter_packages())))
        self.assert_equal(['sha-1:aaa', 'sha-1:bbb'],
                          [p.blob_id for p in component_b.iter_packages()])
        self.assert_equal(1, len(list(component_b.iter_direct_packages())))
        self.assert_equal(1, len(list(component_b.iter_direct_components())))
        self.assert_equal(1, len(list(component_b.iter_components())))
        self.assert_equal('optional', libc['pdk', 'necessity'])
        self.assert_equal('optional', apache['pdk', 'necessity'])

        apache = MockPackage('apache', '1', deb, 'sha-1:aaa')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)

        desc_a = ComponentDescriptor('a.xml')
        component_a = desc_a.load(cache)
        assert isinstance(component_a, Component)
        self.assert_equal(2, len(list(component_a.iter_packages())))
        self.assert_equal(['sha-1:aaa', 'sha-1:bbb'],
                          [p.blob_id for p in component_a.iter_packages()])
        self.assert_equal(0, len(list(component_a.iter_direct_packages())))
        self.assert_equal(1, len(list(component_a.iter_direct_components())))
        self.assert_equal(2, len(list(component_a.iter_components())))
        self.assert_equal('mandatory', libc['pdk', 'necessity'])
        self.assert_equal('default', apache['pdk', 'necessity'])
        self.assert_equal('42', libc['pdk', 'some-random-key'])
Esempio n. 28
0
    def test_dont_lose_entities(self):
        """Make sure the write method handles entities."""
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
  <entities>
    <test id="1">
      <a>b</a>
      <c>d</c>
      <e>f</e>
    </test>
  </entities>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        desc.load(cache)
        desc.write()
        expected = '''<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
  <entities>
    <test id="1">
      <a>b</a>
      <c>d</c>
      <e>f</e>
    </test>
  </entities>
</component>
'''
        self.assert_equals_long(expected, open('test.xml').read())
Esempio n. 29
0
    def test_dont_lose_entities(self):
        """Make sure the write method handles entities."""
        open('test.xml', 'w').write('''<?xml version="1.0"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
  <entities>
    <test id="1">
      <a>b</a>
      <c>d</c>
      <e>f</e>
    </test>
  </entities>
</component>
''')
        desc = ComponentDescriptor('test.xml')
        cache = ShamCache()
        cache.add(MockPackage('a', '1', deb, 'sha-1:aaa'))
        desc.load(cache)
        desc.write()
        expected = '''<?xml version="1.0" encoding="utf-8"?>
<component>
  <meta>
    <predicate>object</predicate>
  </meta>
  <contents>
    <dsc>
      <name>a</name>
      <meta>
        <c>d</c>
      </meta>
    </dsc>
    <deb ref="sha-1:aaa">
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
  </contents>
  <entities>
    <test id="1">
      <a>b</a>
      <c>d</c>
      <e>f</e>
    </test>
  </entities>
</component>
'''
        self.assert_equals_long(expected, open('test.xml').read())
Esempio n. 30
0
    def test_load_multilevel(self):
        """test loading a component that refers to another"""
        os.system('''
cat >a.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <name>libc6</name>
      <meta>
        <necessity>mandatory</necessity>
      </meta>
    </deb>
    <deb>
      <name>apache</name>
      <meta>
        <necessity>default</necessity>
      </meta>
    </deb>
    <component>b.xml</component>
  </contents>
</component>
EOF
''')
        os.system('''
cat >b.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb>
      <name>libc6</name>
      <meta>
        <necessity>optional</necessity>
      </meta>
    </deb>
    <deb ref="sha-1:aaa">
      <name>apache</name>
      <meta>
        <necessity>optional</necessity>
      </meta>
    </deb>
    <component>c.xml</component>
  </contents>
</component>
EOF
''')
        os.system('''
cat >c.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<component>
  <contents>
    <deb ref="sha-1:bbb">
      <name>libc6</name>
      <meta>
        <necessity>mandatory</necessity>
        <some-random-key>42</some-random-key>
      </meta>
    </deb>
  </contents>
</component>
EOF
''')

        apache = MockPackage('apache', '1', deb,'sha-1:aaa')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)

        desc_b = ComponentDescriptor('b.xml')
        component_b = desc_b.load(cache)
        assert isinstance(component_b, Component)
        self.assert_equal('b.xml', desc_b.filename)
        self.assert_equal('b.xml', component_b.ref)
        self.assert_equal(2, len(list(component_b.iter_packages())))
        self.assert_equal(['sha-1:aaa', 'sha-1:bbb'],
                          [ p.blob_id
                            for p in component_b.iter_packages() ])
        self.assert_equal(1, len(list(component_b.iter_direct_packages())))
        self.assert_equal(1,
                          len(list(component_b.iter_direct_components())))
        self.assert_equal(1, len(list(component_b.iter_components())))
        self.assert_equal('optional',
                          libc['pdk', 'necessity'])
        self.assert_equal('optional',
                          apache['pdk', 'necessity'])

        apache = MockPackage('apache', '1', deb,'sha-1:aaa')
        libc = MockPackage('libc6', '1', deb, 'sha-1:bbb')
        cache = ShamCache()
        cache.add(apache)
        cache.add(libc)

        desc_a = ComponentDescriptor('a.xml')
        component_a = desc_a.load(cache)
        assert isinstance(component_a, Component)
        self.assert_equal(2, len(list(component_a.iter_packages())))
        self.assert_equal(['sha-1:aaa', 'sha-1:bbb'],
                          [ p.blob_id
                            for p in component_a.iter_packages() ])
        self.assert_equal(0, len(list(component_a.iter_direct_packages())))
        self.assert_equal(1,
                          len(list(component_a.iter_direct_components())))
        self.assert_equal(2, len(list(component_a.iter_components())))
        self.assert_equal('mandatory', libc['pdk', 'necessity'])
        self.assert_equal('default', apache['pdk', 'necessity'])
        self.assert_equal('42', libc['pdk', 'some-random-key'])