diff --git a/projects/gps-rmm-audit/needs-screenconnect.md b/projects/gps-rmm-audit/needs-screenconnect.md index d01963ea..007a055b 100644 --- a/projects/gps-rmm-audit/needs-screenconnect.md +++ b/projects/gps-rmm-audit/needs-screenconnect.md @@ -1,210 +1,146 @@ -# GPS clients - Syncro-managed machines NOT in GuruRMM +# GPS clients - Syncro-managed machines NOT in GuruRMM (ACTIVE only) -Install ScreenConnect / push agent. Syncro assets (authoritative) vs live GuruRMM, 2026-07-03. -`folder N` = Syncro policy_folder_id (the ScreenConnect-install policy is tied to a folder - devices in the wrong folder don't get SC). +Machines missing from GuruRMM that checked into Syncro within the last 31 days. Excluded: 50 offline >31d, 0 with no check-in data. Snapshot 2026-07-03. +`folder N` = Syncro policy_folder_id. -## Folder distribution across the gap machines (spot the SC-install folder vs outliers) -- folder 4095109: 16 machines -- folder 3577293: 15 machines -- folder 651577: 13 machines -- folder 3996026: 5 machines -- folder 4086884: 4 machines -- folder 677399: 4 machines -- folder 3638391: 4 machines -- folder 2948816: 4 machines -- folder 3937024: 4 machines -- folder 3242716: 4 machines -- folder 4086890: 3 machines -- folder 4086846: 3 machines -- folder 667252: 3 machines -- folder 3426849: 3 machines -- folder 677304: 2 machines -- folder 4896982: 2 machines -- folder 4106776: 2 machines -- folder 4086906: 2 machines -- folder 615472: 2 machines -- folder 3204798: 2 machines -- folder 4100925: 2 machines -- folder 651365: 1 machines -- folder 656150: 1 machines -- folder 3842122: 1 machines -- folder 625040: 1 machines -- folder 625152: 1 machines -- folder 613008: 1 machines -- folder 4088509: 1 machines -- folder 4114466: 1 machines -- folder 3872949: 1 machines -- folder 607593: 1 machines -- folder 696512: 1 machines -- folder 4095118: 1 machines -- folder 3121109: 1 machines -- folder 4088528: 1 machines -- folder 594524: 1 machines +## Folder distribution (active gap machines) +- folder 3577293: 12 +- folder 651577: 5 +- folder 4095109: 4 +- folder 2948816: 4 +- folder 677399: 3 +- folder 667252: 3 +- folder 3426849: 3 +- folder 4086884: 2 +- folder 677304: 2 +- folder 3638391: 2 +- folder 3937024: 2 +- folder 4106776: 2 +- folder 3204798: 2 +- folder 4100925: 2 +- folder 651365: 1 +- folder 4086890: 1 +- folder 3842122: 1 +- folder 3996026: 1 +- folder 613008: 1 +- folder 4088509: 1 +- folder 4086846: 1 +- folder 3872949: 1 +- folder 607593: 1 +- folder 4896982: 1 +- folder 696512: 1 +- folder 4086906: 1 +- folder 4095118: 1 +- folder 3121109: 1 +- folder 4088528: 1 +- folder 594524: 1 -## TOTAL needing install: 114 +## TOTAL active needing install: 64 -**Instrumental Music Center** - 26 managed / 12 in RMM / 14 need install - - DESKTOP-JQ0D38J (folder 651577) - - DESKTOP-KRHQ5TS (folder 651365) - - DESKTOP-URV3UGR (folder 651577) - - IMC-EVENTS (folder 651577) - - IMC-L1-GRAPHICS (folder 651577) - - IMC-LUIS (folder 651577) - - IMC-M-EDSERVICE (folder 651577) - - IMC-PRINTSERVER (folder 651577) - - LAPTOP-PNVA9G51 (folder 651577) - - LAPTOP-UBTI0IE3 (folder 651577) - - PHIL (folder 651577) - - PHIL2021LAPTOP (folder 651577) - - PURCHASINGCOMP (folder 651577) - - REPAIRADMIN (folder 651577) +**Instrumental Music Center** - 6 need install (of 14 not-in-RMM; rest offline >31d) + - DESKTOP-KRHQ5TS (folder 651365, seen 2026-06-16, 17d ago) + - IMC-LUIS (folder 651577, seen 2026-07-03, 0d ago) + - IMC-M-EDSERVICE (folder 651577, seen 2026-07-01, 2d ago) + - LAPTOP-PNVA9G51 (folder 651577, seen 2026-06-30, 3d ago) + - LAPTOP-UBTI0IE3 (folder 651577, seen 2026-07-03, 0d ago) + - REPAIRADMIN (folder 651577, seen 2026-07-02, 1d ago) -**Safesite** - 26 managed / 36 in RMM / 15 need install - - 1225-LENOVO-E14 (folder 3577293) - - 1225-LENOVO-E14 (folder 3577293) - - 1225-LENOVO-E16 (folder 3577293) - - DESKTOP-2KKLG2B (folder 3577293) - - DESKTOP-8KQIDKH (folder 3577293) - - DESKTOP-ARNPE1U (folder 3577293) - - DESKTOP-B3ELJF5 (folder 3577293) - - DESKTOP-BA45FRS (folder 3577293) - - DESKTOP-EJM109L (folder 3577293) - - DESKTOP-FMDIK0Q (folder 3577293) - - DESKTOP-FUB3PAV (folder 3577293) - - DESKTOP-QAR6D04 (folder 3577293) - - DESKTOP-V3H99FC (folder 3577293) - - DESKTOP-V9F9L23 (folder 3577293) - - LAPTOP-NFB98THE (folder 3577293) +**Safesite** - 12 need install (of 15 not-in-RMM; rest offline >31d) + - 1225-LENOVO-E14 (folder 3577293, seen 2026-07-01, 2d ago) + - 1225-LENOVO-E14 (folder 3577293, seen 2026-07-01, 2d ago) + - DESKTOP-2KKLG2B (folder 3577293, seen 2026-07-03, 0d ago) + - DESKTOP-8KQIDKH (folder 3577293, seen 2026-07-03, 0d ago) + - DESKTOP-ARNPE1U (folder 3577293, seen 2026-07-02, 1d ago) + - DESKTOP-B3ELJF5 (folder 3577293, seen 2026-07-02, 1d ago) + - DESKTOP-BA45FRS (folder 3577293, seen 2026-07-03, 0d ago) + - DESKTOP-EJM109L (folder 3577293, seen 2026-07-03, 0d ago) + - DESKTOP-FUB3PAV (folder 3577293, seen 2026-07-01, 2d ago) + - DESKTOP-V3H99FC (folder 3577293, seen 2026-07-01, 2d ago) + - DESKTOP-V9F9L23 (folder 3577293, seen 2026-06-09, 24d ago) + - LAPTOP-NFB98THE (folder 3577293, seen 2026-07-01, 2d ago) -**Horseshoe Management** - 7 managed / 4 in RMM / 3 need install - - HSM-CATHY (folder 4086890) - - HSM-RANDI (folder 4086890) - - HSM-SURFACE (folder 4086890) +**Horseshoe Management** - 1 need install (of 3 not-in-RMM; rest offline >31d) + - HSM-CATHY (folder 4086890, seen 2026-07-02, 1d ago) -**Grabb & Durando Law Office** - 12 managed / 9 in RMM / 4 need install - - GND-ASUSWS (folder 4086884) - - GND-JEANNETTE (folder 4086884) - - GND-L-3 (folder 4086884) - - HOMEPC (folder 4086884) +**Grabb & Durando Law Office** - 2 need install (of 4 not-in-RMM; rest offline >31d) + - GND-ASUSWS (folder 4086884, seen 2026-07-02, 0d ago) + - GND-L-3 (folder 4086884, seen 2026-06-13, 20d ago) -**Quantum Wealth Management** - 5 managed / 4 in RMM / 1 need install - - DESKTOP-A3IVMNF (folder 656150) +**Stamback Septic** - 7 need install (of 10 not-in-RMM; rest offline >31d) + - DEREK-LAPTOP (folder 677304, seen 2026-07-03, 0d ago) + - DESKTOP-1BS5JL4 (folder 677399, seen 2026-07-03, 0d ago) + - JEREE (folder 677399, seen 2026-07-02, 1d ago) + - SERVER2 (folder 3638391, seen 2026-07-03, 0d ago) + - STAMBACK-JBECK (folder 677399, seen 2026-07-03, 0d ago) + - STAMBACK-NEW05 (folder 3638391, seen 2026-07-03, 0d ago) + - STAMBACK-NEW06 (folder 677304, seen 2026-07-03, 0d ago) -**Stamback Septic** - 10 managed / 2 in RMM / 10 need install - - DEREK-LAPTOP (folder 677304) - - DESKTOP-1BS5JL4 (folder 677399) - - DESKTOP-JVLQQIJ (folder 677399) - - JEREE (folder 677399) - - SERVER2 (folder 3638391) - - SSS-SPARE (folder 3638391) - - STAMBACK-JBECK (folder 677399) - - STAMBACK-NEW05 (folder 3638391) - - STAMBACK-NEW06 (folder 677304) - - STAMBACK-NEW06 (folder 3638391) +**Reliant Well Drilling and Pump Corporate** - 4 need install (of 16 not-in-RMM; rest offline >31d) + - Clark’s iMac (folder 4095109, seen 2026-06-10, 23d ago) + - RWD-ALLENDESKTO (folder 4095109, seen 2026-06-16, 17d ago) + - RWD-CHRIS (folder 4095109, seen 2026-07-02, 1d ago) + - WILLCOXDOTADMIN (folder 4095109, seen 2026-07-02, 1d ago) -**Reliant Well Drilling and Pump Corporate** - 17 managed / 1 in RMM / 16 need install - - Clark’s iMac (folder 4095109) - - DESKTOP-09H7T66 (folder 4095109) - - DESKTOP-QIGH458 (folder 4095109) - - DESKTOP-V2247T9 (folder 4095109) - - LAPTOP-8AUEP9N6 (folder 4095109) - - LAPTOP-EJL9PFOU (folder 4095109) - - LAPTOP-FR4QN9KF (folder 4095109) - - LAPTOP-JQMU8N9K (folder 4095109) - - RELIANT-L01 (folder 4095109) - - RELIANT-L02 (folder 4095109) - - RELIANT-L03 (folder 4095109) - - RWD-ALANLAPTOP (folder 4095109) - - RWD-ALLENDESKTO (folder 4095109) - - RWD-CHRIS (folder 4095109) - - WILCOXADMIN (folder 4095109) - - WILLCOXDOTADMIN (folder 4095109) +**Zeus Nestora** - 5 need install (of 5 not-in-RMM; rest offline >31d) + - SERVER-OLD (folder 3842122, seen 2026-07-03, 0d ago) + - WHITE-PC (folder 2948816, seen 2026-07-03, 0d ago) + - ZEUS-ACCOUNTING (folder 2948816, seen 2026-07-03, 0d ago) + - ZEUS-SHERRI (folder 2948816, seen 2026-07-03, 0d ago) + - ZEUS1 (folder 2948816, seen 2026-07-03, 0d ago) -**Zeus Nestora** - 6 managed / 2 in RMM / 5 need install - - SERVER-OLD (folder 3842122) - - WHITE-PC (folder 2948816) - - ZEUS-ACCOUNTING (folder 2948816) - - ZEUS-SHERRI (folder 2948816) - - ZEUS1 (folder 2948816) +**PUTT LAND SURVEYING, INC.** - 1 need install (of 5 not-in-RMM; rest offline >31d) + - PLS-SERVER (folder 3996026, seen 2026-06-26, 7d ago) -**Little Hearts Little Hands** - 2 managed / 0 in RMM / 2 need install - - LHLH (folder 625040) - - WIN-KNVO6MUMMEM (folder 625152) +**Curtis Plumbing** - 2 need install (of 3 not-in-RMM; rest offline >31d) + - CP-QB (folder 613008, seen 2026-07-03, 0d ago) + - CURTIS-002-W7 (folder 4088509, seen 2026-07-03, 0d ago) -**PUTT LAND SURVEYING, INC.** - 7 managed / 2 in RMM / 5 need install - - PLS-FOUR (folder 3996026) - - PLS-FRONT (folder 3996026) - - PLS-LAPTOP (folder 3996026) - - PLS-ONE (folder 3996026) - - PLS-SERVER (folder 3996026) +**The Prairie Schooner** - 2 need install (of 4 not-in-RMM; rest offline >31d) + - MEL-PC (folder 4086846, seen 2026-07-03, 0d ago) + - TPS-SVR (folder 3872949, seen 2026-07-03, 0d ago) -**Curtis Plumbing** - 4 managed / 3 in RMM / 3 need install - - CP-QB (folder 613008) - - CURTIS-002-W7 (folder 4088509) - - CURTIS-003 (folder 4114466) +**Mineralogical Record** - 3 need install (of 5 not-in-RMM; rest offline >31d) + - CHRISTIPC2024 (folder 607593, seen 2026-07-03, 0d ago) + - DESKTOP-ERBA22G (folder 3937024, seen 2026-07-03, 0d ago) + - PUGET-CW (folder 3937024, seen 2026-07-03, 0d ago) -**The Prairie Schooner** - 6 managed / 2 in RMM / 4 need install - - DESKTOP-SRUOH4R (folder 4086846) - - DESKTOP-TS1P9MT (folder 4086846) - - MEL-PC (folder 4086846) - - TPS-SVR (folder 3872949) +**Ridgetop Group** - 3 need install (of 3 not-in-RMM; rest offline >31d) + - CNX-LAB-00 (folder 667252, seen 2026-07-03, 0d ago) + - RGI-DC (folder 667252, seen 2026-07-03, 0d ago) + - RTG-HOST01 (folder 667252, seen 2026-07-03, 0d ago) -**Mineralogical Record** - 6 managed / 2 in RMM / 5 need install - - CHRISTIPC2024 (folder 607593) - - DESKTOP-3VPT017 (folder 3937024) - - DESKTOP-9QHSCIT (folder 3937024) - - DESKTOP-ERBA22G (folder 3937024) - - PUGET-CW (folder 3937024) +**Multicultural Counseling Center** - 1 need install (of 2 not-in-RMM; rest offline >31d) + - DESKTOP-CLJKB39 (folder 4896982, seen 2026-06-20, 13d ago) -**MVAN Enterprises Inc** - 4 managed / 0 in RMM / 4 need install - - CPC-chris-UZR6E (folder 3242716) - - DESKTOP-I7504C5 (folder 3242716) - - June’s MacBook Pro (folder 3242716) - - MITCH-LAPTOP (folder 3242716) +**Brett Interiors** - 3 need install (of 3 not-in-RMM; rest offline >31d) + - BRETTWAREHOUSE (folder 4106776, seen 2026-07-03, 0d ago) + - DESKTOP-6LL5T6B (folder 4106776, seen 2026-07-03, 0d ago) + - SERVER (folder 696512, seen 2026-07-03, 0d ago) -**Ridgetop Group** - 3 managed / 0 in RMM / 3 need install - - CNX-LAB-00 (folder 667252) - - RGI-DC (folder 667252) - - RTG-HOST01 (folder 667252) +**Heieck, Sheila** - 3 need install (of 3 not-in-RMM; rest offline >31d) + - John Heieck’s iMac (folder 3426849, seen 2026-07-03, 0d ago) + - Sheila's iMac (folder 3426849, seen 2026-07-03, 0d ago) + - Sheila’s MacBook Pro (folder 3426849, seen 2026-07-03, 0d ago) -**Multicultural Counseling Center** - 3 managed / 1 in RMM / 2 need install - - DESKTOP-CLJKB39 (folder 4896982) - - DESKTOP-S1HPLDF (folder 4896982) +**The Marc Group** - 1 need install (of 2 not-in-RMM; rest offline >31d) + - DESKTOP-6HT5SJ9 (folder 4086906, seen 2026-07-03, 0d ago) -**Brett Interiors** - 5 managed / 2 in RMM / 3 need install - - BRETTWAREHOUSE (folder 4106776) - - DESKTOP-6LL5T6B (folder 4106776) - - SERVER (folder 696512) +**Business Services of Tucson LLC** - 2 need install (of 2 not-in-RMM; rest offline >31d) + - KAT (folder 3204798, seen 2026-06-03, 30d ago) + - KAT1 (folder 3204798, seen 2026-07-03, 0d ago) -**Heieck, Sheila** - 3 managed / 0 in RMM / 3 need install - - John Heieck’s iMac (folder 3426849) - - Sheila's iMac (folder 3426849) - - Sheila’s MacBook Pro (folder 3426849) +**Pro-Tech Services** - 2 need install (of 2 not-in-RMM; rest offline >31d) + - DESKTOP-EKC9PRV (folder 4100925, seen 2026-07-03, 0d ago) + - LAPTOP-73UDDTTK (folder 4100925, seen 2026-07-02, 1d ago) -**The Marc Group** - 2 managed / 0 in RMM / 2 need install - - DESKTOP-6HT5SJ9 (folder 4086906) - - LAPTOP-JMUNGO (folder 4086906) +**Inside Track Productions** - 1 need install (of 1 not-in-RMM; rest offline >31d) + - DESKTOP-3ST7GFD (folder 4095118, seen 2026-07-03, 0d ago) -**Bill Tedards** - 2 managed / 0 in RMM / 2 need install - - DESKTOP-SUFJR0J (folder 615472) - - TEDARDSLAPTOP (folder 615472) +**Gary A Hartman LLC** - 1 need install (of 1 not-in-RMM; rest offline >31d) + - DESKTOP-EVA4H1A (folder 3121109, seen 2026-07-03, 0d ago) -**Business Services of Tucson LLC** - 2 managed / 0 in RMM / 2 need install - - KAT (folder 3204798) - - KAT1 (folder 3204798) +**Robyn Pittman** - 1 need install (of 1 not-in-RMM; rest offline >31d) + - DESKTOP-PL2RCGL (folder 4088528, seen 2026-07-03, 0d ago) -**Pro-Tech Services** - 2 managed / 0 in RMM / 2 need install - - DESKTOP-EKC9PRV (folder 4100925) - - LAPTOP-73UDDTTK (folder 4100925) - -**Inside Track Productions** - 1 managed / 0 in RMM / 1 need install - - DESKTOP-3ST7GFD (folder 4095118) - -**Gary A Hartman LLC** - 1 managed / 0 in RMM / 1 need install - - DESKTOP-EVA4H1A (folder 3121109) - -**Robyn Pittman** - 1 managed / 0 in RMM / 1 need install - - DESKTOP-PL2RCGL (folder 4088528) - -**Marty Ryan** - 1 managed / 0 in RMM / 1 need install - - DESKTOP-OC2PH4I (folder 594524) +**Marty Ryan** - 1 need install (of 1 not-in-RMM; rest offline >31d) + - DESKTOP-OC2PH4I (folder 594524, seen 2026-07-03, 0d ago) diff --git a/projects/gps-rmm-audit/session-logs/2026-07/2026-07-03-howard-gps-rmm-coverage-audit.md b/projects/gps-rmm-audit/session-logs/2026-07/2026-07-03-howard-gps-rmm-coverage-audit.md index 455ed84f..557b77ef 100644 --- a/projects/gps-rmm-audit/session-logs/2026-07/2026-07-03-howard-gps-rmm-coverage-audit.md +++ b/projects/gps-rmm-audit/session-logs/2026-07/2026-07-03-howard-gps-rmm-coverage-audit.md @@ -115,3 +115,11 @@ Policy finding: Syncro public REST API does NOT expose policy management (GET /p Also: the Syncro-stored ScreenConnect GUID on assets is stale (send-command HTTP 500 / session lookup null) - that's why by-name SC lookup missed these machines. Friction logged: curl inside while-read loop steals loop stdin (fix: 64 active (50 excluded as offline >31d). Each entry now shows policy_folder_id + last-seen date + days-ago. Sent the 64-machine active list to Howard in Discord (4 chunks). Regenerate anytime: MAXDAYS= SK=.. RMM=.. TOK=.. py needs-sc.py. + +Howard pushed a Syncro policy that installs ScreenConnect on the machines as they come online; some may install already, remainder tracked daily. NOTE: SC install alone does not install GuruRMM - after SC lands, GuruRMM still must be pushed via SC (our channel), unless the Syncro policy also runs the GuruRMM one-liner. + +Next step (agreed, not yet done): close the loop - upgrade the daily GPS-RMM-Progress job to auto-push GuruRMM to needs-install machines once they have a live SC session (or add the GuruRMM one-liner to the Syncro SC policy). Billing findings to Winter/Mike remain HELD (do not send yet, per Howard). diff --git a/projects/gps-rmm-audit/tools/needs-sc.py b/projects/gps-rmm-audit/tools/needs-sc.py index 6f45fda9..5d90be15 100644 --- a/projects/gps-rmm-audit/tools/needs-sc.py +++ b/projects/gps-rmm-audit/tools/needs-sc.py @@ -1,17 +1,26 @@ -import json, urllib.request, ssl, os +import json, urllib.request, ssl, os, datetime from collections import Counter BASE="https://computerguru.syncromsp.com/api/v1" SK=os.environ["SK"]; RMM=os.environ["RMM"]; TOK=os.environ["TOK"] +MAXDAYS=int(os.environ.get("MAXDAYS","31")) ctx=ssl.create_default_context() def get(url,hdr=None): return urllib.request.urlopen(urllib.request.Request(url,headers=hdr or {}),context=ctx,timeout=30).read() def clean(b): return bytes(c for c in b if c>=32 or c in (9,10,13)) +now=datetime.datetime.now() +def lastseen(a): + ki=(a.get("properties") or {}).get("kabuto_information") or {} + ts=ki.get("last_synced_at") + if not ts: return None,None + try: d=datetime.datetime.strptime(ts[:19],"%Y-%m-%dT%H:%M:%S") + except Exception: return None,None + return d,(now-d).days agents=json.loads(clean(get(f"{RMM}/api/agents",{"Authorization":f"Bearer {TOK}"}))) by_client={} for a in agents: by_client.setdefault(a.get("client_name") or "",set()).add((a.get("hostname") or "").lower()) tgts=json.load(open("projects/gps-rmm-audit/targets.json"))["clients"] -folder_ctr=Counter(); body=[]; total=0 +folder_ctr=Counter(); body=[]; total=0; stale=0; unknown=0 for t in tgts: c=t["client"]; cid=t["cid"] try: data=json.loads(clean(get(f"{BASE}/customer_assets?customer_id={cid}&per_page=100&api_key={SK}"))) @@ -19,21 +28,26 @@ for t in tgts: body.append(f"**{c}** - ERROR: {e}\n"); continue dev=[a for a in data.get("assets",[]) if a.get("asset_type")=="Syncro Device" and a.get("name")] rmm=by_client.get(c,set()) - gap=sorted([a for a in dev if a["name"].lower() not in rmm], key=lambda a:a["name"].lower()) - if not gap: continue - total+=len(gap) - body.append(f"**{c}** - {len(dev)} managed / {len(rmm)} in RMM / {len(gap)} need install") + gap=[a for a in dev if a["name"].lower() not in rmm] + keep=[] for a in gap: - f=a.get("policy_folder_id") or "-" - folder_ctr[str(f)]+=1 - body.append(f" - {a['name']} (folder {f})") + d,days=lastseen(a) + if d is None: unknown+=1; continue # no check-in data -> exclude + if days>MAXDAYS: stale+=1; continue # offline > MAXDAYS -> exclude + keep.append((a,d,days)) + if not keep: continue + keep.sort(key=lambda x:x[0]["name"].lower()) + total+=len(keep) + body.append(f"**{c}** - {len(keep)} need install (of {len(gap)} not-in-RMM; rest offline >{MAXDAYS}d)") + for a,d,days in keep: + f=a.get("policy_folder_id") or "-"; folder_ctr[str(f)]+=1 + body.append(f" - {a['name']} (folder {f}, seen {d.strftime('%Y-%m-%d')}, {days}d ago)") body.append("") -out=["# GPS clients - Syncro-managed machines NOT in GuruRMM","", - "Install ScreenConnect / push agent. Syncro assets (authoritative) vs live GuruRMM, 2026-07-03.", - "`folder N` = Syncro policy_folder_id (the ScreenConnect-install policy is tied to a folder - devices in the wrong folder don't get SC).","", - "## Folder distribution across the gap machines (spot the SC-install folder vs outliers)"] -for f,n in folder_ctr.most_common(): - out.append(f"- folder {f}: {n} machines") -out+=["",f"## TOTAL needing install: {total}",""]+body +out=["# GPS clients - Syncro-managed machines NOT in GuruRMM (ACTIVE only)","", + f"Machines missing from GuruRMM that checked into Syncro within the last {MAXDAYS} days. Excluded: {stale} offline >{MAXDAYS}d, {unknown} with no check-in data. Snapshot 2026-07-03.", + "`folder N` = Syncro policy_folder_id.","", + "## Folder distribution (active gap machines)"] +for f,n in folder_ctr.most_common(): out.append(f"- folder {f}: {n}") +out+=["",f"## TOTAL active needing install: {total}",""]+body open("projects/gps-rmm-audit/needs-screenconnect.md","w",encoding="utf-8").write("\n".join(out)) -print(f"total={total}, folders={dict(folder_ctr)}") +print(f"active={total} excluded_stale={stale} excluded_unknown={unknown}")