diff --git a/releases/samsung-galaxy-tab.json b/releases/samsung-galaxy-tab.json new file mode 100644 index 00000000..c329cb02 --- /dev/null +++ b/releases/samsung-galaxy-tab.json @@ -0,0 +1,305 @@ +{ + "releases": { + "galaxy-tab-s9-ultra": { + "name": "galaxy-tab-s9-ultra", + "eol": "2028-08-11" + }, + "galaxy-tab-s9-fe+": { + "name": "galaxy-tab-s9-fe+", + "eol": "2028-10-04" + }, + "galaxy-tab-s9-fe": { + "name": "galaxy-tab-s9-fe", + "eol": "2028-10-04" + }, + "galaxy-tab-s9+": { + "name": "galaxy-tab-s9+", + "eol": "2028-08-11" + }, + "galaxy-tab-s9": { + "name": "galaxy-tab-s9", + "eol": "2028-08-11" + }, + "galaxy-tab-s8-ultra": { + "name": "galaxy-tab-s8-ultra", + "eol": "2027-04-30" + }, + "galaxy-tab-s8+": { + "name": "galaxy-tab-s8+", + "eol": "2027-04-14" + }, + "galaxy-tab-s8": { + "name": "galaxy-tab-s8", + "eol": "2027-03-22" + }, + "galaxy-tab-s7-fe": { + "name": "galaxy-tab-s7-fe", + "eol": false + }, + "galaxy-tab-s7+": { + "name": "galaxy-tab-s7+", + "eol": "2024-08-05" + }, + "galaxy-tab-s7": { + "name": "galaxy-tab-s7", + "eol": "2024-08-05" + }, + "galaxy-tab-s6-lite-2024": { + "name": "galaxy-tab-s6-lite-2024", + "eol": false + }, + "galaxy-tab-s6-lite-2020": { + "name": "galaxy-tab-s6-lite-2020", + "eol": "2024-03-26" + }, + "galaxy-tab-s6-lite": { + "name": "galaxy-tab-s6-lite", + "eol": false + }, + "galaxy-tab-s6-5g": { + "name": "galaxy-tab-s6-5g", + "eol": "2024-01-30" + }, + "galaxy-tab-s6": { + "name": "galaxy-tab-s6", + "eol": "2023-07-31" + }, + "galaxy-tab-s5e": { + "name": "galaxy-tab-s5e", + "eol": "2023-04-01" + }, + "galaxy-tab-s4-10.5": { + "name": "galaxy-tab-s4-10.5", + "eol": true + }, + "galaxy-tab-s3-9.7": { + "name": "galaxy-tab-s3-9.7", + "eol": true + }, + "galaxy-tab-s2-9.7": { + "name": "galaxy-tab-s2-9.7", + "eol": true + }, + "galaxy-tab-s2-8.0": { + "name": "galaxy-tab-s2-8.0", + "eol": true + }, + "galaxy-tab-s10-ultra": { + "name": "galaxy-tab-s10-ultra", + "eol": "2031-10-03" + }, + "galaxy-tab-s10-fe+": { + "name": "galaxy-tab-s10-fe+", + "eol": "2032-04-03" + }, + "galaxy-tab-s10-fe": { + "name": "galaxy-tab-s10-fe", + "eol": "2032-04-03" + }, + "galaxy-tab-s10+": { + "name": "galaxy-tab-s10+", + "eol": "2031-10-03" + }, + "galaxy-tab-s-8.4-lte": { + "name": "galaxy-tab-s-8.4-lte", + "eol": true + }, + "galaxy-tab-s-8.4": { + "name": "galaxy-tab-s-8.4", + "eol": true + }, + "galaxy-tab-s-10.5-lte": { + "name": "galaxy-tab-s-10.5-lte", + "eol": true + }, + "galaxy-tab-s-10.5": { + "name": "galaxy-tab-s-10.5", + "eol": true + }, + "galaxy-tab-pro-12.2-lte": { + "name": "galaxy-tab-pro-12.2-lte", + "eol": true + }, + "galaxy-tab-pro-12.2-3g": { + "name": "galaxy-tab-pro-12.2-3g", + "eol": true + }, + "galaxy-tab-pro-12.2": { + "name": "galaxy-tab-pro-12.2", + "eol": true + }, + "galaxy-tab-j": { + "name": "galaxy-tab-j", + "eol": true + }, + "galaxy-tab-e-9.6": { + "name": "galaxy-tab-e-9.6", + "eol": true + }, + "galaxy-tab-e-8.0": { + "name": "galaxy-tab-e-8.0", + "eol": true + }, + "galaxy-tab-advanced2": { + "name": "galaxy-tab-advanced2", + "eol": true + }, + "galaxy-tab-active5": { + "name": "galaxy-tab-active5", + "eol": "2029-01-23" + }, + "galaxy-tab-active4-pro": { + "name": "galaxy-tab-active4-pro", + "eol": "2027-08-31" + }, + "galaxy-tab-active3": { + "name": "galaxy-tab-active3", + "eol": "2024-09-28" + }, + "galaxy-tab-active2": { + "name": "galaxy-tab-active2", + "eol": true + }, + "galaxy-tab-active-pro": { + "name": "galaxy-tab-active-pro", + "eol": "2023-10-01" + }, + "galaxy-tab-active-lte": { + "name": "galaxy-tab-active-lte", + "eol": true + }, + "galaxy-tab-active": { + "name": "galaxy-tab-active", + "eol": true + }, + "galaxy-tab-a9+": { + "name": "galaxy-tab-a9+", + "eol": "2027-10-23" + }, + "galaxy-tab-a9": { + "name": "galaxy-tab-a9", + "eol": "2027-10-23" + }, + "galaxy-tab-a8": { + "name": "galaxy-tab-a8", + "eol": false + }, + "galaxy-tab-a7-lite": { + "name": "galaxy-tab-a7-lite", + "eol": false + }, + "galaxy-tab-a7-10.4-2022": { + "name": "galaxy-tab-a7-10.4-2022", + "eol": false + }, + "galaxy-tab-a7-10.4-2020": { + "name": "galaxy-tab-a7-10.4-2020", + "eol": "2024-08-10" + }, + "galaxy-tab-a-9.7-and-s-pen": { + "name": "galaxy-tab-a-9.7-and-s-pen", + "eol": true + }, + "galaxy-tab-a-9.7": { + "name": "galaxy-tab-a-9.7", + "eol": true + }, + "galaxy-tab-a-8.4-2020": { + "name": "galaxy-tab-a-8.4-2020", + "eol": "2024-03-25" + }, + "galaxy-tab-a-8.0-with-s-pen-2019": { + "name": "galaxy-tab-a-8.0-with-s-pen-2019", + "eol": "2023-04-01" + }, + "galaxy-tab-a-8.0-and-s-pen-2015": { + "name": "galaxy-tab-a-8.0-and-s-pen-2015", + "eol": true + }, + "galaxy-tab-a-8.0-2019": { + "name": "galaxy-tab-a-8.0-2019", + "eol": "2023-07-01" + }, + "galaxy-tab-a-8.0-2018": { + "name": "galaxy-tab-a-8.0-2018", + "eol": true + }, + "galaxy-tab-a-8.0-2017": { + "name": "galaxy-tab-a-8.0-2017", + "eol": true + }, + "galaxy-tab-a-8.0-2015": { + "name": "galaxy-tab-a-8.0-2015", + "eol": true + }, + "galaxy-tab-a-7.0-2016": { + "name": "galaxy-tab-a-7.0-2016", + "eol": true + }, + "galaxy-tab-a-10.5-2018": { + "name": "galaxy-tab-a-10.5-2018", + "eol": true + }, + "galaxy-tab-a-10.1-2019": { + "name": "galaxy-tab-a-10.1-2019", + "eol": true + }, + "galaxy-tab-a-10.1-2016": { + "name": "galaxy-tab-a-10.1-2016", + "eol": true + }, + "galaxy-tab-4-8.0-lte": { + "name": "galaxy-tab-4-8.0-lte", + "eol": true + }, + "galaxy-tab-4-8.0-3g": { + "name": "galaxy-tab-4-8.0-3g", + "eol": true + }, + "galaxy-tab-4-8.0": { + "name": "galaxy-tab-4-8.0", + "eol": true + }, + "galaxy-tab-4-7.0-lte": { + "name": "galaxy-tab-4-7.0-lte", + "eol": true + }, + "galaxy-tab-4-7.0-3g": { + "name": "galaxy-tab-4-7.0-3g", + "eol": true + }, + "galaxy-tab-4-7.0": { + "name": "galaxy-tab-4-7.0", + "eol": true + }, + "galaxy-tab-4-10.1-lte": { + "name": "galaxy-tab-4-10.1-lte", + "eol": true + }, + "galaxy-tab-4-10.1-3g": { + "name": "galaxy-tab-4-10.1-3g", + "eol": true + }, + "galaxy-tab-4-10.1": { + "name": "galaxy-tab-4-10.1", + "eol": true + }, + "galaxy-tab-3-v": { + "name": "galaxy-tab-3-v", + "eol": true + }, + "galaxy-tab-3-lite-7.0-ve": { + "name": "galaxy-tab-3-lite-7.0-ve", + "eol": true + }, + "galaxy-tab-3-lite-7.0-3g": { + "name": "galaxy-tab-3-lite-7.0-3g", + "eol": true + }, + "galaxy-tab-3-lite-7.0": { + "name": "galaxy-tab-3-lite-7.0", + "eol": true + } + }, + "versions": {} +} \ No newline at end of file diff --git a/releases/samsung-mobile.json b/releases/samsung-mobile.json index 0fcdd97c..15f5beda 100644 --- a/releases/samsung-mobile.json +++ b/releases/samsung-mobile.json @@ -247,328 +247,6 @@ "name": "galaxy-v", "eol": true }, - "galaxy-tab-s9-ultra": { - "name": "galaxy-tab-s9-ultra", - "eol": "2028-10-16", - "releaseLabel": "Galaxy Tab S9 Ultra" - }, - "galaxy-tab-s9-fe+": { - "name": "galaxy-tab-s9-fe+", - "eol": "2028-10-16", - "releaseLabel": "Galaxy Tab S9 FE+" - }, - "galaxy-tab-s9-fe": { - "name": "galaxy-tab-s9-fe", - "eol": false, - "releaseLabel": "Galaxy Tab S9 FE" - }, - "galaxy-tab-s9+": { - "name": "galaxy-tab-s9+", - "eol": "2028-10-16", - "releaseLabel": "Galaxy Tab S9+" - }, - "galaxy-tab-s9": { - "name": "galaxy-tab-s9", - "eol": "2028-10-16", - "releaseLabel": "Galaxy Tab S9" - }, - "galaxy-tab-s8-ultra": { - "name": "galaxy-tab-s8-ultra", - "eol": "2027-04-30", - "releaseLabel": "Galaxy Tab S8 Ultra" - }, - "galaxy-tab-s8+": { - "name": "galaxy-tab-s8+", - "eol": "2027-04-14", - "releaseLabel": "Galaxy Tab S8+" - }, - "galaxy-tab-s8": { - "name": "galaxy-tab-s8", - "eol": "2027-03-22", - "releaseLabel": "Galaxy Tab S8" - }, - "galaxy-tab-s7-fe": { - "name": "galaxy-tab-s7-fe", - "eol": false, - "releaseLabel": "Galaxy Tab S7 FE" - }, - "galaxy-tab-s7+": { - "name": "galaxy-tab-s7+", - "eol": "2024-08-05" - }, - "galaxy-tab-s7": { - "name": "galaxy-tab-s7", - "eol": "2024-08-21" - }, - "galaxy-tab-s6-lite-2024": { - "name": "galaxy-tab-s6-lite-2024", - "releaseLabel": "Galaxy Tab S6 Lite (2024)", - "eol": false - }, - "galaxy-tab-s6-lite-2020": { - "name": "galaxy-tab-s6-lite-2020", - "eol": true - }, - "galaxy-tab-s6-lite": { - "name": "galaxy-tab-s6-lite", - "eol": false, - "releaseLabel": "Galaxy Tab S6 Lite" - }, - "galaxy-tab-s6-5g": { - "name": "galaxy-tab-s6-5g", - "eol": true - }, - "galaxy-tab-s6": { - "name": "galaxy-tab-s6", - "eol": true - }, - "galaxy-tab-s5e": { - "name": "galaxy-tab-s5e", - "eol": true - }, - "galaxy-tab-s4-10.5": { - "name": "galaxy-tab-s4-10.5", - "eol": "2022-06-01" - }, - "galaxy-tab-s3-9.7": { - "name": "galaxy-tab-s3-9.7", - "eol": "2019-04-01" - }, - "galaxy-tab-s2-9.7": { - "name": "galaxy-tab-s2-9.7", - "eol": "2019-07-01" - }, - "galaxy-tab-s2-8.0": { - "name": "galaxy-tab-s2-8.0", - "eol": "2019-07-01" - }, - "galaxy-tab-s10-ultra": { - "name": "galaxy-tab-s10-ultra", - "releaseLabel": "Galaxy Tab S10 Ultra", - "eol": false - }, - "galaxy-tab-s10-fe+": { - "name": "galaxy-tab-s10-fe+", - "releaseLabel": "Galaxy Tab S10 FE+", - "eol": false - }, - "galaxy-tab-s10-fe": { - "name": "galaxy-tab-s10-fe", - "releaseLabel": "Galaxy Tab S10 FE", - "eol": false - }, - "galaxy-tab-s10+": { - "name": "galaxy-tab-s10+", - "releaseLabel": "Galaxy Tab S10+", - "eol": false - }, - "galaxy-tab-s-8.4-lte": { - "name": "galaxy-tab-s-8.4-lte", - "eol": "2016-12-01" - }, - "galaxy-tab-s-8.4": { - "name": "galaxy-tab-s-8.4", - "eol": "2017-08-01" - }, - "galaxy-tab-s-10.5-lte": { - "name": "galaxy-tab-s-10.5-lte", - "eol": "2016-12-01" - }, - "galaxy-tab-s-10.5": { - "name": "galaxy-tab-s-10.5", - "eol": "2017-08-01" - }, - "galaxy-tab-pro-12.2-lte": { - "name": "galaxy-tab-pro-12.2-lte", - "eol": true - }, - "galaxy-tab-pro-12.2-3g": { - "name": "galaxy-tab-pro-12.2-3g", - "eol": true - }, - "galaxy-tab-pro-12.2": { - "name": "galaxy-tab-pro-12.2", - "eol": true - }, - "galaxy-tab-j": { - "name": "galaxy-tab-j", - "eol": true - }, - "galaxy-tab-e-9.6": { - "name": "galaxy-tab-e-9.6", - "eol": true - }, - "galaxy-tab-e-8.0": { - "name": "galaxy-tab-e-8.0", - "eol": "2020-11-10" - }, - "galaxy-tab-advanced2": { - "name": "galaxy-tab-advanced2", - "eol": true - }, - "galaxy-tab-active5": { - "name": "galaxy-tab-active5", - "releaseLabel": "Galaxy Tab Active5", - "eol": false - }, - "galaxy-tab-active4-pro": { - "name": "galaxy-tab-active4-pro", - "eol": false, - "releaseLabel": "Galaxy Tab Active4 Pro" - }, - "galaxy-tab-active3": { - "name": "galaxy-tab-active3", - "eol": false, - "releaseLabel": "Galaxy Tab Active3" - }, - "galaxy-tab-active2": { - "name": "galaxy-tab-active2", - "eol": "2021-11-17" - }, - "galaxy-tab-active-pro": { - "name": "galaxy-tab-active-pro", - "eol": true - }, - "galaxy-tab-active-lte": { - "name": "galaxy-tab-active-lte", - "eol": true - }, - "galaxy-tab-active": { - "name": "galaxy-tab-active", - "eol": true - }, - "galaxy-tab-a9+": { - "name": "galaxy-tab-a9+", - "releaseLabel": "Galaxy Tab A9+", - "eol": false - }, - "galaxy-tab-a9": { - "name": "galaxy-tab-a9", - "releaseLabel": "Galaxy Tab A9", - "eol": false - }, - "galaxy-tab-a8": { - "name": "galaxy-tab-a8", - "eol": "2026-01-17", - "releaseLabel": "Galaxy Tab A8" - }, - "galaxy-tab-a7-lite": { - "name": "galaxy-tab-a7-lite", - "eol": "2025-05-27", - "releaseLabel": "Galaxy Tab A7 Lite" - }, - "galaxy-tab-a7-10.4-2022": { - "name": "galaxy-tab-a7-10.4-2022", - "eol": "2026-11-21" - }, - "galaxy-tab-a7-10.4-2020": { - "name": "galaxy-tab-a7-10.4-2020", - "eol": "2024-09-11" - }, - "galaxy-tab-a-9.7-and-s-pen": { - "name": "galaxy-tab-a-9.7-and-s-pen", - "eol": "2017-08-01" - }, - "galaxy-tab-a-9.7": { - "name": "galaxy-tab-a-9.7", - "eol": "2017-08-01" - }, - "galaxy-tab-a-8.4-2020": { - "name": "galaxy-tab-a-8.4-2020", - "eol": true - }, - "galaxy-tab-a-8.0-with-s-pen-2019": { - "name": "galaxy-tab-a-8.0-with-s-pen-2019", - "eol": "2021-11-17" - }, - "galaxy-tab-a-8.0-and-s-pen-2015": { - "name": "galaxy-tab-a-8.0-and-s-pen-2015", - "eol": "2017-08-01" - }, - "galaxy-tab-a-8.0-2019": { - "name": "galaxy-tab-a-8.0-2019", - "eol": true - }, - "galaxy-tab-a-8.0-2018": { - "name": "galaxy-tab-a-8.0-2018", - "eol": true - }, - "galaxy-tab-a-8.0-2017": { - "name": "galaxy-tab-a-8.0-2017", - "eol": "2021-11-17" - }, - "galaxy-tab-a-8.0-2015": { - "name": "galaxy-tab-a-8.0-2015", - "eol": "2017-08-01" - }, - "galaxy-tab-a-7.0-2016": { - "name": "galaxy-tab-a-7.0-2016", - "eol": "2016-12-30" - }, - "galaxy-tab-a-10.5-2018": { - "name": "galaxy-tab-a-10.5-2018", - "eol": "2022-06-01" - }, - "galaxy-tab-a-10.1-2019": { - "name": "galaxy-tab-a-10.1-2019", - "eol": true - }, - "galaxy-tab-a-10.1-2016": { - "name": "galaxy-tab-a-10.1-2016", - "eol": "2020-04-01" - }, - "galaxy-tab-4-8.0-lte": { - "name": "galaxy-tab-4-8.0-lte", - "eol": true - }, - "galaxy-tab-4-8.0-3g": { - "name": "galaxy-tab-4-8.0-3g", - "eol": true - }, - "galaxy-tab-4-8.0": { - "name": "galaxy-tab-4-8.0", - "eol": true - }, - "galaxy-tab-4-7.0-lte": { - "name": "galaxy-tab-4-7.0-lte", - "eol": true - }, - "galaxy-tab-4-7.0-3g": { - "name": "galaxy-tab-4-7.0-3g", - "eol": true - }, - "galaxy-tab-4-7.0": { - "name": "galaxy-tab-4-7.0", - "eol": true - }, - "galaxy-tab-4-10.1-lte": { - "name": "galaxy-tab-4-10.1-lte", - "eol": true - }, - "galaxy-tab-4-10.1-3g": { - "name": "galaxy-tab-4-10.1-3g", - "eol": true - }, - "galaxy-tab-4-10.1": { - "name": "galaxy-tab-4-10.1", - "eol": true - }, - "galaxy-tab-3-v": { - "name": "galaxy-tab-3-v", - "eol": true - }, - "galaxy-tab-3-lite-7.0-ve": { - "name": "galaxy-tab-3-lite-7.0-ve", - "eol": true - }, - "galaxy-tab-3-lite-7.0-3g": { - "name": "galaxy-tab-3-lite-7.0-3g", - "eol": true - }, - "galaxy-tab-3-lite-7.0": { - "name": "galaxy-tab-3-lite-7.0", - "eol": true - }, "galaxy-star-trios-s5283": { "name": "galaxy-star-trios-s5283", "eol": true diff --git a/src/common/endoflife.py b/src/common/endoflife.py index 9be0e5a2..8c368363 100644 --- a/src/common/endoflife.py +++ b/src/common/endoflife.py @@ -47,6 +47,9 @@ class AutoConfig: return None + def is_excluded(self, version: str) -> bool: + return self.first_match(version) is None + def render(self, match: re.Match) -> str: return self.version_template.render(**match.groupdict()) diff --git a/src/samsung-mobile.py b/src/samsung-mobile.py deleted file mode 100644 index 31f2adb9..00000000 --- a/src/samsung-mobile.py +++ /dev/null @@ -1,87 +0,0 @@ -import logging -import re -from datetime import date, datetime, time, timezone - -from bs4 import BeautifulSoup -from common import dates, endoflife, http, releasedata - -"""Detect new models and aggregate EOL data for Samsung Mobile devices. - -This script works cumulatively: when a model is not listed anymore on https://security.samsungmobile.com/workScope.smsb -it retains the date and use it as the model's EOL date. -""" - -TITLES_BY_UPDATE_CADENCE = { - "monthly": "Current Models for Monthly Security Updates", - "quarterly": "Current Models for Quarterly Security Updates", - "biannual": "Current Models for Biannual Security Updates", -} - -EXCLUDED_MODELS = { - "galaxy-tab-a7-10.4-2022": "still available according to https://www.gsmarena.com/samsung_galaxy_tab_a7_10_4_(2022)-11988.php", - "galaxy-watch5-pro": "will be tracked in a dedicated product", - "galaxy-watch5": "will be tracked in a dedicated product", - "galaxy-watch4-classic": "will be tracked in a dedicated product", - "galaxy-watch4": "will be tracked in a dedicated product", - "galaxy-m13-india": "still available according to https://www.gsmarena.com/samsung_galaxy_m13_(india)-11654.php", - "galaxy-a13-sm-a137": "still available according to https://www.gsmarena.com/samsung_galaxy_a13_(sm_a137)-11665.php", - "galaxy-a-quantum2": "still available according to https://www.gsmarena.com/samsung_galaxy_quantum_2-10850.php", -} - -with releasedata.ProductData("samsung-mobile") as product_data: - today = dates.today() - - frontmatter = endoflife.ProductFrontmatter(product_data.name) - frontmatter_release_names = frontmatter.get_release_names() - - # Copy EOL dates from frontmatter to product data - for frontmatter_release in frontmatter.get_releases(): - eol = frontmatter_release.get("eol") - eol = datetime.combine(eol, time.min, tzinfo=timezone.utc) if isinstance(eol, date) else eol - - release = product_data.get_release(frontmatter_release.get("releaseCycle")) - release.set_eol(eol) - - response = http.fetch_url("https://security.samsungmobile.com/workScope.smsb") - soup = BeautifulSoup(response.text, features="html5lib") - for update_cadence, title in TITLES_BY_UPDATE_CADENCE.items(): - models_list = soup.find(string=lambda text, search=title: search in text if text else False).find_next("ul") - - for item in models_list.find_all("li"): - models = item.text.replace("Enterprise Models:", "") - logging.info(f"Found {models} for {update_cadence} security updates") - - for model in re.split(r',\s*', models): - name = endoflife.to_identifier(model) - - release = product_data.get_release(name) - release.set_label(model.strip()) - - if name in frontmatter_release_names: - frontmatter_release_names.remove(name) - current_eol = release.get_eol() - if current_eol is True or (isinstance(current_eol, datetime) and current_eol <= today): - logging.info(f"Known model {name} is incorrectly marked as EOL, updating eol") - release.set_eol(False) - else: - logging.debug(f"Known model {name} is not EOL, keeping eol as {current_eol}") - - else: - logging.debug(f"Found new model {name}") - release.set_eol(False) - - # the remaining models in frontmatter_release_names are not listed anymore on the Samsung page => they are EOL - for eol_model_name in frontmatter_release_names: - release = product_data.get_release(eol_model_name) - current_eol = release.get_eol() - if eol_model_name in EXCLUDED_MODELS: - logging.debug(f"Skipping model {eol_model_name}: {EXCLUDED_MODELS[eol_model_name]}") - elif current_eol is False: - logging.info(f"Model {eol_model_name} is not EOL, setting eol") - release.set_eol(today) - elif isinstance(current_eol, datetime): - if current_eol > today: - logging.info(f"Model {eol_model_name} is not marked as EOL, setting eol as {today}") - release.set_eol(today) - else: - logging.debug(f"Model {eol_model_name} is already EOL, keeping eol as {current_eol}") diff --git a/src/samsung-security.py b/src/samsung-security.py new file mode 100644 index 00000000..fedf50f1 --- /dev/null +++ b/src/samsung-security.py @@ -0,0 +1,80 @@ +import logging +import re +import sys +from datetime import date, datetime, time, timezone + +from bs4 import BeautifulSoup +from common import dates, endoflife, http, releasedata + +"""Detect new models and aggregate EOL data for Samsung Mobile devices. + +This script works cumulatively: when a model is not listed anymore on https://security.samsungmobile.com/workScope.smsb +it retains the date and use it as the model's EOL date. +""" + +TODAY = dates.today() + +p_filter = sys.argv[1] if len(sys.argv) > 1 else None +m_filter = sys.argv[2] if len(sys.argv) > 2 else None +for config in endoflife.list_configs(p_filter, 'samsung-security', m_filter): + with releasedata.ProductData(config.product) as product_data: + frontmatter = endoflife.ProductFrontmatter(product_data.name) + frontmatter_release_names = frontmatter.get_release_names() + + # Copy EOL dates from frontmatter to product data + for frontmatter_release in frontmatter.get_releases(): + eol = frontmatter_release.get("eol") + eol = datetime.combine(eol, time.min, tzinfo=timezone.utc) if isinstance(eol, date) else eol + + release = product_data.get_release(frontmatter_release.get("releaseCycle")) + release.set_eol(eol) + + + response = http.fetch_url(config.url) + soup = BeautifulSoup(response.text, features="html5lib") + + sections = config.data.get("sections", {}) + for update_cadence, title in sections.items(): + models_list = soup.find(string=lambda text, search=title: search in text if text else False).find_next("ul") + + for item in models_list.find_all("li"): + models = item.text.replace("Enterprise Models:", "") + logging.info(f"Found {models} for {update_cadence} security updates") + + for model in re.split(r',\s*', models): + name = endoflife.to_identifier(model) + if config.is_excluded(name): + logging.debug(f"Ignoring model '{name}', excluded by configuration") + continue + + release = product_data.get_release(name) + release.set_label(model.strip()) + + if name in frontmatter_release_names: + frontmatter_release_names.remove(name) + current_eol = release.get_eol() + if current_eol is True or (isinstance(current_eol, datetime) and current_eol <= TODAY): + logging.info(f"Known model {name} is incorrectly marked as EOL, updating eol") + release.set_eol(False) + else: + logging.debug(f"Known model {name} is not EOL, keeping eol as {current_eol}") + + else: + logging.debug(f"Found new model {name}") + release.set_eol(False) + + # the remaining models in frontmatter_release_names are not listed anymore on the Samsung page => they are EOL + for eol_model_name in frontmatter_release_names: + release = product_data.get_release(eol_model_name) + current_eol = release.get_eol() + if config.is_excluded(eol_model_name): + logging.debug(f"Skipping model {eol_model_name}, excluded by configuration") + elif current_eol is False: + logging.info(f"Model {eol_model_name} is not EOL, setting eol") + release.set_eol(TODAY) + elif isinstance(current_eol, datetime): + if current_eol > TODAY: + logging.info(f"Model {eol_model_name} is not marked as EOL, setting eol as {TODAY}") + release.set_eol(TODAY) + else: + logging.debug(f"Model {eol_model_name} is already EOL, keeping eol as {current_eol}")