kavach / api.py
divineearthly's picture
🔱 KAVACH v2.0 Phase 1 — Battle-ready
98e50c2
Raw
History Blame Contribute Delete
3.76 kB
"""KAVACH API — FastAPI endpoint for external integration."""
from fastapi import FastAPI, HTTPException, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field
from typing import Optional, List
import time
from modules.charaka import CharakaDiagnosticEngine
from modules.nyaya_engine import NyayaRuleEngine
from modules.gandharva import GandharvaSonarDefense
from modules.akasha import AkashaLedger
app = FastAPI(
title="🔱 KAVACH API",
description="Sovereign Vedic Cyber Defense Intelligence",
version="2.0.0"
)
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
# Initialize engines
charaka = CharakaDiagnosticEngine()
nyaya = NyayaRuleEngine()
gandharva = GandharvaSonarDefense()
akasha = AkashaLedger()
# Models
class NetworkEvent(BaseModel):
source_ip: str = Field(..., description="Source IP address")
dest_ip: Optional[str] = Field(None, description="Destination IP")
port: Optional[int] = Field(None, description="Port number")
payload: Optional[str] = Field(None, description="Request payload")
event_type: Optional[str] = Field("unknown", description="Event type")
bytes_sent: Optional[int] = Field(0, description="Bytes transmitted")
class ScanRequest(BaseModel):
events: List[NetworkEvent]
context: Optional[dict] = Field({}, description="Additional context")
class ThreatResponse(BaseModel):
verdict: str
diagnosis: dict
rule_matched: Optional[str]
severity: int
action: str
timestamp: float
# Routes
@app.get("/")
def root():
return {
"name": "KAVACH API",
"version": "2.0.0",
"status": "ACTIVE",
"modules": ["charaka", "nyaya", "gandharva", "akasha"],
"sutra": "सत्यमेव जयते"
}
@app.post("/scan/network", response_model=ThreatResponse)
def scan_network(request: ScanRequest):
"""Scan network events for threats."""
results = []
for event in request.events:
event_dict = event.model_dump()
# Charaka diagnosis
diagnosis = charaka.diagnose([event_dict])
# Nyaya firewall
payload = event_dict.get("payload", "")
rule_match = nyaya.evaluate(payload, request.context)
verdict = "BLOCK" if (rule_match and rule_match["verdict"] in ("BLOCK", "RATE_LIMIT")) else "ALLOW"
results.append({
"verdict": verdict,
"diagnosis": diagnosis,
"rule_matched": rule_match["rule_id"] if rule_match else None,
"severity": diagnosis.get("severity", 0),
"action": "BLOCKED" if verdict == "BLOCK" else "ALLOWED",
"timestamp": time.time()
})
# Record in Akasha
akasha.record("api_scan", {"events_count": len(request.events), "results": len(results)}, "api")
return results[0] if results else {"verdict": "ALLOW", "severity": 0}
@app.post("/scan/audio")
async def scan_audio(file: UploadFile = File(...)):
"""Analyze audio file for sonic threats."""
audio_data = await file.read()
result = gandharva.analyze(audio_data, file.filename)
akasha.record("audio_scan", result, "api")
return result
@app.get("/status")
def system_status():
"""Get complete KAVACH system status."""
return {
"nyaya": nyaya.stats(),
"akasha": akasha.get_stats(),
"charaka_diagnoses": len(charaka.diagnosis_history),
"gandharva_signatures": len(gandharva.sonic_threat_db)
}
@app.get("/health")
def health_check():
return {"status": "healthy", "timestamp": time.time()}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)