Celý víkend programuji zbrusu novou fotogalerii. Začal jsem v pátek večer, pokračoval v sobotu do 4:00 do rána, dnes v 10:00 vstával a pracoval na tom opět. Umí to hromadu věcí, neomezený počet sub-galerií, práva uživatelů, privátní a veřejné fotogalerie, automatické thumbnails, má to skvělé administrační rozhraní, a dají se tam kromě obrázků vkládat i FLV, SWF soubory a videa z YouTube.
Přitom jsem si to v sobotu ve 3:00 ráno málem všechno smazal. Začalo to nenápadně. Programoval jsem třídu pro výmaz vnořených sub-galerií a obrázků, jejíž část vypadala nějak takto:
function rmdirr($dirname) {
if (!file_exists($dirname))
return false;
if (is_file($dirname))
return unlink($dirname);
$dir = dir($dirname);
while (false !== $entry = $dir->read()) {
if ($entry == '.' || $entry == '..') continue;
$this->rmdirr($dirname.DIRECTORY_SEPARATOR.$entry);
}
$dir->close();
return rmdir($dirname);
}
Tedy poměrně primitivní kód, který udělá to, že pro předanou cestu smaže všechno, co je v ní a níže. Všechno by fungovalo dobře, kdybych ji místo $this->rmdirr($this->rootdir) nezavolal, ve 3:00 ráno (tedy totálně unavený), s parametrem $this->rmdirr($rootdir). $rootdir je samozřejmě proměnná, která nebyla inicializovaná, což PHP nijak nevadí, použil se tedy adresář běžícího skriptu namísto kořene galerie (PHP 5.2.3 na Ubuntu 7.10), a smazala se tedy půlka PHP projektu.
Skript smazal dokonce i sám sebe. Bylo to vlastně velice půvabné.
Nebylo to tedy taková katastrofa, používám SVN, kam se aktualizuje soubor zcela automaticky při každém uložení v UEStudiu, takže stačilo udělat checkout kódu a během pár minut jsem fungoval dál. Nicméně nedokážu si představit tu katastrofu, kdyby $rootdir náhodou inicializovaná byla a měla hodnotu $rootdir = '/'. Tedy obdoba rm -rf.
Každopádně vše dobře dopadlo, a zbrusu nová multimediální galerie je na světě: