From d24587c32177c1671e7e6196ab598fd216358d1d Mon Sep 17 00:00:00 2001 From: John Peck Date: Sun, 7 Dec 2025 12:42:43 +0000 Subject: [PATCH] fix again --- newpower.py | 10 +- newpower2.py | 10 +- providers/__pycache__/base.cpython-310.pyc | Bin 0 -> 1127 bytes providers/__pycache__/gwt_rpc.cpython-310.pyc | Bin 0 -> 9553 bytes providers/__pycache__/kubra.cpython-310.pyc | Bin 0 -> 5934 bytes providers/__pycache__/nisc.cpython-310.pyc | Bin 0 -> 3199 bytes providers/__pycache__/simple.cpython-310.pyc | Bin 0 -> 2556 bytes base.py => providers/base.py | 0 gwt_rpc.py => providers/gwt_rpc.py | 17 +- kubra.py => providers/kubra.py | 2 +- nisc.py => providers/nisc.py | 2 +- simple.py => providers/simple.py | 2 +- test.py | 163 ------------------ 13 files changed, 21 insertions(+), 185 deletions(-) create mode 100644 providers/__pycache__/base.cpython-310.pyc create mode 100644 providers/__pycache__/gwt_rpc.cpython-310.pyc create mode 100644 providers/__pycache__/kubra.cpython-310.pyc create mode 100644 providers/__pycache__/nisc.cpython-310.pyc create mode 100644 providers/__pycache__/simple.cpython-310.pyc rename base.py => providers/base.py (100%) rename gwt_rpc.py => providers/gwt_rpc.py (96%) rename kubra.py => providers/kubra.py (99%) rename nisc.py => providers/nisc.py (98%) rename simple.py => providers/simple.py (97%) delete mode 100644 test.py diff --git a/newpower.py b/newpower.py index fca17ee..62de15b 100644 --- a/newpower.py +++ b/newpower.py @@ -16,11 +16,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning import get_rpc_config_auto # Import provider classes -from base import BaseCountyProvider -from kubra import KubraCountyProvider -from simple import SimpleCountyJsonProvider -from nisc import NiscCountyProvider -from gwt_rpc import GwtRpcCountyProvider +from providers.base import BaseCountyProvider +from providers.kubra import KubraCountyProvider +from providers.simple import SimpleCountyJsonProvider +from providers.nisc import NiscCountyProvider +from providers.gwt_rpc import GwtRpcCountyProvider requests.packages.urllib3.disable_warnings(InsecureRequestWarning) diff --git a/newpower2.py b/newpower2.py index 93ff3b7..f5d3059 100644 --- a/newpower2.py +++ b/newpower2.py @@ -19,11 +19,11 @@ from requests.packages.urllib3.exceptions import InsecureRequestWarning import get_rpc_config_auto # Import provider classes -from base import BaseProvider -from kubra import KubraProvider -from simple import SimpleJsonProvider -from gwt_rpc import GwtRpcProvider -from nisc import NiscHostedProvider +from providers.base import BaseProvider +from providers.kubra import KubraProvider +from providers.simple import SimpleJsonProvider +from providers.gwt_rpc import GwtRpcProvider +from providers.nisc import NiscHostedProvider requests.packages.urllib3.disable_warnings(InsecureRequestWarning) diff --git a/providers/__pycache__/base.cpython-310.pyc b/providers/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da4bd0a39bfc29118691c8f23ea96e9ca8e8430c GIT binary patch literal 1127 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 HzI5S#r2E)9 literal 0 HcmV?d00001 diff --git a/providers/__pycache__/nisc.cpython-310.pyc b/providers/__pycache__/nisc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7de96eff84f5588f8a0702e63d6d894f9d73a683 GIT binary patch literal 3199 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 Fe*i2(e$D^@ literal 0 HcmV?d00001 diff --git a/base.py b/providers/base.py similarity index 100% rename from base.py rename to providers/base.py diff --git a/gwt_rpc.py b/providers/gwt_rpc.py similarity index 96% rename from gwt_rpc.py rename to providers/gwt_rpc.py index 99b7958..9ea22f6 100644 --- a/gwt_rpc.py +++ b/providers/gwt_rpc.py @@ -5,7 +5,7 @@ from urllib.parse import urlparse from pyproj import Transformer import get_rpc_config_auto -from base import BaseProvider, BaseCountyProvider +from providers.base import BaseProvider, BaseCountyProvider logger = logging.getLogger(__name__) @@ -43,13 +43,12 @@ class GwtRpcBaseProvider: logger.info(f"Attempting Auto-Repair for {self.name}...") try: - # This function needs to be defined in the main script context to save config - from newpower import update_provider_config as update_county_config - except ImportError: - from newpower2 import update_provider_config as update_point_config - update_county_config = update_point_config # Fallback - - try: + # This function needs to be defined in the main script context to save config. + # We import it here, inside the method, to avoid circular import errors at startup. + if isinstance(self, GwtRpcCountyProvider): + from newpower import update_provider_config + else: + from newpower2 import update_provider_config _, valid_headers, valid_cookies, valid_body = get_rpc_config_auto.fetch_live_data(self.map_url) if valid_headers and valid_body: logger.info(f"Repair successful! Updating {self.name}.") @@ -72,7 +71,7 @@ class GwtRpcBaseProvider: self.session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'], path=cookie['path']) # Save to disk for next time - update_county_config(self.name, self.config) + update_provider_config(self.name, self.config) return True except Exception as e: logger.error(f"Auto-repair failed: {e}") diff --git a/kubra.py b/providers/kubra.py similarity index 99% rename from kubra.py rename to providers/kubra.py index e267400..d2393b5 100644 --- a/kubra.py +++ b/providers/kubra.py @@ -4,7 +4,7 @@ import logging import polyline import mercantile from datetime import datetime -from base import BaseProvider, BaseCountyProvider +from providers.base import BaseProvider, BaseCountyProvider logger = logging.getLogger(__name__) diff --git a/nisc.py b/providers/nisc.py similarity index 98% rename from nisc.py rename to providers/nisc.py index 3dca4d7..ca1abbc 100644 --- a/nisc.py +++ b/providers/nisc.py @@ -1,7 +1,7 @@ import logging from datetime import datetime, timezone from pyproj import Transformer -from base import BaseProvider, BaseCountyProvider +from providers.base import BaseProvider, BaseCountyProvider logger = logging.getLogger(__name__) diff --git a/simple.py b/providers/simple.py similarity index 97% rename from simple.py rename to providers/simple.py index 344d912..14bbd47 100644 --- a/simple.py +++ b/providers/simple.py @@ -1,6 +1,6 @@ import logging from datetime import datetime -from base import BaseProvider, BaseCountyProvider +from providers.base import BaseProvider, BaseCountyProvider logger = logging.getLogger(__name__) diff --git a/test.py b/test.py deleted file mode 100644 index 1e69a6a..0000000 --- a/test.py +++ /dev/null @@ -1,163 +0,0 @@ -import json -import os - -def decode_gwt_rpc(payload): - """ - Decodes a GWT-RPC payload to extract outage data for Counties. - """ - # 1. Clean the payload - # GWT responses often start with //OK. We strip that. - if payload.startswith("//OK"): - payload = payload[4:] - - # 2. Parse the FULL payload as JSON - # The GWT payload is structurally a JSON array: [stream_data..., [string_table], flags...] - try: - full_data = json.loads(payload) - except json.JSONDecodeError as e: - print(f"Error parsing payload JSON: {e}") - return None - - # 3. Separate Stream and String Table - # The String Table is a list of strings located near the end of the main array. - # The "Stream" is everything before that string table. - - string_table = None - stream_raw = [] - - # Iterate through the parsed array to find the string table (which is a list) - for item in full_data: - if isinstance(item, list): - string_table = item - # Once we find the table, we assume the rest are flags and stop adding to stream - break - else: - stream_raw.append(item) - - if not string_table: - print("Error: String table not found in payload.") - return None - - # 4. Normalize the Stream - # The decoder logic relies on integers (1-based indices). - # The raw stream might contain floats or strings that we need to cast or filter. - stream = [] - for token in stream_raw: - if isinstance(token, int): - stream.append(token) - elif isinstance(token, float): - stream.append(int(token)) - elif isinstance(token, str): - # Sometimes numeric values are sent as strings in the stream - try: - stream.append(int(float(token))) - except ValueError: - # If it's a non-numeric string token (like a cache ID), ignore it - pass - - # 5. Decode Logic - try: - # Define the signatures we are looking for in the String Table - REGION_SIG = "cc.nisc.oms.clientandserver.v2.pojo.Region/3192921568" - INTEGER_SIG = "java.lang.Integer/3438268394" - CATEGORY_KEY = "County" - - # Helper to find 1-based index - def get_index(val): - try: return string_table.index(val) + 1 - except ValueError: return 0 - - region_type_id = get_index(REGION_SIG) - integer_type_id = get_index(INTEGER_SIG) - county_type_id = get_index(CATEGORY_KEY) - - if region_type_id == 0: - print("Error: Region type signature not found in string table.") - # Debug: Print first few strings to verify if signatures changed - # print("Available strings:", string_table[:10]) - return None - - results = [] - i = 0 - stream_len = len(stream) - - # Iterate through the stream looking for Region objects - while i < stream_len: - if stream[i] == region_type_id: - try: - # We found a Region. The next few integers define its properties. - # Pointer 'p' is relative to current index 'i' - p = i + 1 - - # --- Field 1: Total Served --- - # Logic: Value is valid if followed by Integer Type ID - served = 0 - val1 = stream[p] - p += 1 - if p < stream_len and stream[p] == integer_type_id: - served = val1 - p += 1 # Skip type ID - - # --- Field 2: Number Out --- - out = 0 - val2 = stream[p] - p += 1 - if p < stream_len and stream[p] == integer_type_id: - out = val2 - p += 1 # Skip type ID - - # --- Field 3: Name Index --- - name_idx = stream[p] - p += 1 - - # --- Field 4: Category Index --- - cat_idx = stream[p] - - # Check if this is a County - if cat_idx == county_type_id: - name = "Unknown" - if 0 < name_idx <= len(string_table): - name = string_table[name_idx - 1] - - percent = 0.0 - if served > 0: - percent = (out / served) * 100 - - results.append({ - "county": name, - "served": served, - "out": out, - "percent": percent - }) - - except IndexError: - pass - i += 1 - - return results - - except Exception as e: - print(f"Error during stream traversal: {e}") - return None - -if __name__ == "__main__": - filename = "outage_data.txt" - if os.path.exists(filename): - with open(filename, "r", encoding="utf-8") as f: - raw_content = f.read().strip() - - data = decode_gwt_rpc(raw_content) - - if data: - # Sort A-Z - data.sort(key=lambda x: x['county']) - - print(f"{'County':<20} | {'Served':>8} | {'Out':>8} | {'Percent':>8}") - print("-" * 55) - for row in data: - print(f"{row['county']:<20} | {row['served']:>8} | {row['out']:>8} | {row['percent']:>7.2f}%") - else: - print("No data found.") - else: - print(f"File '{filename}' not found. Please create it and paste the payload.") - \ No newline at end of file