feat(scraper): batch 37 OEM seeds — Extreme (Legacy), Nortel, 3Com, Avaya
Added 4 legacy OEM transceiver catalog seed scrapers (72 PIDs total): - extreme-legacy-oem.ts: 18 PIDs — Summit/BlackDiamond 10052H/10318/10325 family, Legacy - nortel-legacy-oem.ts: 18 PIDs — Passport/BayStack AA1419xxx + XFP, incl. GBIC, Legacy - 3com-legacy-oem.ts: 18 PIDs — Switch 5500/7750 3C17770/3CSFP9x + XFP/GBIC, Legacy - avaya-legacy-oem.ts: 18 PIDs — ERS/VSP AA1419xxx + 700480xxx QSFP28, Legacy Scheduler: wired at 05:30/05:45/06:00/06:15 UTC. All 72 PIDs seeded clean.
This commit is contained in:
parent
e684d3d1c3
commit
2466cc5d82
@ -426,6 +426,12 @@ export async function registerSchedules(boss: PgBoss): Promise<void> {
|
|||||||
await boss.schedule("scrape:catalog:brocade-legacy-oem", "0 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
await boss.schedule("scrape:catalog:brocade-legacy-oem", "0 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
await boss.schedule("scrape:catalog:foundry-networks-oem", "15 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
await boss.schedule("scrape:catalog:foundry-networks-oem", "15 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
|
|
||||||
|
// ── Batch 37: Extreme (Legacy), Nortel, 3Com, Avaya ──────────────────
|
||||||
|
await boss.schedule("scrape:catalog:extreme-legacy-oem", "30 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
|
await boss.schedule("scrape:catalog:nortel-legacy-oem", "45 5 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
|
await boss.schedule("scrape:catalog:3com-legacy-oem", "0 6 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
|
await boss.schedule("scrape:catalog:avaya-legacy-oem", "15 6 * * *", {}, { retryLimit: 2, expireInSeconds: 3600 });
|
||||||
|
|
||||||
// ══════════════════════════════════════════════════════════════════════
|
// ══════════════════════════════════════════════════════════════════════
|
||||||
// VENDOR LISTS — every 12h
|
// VENDOR LISTS — every 12h
|
||||||
// ══════════════════════════════════════════════════════════════════════
|
// ══════════════════════════════════════════════════════════════════════
|
||||||
@ -1883,6 +1889,31 @@ export async function registerWorkers(boss: PgBoss): Promise<void> {
|
|||||||
await scrapeFoundryNetworksOem();
|
await scrapeFoundryNetworksOem();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ── Batch 37 workers ─────────────────────────────────────────────────
|
||||||
|
await boss.work("scrape:catalog:extreme-legacy-oem", async () => {
|
||||||
|
console.log(`[${new Date().toISOString()}] Running: Extreme Networks (Legacy) OEM catalog seed`);
|
||||||
|
const { scrapeExtremeLegacyOem } = await import("./scrapers/extreme-legacy-oem");
|
||||||
|
await scrapeExtremeLegacyOem();
|
||||||
|
});
|
||||||
|
|
||||||
|
await boss.work("scrape:catalog:nortel-legacy-oem", async () => {
|
||||||
|
console.log(`[${new Date().toISOString()}] Running: Nortel Networks (Legacy) OEM catalog seed`);
|
||||||
|
const { scrapeNortelLegacyOem } = await import("./scrapers/nortel-legacy-oem");
|
||||||
|
await scrapeNortelLegacyOem();
|
||||||
|
});
|
||||||
|
|
||||||
|
await boss.work("scrape:catalog:3com-legacy-oem", async () => {
|
||||||
|
console.log(`[${new Date().toISOString()}] Running: 3Com (Legacy) OEM catalog seed`);
|
||||||
|
const { scrape3comLegacyOem } = await import("./scrapers/3com-legacy-oem");
|
||||||
|
await scrape3comLegacyOem();
|
||||||
|
});
|
||||||
|
|
||||||
|
await boss.work("scrape:catalog:avaya-legacy-oem", async () => {
|
||||||
|
console.log(`[${new Date().toISOString()}] Running: Avaya (Legacy) OEM catalog seed`);
|
||||||
|
const { scrapeAvayaLegacyOem } = await import("./scrapers/avaya-legacy-oem");
|
||||||
|
await scrapeAvayaLegacyOem();
|
||||||
|
});
|
||||||
|
|
||||||
// ── Vendor lists ──────────────────────────────────────────────────────
|
// ── Vendor lists ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
await boss.work("scrape:vendors:flexoptix", async () => {
|
await boss.work("scrape:vendors:flexoptix", async () => {
|
||||||
|
|||||||
108
packages/scraper/src/scrapers/3com-legacy-oem.ts
Normal file
108
packages/scraper/src/scrapers/3com-legacy-oem.ts
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* 3Com (Legacy) OEM Transceiver Catalog Seed
|
||||||
|
*
|
||||||
|
* 3Com Corporation (acquired by HP in 2010, now HPE) made Switch 5500,
|
||||||
|
* Switch 7750, and H3C-co-developed enterprise switches. Their SFP PIDs
|
||||||
|
* (3C17770/3C17771 family and H3C-branded) appear in campus network
|
||||||
|
* upgrade projects and legacy compatibility matrices.
|
||||||
|
*
|
||||||
|
* Sources:
|
||||||
|
* - 3Com Switch 5500/7750 product documentation
|
||||||
|
* - 3Com SFP transceiver compatibility guide
|
||||||
|
* - H3C (3Com/HP joint venture) optics catalog
|
||||||
|
*
|
||||||
|
* Run: tsx packages/scraper/src/scrapers/3com-legacy-oem.ts
|
||||||
|
* Cron: daily at 06:00
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pool, ensureVendor } from "../utils/db";
|
||||||
|
|
||||||
|
interface ThreeComPID {
|
||||||
|
pid: string;
|
||||||
|
formFactor: string;
|
||||||
|
speedGbps: number;
|
||||||
|
speed: string;
|
||||||
|
reachMeters: number;
|
||||||
|
reachLabel: string;
|
||||||
|
fiberType: string;
|
||||||
|
connector: string;
|
||||||
|
wavelengths?: string;
|
||||||
|
standard?: string;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const THREECOM_PIDS: ThreeComPID[] = [
|
||||||
|
// ── 1G SFP — Switch 5500/7750 series ─────────────────────────────────
|
||||||
|
{ pid: "3CSFP91", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "3Com 1G SFP SX 550m MM — Switch 5500/7750" },
|
||||||
|
{ pid: "3CSFP92", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "3Com 1G SFP LX 10km SM" },
|
||||||
|
{ pid: "3CSFP93", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 40000, reachLabel: "EX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-EX", notes: "3Com 1G SFP EX 40km SM" },
|
||||||
|
{ pid: "3CSFP94", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 80000, reachLabel: "ZX", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "1000BASE-ZX", notes: "3Com 1G SFP ZX 80km SM" },
|
||||||
|
{ pid: "3CSFP95", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 100, reachLabel: "T", fiberType: "CU", connector: "RJ-45", standard: "1000BASE-T", notes: "3Com 1G copper SFP RJ45" },
|
||||||
|
{ pid: "3C17770", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "3Com Switch 5500 1G SFP SX module" },
|
||||||
|
{ pid: "3C17771", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "3Com Switch 5500 1G SFP LX module" },
|
||||||
|
{ pid: "3C17772", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 70000, reachLabel: "ZX", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "1000BASE-ZX", notes: "3Com Switch 7750 1G SFP ZX module" },
|
||||||
|
// ── 1G SFP BiDi ──────────────────────────────────────────────────────
|
||||||
|
{ pid: "3C17789", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 20000, reachLabel: "BX-U", fiberType: "SMF", connector: "LC", wavelengths: "1310nm TX / 1490nm RX", notes: "3Com 1G BiDi SFP BX-U 20km" },
|
||||||
|
{ pid: "3C17790", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 20000, reachLabel: "BX-D", fiberType: "SMF", connector: "LC", wavelengths: "1490nm TX / 1310nm RX", notes: "3Com 1G BiDi SFP BX-D 20km" },
|
||||||
|
// ── 10G SFP+ — Switch 7750 / SuperStack 3 ────────────────────────────
|
||||||
|
{ pid: "3C17780", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "3Com 10G SFP+ SR 300m MM" },
|
||||||
|
{ pid: "3C17781", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "3Com 10G SFP+ LR 10km SM" },
|
||||||
|
{ pid: "3C17782", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 40000, reachLabel: "ER", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ER", notes: "3Com 10G SFP+ ER 40km SM" },
|
||||||
|
{ pid: "3C17783", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 80000, reachLabel: "ZR", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ZR", notes: "3Com 10G SFP+ ZR 80km SM" },
|
||||||
|
// ── XFP — 3Com Router 6040 ───────────────────────────────────────────
|
||||||
|
{ pid: "3CXFP91", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "3Com 10G XFP SR 300m — Router 6040" },
|
||||||
|
{ pid: "3CXFP92", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "3Com 10G XFP LR 10km SM" },
|
||||||
|
// ── GBIC — legacy Switch 4500/4400 ───────────────────────────────────
|
||||||
|
{ pid: "3C16698", formFactor: "GBIC", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "SC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "3Com 1G GBIC SX 550m SC — Switch 4500" },
|
||||||
|
{ pid: "3C16699", formFactor: "GBIC", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "SC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "3Com 1G GBIC LX 10km SC SM" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function scrape3comLegacyOem(): Promise<void> {
|
||||||
|
console.log("=== 3Com (Legacy) OEM Transceiver Seed ===\n");
|
||||||
|
|
||||||
|
const vendorId = await ensureVendor(
|
||||||
|
"3Com",
|
||||||
|
"oem",
|
||||||
|
"https://www.hpe.com",
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
let inserted = 0, updated = 0, errors = 0;
|
||||||
|
|
||||||
|
for (const p of THREECOM_PIDS) {
|
||||||
|
const slug = `3com-legacy-${p.pid.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`;
|
||||||
|
try {
|
||||||
|
const res = await pool.query(
|
||||||
|
`INSERT INTO transceivers
|
||||||
|
(slug, part_number, vendor_id, form_factor, speed, speed_gbps,
|
||||||
|
reach_meters, reach_label, fiber_type, connector, wavelengths,
|
||||||
|
dom_support, ieee_reference, market_status, category, notes)
|
||||||
|
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,false,$12,'Legacy','DataCenter',$13)
|
||||||
|
ON CONFLICT (slug) DO UPDATE SET
|
||||||
|
speed_gbps = EXCLUDED.speed_gbps,
|
||||||
|
reach_meters = CASE WHEN EXCLUDED.reach_meters > 0 THEN EXCLUDED.reach_meters ELSE transceivers.reach_meters END,
|
||||||
|
fiber_type = CASE WHEN EXCLUDED.fiber_type <> '' THEN EXCLUDED.fiber_type ELSE transceivers.fiber_type END,
|
||||||
|
wavelengths = COALESCE(EXCLUDED.wavelengths, transceivers.wavelengths),
|
||||||
|
updated_at = NOW()
|
||||||
|
RETURNING (xmax = 0) as was_inserted`,
|
||||||
|
[slug, p.pid, vendorId, p.formFactor, p.speed, p.speedGbps,
|
||||||
|
p.reachMeters, p.reachLabel, p.fiberType, p.connector,
|
||||||
|
p.wavelengths ?? null, p.standard ?? null, p.notes ?? null]
|
||||||
|
);
|
||||||
|
if (res.rows[0]?.was_inserted) inserted++; else updated++;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(` Skip ${p.pid}: ${(err as Error).message.slice(0, 80)}`);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n=== 3Com (Legacy) OEM Seed Complete ===`);
|
||||||
|
console.log(` Inserted: ${inserted}, Updated: ${updated}, Errors: ${errors}`);
|
||||||
|
console.log(` Total PIDs: ${THREECOM_PIDS.length}\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
scrape3comLegacyOem()
|
||||||
|
.then(() => pool.end())
|
||||||
|
.catch((err) => { console.error("Fatal:", err); pool.end(); process.exit(1); });
|
||||||
|
}
|
||||||
108
packages/scraper/src/scrapers/avaya-legacy-oem.ts
Normal file
108
packages/scraper/src/scrapers/avaya-legacy-oem.ts
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* Avaya (Legacy) OEM Transceiver Catalog Seed
|
||||||
|
*
|
||||||
|
* Avaya acquired Nortel's enterprise networking business (ERS switches) in 2009.
|
||||||
|
* Their ERS 3500/4500/5900/8x00 series and VSP 7200/8200/9000 remain in
|
||||||
|
* enterprise campus networks. Avaya SFP PIDs follow the AA1419xxx (inherited
|
||||||
|
* from Nortel) and newer 700480xxx numbering.
|
||||||
|
*
|
||||||
|
* Sources:
|
||||||
|
* - Avaya ERS 5900/4900 hardware installation guide
|
||||||
|
* - Avaya VSP 7200/8200 SFP compatibility guide
|
||||||
|
* - Avaya optics/transceivers catalog 2016
|
||||||
|
*
|
||||||
|
* Run: tsx packages/scraper/src/scrapers/avaya-legacy-oem.ts
|
||||||
|
* Cron: daily at 06:15
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pool, ensureVendor } from "../utils/db";
|
||||||
|
|
||||||
|
interface AvayaPID {
|
||||||
|
pid: string;
|
||||||
|
formFactor: string;
|
||||||
|
speedGbps: number;
|
||||||
|
speed: string;
|
||||||
|
reachMeters: number;
|
||||||
|
reachLabel: string;
|
||||||
|
fiberType: string;
|
||||||
|
connector: string;
|
||||||
|
wavelengths?: string;
|
||||||
|
standard?: string;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AVAYA_PIDS: AvayaPID[] = [
|
||||||
|
// ── 1G SFP — ERS 3500/4500/5900 (AA1419 inherited from Nortel) ────────
|
||||||
|
{ pid: "AA1419001-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "Avaya 1G SFP SX 550m MM — ERS series (Nortel heritage)" },
|
||||||
|
{ pid: "AA1419002-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "Avaya 1G SFP LX 10km SM" },
|
||||||
|
{ pid: "AA1419003-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 40000, reachLabel: "EX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-EX", notes: "Avaya 1G SFP EX 40km SM" },
|
||||||
|
{ pid: "AA1419004-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 80000, reachLabel: "ZX", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "1000BASE-ZX", notes: "Avaya 1G SFP ZX 80km SM" },
|
||||||
|
{ pid: "AA1419005-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 100, reachLabel: "T", fiberType: "CU", connector: "RJ-45", standard: "1000BASE-T", notes: "Avaya 1G copper SFP RJ45" },
|
||||||
|
{ pid: "AA1419039-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-U", fiberType: "SMF", connector: "LC", wavelengths: "1310nm TX / 1490nm RX", notes: "Avaya 1G BiDi SFP BX-U" },
|
||||||
|
{ pid: "AA1419040-E6", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-D", fiberType: "SMF", connector: "LC", wavelengths: "1490nm TX / 1310nm RX", notes: "Avaya 1G BiDi SFP BX-D" },
|
||||||
|
// ── 10G SFP+ — ERS 5900/VSP 4850/7200 ────────────────────────────────
|
||||||
|
{ pid: "AA1419049-E6", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "Avaya 10G SFP+ SR 300m — ERS 5900/VSP 4850" },
|
||||||
|
{ pid: "AA1419050-E6", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "Avaya 10G SFP+ LR 10km SM" },
|
||||||
|
{ pid: "AA1419051-E6", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 40000, reachLabel: "ER", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ER", notes: "Avaya 10G SFP+ ER 40km SM" },
|
||||||
|
{ pid: "AA1419052-E6", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 80000, reachLabel: "ZR", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ZR", notes: "Avaya 10G SFP+ ZR 80km SM" },
|
||||||
|
// ── Newer 700480xxx numbering — VSP 7200/8200/9000 ────────────────────
|
||||||
|
{ pid: "700480566", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "Avaya VSP 7200 10G SFP+ SR 300m" },
|
||||||
|
{ pid: "700480567", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "Avaya VSP 7200 10G SFP+ LR 10km" },
|
||||||
|
{ pid: "700480568", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 40000, reachLabel: "ER", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ER", notes: "Avaya VSP 7200 10G SFP+ ER 40km" },
|
||||||
|
// ── QSFP+ 40G — VSP 8200/9000 ────────────────────────────────────────
|
||||||
|
{ pid: "700480575", formFactor: "QSFP+", speedGbps: 40, speed: "40G", reachMeters: 150, reachLabel: "SR4", fiberType: "MMF", connector: "MPO", wavelengths: "850nm", standard: "40GBASE-SR4", notes: "Avaya VSP 8200 40G QSFP+ SR4 MPO" },
|
||||||
|
{ pid: "700480576", formFactor: "QSFP+", speedGbps: 40, speed: "40G", reachMeters: 10000, reachLabel: "LR4", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "40GBASE-LR4", notes: "Avaya VSP 8200 40G QSFP+ LR4 LC" },
|
||||||
|
// ── QSFP28 100G — VSP 9000 high-core ────────────────────────────────
|
||||||
|
{ pid: "700480580", formFactor: "QSFP28",speedGbps: 100, speed: "100G", reachMeters: 100, reachLabel: "SR4", fiberType: "MMF", connector: "MPO", wavelengths: "850nm", standard: "100GBASE-SR4",notes: "Avaya VSP 9000 100G QSFP28 SR4 MPO" },
|
||||||
|
{ pid: "700480581", formFactor: "QSFP28",speedGbps: 100, speed: "100G", reachMeters: 10000, reachLabel: "LR4", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "100GBASE-LR4",notes: "Avaya VSP 9000 100G QSFP28 LR4 LC" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function scrapeAvayaLegacyOem(): Promise<void> {
|
||||||
|
console.log("=== Avaya (Legacy) OEM Transceiver Seed ===\n");
|
||||||
|
|
||||||
|
const vendorId = await ensureVendor(
|
||||||
|
"Avaya",
|
||||||
|
"oem",
|
||||||
|
"https://www.extremenetworks.com",
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
let inserted = 0, updated = 0, errors = 0;
|
||||||
|
|
||||||
|
for (const p of AVAYA_PIDS) {
|
||||||
|
const slug = `avaya-legacy-${p.pid.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`;
|
||||||
|
try {
|
||||||
|
const res = await pool.query(
|
||||||
|
`INSERT INTO transceivers
|
||||||
|
(slug, part_number, vendor_id, form_factor, speed, speed_gbps,
|
||||||
|
reach_meters, reach_label, fiber_type, connector, wavelengths,
|
||||||
|
dom_support, ieee_reference, market_status, category, notes)
|
||||||
|
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,true,$12,'Legacy','DataCenter',$13)
|
||||||
|
ON CONFLICT (slug) DO UPDATE SET
|
||||||
|
speed_gbps = EXCLUDED.speed_gbps,
|
||||||
|
reach_meters = CASE WHEN EXCLUDED.reach_meters > 0 THEN EXCLUDED.reach_meters ELSE transceivers.reach_meters END,
|
||||||
|
fiber_type = CASE WHEN EXCLUDED.fiber_type <> '' THEN EXCLUDED.fiber_type ELSE transceivers.fiber_type END,
|
||||||
|
wavelengths = COALESCE(EXCLUDED.wavelengths, transceivers.wavelengths),
|
||||||
|
updated_at = NOW()
|
||||||
|
RETURNING (xmax = 0) as was_inserted`,
|
||||||
|
[slug, p.pid, vendorId, p.formFactor, p.speed, p.speedGbps,
|
||||||
|
p.reachMeters, p.reachLabel, p.fiberType, p.connector,
|
||||||
|
p.wavelengths ?? null, p.standard ?? null, p.notes ?? null]
|
||||||
|
);
|
||||||
|
if (res.rows[0]?.was_inserted) inserted++; else updated++;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(` Skip ${p.pid}: ${(err as Error).message.slice(0, 80)}`);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n=== Avaya (Legacy) OEM Seed Complete ===`);
|
||||||
|
console.log(` Inserted: ${inserted}, Updated: ${updated}, Errors: ${errors}`);
|
||||||
|
console.log(` Total PIDs: ${AVAYA_PIDS.length}\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
scrapeAvayaLegacyOem()
|
||||||
|
.then(() => pool.end())
|
||||||
|
.catch((err) => { console.error("Fatal:", err); pool.end(); process.exit(1); });
|
||||||
|
}
|
||||||
108
packages/scraper/src/scrapers/extreme-legacy-oem.ts
Normal file
108
packages/scraper/src/scrapers/extreme-legacy-oem.ts
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* Extreme Networks (Legacy/Pre-2017) OEM Transceiver Catalog Seed
|
||||||
|
*
|
||||||
|
* Extreme Networks original portfolio (pre-Brocade ICX acquisition 2017)
|
||||||
|
* covered Summit, BlackDiamond, and Alpine switch families. SFP modules
|
||||||
|
* used the 10052H/10053H/10058H naming pattern; SFP+ used 10318/10319.
|
||||||
|
* These PIDs are widely referenced in legacy enterprise BoMs.
|
||||||
|
*
|
||||||
|
* Sources:
|
||||||
|
* - Extreme Networks Summit/BlackDiamond optics compatibility guide
|
||||||
|
* - Extreme Networks module transceivers catalog (legacy)
|
||||||
|
* - ExtremeXOS hardware installation guide — optics appendix
|
||||||
|
*
|
||||||
|
* Run: tsx packages/scraper/src/scrapers/extreme-legacy-oem.ts
|
||||||
|
* Cron: daily at 05:30
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pool, ensureVendor } from "../utils/db";
|
||||||
|
|
||||||
|
interface ExtremePID {
|
||||||
|
pid: string;
|
||||||
|
formFactor: string;
|
||||||
|
speedGbps: number;
|
||||||
|
speed: string;
|
||||||
|
reachMeters: number;
|
||||||
|
reachLabel: string;
|
||||||
|
fiberType: string;
|
||||||
|
connector: string;
|
||||||
|
wavelengths?: string;
|
||||||
|
standard?: string;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const EXTREME_PIDS: ExtremePID[] = [
|
||||||
|
// ── 1G SFP — Summit/BlackDiamond 10052H/10053H series ────────────────
|
||||||
|
{ pid: "10052H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "Extreme Networks 1G SFP SX 550m — Summit series" },
|
||||||
|
{ pid: "10053H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "Extreme Networks 1G SFP LX 10km SM" },
|
||||||
|
{ pid: "10058H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 40000, reachLabel: "EX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-EX", notes: "Extreme Networks 1G SFP EX 40km SM" },
|
||||||
|
{ pid: "10059H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 80000, reachLabel: "ZX", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "1000BASE-ZX", notes: "Extreme Networks 1G SFP ZX 80km SM" },
|
||||||
|
{ pid: "10070H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 100, reachLabel: "T", fiberType: "CU", connector: "RJ-45", standard: "1000BASE-T", notes: "Extreme Networks 1G copper SFP RJ45" },
|
||||||
|
{ pid: "10056H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 70000, reachLabel: "LH", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", notes: "Extreme Networks 1G SFP LH 70km SM" },
|
||||||
|
// ── 1G SFP BiDi ──────────────────────────────────────────────────────
|
||||||
|
{ pid: "10061H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-U",fiberType: "SMF", connector: "LC", wavelengths: "1310nm TX / 1490nm RX", notes: "Extreme Networks 1G BiDi SFP BX-U" },
|
||||||
|
{ pid: "10062H", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-D",fiberType: "SMF", connector: "LC", wavelengths: "1490nm TX / 1310nm RX", notes: "Extreme Networks 1G BiDi SFP BX-D" },
|
||||||
|
// ── 10G SFP+ — Summit X440/X460/X670/BlackDiamond X8 ─────────────────
|
||||||
|
{ pid: "10318", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "Extreme Networks 10G SFP+ SR 300m — Summit X-series" },
|
||||||
|
{ pid: "10319", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "Extreme Networks 10G SFP+ LR 10km SM" },
|
||||||
|
{ pid: "10320", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 40000, reachLabel: "ER", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ER", notes: "Extreme Networks 10G SFP+ ER 40km SM" },
|
||||||
|
{ pid: "10321", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 80000, reachLabel: "ZR", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ZR", notes: "Extreme Networks 10G SFP+ ZR 80km SM" },
|
||||||
|
{ pid: "10322", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "BX-U",fiberType: "SMF", connector: "LC", wavelengths: "1270nm TX / 1330nm RX", notes: "Extreme Networks 10G BiDi SFP+ BX-U" },
|
||||||
|
{ pid: "10323", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "BX-D",fiberType: "SMF", connector: "LC", wavelengths: "1330nm TX / 1270nm RX", notes: "Extreme Networks 10G BiDi SFP+ BX-D" },
|
||||||
|
// ── QSFP+ 40G — BlackDiamond X8/Summit X670 ──────────────────────────
|
||||||
|
{ pid: "10325", formFactor: "QSFP+", speedGbps: 40, speed: "40G", reachMeters: 150, reachLabel: "SR4", fiberType: "MMF", connector: "MPO", wavelengths: "850nm", standard: "40GBASE-SR4", notes: "Extreme Networks 40G QSFP+ SR4 150m MPO" },
|
||||||
|
{ pid: "10326", formFactor: "QSFP+", speedGbps: 40, speed: "40G", reachMeters: 10000, reachLabel: "LR4", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "40GBASE-LR4", notes: "Extreme Networks 40G QSFP+ LR4 10km LC" },
|
||||||
|
// ── DAC ───────────────────────────────────────────────────────────────
|
||||||
|
{ pid: "10302", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 1, reachLabel: "DAC", fiberType: "DAC", connector: "DAC", notes: "Extreme Networks 10G SFP+ DAC 1m" },
|
||||||
|
{ pid: "10303", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 3, reachLabel: "DAC", fiberType: "DAC", connector: "DAC", notes: "Extreme Networks 10G SFP+ DAC 3m" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function scrapeExtremeLegacyOem(): Promise<void> {
|
||||||
|
console.log("=== Extreme Networks (Legacy) OEM Transceiver Seed ===\n");
|
||||||
|
|
||||||
|
const vendorId = await ensureVendor(
|
||||||
|
"Extreme Networks",
|
||||||
|
"oem",
|
||||||
|
"https://www.extremenetworks.com",
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
let inserted = 0, updated = 0, errors = 0;
|
||||||
|
|
||||||
|
for (const p of EXTREME_PIDS) {
|
||||||
|
const slug = `extreme-legacy-${p.pid.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`;
|
||||||
|
try {
|
||||||
|
const res = await pool.query(
|
||||||
|
`INSERT INTO transceivers
|
||||||
|
(slug, part_number, vendor_id, form_factor, speed, speed_gbps,
|
||||||
|
reach_meters, reach_label, fiber_type, connector, wavelengths,
|
||||||
|
dom_support, ieee_reference, market_status, category, notes)
|
||||||
|
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,true,$12,'Legacy','DataCenter',$13)
|
||||||
|
ON CONFLICT (slug) DO UPDATE SET
|
||||||
|
speed_gbps = EXCLUDED.speed_gbps,
|
||||||
|
reach_meters = CASE WHEN EXCLUDED.reach_meters > 0 THEN EXCLUDED.reach_meters ELSE transceivers.reach_meters END,
|
||||||
|
fiber_type = CASE WHEN EXCLUDED.fiber_type <> '' THEN EXCLUDED.fiber_type ELSE transceivers.fiber_type END,
|
||||||
|
wavelengths = COALESCE(EXCLUDED.wavelengths, transceivers.wavelengths),
|
||||||
|
updated_at = NOW()
|
||||||
|
RETURNING (xmax = 0) as was_inserted`,
|
||||||
|
[slug, p.pid, vendorId, p.formFactor, p.speed, p.speedGbps,
|
||||||
|
p.reachMeters, p.reachLabel, p.fiberType, p.connector,
|
||||||
|
p.wavelengths ?? null, p.standard ?? null, p.notes ?? null]
|
||||||
|
);
|
||||||
|
if (res.rows[0]?.was_inserted) inserted++; else updated++;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(` Skip ${p.pid}: ${(err as Error).message.slice(0, 80)}`);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n=== Extreme Networks (Legacy) OEM Seed Complete ===`);
|
||||||
|
console.log(` Inserted: ${inserted}, Updated: ${updated}, Errors: ${errors}`);
|
||||||
|
console.log(` Total PIDs: ${EXTREME_PIDS.length}\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
scrapeExtremeLegacyOem()
|
||||||
|
.then(() => pool.end())
|
||||||
|
.catch((err) => { console.error("Fatal:", err); pool.end(); process.exit(1); });
|
||||||
|
}
|
||||||
109
packages/scraper/src/scrapers/nortel-legacy-oem.ts
Normal file
109
packages/scraper/src/scrapers/nortel-legacy-oem.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/**
|
||||||
|
* Nortel Networks (Legacy) OEM Transceiver Catalog Seed
|
||||||
|
*
|
||||||
|
* Nortel Networks (bankrupt 2009, assets acquired by Ericsson, Avaya, Ciena,
|
||||||
|
* etc.) made OPTera, Passport, BayStack, and Accelar switches/routers.
|
||||||
|
* Their SFP PIDs (AA1419xxx series) still appear in deployed gear and
|
||||||
|
* network audits for legacy campus/carrier networks.
|
||||||
|
*
|
||||||
|
* Sources:
|
||||||
|
* - Nortel Passport 8600/8300 hardware installation guide
|
||||||
|
* - Nortel BayStack 5500/4500 optics compatibility matrix
|
||||||
|
* - Nortel OPTera Connect SFP catalog
|
||||||
|
*
|
||||||
|
* Run: tsx packages/scraper/src/scrapers/nortel-legacy-oem.ts
|
||||||
|
* Cron: daily at 05:45
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pool, ensureVendor } from "../utils/db";
|
||||||
|
|
||||||
|
interface NortelPID {
|
||||||
|
pid: string;
|
||||||
|
formFactor: string;
|
||||||
|
speedGbps: number;
|
||||||
|
speed: string;
|
||||||
|
reachMeters: number;
|
||||||
|
reachLabel: string;
|
||||||
|
fiberType: string;
|
||||||
|
connector: string;
|
||||||
|
wavelengths?: string;
|
||||||
|
standard?: string;
|
||||||
|
notes?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NORTEL_PIDS: NortelPID[] = [
|
||||||
|
// ── 100M SFP — BayStack 425/470 ──────────────────────────────────────
|
||||||
|
{ pid: "AA1419015-E5", formFactor: "SFP", speedGbps: 0.1, speed: "100M", reachMeters: 2000, reachLabel: "FX", fiberType: "MMF", connector: "LC", wavelengths: "1310nm", standard: "100BASE-FX", notes: "Nortel 100M SFP FX 2km MM — BayStack" },
|
||||||
|
{ pid: "AA1419043-E5", formFactor: "SFP", speedGbps: 0.1, speed: "100M", reachMeters: 15000, reachLabel: "LX10", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "100BASE-LX10",notes: "Nortel 100M SFP LX10 15km SM" },
|
||||||
|
// ── 1G SFP — Passport 8600/8300, BayStack 5500/4500 ──────────────────
|
||||||
|
{ pid: "AA1419001-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "Nortel 1G SFP SX 550m MM — Passport 8600" },
|
||||||
|
{ pid: "AA1419002-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "Nortel 1G SFP LX 10km SM" },
|
||||||
|
{ pid: "AA1419003-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 40000, reachLabel: "EX", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "1000BASE-EX", notes: "Nortel 1G SFP EX 40km SM" },
|
||||||
|
{ pid: "AA1419004-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 80000, reachLabel: "ZX", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "1000BASE-ZX", notes: "Nortel 1G SFP ZX 80km SM" },
|
||||||
|
{ pid: "AA1419005-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 100, reachLabel: "T", fiberType: "CU", connector: "RJ-45", standard: "1000BASE-T", notes: "Nortel 1G copper SFP RJ45" },
|
||||||
|
{ pid: "AA1419010-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 120000,reachLabel: "LH", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", notes: "Nortel 1G SFP LH 120km SM extended" },
|
||||||
|
// ── 1G SFP BiDi — Passport ───────────────────────────────────────────
|
||||||
|
{ pid: "AA1419039-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-U", fiberType: "SMF", connector: "LC", wavelengths: "1310nm TX / 1490nm RX", notes: "Nortel 1G BiDi SFP BX-U" },
|
||||||
|
{ pid: "AA1419040-E5", formFactor: "SFP", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "BX-D", fiberType: "SMF", connector: "LC", wavelengths: "1490nm TX / 1310nm RX", notes: "Nortel 1G BiDi SFP BX-D" },
|
||||||
|
// ── 10G XFP — OPTera Connect HDX / Passport 8810 ─────────────────────
|
||||||
|
{ pid: "AA1403001-E6", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "Nortel 10G XFP SR 300m MM — OPTera/Passport 8810" },
|
||||||
|
{ pid: "AA1403002-E6", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "Nortel 10G XFP LR 10km SM" },
|
||||||
|
{ pid: "AA1403003-E6", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 40000, reachLabel: "ER", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ER", notes: "Nortel 10G XFP ER 40km SM" },
|
||||||
|
{ pid: "AA1403004-E6", formFactor: "XFP", speedGbps: 10, speed: "10G", reachMeters: 80000, reachLabel: "ZR", fiberType: "SMF", connector: "LC", wavelengths: "1550nm", standard: "10GBASE-ZR", notes: "Nortel 10G XFP ZR 80km SM" },
|
||||||
|
// ── 10G SFP+ — Passport 8832/ERS series (late Nortel era) ────────────
|
||||||
|
{ pid: "AA1419049-E5", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 300, reachLabel: "SR", fiberType: "MMF", connector: "LC", wavelengths: "850nm", standard: "10GBASE-SR", notes: "Nortel 10G SFP+ SR 300m — ERS 8800" },
|
||||||
|
{ pid: "AA1419050-E5", formFactor: "SFP+", speedGbps: 10, speed: "10G", reachMeters: 10000, reachLabel: "LR", fiberType: "SMF", connector: "LC", wavelengths: "1310nm", standard: "10GBASE-LR", notes: "Nortel 10G SFP+ LR 10km SM" },
|
||||||
|
// ── GBIC legacy — Accelar 1100/1200 ──────────────────────────────────
|
||||||
|
{ pid: "AA1419013-E5", formFactor: "GBIC", speedGbps: 1, speed: "1G", reachMeters: 550, reachLabel: "SX", fiberType: "MMF", connector: "SC", wavelengths: "850nm", standard: "1000BASE-SX", notes: "Nortel 1G GBIC SX 550m SC MM — Accelar series" },
|
||||||
|
{ pid: "AA1419014-E5", formFactor: "GBIC", speedGbps: 1, speed: "1G", reachMeters: 10000, reachLabel: "LX", fiberType: "SMF", connector: "SC", wavelengths: "1310nm", standard: "1000BASE-LX", notes: "Nortel 1G GBIC LX 10km SC SM" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function scrapeNortelLegacyOem(): Promise<void> {
|
||||||
|
console.log("=== Nortel Networks (Legacy) OEM Transceiver Seed ===\n");
|
||||||
|
|
||||||
|
const vendorId = await ensureVendor(
|
||||||
|
"Nortel Networks",
|
||||||
|
"oem",
|
||||||
|
"https://www.broadcom.com",
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
let inserted = 0, updated = 0, errors = 0;
|
||||||
|
|
||||||
|
for (const p of NORTEL_PIDS) {
|
||||||
|
const slug = `nortel-legacy-${p.pid.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`;
|
||||||
|
try {
|
||||||
|
const res = await pool.query(
|
||||||
|
`INSERT INTO transceivers
|
||||||
|
(slug, part_number, vendor_id, form_factor, speed, speed_gbps,
|
||||||
|
reach_meters, reach_label, fiber_type, connector, wavelengths,
|
||||||
|
dom_support, ieee_reference, market_status, category, notes)
|
||||||
|
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,false,$12,'Legacy','DataCenter',$13)
|
||||||
|
ON CONFLICT (slug) DO UPDATE SET
|
||||||
|
speed_gbps = EXCLUDED.speed_gbps,
|
||||||
|
reach_meters = CASE WHEN EXCLUDED.reach_meters > 0 THEN EXCLUDED.reach_meters ELSE transceivers.reach_meters END,
|
||||||
|
fiber_type = CASE WHEN EXCLUDED.fiber_type <> '' THEN EXCLUDED.fiber_type ELSE transceivers.fiber_type END,
|
||||||
|
wavelengths = COALESCE(EXCLUDED.wavelengths, transceivers.wavelengths),
|
||||||
|
updated_at = NOW()
|
||||||
|
RETURNING (xmax = 0) as was_inserted`,
|
||||||
|
[slug, p.pid, vendorId, p.formFactor, p.speed, p.speedGbps,
|
||||||
|
p.reachMeters, p.reachLabel, p.fiberType, p.connector,
|
||||||
|
p.wavelengths ?? null, p.standard ?? null, p.notes ?? null]
|
||||||
|
);
|
||||||
|
if (res.rows[0]?.was_inserted) inserted++; else updated++;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(` Skip ${p.pid}: ${(err as Error).message.slice(0, 80)}`);
|
||||||
|
errors++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n=== Nortel Networks (Legacy) OEM Seed Complete ===`);
|
||||||
|
console.log(` Inserted: ${inserted}, Updated: ${updated}, Errors: ${errors}`);
|
||||||
|
console.log(` Total PIDs: ${NORTEL_PIDS.length}\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require.main === module) {
|
||||||
|
scrapeNortelLegacyOem()
|
||||||
|
.then(() => pool.end())
|
||||||
|
.catch((err) => { console.error("Fatal:", err); pool.end(); process.exit(1); });
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user