Initial commit — Stupid Simple Network Inventory

Application web d'inventaire réseau manuel avec FastAPI, Vue 3 et Docker.
Inclut l'authentification JWT, la découverte ICMP, et la topologie en cards CSS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-17 09:19:19 +02:00
commit 88cf6458d0
58 changed files with 10365 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
import {
siProxmox, siDocker,
siSynology, siTruenas,
siUbiquiti, siMikrotik, siCisco, siTplink, siAsus, siNetgear, siPfsense, siOpnsense, siOpenwrt,
siApache, siTraefikproxy,
siMariadb,
siKubernetes,
siDebian, siUbuntu,
siAnsible,
siDell, siHp,
siRaspberrypi, siArduino,
siNextcloud, siPaperlessngx, siUptimekuma, siMaterialformkdocs,
siJellyfin, siHomeassistant, siPhilipshue, siXiaomi,
siExcalidraw,
siKde,
} from 'simple-icons'
// Ordre : du plus spécifique au plus générique pour éviter les faux positifs.
const BRANDS = [
// Hyperviseurs / virtualisation
{ kw: ['proxmox', 'pve'], icon: siProxmox },
{ kw: ['docker'], icon: siDocker },
// NAS
{ kw: ['synology', 'dsm'], icon: siSynology },
{ kw: ['truenas', 'freenas'], icon: siTruenas },
// Réseau
{ kw: ['ubiquiti', 'unifi', 'usg', 'udm'], icon: siUbiquiti },
{ kw: ['mikrotik', 'routeros'], icon: siMikrotik },
{ kw: ['cisco'], icon: siCisco },
{ kw: ['tp-link', 'tplink', 'tp link'], icon: siTplink },
{ kw: ['asus'], icon: siAsus },
{ kw: ['netgear'], icon: siNetgear },
{ kw: ['pfsense'], icon: siPfsense },
{ kw: ['opnsense'], icon: siOpnsense },
{ kw: ['openwrt'], icon: siOpenwrt },
// Serveurs web / proxy
{ kw: ['apache', 'apache2', 'httpd'], icon: siApache },
{ kw: ['traefik'], icon: siTraefikproxy },
// Bases de données
{ kw: ['mariadb', 'maria db'], icon: siMariadb },
// Orchestration
{ kw: ['kubernetes', 'k8s', 'kubectl', 'k3s'], icon: siKubernetes },
// OS / distros
{ kw: ['debian'], icon: siDebian },
{ kw: ['ubuntu'], icon: siUbuntu },
// Automatisation
{ kw: ['ansible'], icon: siAnsible },
// Serveurs
{ kw: ['dell', 'idrac', 'poweredge'], icon: siDell },
{ kw: ['proliant', 'ilo', 'hewlett'], icon: siHp },
// SBC / DIY
{ kw: ['raspberry', 'raspberrypi', 'rpi', 'raspi'], icon: siRaspberrypi },
{ kw: ['arduino'], icon: siArduino },
// Environnements de bureau
{ kw: ['kde', 'plasma', 'kde desktop'], icon: siKde },
// Outils
{ kw: ['excalidraw'], icon: siExcalidraw },
// Productivité / self-hosted
{ kw: ['nextcloud'], icon: siNextcloud },
{ kw: ['paperless', 'paperless-ng', 'paperless-ngx'], icon: siPaperlessngx },
{ kw: ['uptime-kuma', 'uptimekuma', 'uptime kuma'], icon: siUptimekuma },
{ kw: ['mkdocs', 'material for mkdocs'], icon: siMaterialformkdocs },
// Médias / domotique
{ kw: ['jellyfin'], icon: siJellyfin },
{ kw: ['homeassistant', 'home assistant', 'hassio', 'hass'], icon: siHomeassistant },
{ kw: ['philips hue', 'hue bridge', 'hue hub'], icon: siPhilipshue },
{ kw: ['xiaomi', 'mi home', 'yeelight'], icon: siXiaomi },
]
export function detectBrands(name, description) {
const text = ((name || '') + ' ' + (description || '')).toLowerCase()
if (!text.trim()) return []
return BRANDS.filter(b => b.kw.some(kw => text.includes(kw))).map(b => b.icon)
}