#20 Skriptování: možnost spouštět skripty ze souborů (atribut: src).
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/vstup/skriptování-proměnné.pl Sun Jul 01 14:43:21 2012 +0200
1.3 @@ -0,0 +1,16 @@
1.4 +#!/usr/bin/perl
1.5 +
1.6 +# Projde zdroják v javě a najde v něm,
1.7 +# jaké proměnné prostředí se nastavují pro běh skriptů
1.8 +
1.9 +use strict;
1.10 +use warnings;
1.11 +
1.12 +open(JAVA, "<", $ENV{"XWG_SKRIPTOVANI_JAVA"}) or die $!;
1.13 +
1.14 +while (<JAVA>) {
1.15 + if (/"(.*)=".*\/\/\s+env:(.*)/) {
1.16 + print "<tr><td><code>$1</code></td><td>$2</td></tr>\n";
1.17 + }
1.18 +}
1.19 +
2.1 --- a/vstup/skriptování.xml Sat Jun 23 23:19:09 2012 +0200
2.2 +++ b/vstup/skriptování.xml Sun Jul 01 14:43:21 2012 +0200
2.3 @@ -21,9 +21,16 @@
2.4 </p>
2.5
2.6 <p>
2.7 - Díky skriptování můžeme stránky obohatit o prakticky libovolný obsah.
2.8 - Tato funkce ale může být nebezpečná – pokud byste spustili generátor na stránkách,
2.9 + Díky skriptování můžeme stránky obohatit o prakticky libovolný obsah –
2.10 + jak prostý text, tak i XHTML fragmenty.<m:podČarou>zapíná se pomocí atributu
2.11 + <code>výstup="xml"</code> a generátor pak kontroluje správné formátování –
2.12 + nestane se vám, že byste omylem vygenerovali stránky s překříženými nebo neuzavřenými značkami.</m:podČarou>
2.13 + </p>
2.14 + <p>
2.15 + Skriptování ale může být nebezpečné, pokud byste spustili generátor na stránkách,
2.16 které psal někdo nedůvěryhodný a vložil do nich škodlivý kód.
2.17 + Kromě toho, ukázková sada stránek by měla být přeložitelná kdekoli a mít minimum závislostí
2.18 + (ne každý musí mít nainstalovaný Perl nebo Python či další podporované interprety).
2.19 Proto je skriptování ve výchozím stavu vypnuté – je potřeba ho povolit v souboru <code>web.conf</code>.
2.20 </p>
2.21
2.22 @@ -40,8 +47,9 @@
2.23 </tr>
2.24 </thead>
2.25 <tbody>
2.26 - <m:skript jazyk="perl" výstup="xml"><![CDATA[
2.27 + <m:skript jazyk="perl" výstup="xml"><![CDATA[
2.28 use strict;
2.29 +use warnings;
2.30
2.31 open(JAVA, "<", $ENV{"XWG_SKRIPTOVANI_JAVA"}) or die $!;
2.32
2.33 @@ -62,6 +70,7 @@
2.34 -->
2.35 <pre><m:skript jazyk="perl"><![CDATA[
2.36 use strict;
2.37 +use warnings;
2.38
2.39 open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"});
2.40 my %skripty;
2.41 @@ -109,18 +118,8 @@
2.42 </tr>
2.43 </thead>
2.44 <tbody>
2.45 - <m:skript jazyk="perl" výstup="xml"><![CDATA[
2.46 -use strict;
2.47 -
2.48 -open(JAVA, "<", $ENV{"XWG_SKRIPTOVANI_JAVA"}) or die $!;
2.49 -
2.50 -while (<JAVA>) {
2.51 -#i.put("bash", "/bin/bash");
2.52 - if (/"(.*)=".*\/\/\s+env:(.*)/) {
2.53 - print "<tr><td><code>$1</code></td><td>$2</td></tr>\n";
2.54 - }
2.55 -}
2.56 - ]]></m:skript>
2.57 + <!-- Pokud načítáme skript ze souboru, je atribut jazyk nepovinný. -->
2.58 + <m:skript jazyk="perl" výstup="xml" src="skriptování-proměnné.pl"/>
2.59 </tbody>
2.60 </table>
2.61
3.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 23:19:09 2012 +0200
3.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sun Jul 01 14:43:21 2012 +0200
3.3 @@ -55,7 +55,8 @@
3.4 * TODO: podporovat i složitější scénáře (např. kompilaci),
3.5 * než jen vložení do souboru a přidání správného záhlaví.
3.6 *
3.7 - * @param skript program k vykonání
3.8 + * @param skriptText skript k vykonání
3.9 + * @param skriptSoubor cesta k souboru se skriptem/programem
3.10 * @param jazyk programovací jazyk
3.11 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
3.12 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
3.13 @@ -63,66 +64,91 @@
3.14 * @param perexStránky perex stránky → proměnná prostředí
3.15 * @return výstup příkazu
3.16 */
3.17 - public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
3.18 + public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
3.19 try {
3.20 - System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
3.21 - String interpret = interpreti.get(jazyk);
3.22 - if (interpret == null) {
3.23 - System.err.println("Neznámý skriptovací jazyk: " + jazyk);
3.24 - return null;
3.25 + if (isNeprázdný(skriptSoubor)) {
3.26 + System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
3.27 } else {
3.28 - File f = File.createTempFile("xml-web-generátor-", ".skript");
3.29 + System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
3.30 + }
3.31 +
3.32 + File souborStránky = new File(new URI(uriStránky));
3.33 + File f;
3.34 +
3.35 + if (isNeprázdný(skriptText)) {
3.36 + /** Skript je zadán uvnitř elementu přímo ve stránce */
3.37 + String interpret = interpreti.get(jazyk);
3.38 + if (interpret == null) {
3.39 + throw new Exception("Neznámý skriptovací jazyk: " + jazyk);
3.40 + }
3.41 +
3.42 + f = File.createTempFile("xml-web-generátor-", ".skript");
3.43 f.deleteOnExit();
3.44 + f.setExecutable(true);
3.45
3.46 PrintStream ps = new PrintStream(f);
3.47 ps.print("#!");
3.48 ps.println(interpret);
3.49 ps.println();
3.50 - ps.print(skript);
3.51 + ps.print(skriptText);
3.52 ps.close();
3.53 + } else if (isNeprázdný(skriptSoubor)) {
3.54 + /** Skript/program je uložen v externím souboru */
3.55 + if (skriptSoubor.startsWith(File.separator)) {
3.56 + /** absolutní cesta */
3.57 + f = new File(skriptSoubor);
3.58 + } else {
3.59 + /** relativní cesta */
3.60 + f = new File(souborStránky.getParent(), File.separatorChar + skriptSoubor);
3.61 + }
3.62
3.63 + if (!f.canExecute()) {
3.64 + throw new Exception("Soubor se skriptem není spustitelný → nastavte: chmod +x " + f);
3.65 + }
3.66 + } else {
3.67 + throw new Exception("Musí být vyplněn text skriptu, nebo cesta k souboru.");
3.68 + }
3.69
3.70 - String[] prostředí = new String[]{
3.71 - "LANG=" + System.getenv("LANG"),
3.72 - "USER=" + System.getenv("USER"),
3.73 - "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java",
3.74 - "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky
3.75 - "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru
3.76 - "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky
3.77 - "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky
3.78 - };
3.79
3.80 - f.setExecutable(true);
3.81 - Runtime r = Runtime.getRuntime();
3.82 - Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
3.83 + String[] prostředí = new String[]{
3.84 + "LANG=" + System.getenv("LANG"),
3.85 + "USER=" + System.getenv("USER"),
3.86 + "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java",
3.87 + "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky
3.88 + "XWG_STRANKA_SOUBOR=" + souborStránky.getAbsolutePath(), // env:absolutní cesta k souboru
3.89 + "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky
3.90 + "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky
3.91 + };
3.92
3.93 - String výsledek = načtiProud(p.getInputStream());
3.94 - String chyby = načtiProud(p.getErrorStream());
3.95 + Runtime r = Runtime.getRuntime();
3.96 + Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
3.97
3.98 - p.waitFor();
3.99 + String výsledek = načtiProud(p.getInputStream());
3.100 + String chyby = načtiProud(p.getErrorStream());
3.101
3.102 - if (p.exitValue() == 0) {
3.103 - if (chyby.length() > 0) {
3.104 - System.err.println("--- Chybový výstup skriptu -----");
3.105 - System.err.println(chyby);
3.106 - System.err.println("--------------------------------");
3.107 - System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
3.108 - }
3.109 + p.waitFor();
3.110
3.111 - return připravVýstup(výsledek, výstupníFormát);
3.112 - } else {
3.113 - System.err.println("--- Standardní výstup skriptu: -----");
3.114 - System.err.println(výsledek);
3.115 - System.err.println("--- Cyhbový výstup skriptu: ---------");
3.116 + if (p.exitValue() == 0) {
3.117 + if (chyby.length() > 0) {
3.118 + System.err.println("--- Chybový výstup skriptu -----");
3.119 System.err.println(chyby);
3.120 - System.err.println("--------------------------------------");
3.121 - throw new RuntimeException("Návratová hodnota: " + p.exitValue());
3.122 + System.err.println("--------------------------------");
3.123 + System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
3.124 }
3.125 +
3.126 + return připravVýstup(výsledek, výstupníFormát);
3.127 + } else {
3.128 + System.err.println("--- Standardní výstup skriptu: -----");
3.129 + System.err.println(výsledek);
3.130 + System.err.println("--- Cyhbový výstup skriptu: ---------");
3.131 + System.err.println(chyby);
3.132 + System.err.println("--------------------------------------");
3.133 + throw new Exception("Návratová hodnota: " + p.exitValue());
3.134 }
3.135 } catch (Exception e) {
3.136 System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
3.137 System.err.println("--------");
3.138 - System.err.println(skript);
3.139 + System.err.println(skriptText);
3.140 System.err.println("--------");
3.141 e.printStackTrace(System.err);
3.142 return null;
3.143 @@ -143,6 +169,10 @@
3.144 }
3.145 }
3.146
3.147 + private static boolean isNeprázdný(String s) {
3.148 + return !(s == null || s.trim().isEmpty());
3.149 + }
3.150 +
3.151 /**
3.152 * @param xml fragment XML vygenerovaný skriptem
3.153 * @return true v případě, že výstup je validním fragmentem XML
4.1 --- a/šablona/makra/skriptování.xsl Sat Jun 23 23:19:09 2012 +0200
4.2 +++ b/šablona/makra/skriptování.xsl Sun Jul 01 14:43:21 2012 +0200
4.3 @@ -28,10 +28,11 @@
4.4 <!--
4.5 Skriptování
4.6 ***********
4.7 - Provedeme skript zadaný v těle elementu a jeho výstup vložíme do stránky.
4.8 + Provedeme skript zadaný v těle elementu nebo v souboru a jeho výstup vložíme do stránky.
4.9 *
4.10 - @jazyk programovací jazyk, např. bash, perl, php
4.11 + @jazyk programovací jazyk, např. bash, perl, php (nepovinné, pokud je vyplněn atribut src)
4.12 @výstup formát výstupu skriptu: text (výchozí) | xml (musí být validním fragmentem XML)
4.13 + @src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut)
4.14 -->
4.15 <xsl:template match="m:skript">
4.16
4.17 @@ -41,6 +42,7 @@
4.18 <xsl:when test="$režim = 'povolit'">
4.19 <xsl:variable name="výstupSkriptu" select="j:interpretuj(
4.20 text(),
4.21 + @src,
4.22 @jazyk,
4.23 @výstup,
4.24 document-uri(/),