[PHP] Self deploying PHP script?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
Momenteel ben ik bezig aan een soort van picasa-achtig PHP Gallery scriptje icm wat DHTML enzo, maar ik zit met het volgende:

Veelal gebeurt het zo dat ik wat pics via FTP upload, er een aantal PHP scripts heenpomp, en de scripts doen de rest. Maar nu wil ik het anders aanpakken, ik wil het nu zo maken dat ik eigenlijk een soort van self-extracting-php naar de directory toe kan gooien.

Wat er dan waarschijnlijk moet gebeuren is dat er een ZIP of een GZIP file achter een soort van mini installer PHPtje aangeplakt moet worden, deze moet zich dan uitpakken als hij voor de 1e keer opgestart wordt, de script properties uitlezen uit bijv. een XML bestandje in de zip, en de directories aanmaken en de scripts er in plaatsen.

Wat ik me nu afvraag:
• Zijn er mensen die dit eerder gedaan hebben
• Zijn deze mensen bepaalde problemen tegengekomen? (ik heb bijv. nog geen ervaringen met het inlezen van een deel van het script dat op dat moment geinclude wordt, php+gzip, etc.)
• En is er intresse in als ik dit als het af is onder bijv. GPL publiceer?

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Ja!.

Haha, net eingelijk; ik heb ooit eens scriptjes gezien in ALL BASIC CODE (dat was een soortement van scriptlibrary voor QuickBASIC, PDS, PowerBASIC en dergelijke 'basic' talen.) ook daar moesten ze wel eens meer dan alleen 'code' posten en daarvoor hadden ze een soortement van 'data' systeem geschreven.

Omdat ik de laatste tijd nogal wat geklooi las op PHP freakz had ik even een tooltje in elkaar gebakken die een bestand omzet naar 'hex' code en deze door het starten van het 'gemaakte' scriptje weer output naar het 'orginele' bestand.

Zie mij scriptje @ (ow, ze hebben um er af geflikkert, wat zielig).. (weer toegevoegd)

maar niet te min heb ik al wat code; wil je iets zien klik dan op http://phpextract.bruggema.nl/php2hex.php, en knip de output maar eens :)

Misschien dat dit niet geheel jou idee is maar het is wel een leuk idee om te gebruiken.

[ Voor 183% gewijzigd door Verwijderd op 12-10-2004 15:44 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
Hmm ik snap het nut niet helemaal van het vertalen van een een PHP bestand naar HEX :? Lijkt mij een beetje opnieuw het wiel uitvinden, en tevens: (g)Zip doet er gelijk nog compressie overheen ook, inclusief eventuele mappen, dat wordt het dus in ieder geval :P

Onze ideeën komen dus in ieder geval wél overeen, dus ik ga hier vandeweek wel degelijk even aan knutselen...

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Interessant concept.

Om het geheel in een PHP file te houden moet je echter wel zorgen dat de resulterende file een textbestand blijft (met binaries erin). Dus zul je de zip nog moeten uu- of base64-encoden (of een van die andere codecs die gebruikt worden in MIME mail). Daarna kun je die tekst invoegen als "resource" (of whatever) in het PHP bestandje, en het PHP bestandje de shit laten uitpakken.

Dit zal uiteindelijk wat efficiënter zijn dan elk bestand apart naar hex converteren. Met compressie worden de files kleiner, en door te encoden naar tekst worden ze weer iets groter; je zal ongeveer op de brongrootte uitkomen schat ik, afhankelijk van de type files die je wil encoden. Als je alles naar hex converteert worden alle bestanden 2x zo groot.

Overigens kun je met gzip maar één bestand inpakken. Dus voor een dirstructuur zul je "gewoon" zip moeten gebruiken. Of een tarball natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Logisch dat je het moet converteren, dat heb ik reeds gemaakt. De output van mijn script kan er uitzien als volgt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?
$files[] = array(
"name" => "php2hex.php",
"size" => "4715",
"gzip" => "1638",
"dir" => "/",
"data" => array(
'789cad586d6fe24610fe1e29ff61622119279c2169ab4a870da2874f8994863490b611',
'174506afc18db1adf53a819cf8ef9dddf51a632017a9e50336bbf3f6cccccecc62758f',
'8f8e8f9aa770ed8c06b72726dc39bd3e8c2eaf8626dfe88510fbc0e6242590c6199d12',
'98c61e49c1a5f84689cb880793153826fc46b3d98c2c5ca8cf194b3e379bafafafe624',
'5f34a3d00037f2245f9cac68309b735e16c33c58085d0f71060b77056ec808459d410a',
'e9940609832082decd03fcd57b388149c6e0ea2b3c0ceea13f68c0ed603882c10d7065',
'c93cf1d1a4e737d486101ce85d8f9c3ba70f2f84a6411c492885d8c6f1511a438ce028',
'642992c0d48d8044ffc42b8e185e63fa2cf470bbaf60eebe10f0e2889c086b4f9bfcdb',
'cfa229e3a25346e76459afe1338866c6f1d1f7e32300a8e122d8a0696df1d38f29d46b',
'01aeb4da804f8bf385242af8f8ead9992188a50450524c1bea39b547a65c594c3dc538',
'ae058f866158170674416b6960c22122f87c704b1ab916df94b08c4642352eaf39d812',
'5c5c45c63adf2db0422eab84f71dc09c133e9d8bd5331b2e24e632e85c1ae29ece691d',
'e9d16cc1c78d4580f92b9cc179617b6e7c61bd94a100349b10658b09c61b334147763d',
'ff9d42828b6110118c6d8d3f172e8fdb4fbfb4395fe02388a7a173f7a77337d6ef9c3f',
'ee9de1e8e977677439e8eb8f6023609e87dac6159ce324489f5c4add15f27ebdba7686',
'c60e46c040c4a0df0c8013c0fdedf5a0d777fa7abb44b10c58bd828e84292944753bc7',
'47564249c7023ccb9638cf8a59badf0f423cb1367067cb770bcf60163165d858e7cbfa',
'e3588fdc053e0d45a852112a662b883bfc84d298e28b6417ae6919db7c1531fcc3e312',
'83e0ddddacf91edaeec709cf9aaa3eb6489ea4cd4a6503343ad18cf6ae20216c92f93e',
'86da86d9db345ea0dbd2b4ce8b069e04df6bc08e8234782b09370eca15fb488b925586',
'4b55fb38fc6918a7846b2cef960357c88d5f84b5ad3d526a11792de0c84433dafb84c8',
'2c58e6877089d1f7c338a6f58dd14d5049cf43bfdc0abbfaec89dbb615e347099e9796',
'349b88fa2077d0afcb53a5a1b1d1b5cf37ebf7dc50f2f327a8bf83024e4b8876e589dc',
'15323b3bf9f9dfb1966c144a1af271086e75699f03f8219772856619ede3238de7be06',
'760734ab6b1f38cd2a79dbdd8e863d4fe3a61de6d94e78c5337b0b920d8f02a876bd80',
'9604f25238d61397cd77e5782e7305a94460753137893b9d633836d9eca6507b262b4e',
'567b71c38c18f05d564a4de79d4d2ee28ba637bed16f91d68675b7a3eb864c7f5e020f',
'b878bd5546e537161f2f489310278f204a991b8684aa7deef61f763dac4176b9e161bf',
'b35bed9d6687bd0e7bbbbddbe88404d3ded3e4ccfce5ec70834356d5dd0a33c9925177',
'caf293b1b134f7b56a08dccdd3386224627b6cc2586c506d71e73c639d0713db1f97e3',
'0724f40ef70a2ecdb425557b271c85bed91b42505559391b378cedba16f8652302ec37',
'27f697cbbbfacfbf1aefb5abe2a04e73ae46ab716ed87b58f7b00b1bb795da85bcade5',
'c67943857d7b0333a05a012aa7bfc60f8dcdbf82c88f4b23c76d6f74f934baebdd0caf',
'7b239c0f1eab82f8e94125b69020f4c9b35f25c38dd426cb24c421be9e036f54eddc69',
'2245e839bb8877aee0033e9386e110976b3315efdeb25cc79909f7eb395b35280794f0',
'8f9ca4fa01255316d315e8a652ade38d8277f895bab098966eea13dad13f568f37d3d6',
'07cc40088be71f2078877d83e44b7eb9f214a2cf6548ef203880e230928f991367a187',
'531acb9df8bfd9b53e7822d695337f3835aad5a6c86779086c655e91821582fd2569db',
'5b3fd2f131d9d5c97fe8bef03b8ebec386595b2fafcab66cea86293e253f976aa8efd9',
'f99c5c91d6d05e27675b43b19f642c1533af28b0e59dade1b46ab08377e154185d09f5',
'3aef4295e6234474a16335f915453667a493be55b797f979e72b52c3055c3a7f8378bd',
'52ad186f2a110e4f8c50ab8974488dd568010bc2e6b1676b499c320d2fed53b64a88ad',
'2db29005894b5993537d12e306e761ee2414ea19ed487b2de6758624c41c066ea9d5c4',
'dfa51d71d957299e6fe28376d4156b33549fe743f579ab550ccf0ad9963aebeae6f67e',
'04a3875bc7d6b8520d7878e4fb98cf4e4b9c931eb54ec5182b88305a20113274b0e213',
'c57ec307622eb2b56621a164f17a8f45e8db304ddcc8d62e342c92c10cdfc41f33dab6',
'4e6c748ba0d09affaaea682a1ff377eefd8e1ac672d5ff02062fa31f',
''));


function hexstr($hex)
{
    $tmp="";
    for($i=0;$i < strlen($hex)-1;$i+=2)
    {
        $tmp.=chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $tmp;
}

function extractFiles($files)
{
    foreach($files as $content)
    {
        $buf="";
        foreach($content['data'] as $field)
        {
            $buf.=$field;
        }
        $buf=gzuncompress(hexstr($buf));

        if($content['dir']!=CHR(47))
        {
            if(substr($c['dir'],0,1)==CHR(47))
            {
                $content['dir']=substr($content['dir'],1,strlen($content['dir'])-1);
            }
            $path=pathinfo($_SERVER['PATH_TRANSLATED']);
            $newdir=$path['dirname'];
            $dirs=explode(CHR(47),$content['dir']);

            foreach($dirs as $dirname)
            {
                $newdir.= CHR(47) .$dirname;
                if(is_dir($newdir))
                {
                    echo 'Directory '.$newdir.' already created.<'.'br>';
                }
                else
                {
                    if(mkdir($newdir))
                    {
                        echo 'Created directory: '.$newdir.'<'.'br>';
                    }
                    else
                    {
                        echo 'Could not create directory: '.$newdir.'<'.'br>';
                    }
                }
            }
        }

        if(is_dir($newdir))
        {
            $content['name']=$newdir.CHR(47).$content['name'];
        }
        else
        {
            $content['name']=CHR(47).$content['name'];
        }

        echo 'Saving '.$content['name'].' ('.$content['size'].')......<'.'br>';

        $fd=fopen($content['name'],"wb+");
        fputs($fd,$buf);
        fclose($fd);

        echo 'End saving<'.'br>';
    }
}

extractFiles($files);

?>


Je ziet dat de code is omgezet naar HEX codes, dit kan ik dus in een array zetten, uitlezen weer combineren en ungzippen :P. Je kan natuurlijk in arrays meerdere bestanden verwerken en of opties aanvast knopen, bv wat voor een type bestand het is (stel text = insert into mysql database!?) bv.

[ Voor 22% gewijzigd door Verwijderd op 12-10-2004 19:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb ooit zoiets gemaakt voor YaBB SE (nu SMF). Het grootste probleem dat ik tegenkwam is het probleem met rechten. De gebruiker zal directories moeten gaan chmodden en ik begreep dat het aanmaken van files en directories niet wil in safe mode. (Ik weet niet precies hoe dit zit, maar het was destijds reden om een extra versie uit te brengen voor mensen met safe mode enabled die werkte zonder dit packaging systeem.)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Leuk detail is dat als je een zip-file gebruikt, je je archives niet per se hoeft te coderen; je kunt ze ook in binary vorm toevoegen. Stel dat je een zip-file hebt met je bestanden (files.zip), en een installer (installer.php) met de volgende voorbeeldcode:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$archive = @zip_open(__FILE__) or
    die('Installation file is corrupt!');
while($entry = zip_read($archive))
{
        echo '<li>', zip_entry_name($entry), '</li>';
        // ... TODO ...
}
zip_close($archive);
?>
</p></body></html>
<?php exit(); ?>

Deze installer gebruikt de standaard zip-functies van PHP (zie de manual) om zichzelf uit te pakken (in dit voorbeeld worden alleen de bestandsnamen opgesomd, maar je kan er van alles in doen). Het zipbestand kun je gewoon achteraan toevoegen en vervolgens kan een standaard zip-tool de index aanpassen. Stel dat ik een installer genaamd install.php wil maken, dan kan ik dat onder UNIX zo doen:
code:
1
cat installer.php files.zip > install.php && zip -A install.php

Nu heb je een enkel PHP script, dat de bestanden kan uitpakken als 'ie gestart wordt! Merk op dat het tweede commando alleen nodig is omdat de zip library in PHP nogal brak en restrictief is; de gewone command line unzip tools kunnen install.php ook wel unzippen zonder aangepaste index.

Leuk trucje natuurlijk, maar er zitten een aantal haken en ogen aan. Het belangrijkste is dat PHP zal proberen het hele script (inclusief ZIP-file) te interpreteren. Daarom is het van belang dat er geen PHP-tags in de zip-file voorkomen. Als je short open tags uit hebt staan, kun je daar wel vanuit gaan (de kans dat <?php in random data voorkomt is ontzettend klein), maar met short open tags aan kun je dat moeilijk garanderen. Je zou echter juist een installer willen hebben die overal werkt, ongeacht de instellingen van de interpreter, dus dan is deze methode niet ideaal.

Verder is het probleem dat je vanuit een PHP script meestal niet veel kan doen, omdat je executeert onder de rechten van de webserver. Die kan vaak niet schrijven in de directory waarin het script gestart wordt of geinstalleerd moet worden. Dit probleem treedt trouwens alleen op als het script gestart wordt via een webbrowser (wat je wil doen, als je de installer via FTP upload). Als je het vanaf de shell start heb je er geen last van.

[ Voor 17% gewijzigd door Soultaker op 12-10-2004 20:29 ]

Pagina: 1