Skip to content

Commit 1306c5b

Browse files
committed
Support directory listed package indexing
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 8e21c87 commit 1306c5b

1 file changed

Lines changed: 81 additions & 3 deletions

File tree

minecode/visitors/generic.py

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@
99

1010
import logging
1111

12-
from packageurl import PackageURL
13-
12+
from fetchcode.package import info
1413
from packagedcode.models import PackageData
14+
from packageurl import PackageURL
1515

1616
from minecode import priority_router
1717

18-
1918
"""
2019
Collect generic packages from a download URL.
2120
"""
@@ -77,3 +76,82 @@ def process_request(purl_str):
7776

7877
if error_msg:
7978
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

Comments
 (0)