|
9 | 9 |
|
10 | 10 | import logging |
11 | 11 |
|
12 | | -from packageurl import PackageURL |
13 | | - |
| 12 | +from fetchcode.package import info |
14 | 13 | from packagedcode.models import PackageData |
| 14 | +from packageurl import PackageURL |
15 | 15 |
|
16 | 16 | from minecode import priority_router |
17 | 17 |
|
18 | | - |
19 | 18 | """ |
20 | 19 | Collect generic packages from a download URL. |
21 | 20 | """ |
@@ -77,3 +76,82 @@ def process_request(purl_str): |
77 | 76 |
|
78 | 77 | if error_msg: |
79 | 78 | return error_msg |
| 79 | + |
| 80 | + |
| 81 | +def map_directory_listed_package(package_url): |
| 82 | + """ |
| 83 | + Add a GNU `package_url` to the PackageDB. |
| 84 | +
|
| 85 | + Return an error string if any errors are encountered during the process |
| 86 | + """ |
| 87 | + from minecode.model_utils import add_package_to_scan_queue |
| 88 | + from minecode.model_utils import merge_or_create_package |
| 89 | + |
| 90 | + packages = [p for p in info(str(package_url)) or []] |
| 91 | + |
| 92 | + if not packages: |
| 93 | + error = f"Could not find package using fetchcode: {package_url}" |
| 94 | + logger.error(error) |
| 95 | + return error |
| 96 | + |
| 97 | + package_data = packages[0].to_dict() |
| 98 | + |
| 99 | + # Remove obsolete Package fields see https://github.com/nexB/fetchcode/issues/108 |
| 100 | + del package_data["api_url"] |
| 101 | + del package_data["license_expression"] |
| 102 | + del package_data["declared_license"] |
| 103 | + del package_data["root_path"] |
| 104 | + del package_data["contains_source_code"] |
| 105 | + del package_data["purl"] |
| 106 | + |
| 107 | + package = PackageData(**package_data) |
| 108 | + |
| 109 | + db_package, _, _, error = merge_or_create_package(package, visit_level=0) |
| 110 | + |
| 111 | + # Submit package for scanning |
| 112 | + if db_package: |
| 113 | + add_package_to_scan_queue(db_package) |
| 114 | + |
| 115 | + return error |
| 116 | + |
| 117 | + |
| 118 | +DIR_SUPPORTED_PURLS = [ |
| 119 | + "pkg:generic/busybox@.*", |
| 120 | + "pkg:generic/bzip2@.*", |
| 121 | + "pkg:generic/dnsmasq@.*", |
| 122 | + "pkg:generic/dropbear@.*", |
| 123 | + "pkg:generic/ebtables@.*", |
| 124 | + "pkg:generic/hostapd@.*", |
| 125 | + "pkg:generic/iproute2@.*", |
| 126 | + "pkg:generic/iptables@.*", |
| 127 | + "pkg:generic/libnl@.*", |
| 128 | + "pkg:generic/lighttpd@.*", |
| 129 | + "pkg:generic/nftables@.*", |
| 130 | + "pkg:generic/openssh@.*", |
| 131 | + "pkg:generic/samba@.*", |
| 132 | + "pkg:generic/syslinux@.*", |
| 133 | + "pkg:generic/toybox@.*", |
| 134 | + "pkg:generic/uclibc@@.*", |
| 135 | + "pkg:generic/uclibc-ng@.*", |
| 136 | + "pkg:generic/util-linux@.*", |
| 137 | + "pkg:generic/wpa_supplicant@.*", |
| 138 | + "pkg:generic/ipkg@.*", |
| 139 | +] |
| 140 | + |
| 141 | + |
| 142 | +@priority_router.route(*DIR_SUPPORTED_PURLS) |
| 143 | +def process_request(purl_str): |
| 144 | + """ |
| 145 | + Process `priority_resource_uri` containing a generic Package URL (PURL) |
| 146 | + supported by fetchcode |
| 147 | + """ |
| 148 | + try: |
| 149 | + package_url = PackageURL.from_string(purl_str) |
| 150 | + except ValueError as e: |
| 151 | + error = f"error occured when parsing {purl_str}: {e}" |
| 152 | + return error |
| 153 | + |
| 154 | + error_msg = map_directory_listed_package(package_url) |
| 155 | + |
| 156 | + if error_msg: |
| 157 | + return error_msg |
0 commit comments