Skip to content

Commit 3624b30

Browse files
committed
Add package architecture info to data model
This commit adds package architecture information to Tern's data model by collecting it during analysis. Many purl types[1] include an architecture qualifier key. Having this attribute available in Tern's data model will making creating and reporting purls easier and more accurate. [1]https://github.com/package-url/purl-spec/blob/master/PURL-TYPES.rst Works towards #1206 Signed-off-by: Rose Judge <[email protected]>
1 parent 5ab79f3 commit 3624b30

File tree

5 files changed

+53
-5
lines changed

5 files changed

+53
-5
lines changed

tern/analyze/default/bundle.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ def convert_to_pkg_dicts(attr_lists):
5353
'files': 'files',
5454
'src_name': 'source_names',
5555
'src_version': 'source_versions',
56-
'pkg_supplier': 'pkg_suppliers'}
56+
'pkg_supplier': 'pkg_suppliers',
57+
'arch': 'archs'}
5758
pkg_list = []
5859
len_names = len(attr_lists['names'])
5960
# make a list of keys that correspond with package property names

tern/analyze/default/command_lib/base.yml

+33
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ tdnf:
5252
- 'pkgs=`tdnf list installed | cut -f1 -d"."`'
5353
- 'for p in $pkgs; do tdnf info $p | head -10 | tail -1 | cut -f2 -d":" | xargs; done'
5454
delimiter: "\n"
55+
archs:
56+
invoke:
57+
1:
58+
container:
59+
- 'tdnf check-update > /dev/null'
60+
- 'tdnf list installed | cut -f2 -d"." | cut -f1 -d" "'
61+
delimiter: "\n"
5562
files: {}
5663
proj_urls:
5764
invoke:
@@ -88,6 +95,12 @@ dpkg:
8895
container:
8996
- "dpkg-query -W -f '${Version}\n'"
9097
delimiter: "\n"
98+
archs:
99+
invoke:
100+
1:
101+
container:
102+
- "dpkg-query -W -f '${Architecture}\n'"
103+
delimiter: "\n"
91104
pkg_suppliers:
92105
invoke:
93106
1:
@@ -156,6 +169,13 @@ apk:
156169
- "pkgs=`apk info 2>/dev/null`"
157170
- "for p in $pkgs; do lic=`apk info $p 2>/dev/null | head -1 | awk '{print $1}'`; echo $lic | sed -e \"s/^$p-//\"; done"
158171
delimiter: "\n"
172+
archs:
173+
invoke:
174+
1:
175+
container:
176+
- "pkgs=`apk info 2>/dev/null`"
177+
- "for p in $pkgs; do apk -a info $p --print-arch; done"
178+
delimiter: "\n"
159179
pkg_suppliers:
160180
invoke:
161181
1:
@@ -274,6 +294,12 @@ rpm:
274294
container:
275295
- 'rpm --query --all --queryformat "%{license}\n" 2>/dev/null'
276296
delimiter: "\n"
297+
archs:
298+
invoke:
299+
1:
300+
container:
301+
- 'rpm --query --all --queryformat "%{arch}\n" 2>/dev/null'
302+
delimiter: "\n"
277303
source_names:
278304
invoke:
279305
1:
@@ -560,6 +586,13 @@ distroless:
560586
- "files=`ls var/lib/dpkg/status.d`"
561587
- "for f in $files; do grep -oP '^Version: \\K.*$' var/lib/dpkg/status.d/$f; done"
562588
delimiter: "\n"
589+
archs:
590+
invoke:
591+
1:
592+
host:
593+
- "files=`ls var/lib/dpkg/status.d`"
594+
- "for f in $files; do grep -oP '^Architecture: \\K.*$' var/lib/dpkg/status.d/$f; done"
595+
delimiter: "\n"
563596
copyrights:
564597
invoke:
565598
1:

tern/analyze/default/command_lib/command_lib.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
command_lib['snippets'] = yaml.safe_load(f)
3838
# list of package information keys that the command library can accomodate
3939
base_keys = {'names', 'versions', 'licenses', 'source_names',
40-
'source_versions', 'pkg_suppliers', 'copyrights',
40+
'source_versions', 'pkg_suppliers', 'archs', 'copyrights',
4141
'proj_urls', 'srcs', 'files'}
4242
package_keys = {'name', 'version', 'license', 'src_name', 'src_version',
43-
'pkg_supplier', 'copyright', 'proj_url', 'src', 'files'}
43+
'pkg_supplier', 'arch', 'copyright', 'proj_url', 'src', 'files'}
4444

4545
# global logger
4646
logger = logging.getLogger(constants.logger_name)

tern/classes/package.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class Package:
2525
src_name: the source package associated with the binary package
2626
src_version: the source package version
2727
pkg_supplier: the package distributor according to SPDX 7.5;
28-
required to create NTIA compliant SPDX docs
28+
required to create NTIA compliant SPDX docs
29+
arch: architecture the package was built for
2930
3031
methods:
3132
to_dict: returns a dict representation of the instance
@@ -50,6 +51,7 @@ def __init__(self, name):
5051
self.__src_name = ''
5152
self.__src_version = ''
5253
self.__pkg_supplier = ''
54+
self.__arch = ''
5355

5456
@property
5557
def name(self):
@@ -155,6 +157,14 @@ def pkg_supplier(self):
155157
def pkg_supplier(self, pkg_supplier):
156158
self.__pkg_supplier = pkg_supplier
157159

160+
@property
161+
def arch(self):
162+
return self.__arch
163+
164+
@arch.setter
165+
def arch(self, arch):
166+
self.__arch = arch
167+
158168
def get_file_paths(self):
159169
"""Return a list of paths of all the files in a package"""
160170
return [f.path for f in self.__files]

tests/test_class_package.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def setUp(self):
2626
self.p1.src_name = 'p1src'
2727
self.p1.src_version = '1.0'
2828
self.p1.pkg_supplier = 'VMware'
29+
self.p1.arch = 'x86_64'
2930

3031
self.p2 = Package('p2')
3132

@@ -82,6 +83,7 @@ def testGetters(self):
8283
self.assertEqual(self.p1.src_name, 'p1src')
8384
self.assertEqual(self.p1.src_version, '1.0')
8485
self.assertEqual(self.p1.pkg_supplier, 'VMware')
86+
self.assertEqual(self.p1.arch, 'x86_64')
8587

8688
def testAddFile(self):
8789
p1 = Package('package')
@@ -135,6 +137,7 @@ def testToDict(self):
135137
self.assertEqual(a_dict['src_name'], 'p1src')
136138
self.assertEqual(a_dict['src_version'], '1.0')
137139
self.assertEqual(a_dict['pkg_supplier'], 'VMware')
140+
self.assertEqual(a_dict['arch'], 'x86_64')
138141

139142
def testToDictTemplate(self):
140143
template1 = TestTemplate1()
@@ -181,7 +184,8 @@ def testFill(self):
181184
'pkg_format': 'rpm',
182185
'src_name': 'p1src',
183186
'src_version': '1.0',
184-
'pkg_supplier': 'VMware'
187+
'pkg_supplier': 'VMware',
188+
'arch': 'x86_64'
185189
}
186190
p = Package('p1')
187191
p.fill(p_dict)

0 commit comments

Comments
 (0)