Robovojtik/shell_functions.py
sinuhet 2e2a18272a Oprava, po které to ale blbne
Po příkazu se ptá stále dokola
2025-03-22 23:24:23 +01:00

79 lines
2.7 KiB
Python

"""
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