diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..b2c2773 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(docker run:*)", + "WebSearch" + ], + "deny": [], + "ask": [] + } +} diff --git a/TUTORIAL_README.md b/TUTORIAL_README.md deleted file mode 100644 index f8ae5bf..0000000 --- a/TUTORIAL_README.md +++ /dev/null @@ -1,223 +0,0 @@ -# 📚 SystĂšme de Tutoriel Flowsint - -SystĂšme de tutoriel global basĂ© sur **React Joyride**, intĂ©grĂ© avec **TanStack Router**. - -## ✅ Installation complĂšte - -Le systĂšme est dĂ©jĂ  installĂ© et configurĂ© : - -```bash -✓ react-joyride installĂ© -✓ TutorialProvider intĂ©grĂ© dans main.tsx -✓ Structure de fichiers créée -``` - -## 📁 Structure - -``` -src/components/tutorial/ -├── tutorial-provider.tsx # Provider React + logique Joyride -├── use-tutorial.ts # Hook pour contrĂŽler le tutoriel -├── tutorial-steps.ts # Configuration des Ă©tapes par route -└── index.ts # Exports -``` - -## 🚀 Utilisation - -### 1. Ajouter des Ă©tapes pour une route - -Éditez `src/components/tutorial/tutorial-steps.ts` : - -```typescript -export const tutorialSteps: Record = { - '/ma-route': [ - { - target: '[data-tour-id="mon-element"]', - content: 'Description de l\'Ă©lĂ©ment', - disableBeacon: true, // DĂ©marre sans animation initiale - }, - { - target: '[data-tour-id="autre-element"]', - content: 'Autre description', - }, - ], -}; -``` - -### 2. Annoter vos composants - -Ajoutez `data-tour-id` aux Ă©lĂ©ments cibles : - -```tsx -
- -
- - -``` - -### 3. Ajouter un bouton d'aide (optionnel) - -```tsx -import { useTutorial } from '@/components/tutorial'; - -function MyPage() { - const { startTutorial } = useTutorial(); - - return ( -
- - {/* Votre contenu */} -
- ); -} -``` - -## 🎯 FonctionnalitĂ©s - -- ✅ **DĂ©tection automatique** : Le tutoriel se lance Ă  la premiĂšre visite d'une route -- ✅ **Persistance** : Historique sauvegardĂ© dans `localStorage` -- ✅ **Multi-routes** : Chaque page a ses propres Ă©tapes -- ✅ **ContrĂŽle manuel** : Hook `useTutorial()` pour contrĂŽler le tutoriel -- ✅ **Traduction FR** : Boutons et textes en français -- ✅ **Style personnalisable** : Couleurs et thĂšme configurables - -## 🔧 API du hook - -```tsx -const { - startTutorial, // DĂ©marre le tutoriel pour la route actuelle - stopTutorial, // ArrĂȘte le tutoriel - resetTutorial, // Efface l'historique (force la revisite) - isRunning, // État du tutoriel (boolean) -} = useTutorial(); -``` - -## 📝 Exemple complet - -Voir `TUTORIAL_EXAMPLE.tsx` pour des exemples dĂ©taillĂ©s. - -### Page avec tutoriel - -```tsx -import { useTutorial } from '@/components/tutorial'; - -export function GraphPage() { - const { startTutorial } = useTutorial(); - - return ( -
- - -
Barre d'outils
-
Menu latéral
-
Canvas principal
-
- ); -} -``` - -### Configuration des Ă©tapes - -```typescript -// src/components/tutorial/tutorial-steps.ts -export const tutorialSteps = { - '/graph/$id': [ - { - target: '[data-tour-id="toolbar"]', - content: 'Voici la barre d\'outils', - disableBeacon: true, - }, - { - target: '[data-tour-id="sidebar"]', - content: 'Le panneau latĂ©ral affiche vos sources', - }, - { - target: '[data-tour-id="canvas"]', - content: 'Le canvas affiche votre graphe', - }, - ], -}; -``` - -## 🎹 Personnalisation - -### Modifier le style - -Dans `tutorial-provider.tsx`, ligne 100+ : - -```tsx - -``` - -### DĂ©lai de dĂ©marrage - -Ligne 77 du `tutorial-provider.tsx` : - -```tsx -setTimeout(() => { - setRun(true); -}, 500); // Modifier le dĂ©lai (ms) -``` - -## 📊 ClĂ© localStorage - -Le systĂšme utilise `flowsint-tutorial-completed` pour stocker les routes visitĂ©es. - -### RĂ©initialiser manuellement - -```tsx -const { resetTutorial } = useTutorial(); -resetTutorial(); // Efface tout l'historique -``` - -Ou via console : - -```javascript -localStorage.removeItem('flowsint-tutorial-completed'); -``` - -## 🔍 DĂ©bogage - -### Le tutoriel ne se lance pas ? - -1. VĂ©rifiez que la route est dans `tutorialSteps.ts` -2. VĂ©rifiez que les `data-tour-id` correspondent -3. VĂ©rifiez que les Ă©lĂ©ments sont montĂ©s dans le DOM (dĂ©lai de 500ms configurĂ©) -4. Consultez la console pour les erreurs - -### Forcer le redĂ©marrage - -```tsx -const { resetTutorial, startTutorial } = useTutorial(); - -resetTutorial(); // Efface l'historique -startTutorial(); // Relance immĂ©diatement -``` - -## 📚 Documentation React Joyride - -https://docs.react-joyride.com/ - -## đŸ€ Contribuer - -Pour ajouter des Ă©tapes Ă  une nouvelle page : - -1. Ajouter la route dans `tutorial-steps.ts` -2. Annoter les Ă©lĂ©ments avec `data-tour-id` -3. Tester en visitant la page (effacer localStorage si besoin) diff --git a/flowsint-transforms/src/flowsint_transforms/ip/to_asn.py b/flowsint-transforms/src/flowsint_transforms/ip/to_asn.py index 63281d9..49e07bf 100644 --- a/flowsint-transforms/src/flowsint_transforms/ip/to_asn.py +++ b/flowsint-transforms/src/flowsint_transforms/ip/to_asn.py @@ -1,12 +1,11 @@ import json -import socket -import subprocess from typing import List, Union from flowsint_core.core.transform_base import Transform from flowsint_types.ip import Ip from flowsint_types.asn import ASN from flowsint_core.utils import is_valid_ip from flowsint_core.core.logger import Logger +from tools.network.asnmap import AsnmapTool class IpToAsnTransform(Transform): @@ -18,7 +17,7 @@ class IpToAsnTransform(Transform): @classmethod def name(cls) -> str: - return "ip_to_asn_transform" + return "ip_to_asn" @classmethod def category(cls) -> str: @@ -46,29 +45,21 @@ class IpToAsnTransform(Transform): async def scan(self, data: InputType) -> OutputType: results: OutputType = [] + asnmap = AsnmapTool() for ip in data: try: - # Use asnmap to get ASN info - result = subprocess.run( - ["asnmap", "-a", ip.address, "-json"], - capture_output=True, - text=True, - timeout=30, - ) + # Use asnmap tool to get ASN info + asn_data = asnmap.launch(ip.address, type="ip") - if result.returncode == 0: - output = result.stdout.strip() - if output: - asn_data = json.loads(output) - if asn_data and "as_number" in asn_data: - asn = ASN( - asn=str(asn_data["as_number"]), - name=asn_data.get("as_name", ""), - org=asn_data.get("as_org", ""), - country=asn_data.get("as_country", ""), - ) - results.append(asn) + if asn_data and "as_number" in asn_data: + asn = ASN( + asn=str(asn_data["as_number"]), + name=asn_data.get("as_name", ""), + org=asn_data.get("as_org", ""), + country=asn_data.get("as_country", ""), + ) + results.append(asn) except Exception as e: Logger.error(