Archive for ‘Scripts’ category

* Aktualizace WordPressu podruhé

22. November 2014, Jakub Horák. Categorized as Scripts.


V létě 2011 jsem na tomto blogu popisoval, jak vzdáleně aktualizovat WordPress. O tři roky později znovu řeším stejný problém, situace se však změnila. Dříve jsem měl na server přístup pouze přes FTP, nyní mám SSH.

Myšlenka nového skriptu spočívá v tom, že udržuje zdrojový kód WordPressu i jeho pluginů v SVN pracovních kopiích. Jak se to dělá pro samotný WordPress je popsáno zde. Poprvé je nutno provést SVN checkout nejnovějších tagů jádra WordPressu a jeho pluginů z repozitářů na http://core.svn.wordpress.org resp. http://plugins.svn.wordpress.org. Pro kompletní aktualizaci pak už vždy stačí spustit skript. Sám si zjistí tagy odpovídající nejnovějším verzím a pracovní kopie do nich přepne.

Skript si můžete prohlédnout:

#!/bin/bash
##
## Updates Wordpress in this directory to maximum release version.
##
 
LCYAN="\033[1;35m"
NOCOL="\033[0m"
 
update() {
  svninfo=`svn info 2>/dev/null`
  # check that directory is a working copy
  if [ "$?" -ne 0 ]; then
    echo -e "$LCYAN$(readlink -f .)$NOCOL is not a working copy."
    return
  fi
 
  oldurl=`echo "$svninfo" | grep '^URL:'`
  oldurl=${oldurl##* }
  oldversion=${oldurl##*/}
  tagurl=${oldurl%/*}
  newversion=`svn ls "$tagurl" | sed -e 's/\/$//' | sort --version-sort | tail -n 1`
 
  if [ "$oldversion" == "$newversion" ]; then
    echo "$(readlink -f .) is up to date with version $newversion."
  else
    echo -e "Update $LCYAN`readlink -f .`$NOCOL from version '$LCYAN$oldversion$NOCOL' to '$LCYAN$newversion$NOCOL'?"
    select prompt in "Yes" "No but continue" "Abort"; do
      case $prompt in
        Yes ) break;;
        "No but continue" ) return;;
        Abort ) exit;;
      esac
    done
 
    echo ---
    svn switch "$tagurl/$newversion"
    echo ---
  fi
}
 
if [ "$#" -ne 0 ]; then
  echo "Usage: $0"
  exit
fi
 
# main
update
 
# plugins
pushd wp-content/plugins/ >/dev/null
for plugindir in *; do
  if [ -d "$plugindir" ]; then
    pushd "$plugindir" >/dev/null
    update
    popd >/dev/null
  fi
done
popd >/dev/null

Také si skript můžete stáhnout.

Tags: .



* Automatická aktualizace WordPressu

7. August 2011, Jakub Horák. Categorized as Scripts.


Podle statistik rozšíření CMS na internetu z ledna tohoto roku využívá 15% všech webů WordPress. Kdyby tedy hacker objevil ve WordPressu bezpečnostní díru, mohl by teoreticky ovládnout až 15% Internetu. Spoustu lidí se o to již pokusilo a jistě nadále pokouší a komunita vývojářů chyby rychle odstraňuje. Nové verze vychází zhruba jednou za měsíc. Oprava vám ale nepomůže, pokud jí nemáte nainstalovanou :). Je tedy nutné neustále aktualizovat.

WordPress se dá aktualizovat z administrace, proces ale potřebuje na stažení a rozbalení balíčku místo na disku, kterého se mi na freehostingu nedostává. Člověk se také musí přihlásit a zmáčknout tlačítko. Naštěstí to lze udělat i jinak. Stačí malý skript.

Můj skript stáhne poslední stabilní verze českého WordPressu a vašich pluginů, uloží je do lokálního repozitáře GITu a následně nahraje na FTP pouze ty soubory, které se změnily. K nahrání změněných souborů jsem využil skvělý skript git-ftp.py.

Aby git-ftp.py fungoval, vytvořte ve složce WordPressu soubor .git/ftpdata s následujícím obsahem a doplňte vaše údaje k FTP:

[master]
username=me
password=s00perP4zzw0rd
hostname=ftp.hostname.com
remotepath=/htdocs

Připravte si adresář, do kterého se rozbalí WordPress. Já mám WORKDIR nastavenou na /home/kuba/weby/oss/, takže WordPress se rozbalí do /home/kuba/weby/oss/wordpress. Do proměnné PLUGINY uveďte názvy pluginů získané z adres URL jejich webů. Zde je celý skript (stáhnout):

#!/bin/bash
#
# Automaticka aktualizace Wordpressu pres FTP
#
 
WORKDIR="/home/kuba/weby/oss/"
TMPDIR="/tmp/wordpress-update/"
PLUGINY="w3-total-cache wp-syntax simplemodal-contact-form-smcf lightbox-plus openid"
 
function echoi {
        echo -e "\e[1;36m""$1""\e[0m"
}
 
function stahnoutplugin {
        PLUGINSVN=http://plugins.svn.wordpress.org/
        PLUGINDIR="$TMPDIR"/"$1"
        stabilni_verze=`svn ls "$PLUGINSVN"/"$1"/tags | tr -d / | sort -V | tail -n 1`
        echoi "Stahuji $1-$stabilni_verze"
        mkdir -p "$PLUGINDIR"
        cd "$PLUGINDIR"
        svn co "$PLUGINSVN"/"$1"/tags/"$stabilni_verze"
        rm -rf `find -type d -name .svn`
        mv "$stabilni_verze" "$1"
        mv "$1" "$WORKDIR"/wordpress/wp-content/plugins
}
 
cd "$WORKDIR"
rm latest-cs_CZ.tar.gz
echoi "Stahuji aktualni wordpress"
wget http://cs.wordpress.org/latest-cs_CZ.tar.gz
rm -rf wordpress/*
tar xvf latest-cs_CZ.tar.gz
for plugin in $PLUGINY; do
        stahnoutplugin "$plugin"
done
cd "$WORKDIR"/wordpress
echoi "Mazu zbytecnosti"
rm -rf wp-content/themes/twenty*
rm wp-content/plugins/*/screenshot-*
find -name \*.txt -exec rm '{}' \;
find -name \*.dev.\* -exec rm '{}' \;
rm -rf "$TMPDIR"
echoi "Commituji zmeny"
git add .
git commit -a
echoi "Nahravam na vzdaleny server"
git-ftp.py

O upozornění na nové verze WordPressu se stará moje RSS čtečka se speciálním kanálem. Časem by se to celé ale klidně dalo spojit s Cronem a nemusel bych se starat vůbec o nic.

Tags: , .



* Ukládání coverů do ID3 tagu

9. May 2011, Jakub Horák. Categorized as Scripts.


Od verze 2 tagu ID3 lze k souboru MP3 kromě tradičních metadat ukládat i obrázky. Těchto obrázků se využívá se například v iPodu, když se vám při přehrávání písničky zobrazuje cover alba. Hezké. Kvůli tomu jsem vylepšil svůj loňský skript na automatické stahování coverů alb, aby dokázal stažené covery automaticky uložit také do ID3 tagu.

K vlastnímu tagování používám program eyeD3. Seznam závislostí se tedy rozrostl na: id3lib, eyeD3, ImageMagick, Ruby, cURL.

Novou sadu skriptů stahujte zde: musiccovers.20110509.tar.gz

Tags: , , , .



* Ověření schématu databáze

31. October 2010, Jakub Horák. Categorized as Scripts.


Spravuji jistou webovou aplikaci pro nejmenovaného zákazníka. Nedávno se mi v souvislosti s tím stala nepříjemná událost. Při aktualizaci aplikace jsem zapomněl zkopírovat jednu tabulku do databáze. Funkci, která tabulku vyžadovala jsem neotestoval, takže o mnou způsobeném problém jsem se dozvěděl až po týdnu přímo od zákazníka.

Řekl jsem si, že by bylo moc pěkné, kdyby se mi v okamžiku deploymentu vygeneroval test, který by ověřoval, že databáze má předpokládanou strukturu. Tento test bych pak po aktualizaci aplikace mohl pustit na ostré databázi a ujistil by mě a že jsem na nic nezapomněl. Z mého snažení vyplynul Ruby skript generující PHP test.

Kód naleznete zde.

Tags: , , .



* Covery alb

13. September 2010, Jakub Horák. Categorized as Scripts.


Potrpím si na detaily, proto je pro mě velice důležité mít ke všem písničkám příslušné covery alb. Tyto covery rád vidím jako náhledy složek při procházení ve správci souborů. Napsal jsem si tedy sadu skriptů 😉

Ve Windows se náhled složky uchovává v souboru folder.jpg. Na Freedesktopu pak podle specifikace Desktop Entry musí ve složce existovat soubor .directory, ve kterém je definováno, který PNG obrázek použít jako náhled dané složky. Zvolil jsem si, že na Freedesktopu mám náhled vždy uložen ve skrytém souboru .folder.png.

Práci jsem rozdělil do tří skriptů:

  1. Zjištění URL coveru podle jména umělce a názvu alba. Tento skript (getcover.rb) se připojuje k Last.fm API, které se stará o zbytek :-). Původně se jedná o dílo Dana Sosedoffa.
  2. Přejmenování obrázku na folder.jpg pro Windows Media Player, vytvoření obrázku .folder.png a souboru .directory pro Freedesktop. Skript (mkfolderimg.sh) lze využít také např. pro generování náhledů k fotoalbům.
  3. Skript, který projde všechny alba, pro každé album umístí cover podle specifikací Freedesktopu nebo WMP a případně ho stáhne z internetu (mkmusiccovers.sh). Implementace nejdřív vyhledá všechny hudební soubory a sestaví seznam alb, jakožto kandidátů na vytvoření coveru. Poté prochází jednotlivá alba a pokouší se sestavit náhledy. Pokud ve složce alba není žádný obrázek, stáhne cover z URL získané pomocí 1. skriptu.

Všechno pěkně zabalené si stáhněte zde: musiccovers.20100913.tar.gz.

Tags: , , , .



* Upozornění na nové maily

30. August 2010, Jakub Horák. Categorized as Scripts.


Používám Gmail již dlouhou dobu a štve mě, že neexistuje vhodný minimalistický program pro kontrolování příchozích emailů v KDE. Zkusil jsem KCheckGmail, ale nepodařilo se mi ho zprovoznit. Aplikace běží v systemtray, takže zabírá místo v paměti a pixely na ploše.

Napsal jsem si tedy skript, který kontroluje příchozí emaily a zobrazuje malé okénko v případě nové nepřečtené zprávy. Použil jsem Ruby, protože v něm trochu umím, v kombinaci s Qt, mou oblíbenou grafickou knihovnou. Skript spouští démon Cron pravidelně každých 5 minut.

Prohlédněte si zdrojový kód: checkgmail.rb.

Tags: , , .



* Zvýšení produktivity vývoje webů

12. December 2009, Jakub Horák. Categorized as Scripts.


Při vývoji webů jsem vždy pracoval na adrese http://localhost/projekt. Naštvalo mě ale, že když web používá mod_rewrite, nemusí kvůli podadresáři fungovat přepisování URL správně. Začal jsem tedy vždycky linkovat projekt na adresu http://localhost. Když se k tomuto přidá fakt, že často potřebuji importovat databáze, neustále všechno zálohovat a exportovat, musím napsat spoustu příkazů, aniž cokoliv naprogramuji. Důležitý je také fakt, že nesmím nic zkazit. Rozhodl jsem se tedy, že rozšířím svůj starý skript rmbackups na export tar archivu webu a napíšu si sadu skriptů pro práci s weby. Vzor mám ve skriptech pro práci se zdrojovými soubory v KDE.

Myslím, že se mi skripty docela povedly. Základní nastavení se provádí v hlavičce souboru. Práce s příkazy je jednoduchá:

# před začátkem práce pustím
wds projekt
# případně pokud chci importovat databázi např. z ostrého serveru
wds projekt -db import.sql
# potom, když chci zazálohovat aktuální stav projektu, pustím
wdtag název_zálohy
# po ukončení práce na projektu program jednoduše
# exportuji buď do tar.bz2 archivu
wde tar
# nebo když budu soubory uploadovat, chci
# aby se mi zdrojové soubory nakopírovaly do nějaké dočasné složky
wde files

Použití je na vlastní nebezpečí. Skript obsahuje několik rm -rf, takže neodborný zásah může vést ke ztrátě Vašich dokumentů.

Stáhnout

Tags: .



* Zobrazování textů písní pro MPD

19. April 2009, Jakub Horák. Categorized as Scripts.


Narazil jsem na další problém přehrávače MPD. Kvůli absenci grafického rozhraní nemá jak zobrazovat texty písní. Zkoušel jsem různé skripty, které mají texty zobrazovat, ale žádný nefungoval, takže jsem se rozhodl obětovat chvíli času a napsat si skript vlastní.

Zajímavé bylo řešit, jak texty získat. Existuje totiž spoustu webů s databázemi textů, které jsou ale značně pochybné a texty se z nich špatně vytahují. Napadlo mě použít nejlepší výsledek vyhledávání v Yahoo! a zobrazit ho v prohlížeči. Yahoo! poskytuje webovou vyhledávací službu BOSS, pomocí níž by se toto implementovalo velice snadno. Bohužel testování ukázalo, že v praxi Yahoo! na první pozici často nedá správný odkaz. Škoda… Ještě v souvislosti s vyhledávači a jejich službami mě překvapila skutečnost, že Google tu svojí přestal poskytovat.

Vzpomněl jsem si na Amarok a na jeho řešení vyhledávání textů písní, které ve verzi 2.0+ funǵuje docela spolehlivě. Po chvilce pátrání ve zdrojácích jsem objevil službu lyricwiki.org. LyricWiki.org podporuje vyhledávání textů pomocí SOAP, což je pro programátora velká výhra 🙂 Zbytek práce už bylo jenom skládání v Ruby.

Více o skriptu na oficiálních stránkách MPD

Tags: , .



* MPD hack v Ruby

17. January 2009, Jakub Horák. Categorized as Scripts.


Vždy jsem byl příznivcem hudebního přehrávače Amarok. Nedávno mě ale jeho autoři naštvali. V nové verzi 2.0 jako databázový backend použili MySQL embedded. To je sice pěkné, ale tahle vlastnost je dostupná jenom v nejnovějších experimentálních verzích MySQL 5.1. Vzhledem k tomu, že MySQL potřebuji do práce, nechci nainstalovat nestabilní verzi, která se chová jinak než verze MySQL na ostrém serveru.

Před pár lety jsem používal jako hudební přehrávač MPD, a tak mě napadlo, že bych se mohl podívat, jak se za tu dobu změnil. Přehrávač MPD je zajímavý hlavně svojí architekturou — vlastní MPD se chová jako server a existuje spousta klientů, které se k němu připojují a doplňují přehrávací GUI. Vzhledem k tomu, že dávám přednost rychlým konzolovým aplikacím, vybral jsem si klienta ncmpcpp, který má jednoduché, ale přitom efektivní rozhraní.

Oproti Amaroku mi ale chyběla jedna důležitá vlastnost hudebního přehrávače — možnost přehrávat hudbu z externího disku. Amarok to řeší tím způsobem, že kromě songů z vlastní databáze umí přehrát i soubory vybrané v integrovaném prohlížeči souborů (KPart). Pro MPD je tohle bohužel docela velký problém. Rozhodl jsem se proto napsat si vlastní hack 🙂

Můj oblíbený filemanager Midnight Commander umí samozřejmě spustit hudební soubory jakýmkoliv programem mu řeknu. Takže mi stačilo napsat prográmek, který vybrané hudební soubory přidá do playlistu MPD. V praxi to provádím tak, že ve složce na lokálním disku, kam MPD může, vytvořím symbolický odkaz na soubor z externího disku. Když pak MPD pustí aktualizaci databáze, zaindexuje i tyto soubory a tím pádem už je možné je snadno přidat do playlistu a přehrát.

Napsat takový krátký program v kompilovaném jazyce mi přišlo nevhodné a v PHP zas jako naprostá prasárna. Ze skriptovacích jazyků se podle mě k tomuto účelu nejvíc hodí jeden z jazyků Perl, Python nebo Ruby. Ačkoliv každý z této trojice jazyků má něco do sebe, nakonec jsem si vybral Ruby. Na Ruby se mi líbí jeho filozofie “Všechno je objekt” a “Princip menšího překvapení”. Ruby má také interaktivní shell zvaný IRB, což je docela pěkná věc, ve které se dají zkoušet rozmanité jazykové konstrukty a kterou používám místo kalkulačky.

Zdrojový kód hacku je ke stažení zde. Pro ovládání MPD používám knihovnu librmpd.rb.

Instalace

Otevřete mpdplay.rb v editoru a nastavte MUSIC_DIR na složku s hudbou, jakou máte v konfiguraci MPD.

$  vi mpdplay.rb

Dále spusťte:

#  mv mpdplay.rb /usr/local/bin/mpdplay
#  chmod +x /usr/local/bin/mpdplay.rb
#  mv librmpd.rb /usr/local/lib/
$  vi .mc/menu

Na konec souboru .mc/menu přidejte text:

|   Enqueue
mpdplay -a %f
\   Play
mpdplay %f

Otevřete .mc/bindings

$  vi .mc/bindings

Upravte

regex/\.([mM][pP]3)$
View=%view{ascii} mpg123 -vtn1 %f 2>&1 | sed -n '/^Title/,/^Comment/p;/^MPEG/,/^Audio/p'
Open=mpdplay %f
 
regex/\.([oO][gG][gG])$
View=%view{ascii} ogginfo %s
Open=mpdplay %f

A je to! Kdykoliv teď chci přehrát soubor, zmáčknu v Midnight Commanderu F2 a \ pro přehrání nebo | pro zařazení do playlistu.

Tags: , , .