""" Module: shell_functions.py ---------------------------- Obsahuje funkce pro vykonávání lokálních shellových příkazů a tvorbu skriptů. Přidána funkce read_file_content pro načtení souboru. """ import subprocess import logging import os logger = logging.getLogger("robovojtik.shell_functions") MAX_FILE_SIZE = 10 * 1024 # 10 kB def clean_command(command): """ Odstraní backticky a nepotřebné mezery z příkazu. """ return command.replace("`", "").strip() def spust_prikaz(command): """ Spustí příkaz lokálně a vrátí jeho výstup. V případě chyby vrací chybovou hlášku. """ try: logger.debug(f"Lokálně spouštím příkaz: {command}") output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT, universal_newlines=True) return output.strip() except subprocess.CalledProcessError as e: logger.exception("Chyba při vykonávání příkazu.") return f"Chyba při vykonávání příkazu:\n{e.output}" except Exception as e: logger.exception("Obecná chyba při vykonávání příkazu.") return f"Chyba při vykonávání příkazu: {str(e)}" def vytvor_skript(nazev, obsah): """ Zapíše obsah do souboru s daným názvem a nastaví jej jako spustitelný. """ try: with open(nazev, "w", encoding="utf-8") as f: f.write(obsah) subprocess.call(f"chmod +x {nazev}", shell=True) logger.debug(f"Skript {nazev} vytvořen a nastaven jako spustitelný.") return f"Skript {nazev} byl úspěšně vytvořen." except Exception as e: logger.exception("Chyba při tvorbě skriptu.") return f"Nastala chyba při tvorbě skriptu: {str(e)}" def read_file_content(path: str) -> str: """ Načte soubor na adrese 'path' do max. 10 kB. Pokud je soubor větší, vrátí jen 10 kB a poznámku. """ try: if not os.path.isfile(path): return f"Chyba: Soubor '{path}' neexistuje nebo není souborem." size = os.path.getsize(path) partial = (size > MAX_FILE_SIZE) with open(path, "rb") as f: data = f.read(MAX_FILE_SIZE) text = data.decode("utf-8", errors="replace") if partial: text += "\n\n[POZOR: Soubor byl delší než 10 kB, zobrazujeme pouze prvních 10 kB!]" return text except Exception as e: logger.exception("Chyba při čtení souboru") return f"Chyba při čtení souboru: {str(e)}" def run_command_locally(command): """ Spustí příkaz lokálně a vrátí jeho výstup. """ command = clean_command(command) output = spust_prikaz(command) return output