/
jdkutil.py
executable file
·110 lines (98 loc) · 4.52 KB
/
jdkutil.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/env python3
import csv
import urllib.request
from os import path
import pathlib
import hashlib
import argparse
import shutil
from subprocess import check_output, CalledProcessError, STDOUT
class Jdk:
def __init__(self, variant, version, os, arch, url, checksum):
self.variant = variant
self.version = version
self.os = os
self.arch = arch
self.url = url
self.checksum = checksum
self.zip_filename = "{}-{}-{}-{}.zip".format(variant, version, os, arch)
self.zip_path = path.join(path.dirname(__file__), "jdk_zips")
self.zip_full_path = path.join(self.zip_path, self.zip_filename)
self.unzip_path = path.join(path.dirname(__file__), "jdks", self.os, self.arch)
def download(self):
print("Checking if {} already exists".format(self.zip_filename))
if path.exists(path.join(self.zip_path, self.zip_filename)):
print("{} already exists".format(self.zip_filename))
if self.verify_checksum():
print("Checksum matches for {}, skipping download".format(self.zip_filename))
return
else:
print("Checksum does not match for {}, downloading again".format(self.zip_filename))
pathlib.Path(self.zip_path).mkdir(parents=True, exist_ok=True)
print("Downloading {}...".format(self.url))
urllib.request.urlretrieve(self.url, self.zip_full_path)
print("Downloaded {} to {}".format(self.url, self.zip_full_path))
print("Verifying checksum for {}".format(self.zip_filename))
if self.verify_checksum():
print("Checksum verified for {}".format(self.zip_filename))
return
else :
raise Exception("Checksum does not match for {}".format(self.zip_filename))
return
def verify_checksum(self):
if not path.exists(self.zip_full_path):
return False
with open (self.zip_full_path, "rb") as f:
data = f.read()
sha256 = hashlib.sha256(data).hexdigest()
return self.checksum == sha256
def unzip(self):
print("Unzipping {}".format(self.zip_filename))
pathlib.Path(self.unzip_path).mkdir(parents=True, exist_ok=True)
try:
check_output(['unzip', '-q', self.zip_full_path, '-d', self.unzip_path], stderr=STDOUT)
except CalledProcessError as err:
print(err.output)
raise err
for item in pathlib.Path(self.unzip_path).iterdir():
if item.is_dir():
shutil.move(path.join(self.unzip_path, item.name), path.join(self.unzip_path, "jdk"))
print("Unzipped {} to {}".format(self.zip_filename, self.unzip_path))
def fix_permissions(self):
print("Fixing permissions for {}".format(self.unzip_path))
check_output(['chmod', '-R', 'a+rw', self.unzip_path], stderr=STDOUT)
print("Fixed permissions for {}".format(self.unzip_path))
jdks = []
with open(path.join(path.dirname(__file__), 'jdks.csv'), 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
for line in csv_reader:
jdks.append(Jdk(line['variant'], line['version'], line['os'], line['arch'], line['url'], line['checksum']))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("action", help="Action to perform", choices=["clean", "clean:jdks", "clean:zips", "download", "unzip"], nargs='+')
parser.add_argument("-t", "--variant", help="Variant to use", choices=["jre", "jdk"], default="jre")
args = parser.parse_args()
print("Running: {}".format(",".join(args.action)))
if "clean" in args.action or "clean:jdks" in args.action:
print("Cleaning jdks...")
if not path.exists(path.join(path.dirname(__file__), "jdks")):
print("No jdks to clean")
else:
shutil.rmtree(path.join(path.dirname(__file__), "jdks"))
if "clean" in args.action or "clean:zips" in args.action:
print("Cleaning jdk zips...")
if not path.exists(path.join(path.dirname(__file__), "jdk_zips")):
print("No jdk zips to clean")
else:
shutil.rmtree(path.join(path.dirname(__file__), "jdk_zips"))
if "download" in args.action:
print("Downloading jdks...")
for jdk in jdks:
if jdk.variant == args.variant:
jdk.download()
if "unzip" in args.action:
print("Unzipping jdks...")
for jdk in jdks:
if jdk.variant == args.variant:
jdk.unzip()
jdk.fix_permissions()