Manual:BoxedCommand/cs

BoxedCommand je součástí knihovny, která umožňuje transparentně spouštět příkazy příkazové řádky (shellu) a to nejem lokálně (jak se běžně dělá), ale i na serverech, pokud také používají. Tahle stránka se zaobírá tím, jak lze pomocí této knihovny nahradit framework pro Shell, používaný od MediaWiki 1.30+.

A lightly edited and annotated example from :

Přehled
BoxedCommand používá oddělený sandbox, který se může spustit i na jiném serveru. Jde o dočasně vytvořený adresář, který neobsahuje žádné soubory, proto je potřeba data, s nimiž se bude pracovat, do příslušného souboru vložit pomocí funkce BoxedCommand. BoxedCommand se stará o to, aby vše fungovalo bez ohledu na to, jakou metodu pro vytvoření sandboxu administrátoři serverů nakonfigurovali.



Jak získáme BoxedCommand
Objekt získáme, když zavoláme z  funkci. Řetězcová hodnota, kterou předáte metodě, bude názvem klíče, pod který bude váš Shellbox zaregistrován do pole. Obvykle k tomu rozšíření používají svůj vlastní název, pokud nepotřebují spouštěné příkazy izolovat do samostatných Shellboxů.

There are various additional hardening measures that can be set at this point such as enabling firejail's default seccomp filter or disabling network access. Ovšem ty budou dostupné jen v tom případě, že je bude vzdálený server také podporovat.

No a nakonec se nastaví název trasy (ovšem pozor, ve skutečnosti tohle přiřazení nic nedělá, protože je teprve ve fázi TODO – tedy jednou někdo možná k tomu nějakou funkcionalitu dodělá).

Obvykle si tvůrci rozšíření pomáhají statickou funkcí, s názvem, která vrací objekt   již nakonfigurovaný:



Sestavení příkazu
Parametry se předávají zavoláním metody. Ta automaticky celý řetězec upraví tak, aby se mohl předat přes URL. Pokud se tomu chcete vyhnout a předat řetězec pro vykonání příkazu tak jak je, použijte. Pomocná funkce, která ošetří problematické znaky předávaného řetězce tak, aby nedošlo během předání k nežádoucí dezinterpretaci, se totiž volá dřív než. A proměnné prostředí můžete předat jako pole, prostřednictvím metody.

Pokud chcete, aby sloučit standardní chybový výstup (stderr) se standardním výstupem (stdout), zavolejte metodu.

Většina příkazů pracuje se soubory, proto má pro práci s nimi Shellbox několik pomocných funkcí:


 * - Vytvoří ještě před spuštěním příkazu soubor pro jehož název použije obsah proměnné, do kterého pak nalije obsah proměnné
 * - Udělá totéž co, ovšem s tím rozdílem obsah souboru přelije ze souboru, identifikovaného řetězcovou hodnotou proměnné   (cesta k souboru)
 * - Pokud má mít příkaz nějaký výstup, můžete ho po vykonání příkazu uložit do souboru, který je ovšem pouze v RAM
 * - Udělá totéž co, až na to že obsah přeleje rovnou do souboru identifikovaného cestou
 * - Funguje podobně jako, ovšem s tím rozdílem, že to udělá pro všechny soubory, jejichž název vyhoví následujícímu filtru
 * - I v tomto případě to funguje jako u, až na to, že cílem souborů vyhovujících nastaveným parametrům bude adresář

A standardní vstup (stdin) můžete předat přes metodu



Použití skriptu
It is common to run external commands in pipeline. For example, Score will run abc2ly to convert ABC markup to LilyPond and then generate images using lilypond from the LilyPond markup. Traditionally this would have been two Shell::command invocations, one for abc2ly, then another for lilypond using the output from abc2ly. However, this can cause unnecessary overhead when using a remote Shellbox server, since file contents need to be sent back and forth as HTTP requests unnecessarily. One practice is to use a shell script to run multiple commands, possibly interpreting the output.

Take a look at Score's scripts/ directory for examples on how this works.



Zpracování výsledků
Calling  will give you a   object. The following methods are useful:


 * - null if includeStderr was used
 * - if an output file was registered with, get that file's contents
 * - whether that file was received
 * - if an output file was registered with, get that file's contents
 * - whether that file was received

Příklady

 * probably has the most complex uses of Shellbox's functionality, including using shell wrappers and output globbing. See the conversion patch.
 * has very simple uses. See the conversion patch.