diff --git a/exporters/html/delete_web_from_r2.py b/exporters/html/delete_web_from_r2.py new file mode 100644 index 0000000..4873cbd --- /dev/null +++ b/exporters/html/delete_web_from_r2.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +""" +Script för att ta bort alla filer i Cloudflare R2 bucket +""" + +import os +import sys +import subprocess +import argparse + +def check_required_env_vars(): + """Kontrollera att alla nödvändiga miljövariabler är satta""" + required_vars = [ + 'CLOUDFLARE_R2_ACCESS_KEY_ID', + 'CLOUDFLARE_R2_SECRET_ACCESS_KEY', + 'CLOUDFLARE_R2_BUCKET_NAME', + 'CLOUDFLARE_R2_ACCOUNT_ID' + ] + + missing_vars = [] + for var in required_vars: + if not os.getenv(var): + missing_vars.append(var) + + if missing_vars: + print("Error: Följande miljövariabler saknas:") + for var in missing_vars: + print(f" - {var}") + print("\nExempel på hur du sätter dem:") + print("export CLOUDFLARE_R2_ACCESS_KEY_ID='your_access_key'") + print("export CLOUDFLARE_R2_SECRET_ACCESS_KEY='your_secret_key'") + print("export CLOUDFLARE_R2_BUCKET_NAME='your_bucket_name'") + print("export CLOUDFLARE_R2_ACCOUNT_ID='your_account_id'") + return False + + print("✓ Alla nödvändiga miljövariabler är konfigurerade") + return True + +def configure_aws_cli(): + """Konfigurera AWS CLI för Cloudflare R2""" + print("Konfigurerar AWS CLI för Cloudflare R2...") + + commands = [ + ['aws', 'configure', 'set', 'aws_access_key_id', os.getenv('CLOUDFLARE_R2_ACCESS_KEY_ID')], + ['aws', 'configure', 'set', 'aws_secret_access_key', os.getenv('CLOUDFLARE_R2_SECRET_ACCESS_KEY')], + ['aws', 'configure', 'set', 'region', 'us-east-1'], + ['aws', 'configure', 'set', 'output', 'json'] + ] + + for cmd in commands: + try: + subprocess.run(cmd, check=True, capture_output=True) + except subprocess.CalledProcessError as e: + print(f"Error vid konfiguration av AWS CLI: {e}") + return False + + print("✓ AWS CLI konfigurerad") + return True + +def delete_web_folder(): + """Ta bort alla filer i Cloudflare R2 bucket""" + bucket_name = os.getenv('CLOUDFLARE_R2_BUCKET_NAME') + account_id = os.getenv('CLOUDFLARE_R2_ACCOUNT_ID') + endpoint_url = f"https://{account_id}.r2.cloudflarestorage.com" + + print(f"Tar bort alla filer i bucket {bucket_name}...") + + cmd = [ + 'aws', 's3', 'rm', f's3://{bucket_name}/', + '--endpoint-url', endpoint_url, + '--recursive' + ] + + env = os.environ.copy() + env['AWS_DEFAULT_REGION'] = 'us-east-1' + + try: + print(f"Kör kommando: {' '.join(cmd)}") + result = subprocess.run(cmd, env=env, check=True, capture_output=True, text=True) + print("✓ Alla filer har tagits bort från bucketen") + + # Visa AWS CLI output om det finns + if result.stdout.strip(): + print("\nAWS CLI output:") + print(result.stdout.strip()) + + if result.stderr.strip(): + print("\nAWS CLI stderr:") + print(result.stderr.strip()) + + return True + except subprocess.CalledProcessError as e: + print(f"Error vid borttagning av filer: {e}") + if e.stderr: + print(f"Stderr: {e.stderr}") + if e.stdout: + print(f"Stdout: {e.stdout}") + return False + +def main(): + """Huvudfunktion""" + parser = argparse.ArgumentParser( + description='Ta bort alla filer i Cloudflare R2 bucket' + ) + parser.add_argument( + '--force', + action='store_true', + help='Hoppa över bekräftelse' + ) + args = parser.parse_args() + + print("=== Ta bort alla filer från Cloudflare R2 ===") + print() + + # Bekräfta med användaren om inte --force används + if not args.force: + print("VARNING: Detta kommer att ta bort ALLA filer i R2 bucketen.") + print("Detta kan inte ångras!") + response = input("Är du säker på att du vill fortsätta? (ja/nej): ") + + if response.lower() not in ['ja', 'j', 'yes', 'y']: + print("Avbruten.") + sys.exit(0) + + print() + + # Kontrollera att AWS CLI är installerat + try: + subprocess.run(['aws', '--version'], check=True, capture_output=True) + except (subprocess.CalledProcessError, FileNotFoundError): + print("Error: AWS CLI är inte installerat eller inte tillgängligt i PATH") + print("Installera med: pip install awscli") + sys.exit(1) + + # Kontrollera miljövariabler + if not check_required_env_vars(): + sys.exit(1) + + # Konfigurera AWS CLI + if not configure_aws_cli(): + sys.exit(1) + + # Ta bort filerna + print() + if delete_web_folder(): + print("\n✓ Klart!") + else: + print("\n✗ Något gick fel") + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/exporters/html/upload_to_r2.py b/exporters/html/upload_to_r2.py index 4805bb7..9d64204 100644 --- a/exporters/html/upload_to_r2.py +++ b/exporters/html/upload_to_r2.py @@ -10,6 +10,10 @@ import datetime import argparse from pathlib import Path +from dotenv import load_dotenv + +# Ladda miljövariabler från .env-fil +load_dotenv() def check_required_env_vars(): """Kontrollera att alla nödvändiga miljövariabler är satta""" @@ -60,42 +64,42 @@ def configure_aws_cli(): print("✓ AWS CLI konfigurerad") return True -def upload_sfs_folder(output_base_dir=""): - """Ladda upp SFS-mappen till Cloudflare R2""" +def upload_html_site(output_base_dir=""): + """Ladda upp hela HTML-siten (eli/ + index-sidor) till Cloudflare R2""" bucket_name = os.getenv('CLOUDFLARE_R2_BUCKET_NAME') account_id = os.getenv('CLOUDFLARE_R2_ACCOUNT_ID') endpoint_url = f"https://{account_id}.r2.cloudflarestorage.com" - + # Kontrollera att mappen finns if not Path(output_base_dir).exists(): print(f"Error: Mappen {output_base_dir} finns inte. Kör först HTML-export.") return False - - # Räkna HTML-filer som ska laddas upp + + # Räkna filer som ska laddas upp html_files = list(Path(output_base_dir).rglob('*.html')) - file_count = len(html_files) - print(f"Laddar upp {output_base_dir}-mappen ({file_count} HTML-filer)...") - + css_files = list(Path(output_base_dir).rglob('*.css')) + js_files = list(Path(output_base_dir).rglob('*.js')) + file_count = len(html_files) + len(css_files) + len(js_files) + print(f"Laddar upp HTML-siten från {output_base_dir} ({len(html_files)} HTML, {len(css_files)} CSS, {len(js_files)} JS-filer)...") + cmd = [ - 'aws', 's3', 'sync', f'{output_base_dir}/', f's3://{bucket_name}/sfs/', + 'aws', 's3', 'sync', f'{output_base_dir}/', f's3://{bucket_name}/', '--endpoint-url', endpoint_url, '--delete', '--cache-control', 'public, max-age=3600', - '--content-type', 'text/html', '--exclude', '*.md', '--exclude', '.DS_Store', - '--include', '*.html', '--cli-read-timeout', '0', '--cli-connect-timeout', '60' ] env = os.environ.copy() env['AWS_DEFAULT_REGION'] = 'us-east-1' - + try: print(f"Kör kommando: {' '.join(cmd)}") result = subprocess.run(cmd, env=env, check=True, capture_output=True, text=True) - print(f"✓ {output_base_dir}-mappen uppladdad ({file_count} HTML-filer)") + print(f"✓ HTML-siten uppladdad ({file_count} filer)") # Visa AWS CLI output om det finns if result.stdout.strip(): @@ -108,54 +112,82 @@ def upload_sfs_folder(output_base_dir=""): return True except subprocess.CalledProcessError as e: - print(f"Error vid uppladdning av {output_base_dir}-mappen: {e}") + print(f"Error vid uppladdning av HTML-siten: {e}") if e.stderr: print(f"Stderr: {e.stderr}") if e.stdout: print(f"Stdout: {e.stdout}") return False -def upload_index_pages(output_base_dir=""): +def upload_index_pages(output_base_dir="", json_input_dir=None): """Ladda upp index-sidor till Cloudflare R2""" bucket_name = os.getenv('CLOUDFLARE_R2_BUCKET_NAME') account_id = os.getenv('CLOUDFLARE_R2_ACCOUNT_ID') endpoint_url = f"https://{account_id}.r2.cloudflarestorage.com" - + # Hitta JSON-filerna för att generera index-sidor - json_input_dir = "sfs_json" # Standard JSON-mapp + if json_input_dir is None: + # Försök hitta JSON-mappen automatiskt + possible_paths = ["../sfs-jsondata", "sfs_json", "data/sfs_json"] + json_input_dir = None + for path in possible_paths: + if Path(path).exists(): + json_input_dir = path + break + + if json_input_dir is None: + print(f"Varning: Kunde inte hitta JSON-mappen. Hoppar över index-sidor.") + print(f"Prövade sökvägarna: {', '.join(possible_paths)}") + return True # Inte ett kritiskt fel + if not Path(json_input_dir).exists(): - print(f"Error: JSON-mappen {json_input_dir} finns inte.") - return False + print(f"Varning: JSON-mappen {json_input_dir} finns inte. Hoppar över index-sidor.") + return True # Inte ett kritiskt fel # Generera index-sidor i output_base_dir print(f"Genererar index-sidor i {output_base_dir}...") + print(f"Använder JSON-katalog: {json_input_dir}") + + # Konvertera till absoluta sökvägar + json_input_abs = str(Path(json_input_dir).resolve()) + output_base_abs = str(Path(output_base_dir).resolve()) # Skapa index.html (30 senaste) - index_file = Path(output_base_dir) / "index.html" - latest_file = Path(output_base_dir) / "latest.html" + index_file = Path(output_base_abs) / "index.html" + latest_file = Path(output_base_abs) / "latest.html" try: # Kör populate_index_pages.py för att skapa index-sidor - subprocess.run([ + result1 = subprocess.run([ 'python', 'exporters/html/populate_index_pages.py', - '--input', json_input_dir, + '--input', json_input_abs, '--output', str(index_file), '--limit', '30' ], check=True, capture_output=True, text=True) - subprocess.run([ + result2 = subprocess.run([ 'python', 'exporters/html/populate_index_pages.py', - '--input', json_input_dir, + '--input', json_input_abs, '--output', str(latest_file), '--limit', '10' ], check=True, capture_output=True, text=True) print(f"✓ Index-sidor genererade: {index_file}, {latest_file}") + # Visa output från populate_index_pages.py om det finns + if result1.stdout.strip(): + print("Output från index.html-generering:") + print(result1.stdout.strip()) + if result2.stdout.strip(): + print("Output från latest.html-generering:") + print(result2.stdout.strip()) + except subprocess.CalledProcessError as e: print(f"Error vid generering av index-sidor: {e}") if e.stderr: print(f"Stderr: {e.stderr}") + if e.stdout: + print(f"Stdout: {e.stdout}") return False # Kontrollera att index-filerna nu finns @@ -271,13 +303,19 @@ def main(): formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Exempel: - python upload_to_r2.py --output-base-dir /path/to/export # Ladda upp från specifik mapp + python upload_to_r2.py --output-base-dir output/html_site # Ladda upp från output/html_site + python upload_to_r2.py --output-base-dir output/html_site --json-dir ../sfs-jsondata # Med JSON-mapp """ ) parser.add_argument( '--output-base-dir', - default='', - help='Baskatalog som innehåller HTML-filerna att ladda upp' + default='output/html_site', + help='Baskatalog som innehåller HTML-filerna (eli/, index.html, etc.)' + ) + parser.add_argument( + '--json-dir', + default=None, + help='Sökväg till JSON-mappen (för att generera index-sidor)' ) args = parser.parse_args() @@ -305,19 +343,19 @@ def main(): # Utför uppladdningar print() success = True - - # Skapa korrekt sökväg till sfs-mappen - sfs_path = str(Path(args.output_base_dir) / "sfs") if args.output_base_dir else "sfs" - if not upload_sfs_folder(sfs_path): + # Generera och ladda upp index-sidor först + if not upload_index_pages(args.output_base_dir, args.json_dir): success = False - - if not upload_index_pages(args.output_base_dir): + + # Ladda upp hela HTML-siten (eli/ + index-sidor) + if not upload_html_site(args.output_base_dir): success = False - + + # Ladda upp sammanfattning if not upload_summary(): success = False - + print() if success: print("✓ Alla filer har laddats upp till Cloudflare R2!") diff --git a/requirements.txt b/requirements.txt index fb6c8e4..46d3a52 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ requests>=2.25.0 pyyaml>=6.0 markdown>=3.4.0 +python-dotenv>=0.19.0