79 lines
2.7 KiB
Python
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
|