SDK développeur

Intégrez directement les diagnostics de RoamSwitch dans votre propre app Mac ou Linux

RoamSwitchKit (macOS) et roamswitch-linux-kit (Linux) sont des clients gratuits et open source qui permettent à votre code Swift ou Rust d'interroger directement les mêmes diagnostics de sécurité que RoamSwitch calcule lui-même. Intégrez « ce réseau est-il sûr en ce moment » dans votre propre application sans réimplémenter la surveillance ARP ni le scan de ports.

🍎 RoamSwitchKit (macOS) → 🐧 roamswitch-linux-kit (Linux) →

🔒 Pourquoi c'est sûr

  • Lecture seule : aucune API ne permet de basculer le verrouillage, d'isoler un port ou d'éjecter un appareil. Une application liée à ce package ne peut pas modifier les réglages de RoamSwitch sans le consentement de l'utilisateur.
  • Entièrement local : il lance le binaire fourni avec RoamSwitch (macOS : RoamSwitchMCPServer / Linux : roamswitch-mcp) en tant que sous-processus et communique uniquement via stdio. Rien n'est jamais envoyé à un serveur externe.
  • Gratuit et open source : publié sous licence MIT — chacun peut inspecter le code source et l'intégrer librement.
Installation

Une ligne dans votre gestionnaire de paquets

Ajoutez-le simplement aux dépendances de votre Package.swift. Nécessite macOS 12+, Swift 5.9+ et RoamSwitch 1.3.0 ou version ultérieure installé.

dependencies: [
    .package(url: "https://github.com/lafine1211/RoamSwitchKit.git", from: "1.0.0")
]

Ajoutez-le simplement aux dépendances de votre Cargo.toml. Nécessite une chaîne d'outils Rust stable (édition 2021, runtime asynchrone tokio) et RoamSwitch for Linux installé (qui inclut le binaire roamswitch-mcp).

[dependencies]
roamswitch-linux-kit = { git = "https://github.com/lafine1211/roamswitch-linux-kit", tag = "v0.1.0" }
Utilisation

Obtenez des diagnostics avec quelques méthodes simples

import RoamSwitchKit

let client = try RoamSwitchClient()

let report = try await client.securityReport()
print(report.score, report.grade)

let ports = try await client.exposedPorts()
for port in ports.ports where port.overallRisk == "high" {
    print(port.processName, port.port)
}

let status = try await client.guardStatus()
print(status.activeSecurityLevelLabel, status.isCurrentNetworkTrusted)

let urlReport = try await client.auditURLSafety(url: "https://apple.com.login-verify.xyz")
print(urlReport.score, urlReport.riskLevel) // e.g. 20, "dangerous"
use roamswitch_linux_kit::RoamSwitchClient;

let client = RoamSwitchClient::new(None, None)?;

let report = client.security_report().await?;
println!("{} ({})", report.score, report.grade);

let ports = client.exposed_ports(false).await?;
for port in ports.ports.iter().filter(|p| p.overall_risk.as_deref() == Some("high")) {
    println!("{} {}", port.process_name, port.port);
}

let status = client.guard_status().await?;
println!("{} {}", status.active_security_level_label, status.is_current_network_trusted);

let url_report = client.audit_url_safety("https://apple.com.login-verify.xyz").await?;
println!("{} {}", url_report.score, url_report.risk_level); // e.g. 20, "dangerous"
Surface de l'API

Méthodes en lecture seule

securityReport()

Renvoie un audit complet et noté sur 18 critères — FileVault, SIP, Gatekeeper, pare-feu, robustesse du chiffrement Wi-Fi, usurpation ARP, ports exposés, etc. — avec des recommandations pour tout ce qui échoue.

exposedPorts(includeLocalOnly:)

Répertorie tous les ports actuellement en écoute et, pour tout ce qui est exposé au-delà de localhost, renvoie un audit détaillé incluant la détection de services connus pour être dangereux (Redis, MongoDB, etc.).

guardStatus()

Obtient l'état des gardes de ports, d'ARP, USB, Bluetooth, de téléchargement Web/Mail, de menaces DNS et le niveau de sécurité.

auditURLSafety(url:)

Inspecte les liens suspects ou URLs raccourcies pour détecter le phishing et les attaques homographes en local (Zero Telemetry).

Autres méthodes en lecture seule

MéthodeDescription
auditSecurityLogs(hours:)Agrège les journaux de sécurité récents (Mac : échecs d'authentification sudo, tentatives de force brute SSH, blocages Gatekeeper, détections XProtect, etc. / Linux : échecs d'authentification sudo, force brute SSH, blocages pare-feu, refus AppArmor, détections ClamAV, etc.), masque automatiquement les informations sensibles telles que les clés API et jetons, et renvoie également les résultats de la détection de nouveaux motifs (par gabarits de logs) et des anomalies de fréquence (pics statistiques).
activeVulnScan()Vérification active de vulnérabilités, non destructive et limitée à 127.0.0.1. Le seul outil qui utilise le réseau : désactivé par défaut, il exige un consentement explicite dans les réglages.
packageCveScan()Compare les paquets installés (Mac : Homebrew / Linux : dpkg, dnf, zypper, pacman) à une carte CVE locale. Aucune communication réseau n'a lieu.
packageCveScanLanguages(watchedFolders:)Compare les fichiers de verrouillage de dépendances npm, PyPI, crates.io, RubyGems, Packagist, Go et Maven à la même carte CVE locale. Aucune communication réseau n'a lieu.
canaryStatus()Renvoie l'état des fichiers leurres anti-rançongiciel (canary) ainsi que les 50 incidents détectés les plus récents.
portAnomalyIncidents()Renvoie l'état de référence de la protection contre les ports anormaux, les ports actuellement bloqués automatiquement et les 50 incidents les plus récents. La réponse précise explicitement que les ports actuellement bloqués sont un instantané de l'état présent, sans horodatage, distinct de l'historique des incidents qui, lui, est horodaté.
runtimeThreatStatus()Indique si ce Mac est isolé (Air-Gap) à la suite d'une détection de logiciel malveillant par XProtect, et l'incident déclencheur. À consulter en premier lors d'un Air-Gap actif.
notificationHistory()Renvoie l'historique des notifications envoyées par RoamSwitch (anomalies d'audit des journaux de sécurité, détections ClickFix, etc.) des 7 derniers jours, les plus récentes en premier.

Les champs de chaque type de retour sont documentés sous forme de déclarations Swift dans le README sur GitHub et dans AGENTS.md.

security_report()

Obtient un score et des recommandations à partir d'un audit en 24 points couvrant le chiffrement de disque LUKS/dm-crypt, l'UEFI Secure Boot, AppArmor/SELinux, la configuration sudo/SSH, l'usurpation ARP et les ports exposés.

exposed_ports(include_local_only)

Répertorie tous les ports actuellement en écoute et, pour tout ce qui est exposé au-delà de localhost, renvoie un audit détaillé incluant la détection de services connus pour être dangereux (Redis, MongoDB, etc.).

guard_status()

Obtient l'état des gardes de ports, d'ARP, USB, Bluetooth, de téléchargement Web/Mail, de menaces DNS et le niveau de sécurité.

audit_url_safety(url)

Inspecte les liens suspects ou URLs raccourcies pour détecter le phishing et les attaques homographes en local (Zero Telemetry).

Autres méthodes en lecture seule

MéthodeDescription
server_security_report()Exécute le profil de 30 points de l'édition Server (durcissement du noyau, isolation des conteneurs, exposition aux CVE du noyau, eBPF LSM) au lieu de l'audit client.
run_active_vuln_scan()Vérification active de vulnérabilités, non destructive et limitée à 127.0.0.1. Le seul outil qui utilise le réseau : désactivé par défaut, il exige un consentement explicite dans les réglages.
audit_secrets(text)Détecte les clés d'API et les clés privées exposées dans un texte, un fichier ou une arborescence (les valeurs trouvées sont masquées en sortie).
audit_security_logs(hours)Agrège les journaux de sécurité récents (Mac : échecs d'authentification sudo, tentatives de force brute SSH, blocages Gatekeeper, détections XProtect, etc. / Linux : échecs d'authentification sudo, force brute SSH, blocages pare-feu, refus AppArmor, détections ClamAV, etc.), masque automatiquement les informations sensibles telles que les clés API et jetons, et renvoie également les résultats de la détection de nouveaux motifs (par gabarits de logs) et des anomalies de fréquence (pics statistiques).
get_app_help(query, topic)Recherche dans la base de connaissances officielle de RoamSwitch couvrant toutes les fonctionnalités, alertes, paramètres et dépannages en local pour fournir des explications précises.
quarantine_status()Renvoie le contenu du coffre de quarantaine : chemin d'origine, nom de la menace détectée, date de mise en quarantaine et taille.
canary_status()Renvoie l'état des fichiers leurres anti-rançongiciel (canary) ainsi que les 50 incidents détectés les plus récents.
package_cve_scan()Compare les paquets installés (Mac : Homebrew / Linux : dpkg, dnf, zypper, pacman) à une carte CVE locale. Aucune communication réseau n'a lieu.
package_cve_scan_languages(watched_folders)Compare les fichiers de verrouillage de dépendances npm, PyPI, crates.io, RubyGems, Packagist, Go et Maven à la même carte CVE locale. Aucune communication réseau n'a lieu.
verify_fim()Recalcule l'empreinte d'environ 150 fichiers système critiques et la compare à la référence enregistrée pour détecter toute altération.
get_port_anomaly_incidents()Renvoie l'état de référence de la protection contre les ports anormaux, les ports actuellement bloqués automatiquement et les 50 incidents les plus récents. La réponse précise explicitement que les ports actuellement bloqués sont un instantané de l'état présent, sans horodatage, distinct de l'historique des incidents qui, lui, est horodaté.
get_ebpf_incidents()Renvoie l'état d'isolation actuel du garde d'exécution eBPF et l'historique des incidents à son origine.

Les champs de chaque type de retour sont documentés sous forme de déclarations Rust dans le README sur GitHub.

Cas d'usage

Ce que vous pouvez en faire

Les exemples ci-dessous utilisent Swift (macOS). roamswitch-linux-kit (Linux) propose les mêmes méthodes (en snake_case) pour le même résultat.

Applications de synchronisation et de sauvegarde

Met automatiquement en pause la synchronisation en arrière-plan lors de la connexion à un réseau non fiable.

let status = try await client.guardStatus()
if !status.isCurrentNetworkTrusted {
    syncEngine.pauseBackgroundSync()
}

Gestionnaires de mots de passe

Raccourcit le délai de verrouillage automatique sur les réseaux non fiables, en adaptant le comportement au niveau de protection actif.

let status = try await client.guardStatus()
let lockTimeout: TimeInterval = status.isCurrentNetworkTrusted ? 300 : 30
vault.setAutoLockTimeout(lockTimeout)

Outils de développement et automatisation

Avertit lorsqu'un serveur de développement commence à écouter sur 0.0.0.0, ou crée des workflows de type Shortcuts qui réagissent à la confiance réseau.

let ports = try await client.exposedPorts(includeLocalOnly: false)
for port in ports.ports where [3000, 5173, 8000, 11434, 1234].contains(port.port) {
    print("⚠️ Dev/AI server exposed on port \(port.port)")
}

Vérification préalable des liens dans les e-mails et le chat

Analyse automatiquement les liens des messages reçus avant leur affichage, et n’alerte que sur les liens dangereux.

let result = try await client.auditURLSafety(url: link)
if result.riskLevel == "dangerous" || result.riskLevel == "suspicious" {
    showWarningBanner(for: link, score: result.score)
}

Vérification via le menu contextuel ou Raccourcis

Intégrez-le au menu Services du Finder ou à l’app Raccourcis pour vérifier une URL copiée en une seule action.

// Appelé depuis un gestionnaire macOS Shortcuts (App Intent) ou du menu Services
let report = try await client.auditURLSafety(url: pasteboardURL)
return "\(report.riskLevel.uppercased()) (\(report.score)/100)"

Gestion des actifs IT & tableaux de bord MDM

Collectez les scores de tous les Mac de l’organisation et affichez-les sous forme de liste avec alertes sur un tableau de bord administrateur.

let report = try await client.securityReport()
try await mdmAPI.reportScore(deviceID: deviceID, score: report.score, grade: report.grade)
FAQ

À propos des SDK

Q. Est-ce gratuit ?

A. Oui. RoamSwitchKit (macOS) et roamswitch-linux-kit (Linux) sont tous deux publiés gratuitement sous licence MIT. Ils nécessitent que RoamSwitch lui-même (le moteur de diagnostic) soit installé, mais les SDK eux-mêmes ne coûtent rien.

Q. Peut-il modifier les réglages d'un utilisateur ?

A. Non. C'est en lecture seule — aucune API n'est implémentée pour basculer le verrouillage, isoler des ports ou autre. Une application intégrant ce package ne peut pas modifier les réglages de protection de RoamSwitch sans le consentement de l'utilisateur.

Q. Que se passe-t-il si RoamSwitch n'est pas installé ?

A. L'erreur correspondante est renvoyée (macOS : RoamSwitchClientError.appNotInstalled / Linux : RoamSwitchClientError::AppNotInstalled). Nous recommandons de la gérer avec élégance — par exemple en masquant la fonctionnalité — plutôt que de la traiter comme une erreur fatale.

Q. Et si je veux intégrer et redistribuer RoamSwitch lui-même avec mon produit ?

A. L'intégration du SDK (contenu de cette page) reste libre d'utilisation. Intégrer et redistribuer RoamSwitch lui-même nécessite une licence OEM — contactez-nous ici pour un partenariat OEM.