Jak si smazat celodenní práci [selfdestruction]

MyEgo.cz

home foto blogy mywindows.cz kontakt

Jak si smazat celodenní práci [selfdestruction]

PHP 27.01.08

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ě:

nová fotogalerie

Komentáře

  1. 1 Jan Tichava 27.01.08, 08:01:26
    FB

    Něco podobného se mi už taky stalo, smazal jsem si skriptem adresář s instalačnima balikama a ja pak proč to pořád nechce spustit instalaci :)

    Jinak, SVN je fajn věc, použivám ho i když na projektu pracuju sám (jednak záloha mimo můj počítač a druhak verzování a snadný návrat o krok zpět), ale commitovat při každém uložení souboru mi přijde dost zbytečné - ne-li šílené. Pak budou v repozitáři tisíce revizí, ve kterých bych se nevyznal. Osobně commituju po dokončení nějaké konkrétní části nebo před nějakou větší změnou a vzdycky si píšu stručný komentář toho, co jsem udělal.

  2. 2 fixinko 27.01.08, 09:01:29
    FB

    Ak by si pustil aj rm -rf / tak, php skript bezi s pravami apache, takze by zmazal maximalne to, kam ma prava na zapis, takze nic hrozneho by sa nestalo. Systemove veci by to urcite nezmazalo. A optimalne ked je zapnuty safe_mode, a este nastavene open_basedir na "root" dir www stranky, tak by si nikde ani nestekol :-). To je asi len choroba z windowsow, kde sa bezne pracuje s administratorskymi pravami... ;-)

  3. 3 Miroslav Navrátil 27.01.08, 10:01:08
    FB

    [2] Ano, přesně tak, naprostá většina lidí na Windows programuje tak, že by to smazalo naprosto vše.

  4. 4 Radek Hulán 27.01.08, 10:01:36
    FB

    [2] nechci vám kazit zábavu, ale v článku je zmíněna platforma ;-) A to Ubuntu 7.10 / PHP 5.2.3..

  5. 5 fixinko 27.01.08, 10:01:40
    FB

    [4] ja som si to vsimol, ved prave preto som pisal ze keby si pustil rm -rf / cez php skript, tak maximalne by sa mazali subory/adresare ked ma apache pristup :-), kedze to na windoze by sa mazalo imho vsetko :-). A naladu si mi nepokazil, ja sa tu niekedy velmi zabavam :-)

  6. 6 Michal Vácha 27.01.08, 10:01:49
    FB

    No něco podobnýho se mi jednou stalo, když jsem odinstalovával vertrigo server - zeptal se jestli má smazat i wwwroot a já dal ANO :-D....pak jsem to obnovoval celé odpoledne :-)

    A přijde ta nová galerie i na megablog.cz?...poslední dobou je tam nějak mrtvo :-(((((((

  7. 7 Honza Skýpala 28.01.08, 12:01:41
    FB

    Za obdobnými účely instantních záloh používám Tivoli Continuous Data Protection od IBM. Lze vykonfigurovat přesně které soubory podle masek resp. adresáře má okamžitě zálohovat kopii při zapsání souboru na disk. Single licence vyjde na 50 Euro a je to super, plně doporučuji!

  8. 8 Tomáš Kafka 28.01.08, 01:01:16
    FB

    [2] Presne tak, drahocenne systemove soubory (ktere jsou nainstalovane z cd za 5 minut) by se zachovaly, smazala by se jenom nejaka bezvyznamna uzivatelska data, ktera ten user nekolik let vytvarel... Miluju linuxarsky pohled na vec :))

  9. 9 fixinko 28.01.08, 08:01:40
    FB

    [8] Ak by to bolo na produkcnom serveri, kde je X webov a podobnych veci, a nejaky luzerko ktory by zle naprogramoval web alebo cokolvek, tak by asi prevadzkujuca firma nebola rada keby to mazalo vsetko. A vravel som o niecom ze by to mazalo user data? Hovoril som o tom, ze by to, mazalo data kde ma __apache__ prava zapisovat, nie user. PHP skripty ktore vykonava apache su pustane s pravami apacha, nie usera ktoremu patria... A ked sa maju vytvarat adresare a podobne somariny, tak tam musi apache vediet zapisovat, preto to tunak velkemu programatorovi mazalo co mu prislo pod ruku :-).

  10. 10 drooth 28.01.08, 10:01:11
    FB

    Ono este vacsia parada je ked je web admin taky trtko a startup/shutdown script napise pod uid 0, a nahodou pouziva premenne ..

    osobny zazitok, takyto trtko volal skriptom rm -fr $HOME_DIR/* ... chalan vsak zabudol v tom korn-shell skripte uviest/nastavit $HOME_DIR, takze po startupe apacha s tomcatom nejako zacal stracat connect a zaroven content komplet systemu :-)) do dvoch minut fical uz iba z RAM, takze adminoval stylom -> boot -> start -> shit!!!

    a bol taky sikovny ze na ten ordering masine zabudol za posledne dva roky spustit backup .... takze, dakto je mudry a dakto nie :-)))

  11. 11 Tomáš Herceg 28.01.08, 10:01:45
    FB

    [5] Pokud je to tak, jak říkáte, že webová aplikace může smazat vše, kam má práva webserver Apache, tak mi to přijde divné. Pokud na něm poběží více aplikací, může jedna smazat druhou? Neměla by mít webová aplikace práva jenom sama na svůj adresář a případně tam, kam jí je přidám manuálně?

  12. 12 Radek Hulán 28.01.08, 11:01:06
    FB

    [11] typicky má PHP přístup jen k adresáři daného webu (plus tmp adresář), což ale bohatě stačí na jeho smazání ;)

  13. 13 Adam R 01.02.08, 09:02:26
    FB

    [1] Nedalo by se o tom slavném SVN napsat něco více? Jsem amatérský PHP programátor, ale o SVN jsem nikdy neslyšel. Hledal jsem to v Google, ale vyšel mi z toho jen nějaký modul do Apache...

  14. 14 Pavel Kouřil 01.02.08, 10:02:15
    FB

    [13] http://cs.wikipedia.org/wiki/Subversion... - by ti IMHO mohlo stačit? :)

  15. 15 Adam R 01.02.08, 10:02:58
    FB

    [14] Perfektní, dole na té Wiki stránce je odkaz na Windows verzi, která mi konečně funguje. Díky

  16. 16 neni treba 04.02.08, 08:02:09
    FB

    [15] Jinak na root.cz je v knihovnicce zdarma e-book o SVN, ma to nekolik set stran :D Pokud Vas to opravdu zajima, tak http://knihy.root.cz/kniha/subversion-version-control/...

  17. 17 Hmm.. Trochu drze ziadat skutocne meno, nie? 03.03.09, 06:03:52
    FB

    Ako riesis MultiUpload?