Files
airstream/airstream.py
2025-08-03 20:20:55 -04:00

61 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
from scapy.all import get_if_list
from frametypes import FRAME_TYPES
from core.analyzer import PacketFlowAnalyzer
def main():
p = argparse.ArgumentParser(description="Airstream - Packet Flow Analyzer")
p.add_argument('-p', '--pcap', help='PCAP file')
p.add_argument('-i', '--interface', help='Network interface')
p.add_argument('-c', '--count', type=int, default=100, help='Packet count (default: 100)')
p.add_argument('-l', '--list-interfaces', action='store_true', help='List interfaces')
p.add_argument('-o', '--output', help='CSV output file')
p.add_argument('-s', '--stats', nargs='+', choices=list(FRAME_TYPES.keys()) + ['all'],
default=['overview'], help='Statistics types to use (default: overview, use "all" for all types)')
args = p.parse_args()
if args.list_interfaces:
print("Interfaces:", *get_if_list(), sep='\n ')
return
if not (args.pcap or args.interface):
p.error("Specify --pcap or --interface")
# Handle 'all' option
if 'all' in args.stats:
selected_stats = list(FRAME_TYPES.keys())
stats_classes = list(FRAME_TYPES.values())
else:
selected_stats = args.stats
stats_classes = [FRAME_TYPES[s] for s in args.stats]
print(f"Using stats: {', '.join(selected_stats)}")
analyzer = PacketFlowAnalyzer(stats_classes)
try:
if args.pcap:
analyzer.analyze_pcap(args.pcap)
else:
analyzer.analyze_live(args.interface, args.count)
analyzer.print_summary()
if args.output:
analyzer.summary().to_csv(args.output, index=False)
print(f"Saved: {args.output}")
except KeyboardInterrupt:
print("\nInterrupted")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()