src/modules/p5i.py
author Brock Pytlik <bpytlik@sun.com>
Mon, 16 Aug 2010 16:48:50 -0700
changeset 2026 d1b30615bc99
parent 1968 c0540b1e4f7e
child 2028 b2c674e6ee28
permissions -rw-r--r--
9196 pkg(5) should have support for cryptographic manifest signatures 11611 pkg5 should provide for hash validation on manifests 16654 Expose ability to upload by file path
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1516
8c950a3b4171 10485 move pkg(5) to Python 2.6
Rich Burridge <rich.burridge@sun.com>
parents: 1265
diff changeset
     1
#!/usr/bin/python
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     2
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     4
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     8
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    13
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    19
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    21
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    22
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    23
#
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
    24
# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    25
#
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    26
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    27
import os
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    28
import pkg.client.api_errors as api_errors
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    29
import pkg.client.publisher as publisher
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    30
import pkg.fmri as fmri
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    31
import simplejson as json
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    32
import urllib
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    33
import urllib2
1265
c700981b0af2 8656 build download hash check fails in Windows due to text mode open
Tom Mueller <Tom.Mueller@sun.com>
parents: 1253
diff changeset
    34
import urlparse
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    35
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    36
CURRENT_VERSION = 1
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    37
MIME_TYPE = "application/vnd.pkg5.info"
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    38
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    39
def parse(data=None, fileobj=None, location=None):
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    40
        """Reads the pkg(5) publisher JSON formatted data at 'location'
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    41
        or from the provided file-like object 'fileobj' and returns a
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    42
        list of tuples of the format (publisher object, pkg_names).
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    43
        pkg_names is a list of strings representing package names or
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    44
        FMRIs.  If any pkg_names not specific to a publisher were
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    45
        provided, the last tuple returned will be of the format (None,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    46
        pkg_names).
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    47
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    48
        'data' is an optional string containing the p5i data.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    49
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    50
        'fileobj' is an optional file-like object that must support a
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    51
        'read' method for retrieving data.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    52
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    53
        'location' is an optional string value that should either start
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    54
        with a leading slash and be pathname of a file or a URI string.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    55
        If it is a URI string, supported protocol schemes are 'file',
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    56
        'ftp', 'http', and 'https'.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    57
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    58
        'data' or 'fileobj' or 'location' must be provided."""
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    59
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    60
        if not data and not location and not fileobj:
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    61
                raise api_errors.InvalidResourceLocation(location)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    62
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    63
        if location:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents: 1795
diff changeset
    64
                if location.find("://") == -1 and \
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents: 1795
diff changeset
    65
                    not location.startswith("file:/"):
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    66
                        # Convert the file path to a URI.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    67
                        location = os.path.abspath(location)
1265
c700981b0af2 8656 build download hash check fails in Windows due to text mode open
Tom Mueller <Tom.Mueller@sun.com>
parents: 1253
diff changeset
    68
                        location = urlparse.urlunparse(("file", "",
c700981b0af2 8656 build download hash check fails in Windows due to text mode open
Tom Mueller <Tom.Mueller@sun.com>
parents: 1253
diff changeset
    69
                            urllib.pathname2url(location), "", "", ""))
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    70
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    71
                try:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    72
                        fileobj = urllib2.urlopen(location)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    73
                except (EnvironmentError, ValueError,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    74
                    urllib2.HTTPError), e:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    75
                        raise api_errors.RetrievalError(e,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    76
                            location=location)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    77
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    78
        try:
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    79
                if data:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    80
                        dump_struct = json.loads(data)
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    81
                else:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    82
                        dump_struct = json.load(fileobj)
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    83
        except (EnvironmentError, urllib2.HTTPError), e:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    84
                raise api_errors.RetrievalError(e)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    85
        except ValueError, e:
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
    86
                # Not a valid JSON file.
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    87
                raise api_errors.InvalidP5IFile(e)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    88
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    89
        try:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    90
                ver = int(dump_struct["version"])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    91
        except KeyError:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    92
                raise api_errors.InvalidP5IFile(_("missing version"))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    93
        except ValueError:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    94
                raise api_errors.InvalidP5IFile(_("invalid version"))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    95
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    96
        if ver > CURRENT_VERSION:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    97
                raise api_errors.UnsupportedP5IFile()
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    98
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
    99
        result = []
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   100
        try:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   101
                plist = dump_struct.get("publishers", [])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   102
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   103
                for p in plist:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   104
                        alias = p.get("alias", None)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   105
                        prefix = p.get("name", None)
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   106
                        signing_ca_certs = p.get("signing_ca_certs", [])
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   107
                        inter_certs = p.get("intermediate_certs", [])
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   108
                        
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   109
                        if not prefix:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   110
                                prefix = "Unknown"
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   111
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   112
                        pub = publisher.Publisher(prefix, alias=alias,
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   113
                            ca_certs=signing_ca_certs, inter_certs=inter_certs)
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   114
                        pkglist = p.get("packages", [])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   115
                        result.append((pub, pkglist))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   116
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   117
                        for r in p.get("repositories", []):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   118
                                rargs = {}
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   119
                                for prop in ("collection_type",
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   120
                                    "description", "name",
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   121
                                    "refresh_seconds",
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   122
                                    "registration_uri"):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   123
                                        val = r.get(prop, None)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   124
                                        if val is None or val == "None":
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   125
                                                continue
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   126
                                        rargs[prop] = val
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   127
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   128
                                for prop in ("legal_uris", "mirrors",
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   129
                                    "origins", "related_uris"):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   130
                                        val = r.get(prop, [])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   131
                                        if not isinstance(val, list):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   132
                                                continue
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   133
                                        rargs[prop] = val
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   134
1795
1b3bed835773 14856 image-create / set-publisher shouldn't require repository configuration to have origins
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
   135
                                repo = publisher.Repository(**rargs)
1b3bed835773 14856 image-create / set-publisher shouldn't require repository configuration to have origins
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
   136
                                pub.add_repository(repo)
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   137
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   138
                pkglist = dump_struct.get("packages", [])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   139
                if pkglist:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   140
                        result.append((None, pkglist))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   141
        except (api_errors.PublisherError, TypeError, ValueError), e:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   142
                raise api_errors.InvalidP5IFile(str(e))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   143
        return result
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   144
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   145
def write(fileobj, pubs, pkg_names=None):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   146
        """Writes the publisher, repository, and provided package names to the
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
   147
        provided file-like object 'fileobj' in JSON p5i format.
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   148
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   149
        'fileobj' is an object that has a 'write' method that accepts data to be
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   150
        written as a parameter.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   151
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   152
        'pkg_names' is a dict of lists, tuples, or sets indexed by publisher
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   153
        prefix that contain package names, FMRI strings, or FMRI objects.  A
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   154
        prefix of "" can be used for packages that are that are not specific to
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   155
        a publisher.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   156
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   157
        'pubs' is a list of Publisher objects."""
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   158
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   159
        dump_struct = {
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   160
            "packages": [],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   161
            "publishers": [],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   162
            "version": CURRENT_VERSION,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   163
        }
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   164
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   165
        if pkg_names is None:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   166
                pkg_names = {}
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   167
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   168
        def copy_pkg_names(source, dest):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   169
                for entry in source:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   170
                        # Publisher information is intentionally
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   171
                        # omitted as association with this specific
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   172
                        # publisher is implied by location in the
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   173
                        # output.
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   174
                        if isinstance(entry, fmri.PkgFmri):
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   175
                                dest.append(entry.get_fmri(
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   176
                                    anarchy=True))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   177
                        else:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   178
                                dest.append(str(entry))
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   179
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   180
        dpubs = dump_struct["publishers"]
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   181
        for p in pubs:
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   182
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   183
                dpub = {
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   184
                    "alias": p.alias,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   185
                    "name": p.prefix,
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   186
                    "signing_ca_certs": p.signing_ca_certs,
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1968
diff changeset
   187
                    "intermediate_certs": p.inter_certs,
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   188
                    "packages": [],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   189
                    "repositories": []
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   190
                }
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   191
                dpubs.append(dpub)
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   192
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   193
                try:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   194
                        copy_pkg_names(pkg_names[p.prefix],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   195
                            dpub["packages"])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   196
                except KeyError:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   197
                        pass
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   198
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   199
                drepos = dpub["repositories"]
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   200
                for r in p.repositories:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   201
                        reg_uri = ""
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   202
                        if r.registration_uri:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   203
                                reg_uri = r.registration_uri.uri
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   204
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   205
                        drepos.append({
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   206
                            "collection_type": r.collection_type,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   207
                            "description": r.description,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   208
                            "legal_uris": [u.uri for u in r.legal_uris],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   209
                            "mirrors": [u.uri for u in r.mirrors],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   210
                            "name": r.name,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   211
                            "origins": [u.uri for u in r.origins],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   212
                            "refresh_seconds": r.refresh_seconds,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   213
                            "registration_uri": reg_uri,
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   214
                            "related_uris": [
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   215
                                u.uri for u in r.related_uris
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   216
                            ],
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   217
                        })
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   218
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   219
        try:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   220
                copy_pkg_names(pkg_names[""], dump_struct["packages"])
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   221
        except KeyError:
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   222
                pass
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   223
1253
6398a8499a91 9027 p5i module should add terminating newline
Shawn Walker <srw@sun.com>
parents: 1117
diff changeset
   224
        json.dump(dump_struct, fileobj, ensure_ascii=False,
1117
667aecade0ab 7862 install links using p5i for search results desired
Shawn Walker <srw@sun.com>
parents:
diff changeset
   225
            allow_nan=False, indent=2, sort_keys=True)
1253
6398a8499a91 9027 p5i module should add terminating newline
Shawn Walker <srw@sun.com>
parents: 1117
diff changeset
   226
        fileobj.write("\n")