diff --git a/tools/FetchMacOS/.idea/FetchMacOS.iml b/tools/FetchMacOS/.idea/FetchMacOS.iml deleted file mode 100644 index 6711606..0000000 --- a/tools/FetchMacOS/.idea/FetchMacOS.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/tools/FetchMacOS/.idea/misc.xml b/tools/FetchMacOS/.idea/misc.xml deleted file mode 100644 index a17801f..0000000 --- a/tools/FetchMacOS/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tools/FetchMacOS/.idea/modules.xml b/tools/FetchMacOS/.idea/modules.xml deleted file mode 100644 index 679a9f7..0000000 --- a/tools/FetchMacOS/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/tools/FetchMacOS/.idea/workspace.xml b/tools/FetchMacOS/.idea/workspace.xml deleted file mode 100644 index 22eee8a..0000000 --- a/tools/FetchMacOS/.idea/workspace.xml +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1499116578112 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/FetchMacOS/fetch-macos.py b/tools/FetchMacOS/fetch-macos.py deleted file mode 100755 index ec0b189..0000000 --- a/tools/FetchMacOS/fetch-macos.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/python - -"""fetch-macos.py: Fetches macOS products from Apple's SoftwareUpdate service.""" - -import logging -import plistlib -import os -import errno -import click -import requests -import sys - -__author__ = "Foxlet" -__copyright__ = "Copyright 2019, FurCode Project" -__license__ = "GPLv3" -__version__ = "1.4" - -logging.basicConfig(format='%(asctime)-15s %(message)s', level=logging.INFO) -logger = logging.getLogger('webactivity') - - -class ClientMeta: - # Client used to connect to the Software CDN - osinstall = {"User-Agent":"osinstallersetupplaind (unknown version) CFNetwork/720.5.7 Darwin/14.5.0 (x86_64)"} - # Client used to connect to the Software Distribution service - swupdate = {"User-Agent":"Software%20Update (unknown version) CFNetwork/807.0.1 Darwin/16.0.0 (x86_64)"} - - -class Filesystem: - @staticmethod - def download_file(url, size, path): - label = url.split('/')[-1] - filename = os.path.join(path, label) - # Set to stream mode for large files - remote = requests.get(url, stream=True, headers=ClientMeta.osinstall) - - with open(filename, 'wb') as f: - with click.progressbar(remote.iter_content(1024), length=size/1024, label="Fetching {} ...".format(filename)) as stream: - for data in stream: - f.write(data) - return filename - - @staticmethod - def check_directory(path): - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise - - @staticmethod - def fetch_plist(url): - logging.info("Network Request: %s", "Fetching {}".format(url)) - plist_raw = requests.get(url, headers=ClientMeta.swupdate) - plist_data = plist_raw.text.encode('UTF-8') - return plist_data - - @staticmethod - def parse_plist(catalog_data): - if sys.version_info > (3, 0): - root = plistlib.loads(catalog_data) - else: - root = plistlib.readPlistFromString(catalog_data) - return root - -class SoftwareService: - # macOS 10.15 is available in 4 different catalogs from SoftwareScan - catalogs = { - "10.15": { - "CustomerSeed":"https://swscan.apple.com/content/catalogs/others/index-10.15customerseed-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog", - "DeveloperSeed":"https://swscan.apple.com/content/catalogs/others/index-10.15seed-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog", - "PublicSeed":"https://swscan.apple.com/content/catalogs/others/index-10.15beta-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog", - "PublicRelease":"https://swscan.apple.com/content/catalogs/others/index-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog" - }, - "10.14": { - "PublicRelease":"https://swscan.apple.com/content/catalogs/others/index-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog" - }, - "10.13": { - "PublicRelease":"https://swscan.apple.com/content/catalogs/others/index-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog" - } - } - - def __init__(self, version, catalog_id): - self.version = version - self.catalog_url = self.catalogs.get(version).get(catalog_id) - self.catalog_data = "" - - def getcatalog(self): - self.catalog_data = Filesystem.fetch_plist(self.catalog_url) - return self.catalog_data - - def getosinstall(self): - # Load catalogs based on Py3/2 lib - root = Filesystem.parse_plist(self.catalog_data) - - # Iterate to find valid OSInstall packages - ospackages = [] - products = root['Products'] - for product in products: - if products.get(product, {}).get('ExtendedMetaInfo', {}).get('InstallAssistantPackageIdentifiers', {}).get('OSInstall', {}) == 'com.apple.mpkg.OSInstall': - ospackages.append(product) - - # Iterate for an specific version - candidates = [] - for product in ospackages: - meta_url = products.get(product, {}).get('ServerMetadataURL', {}) - if self.version in Filesystem.parse_plist(Filesystem.fetch_plist(meta_url)).get('CFBundleShortVersionString', {}): - candidates.append(product) - - return candidates - - -class MacOSProduct: - def __init__(self, catalog, product_id): - root = Filesystem.parse_plist(catalog) - products = root['Products'] - self.date = root['IndexDate'] - self.product = products[product_id] - - def fetchpackages(self, path, keyword=None): - Filesystem.check_directory(path) - packages = self.product['Packages'] - if keyword: - for item in packages: - if keyword in item.get("URL"): - Filesystem.download_file(item.get("URL"), item.get("Size"), path) - else: - for item in packages: - Filesystem.download_file(item.get("URL"), item.get("Size"), path) - -@click.command() -@click.option('-o', '--output-dir', default="BaseSystem/", help="Target directory for package output.") -@click.option('-v', '--catalog-version', default="10.15", help="Version of catalog.") -@click.option('-c', '--catalog-id', default="PublicRelease", help="Name of catalog.") -@click.option('-p', '--product-id', default="", help="Product ID (as seen in SoftwareUpdate).") -def fetchmacos(output_dir="BaseSystem/", catalog_version="10.15", catalog_id="PublicRelease", product_id=""): - # Get the remote catalog data - remote = SoftwareService(catalog_version, catalog_id) - catalog = remote.getcatalog() - - # If no product is given, find the latest OSInstall product - if product_id == "": - product_id = remote.getosinstall()[0] - - # Fetch the given Product ID - try: - product = MacOSProduct(catalog, product_id) - except KeyError: - print("Product ID {} could not be found.".format(product_id)) - exit(1) - - logging.info("Selected macOS Product: {}".format(product_id)) - - # Download package to disk - product.fetchpackages(output_dir, keyword="BaseSystem") - -if __name__ == "__main__": - fetchmacos() diff --git a/tools/FetchMacOS/fetch.sh b/tools/FetchMacOS/fetch.sh deleted file mode 100755 index df76311..0000000 --- a/tools/FetchMacOS/fetch.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -# fetch.sh: Run fetch-macos.py with safety checks -# by Foxlet - -set +x; -SCRIPTDIR="$(dirname "$0")"; -cd "$SCRIPTDIR" - -initpip() { - if [ -x "$(command -v easy_install)" ]; then - sudo easy_install pip - else - echo "Please install python3-pip or easy_install before continuing." - exit 1; - fi - pip install -r requirements.txt --user -} - -getpip(){ - if [ -x "$(command -v pip3)" ]; then - pip3 install -r requirements.txt --user - elif [ -x "$(command -v pip)" ]; then - pip install -r requirements.txt --user - else - echo "pip will be installed..." >&2 - initpip - fi -} - -getpython(){ - if [ -x "$(command -v python3)" ]; then - PYTHONBIN=python3 - elif [ -x "$(command -v python)" ]; then - PYTHONBIN=python - elif [ -x "$(command -v python2)" ]; then - PYTHONBIN=python2 - else - echo "Please install Python 3 before continuing." >&2 - exit 1; - fi -} - -getpip -getpython -$PYTHONBIN fetch-macos.py "$@" - -exit; diff --git a/tools/FetchMacOS/requirements.txt b/tools/FetchMacOS/requirements.txt deleted file mode 100644 index f80ea3b..0000000 --- a/tools/FetchMacOS/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests -click