diff --git a/fix_xml_files.py b/fix_xml_files.py new file mode 100644 index 0000000..321d124 --- /dev/null +++ b/fix_xml_files.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""Fix XML files to have XML declaration at the beginning""" + +import os +import re +from pathlib import Path + +def fix_xml_file(filepath): + """Fix a single XML file""" + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Check if file starts with XML declaration + if content.strip().startswith('' + match = re.search(xml_decl_pattern, content) + + if not match: + print(f"āœ— {filepath.name} - No XML declaration found") + return False + + # Extract XML declaration + xml_decl = match.group(0) + + # Remove the XML declaration from its current position + content_without_decl = content.replace(xml_decl, '', 1) + + # Remove leading whitespace/newlines but keep copyright comments + content_without_decl = content_without_decl.lstrip('\n') + + # Put XML declaration at the beginning + new_content = xml_decl + '\n' + content_without_decl + + # Write back + with open(filepath, 'w', encoding='utf-8') as f: + f.write(new_content) + + print(f"āœ“ {filepath.name} - Fixed") + return True + +def main(): + # Path to Nga4ThuDuc directory + nga4_dir = Path('/home/thaianh/Study/GreenWave/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc') + + print("Fixing XML files in Nga4ThuDuc directory...\n") + + fixed_count = 0 + + # Fix all .xml and .sumocfg files + for pattern in ['*.xml', '*.sumocfg']: + for filepath in nga4_dir.glob(pattern): + if fix_xml_file(filepath): + fixed_count += 1 + + print(f"\nTotal files fixed: {fixed_count}") + +if __name__ == '__main__': + main() diff --git a/resolve_conflicts.py b/resolve_conflicts.py new file mode 100644 index 0000000..fda4817 --- /dev/null +++ b/resolve_conflicts.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +""" +Resolve Git merge conflicts in XML files +Keeps the HEAD version (current branch) and removes conflict markers +""" + +import os +import re +from pathlib import Path + +def resolve_conflict(content): + """ + Remove Git conflict markers and keep HEAD version + + Handles multiple patterns: + 1. <<<<<<< HEAD ... ======= ... >>>>>>> branch + 2. Standalone markers that weren't cleaned up + """ + # First pass: Remove complete conflict blocks, keep HEAD content + conflict_pattern = r'<<<<<<< HEAD\n(.*?)\n=======\n(.*?)\n>>>>>>> .*?\n' + resolved = re.sub( + conflict_pattern, + r'\1\n', + content, + flags=re.DOTALL + ) + + # Second pass: Remove any remaining standalone markers + resolved = re.sub(r'<<<<<<< HEAD\n?', '', resolved) + resolved = re.sub(r'=======\n?', '', resolved) + resolved = re.sub(r'>>>>>>> .*?\n?', '', resolved) + + return resolved + +def main(): + nga4_dir = Path('/home/thaianh/Study/GreenWave/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc') + + print("šŸ” Resolving Git merge conflicts in Nga4ThuDuc files...\n") + + fixed_count = 0 + + # Process all XML and sumocfg files + for pattern in ['*.xml', '*.sumocfg']: + for filepath in nga4_dir.glob(pattern): + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # Check if file has conflicts + if '<<<<<<< HEAD' in content: + print(f"šŸ”§ Resolving {filepath.name}...") + + # Resolve conflicts + resolved_content = resolve_conflict(content) + + # Write back + with open(filepath, 'w', encoding='utf-8') as f: + f.write(resolved_content) + + fixed_count += 1 + print(f" āœ… Fixed") + else: + print(f" āœ“ {filepath.name} - No conflicts") + + print(f"\nāœ… Resolved conflicts in {fixed_count} files") + +if __name__ == '__main__': + main() diff --git a/src/backend/Dockerfile b/src/backend/Dockerfile index e87ce39..f2691ee 100644 --- a/src/backend/Dockerfile +++ b/src/backend/Dockerfile @@ -8,7 +8,7 @@ FROM python:3.9-slim WORKDIR /app COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir --timeout 600 -r requirements.txt COPY . . diff --git a/src/backend/app/sumo_rl/agents/iot_agent.py b/src/backend/app/sumo_rl/agents/iot_agent.py index bd94313..5faff9e 100644 --- a/src/backend/app/sumo_rl/agents/iot_agent.py +++ b/src/backend/app/sumo_rl/agents/iot_agent.py @@ -266,9 +266,10 @@ def get_status(self) -> Dict[str, Any]: config_file = os.path.join("/app/sumo_files", config_rel_path) # Explicitly construct arguments for subprocess - # num-clients=2 (REMOVED): Caused blocking/connection closed errors. - # We use explicit setOrder() in code to manage synchronization instead. - base_cmd = ["-c", config_file, "--remote-port", "8813"] + # num-clients=2: Allow multiple TraCI connections (IoT Agent + Backend) + # Order 1: Backend (Passive/Observer) + # Order 2: IoT Agent (Active/Driver) + base_cmd = ["-c", config_file, "--remote-port", "8813", "--num-clients", "2"] # Try GUI first if requested and DISPLAY is set success = False diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/.tmp b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/.tmp new file mode 100644 index 0000000..12bbf74 --- /dev/null +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/.tmp @@ -0,0 +1 @@ + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml index 7f161ea..26f5476 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml @@ -1,4 +1,12 @@ + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.net.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.net.xml index e04b9ea..3999171 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.net.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.net.xml @@ -1,4 +1,12 @@ + + + - + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_0.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_0.xml index 6a24221..fbda692 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_0.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_0.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_1.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_1.xml index e494986..7240710 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_1.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_1.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_2.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_2.xml index 44f5292..e98cab0 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_2.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_2.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_3.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_3.xml index 43ef683..7a5bc4b 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_3.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_3.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_4.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_4.xml index a880aed..4528af1 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_4.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_4.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_5.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_5.xml index b146a69..627c823 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_5.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1_5.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_0.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_0.xml index a284b35..e7f3867 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_0.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_0.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_1.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_1.xml index daccb41..6348af9 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_1.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_1.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_2.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_2.xml index 1da534b..070fcd9 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_2.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_2.xml @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_4.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_4.xml index 5705b36..3f5a5d8 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_4.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e1i_4.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_0.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_0.xml index 5865216..4625bdb 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_0.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_0.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_2.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_2.xml index d8ab221..9a2da83 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_2.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/e2_2.xml @@ -1,6 +1,6 @@ - + + + diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/eed.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/eed.xml index 7849be2..37bd185 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/eed.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/eed.xml @@ -1,3 +1,10 @@ + + + + + + + + - - diff --git a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml index e6463a7..51fba8e 100644 --- a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml +++ b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml @@ -1,6 +1,6 @@ -