1- from cfengine_cli .masterfiles .download import download_all_versions
1+ from cfengine_cli .masterfiles .download import (
2+ ENTERPRISE_RELEASES_URL ,
3+ download_all_versions ,
4+ )
25from cfengine_cli .masterfiles .generate_vcf_download import generate_vcf_download
6+ from cfengine_cli .masterfiles .analyze import filter_unstable_releases , sort_release_data
37from cfengine_cli .masterfiles .generate_vcf_git_checkout import generate_vcf_git_checkout
48from cfengine_cli .masterfiles .check_download_matches_git import (
59 check_download_matches_git ,
610)
7- from cfbs .utils import immediate_subdirectories , version_is_at_least
11+ from cfbs .utils import (
12+ get_json ,
13+ immediate_subdirectories ,
14+ version_is_at_least ,
15+ write_json ,
16+ CFBSNetworkError ,
17+ CFBSExitError ,
18+ )
819
920DOWNLOAD_PATH = "downloaded_masterfiles"
1021
@@ -33,6 +44,8 @@ def generate_release_information_impl(
3344 )
3445 generate_vcf_download (DOWNLOAD_PATH , downloaded_versions )
3546
47+ generate_release_history ()
48+
3649 if check :
3750 print (
3851 "Downloading releases of masterfiles from git (github.com) and generating "
@@ -52,3 +65,85 @@ def generate_release_information_impl(
5265 "(Run again with --check-against-git to download and compare with files "
5366 + "from git, and generate -git.json files)"
5467 )
68+
69+
70+ def generate_release_history ():
71+ print ("Generating release history information..." )
72+
73+ releases_data = download_releasedata ()
74+
75+ stable_releases = filter_unstable_releases (releases_data )
76+
77+ file_checksums_dict = build_release_history (stable_releases )
78+
79+ sorted_releases = sort_release_data (file_checksums_dict )
80+
81+ write_json ("./cfengine-enterprise/checksums.json" , sorted_releases )
82+
83+
84+ def download_releasedata ():
85+ # Downloading releases.json:
86+ try :
87+ releases_data = get_json (ENTERPRISE_RELEASES_URL )
88+
89+ except CFBSNetworkError :
90+ raise CFBSExitError (
91+ "Downloading CFEngine release data failed - check your Wi-Fi / network settings."
92+ )
93+
94+ return releases_data
95+
96+
97+ def build_release_history (filtered_releases ):
98+ release_history = {}
99+
100+ for release_data in filtered_releases :
101+ if not release_data .get ("version" ) or not release_data .get ("URL" ):
102+ continue
103+
104+ subdata , version = download_release_version_data (release_data )
105+ version_files = extract_version_files (subdata )
106+
107+ if version_files :
108+ release_history [version ] = version_files
109+
110+ return release_history
111+
112+
113+ def download_release_version_data (release_data ):
114+ # Downloads each versionnumber.json in releases.json
115+ version = release_data .get ("version" )
116+ url = release_data .get ("URL" )
117+
118+ try :
119+ return get_json (url ), version
120+ except CFBSNetworkError :
121+ raise CFBSExitError (
122+ f"Downloading CFEngine release data for version { version } failed - check your Wi-Fi / network settings."
123+ )
124+
125+
126+ def extract_version_files (subdata ):
127+ # Gets filenames and checksums for each file in the subdata of releases.json:
128+ artifacts = subdata .get ("artifacts" , {})
129+ version_files = {}
130+
131+ for asset_list in artifacts .values ():
132+ for asset_data in asset_list :
133+ filename , checksum = extract_file_info (asset_data )
134+
135+ if filename and checksum :
136+ version_files [filename ] = checksum
137+
138+ return version_files
139+
140+
141+ def extract_file_info (asset_data ):
142+ url = asset_data .get ("URL" )
143+ checksum = asset_data .get ("SHA256" )
144+
145+ if url and checksum :
146+ filename = url .split ("/" )[- 1 ]
147+ return filename , checksum
148+
149+ return None , None
0 commit comments