Canstralian's picture
Update app.py
069a95c verified
import os
import streamlit as st
import time
import io
import logging
import json
from components.dashboard import Dashboard
# Must be the first Streamlit command
st.set_page_config(
page_title="Cybersecurity IDS Dashboard",
page_icon="🛡️",
layout="wide",
initial_sidebar_state="expanded",
)
logging.basicConfig(level=logging.ERROR)
def get_api_token():
"""Retrieves the Hugging Face API token from Streamlit secrets."""
try:
return st.secrets["HUGGING_FACE_API_TOKEN"]
except KeyError:
st.warning(
"Please add your Hugging Face API token to Streamlit secrets. "
"See the Streamlit documentation for instructions."
)
st.stop()
def load_sample_logs(filepath="sample_logs.json"):
"""Loads sample logs from a JSON file, or returns default logs if file not found."""
try:
with open(filepath, "r") as f:
return json.load(f)
except FileNotFoundError:
return [
"Failed SSH login attempt from IP 192.168.1.10",
"Multiple port scan detected from IP 10.0.0.5",
"Suspicious outbound connection to known malicious IP",
"Brute force attack detected on admin portal",
]
def process_log(log, dashboard, placeholder):
"""Processes a single log entry and updates the dashboard."""
try:
from PurpleTeamIDS import analyze_security_log
threat_data = analyze_security_log(log)
dashboard.threat_analysis.process_new_threat(threat_data)
placeholder.write(dashboard.threat_analysis.display_threats())
except ImportError:
st.error("PurpleTeamIDS module not found. Please install the necessary dependencies.")
st.stop()
except Exception as e:
st.error(f"Error processing log: {e}")
logging.error(f"Error processing log: {e}")
def main():
"""Main function to render the Cybersecurity IDS Dashboard."""
st.title("Cybersecurity Intrusion Detection Dashboard")
st.markdown("Monitor and analyze security logs for potential threats.")
# Secure API Token Handling
api_token = get_api_token()
# Initialize dashboard
dashboard = Dashboard()
# Load custom CSS
css_path = os.getenv("CSS_PATH", "styles/custom.css")
try:
with open(css_path) as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
except FileNotFoundError:
st.error(f"CSS file not found: {css_path}")
# Render main content
dashboard.render_main_content()
# File Upload functionality
uploaded_file = st.file_uploader("Upload Security Log File", type=["log", "txt"])
if uploaded_file is not None:
try:
stringio = io.StringIO(uploaded_file.getvalue().decode("utf-8"))
placeholder = st.empty()
progress_bar = st.progress(0)
lines = stringio.readlines()
total_lines = len(lines)
for i, line in enumerate(lines):
process_log(line.strip(), dashboard, placeholder)
progress_bar.progress((i + 1) / total_lines)
time.sleep(1)
progress_bar.empty()
except Exception as e:
st.error(f"Error processing log file: {e}")
logging.error(f"Error processing log file: {e}")
else:
# Simulate real-time log analysis
sample_logs = load_sample_logs()
placeholder = st.empty()
progress_bar = st.progress(0)
total_logs = len(sample_logs)
for i, log in enumerate(sample_logs):
process_log(log, dashboard, placeholder)
progress_bar.progress((i + 1) / total_logs)
time.sleep(1)
progress_bar.empty()
st.markdown("---")
st.markdown("Footer: Example Cybersecurity Application")
if __name__ == "__main__":
main()