61 lines
1.9 KiB
Python
Executable File
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() |