Jump to content


Photo

Self-overwriting Scripts


  • Please log in to reply
No replies to this topic

#1 PhilMorton

PhilMorton
  • New Members
  • Pip
  • Newbie
  • 1 posts

Posted 30 August 2006 - 05:01 AM

Hi, I'm currently designing a system which has one central script (core.php) and several plugin scripts that it can load and execute. This is a command line tool, not a web-application (however there is a web-server that hosts the most up-to-date versions of the scripts to allow for auto-updating).

When a plugin is loaded, its md5 is calculated and compared with an md5 from the server. If the values dont match, a new version of the plugin is downloaded from the server and written over the old plugin.

My problem has arisen because now I need to do this same procedure for the core itself. So basically i run my script ("php.exe core.php"), and then the script has to open itself (fopen('core.php')) and overwrite itself with a newer version of the script!

Coming from a C++ background, these seems totally illogical, but its the task i have been given...

So, to test whether this is even possible, I wrote the following test program:
self_update.php
<?php
define( 'MESSAGE_1', 'i like the rice' );
define( 'MESSAGE_2', 'the rice is nice' );

define( "MESSAGE", MESSAGE_2 );

echo MESSAGE."\n";

$self = "./self_update.php";
$contents = @file_get_contents( $self );

$string_1 = "define( \"MESSAGE\", MESSAGE_1 );";
$string_2 = "define( \"MESSAGE\", MESSAGE_2 );";

if( strpos( $contents, $string_1 ) !== false )
   $contents = str_replace( $string_1, $string_2, $contents );
else
   $contents = str_replace( $string_2, $string_1, $contents );

$fp = @fopen( $self, 'w' );
fwrite( $fp, $contents );
fclose( $fp );
?>

I have only been able to test this on Windows. On WinXP it works, each time you run the script it outputs a different message, because it has overwritten itself with a new script.

Does anyone know if this will also work on Linux/Unix? Or will the file be locked?

If anyone can try out my test script on their system and tell me if it works, that would be great!




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users