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