PHP mirror script - server to server copying

these scripts will make an exact copy of an entire directory with all subfolders and files on a remote server.
it's the perfect tool if you move sites or if you have a site template somewhere which you want to copy over.
having to download a whole site to your desktop just to upload it again on the next server is, especially if you consider the difference between the bandwith of your server and your desktop, not the best option.

this file will copy from one server directly to the other. without FTP.
of course you have to have access to both servers, it won't get to the files remotely.
you upload the file mirror_agent.php into the directory you want to copy, and upload the file mirror_client.php to the directory where you want the mirror.

just change a single variable in mirror_client.php and load it in your browser.
and that's it basically...

mirror_agent.php - the script which lists all files

download mirror_agent.php | downloaded 2343 times | last changed 01.01.1970 01:00

01  

mirror_client.php - the script which writes the files to the server

download mirror_client.php | downloaded 833 times | last changed 22.11.2004 14:17

01 <?php
02
03 /*|----------------------------------------------------------|
04   |                                                          |
05   |                lixlpixel mirror_magic                    |
06   |                                                          |
07   |            mirror_client.php    part 2 of 2              |
08   |                                                          |
09   |              copyleft 2004 lixlpixel.com                 |
10   |                                                          |
11   |----------------------------------------------------------|
12   |-------------------- what it does ------------------------|
13   |                                                          |
14   |   this script(s) will make an exact copy of an entire    |
15   |   directory with all subfolders and files on a remote    |
16   |   server.                                                |
17   |                                                          |
18   |   it connects to its sister script mirror_agent.php      |
19   |   on the remote server and receives the data as a hex    |
20   |   string. it converts this hex data to binary and        |
21   |   writes the files to disk.                              |
22   |                                                          |
23   |   after a sucessful run the mirror_agent.php and this    |
24   |   script will delete themselves to protect from abuse.   |
25   |                                                          |
26   |----------------------------------------------------------|
27   |                                                          |
28   |     =================================================    |
29   |     WARNING ! DON'T USE ORIGINAL ! WILL DELETE ITSELF    |
30   |     =================================================    |
31   |                                                          |
32   |----------------------------------------------------------|
33   |----------------------- usage ----------------------------|
34   |                                                          |
35   |   put a COPY of this file here INSIDE a fresh new        |
36   |   directory which must be WRITEABLE by PHP.              |
37   |                                                          |
38   |   make sure you UPLOADED a copy of the mirror_agent.php  |
39   |   to the directory on the remote server which            |
40   |   you want to mirror.                                    |
41   |                                                          |
42   |   CHANGE the $mirror_agent variable below to the         |
43   |   URL of the mirror_agent.php on the REMOTE SERVER.      |
44   |                                                          |
45   |   LOAD this file in your browser - done                  |
46   |                                                          |
47   |----------------------------------------------------------|*/
48  
49  
50 /* --------------------- configuration ---------------------- */
51  
52 // set this to the URL of the mirror_agent.php on the server you want to mirror
53 $mirror_agent = 'http://www.remote.host/the_directory_to_mirror/mirror_agent.php';
54  
55 /*|----------------------------------------------------------|
56   |                                                          |
57   |           no need to edit below this line                |
58   |                                                          |
59   |----------------------------------------------------------|*/
60  
61  
62 /* --------------------- functions -------------------------- */
63  
64 // convert hex to binary
65 function hex2asc($temp)
66 {
67     for ($i = 0; $i < strlen($temp); $i += 2) $data .= chr(hexdec(substr($temp,$i,2)));
68     return $data;
69 }
70  
71 // write file to disk
72 function file_write($filename, $filecontent, $mode='wb')
73 {
74     if($fp = fopen($filename,$mode))
75     {
76         fwrite($fp, $filecontent);
77         fclose($fp);
78         return true;
79     }else{
80         return false;
81     }
82 }
83  
84 /* --------------------- the code --------------------------- */
85  
86 // disable errors ( just in case you try this script before you read the usage above )
87 error_reporting(0);
88  
89 // disable time limit ( you never know how big this site is )
90 set_time_limit(0);
91  
92 // get the hex data from mirror
93 $cont = file_get_contents($mirror_agent);
94 $files = explode("\n",$cont);
95  
96 // check if it's really the mirror_agent and if we have write permission
97 if(trim($files[0]) == 'mirror_agent here' && is_writeable(dirname(__file__)))
98 {
99     // yes - start copying
100     for($i = 1; $i < count($files); $i++)
101     {
102         if(trim($files[$i]) != '')
103         {
104             $parts = explode('|',trim($files[$i]));
105             $permissions = intval($parts[2], 8);
106             if($parts[0] == 'dir')
107             {
108                 // it's a directory - make it
109                 mkdir($parts[1],$permissions);
110                 $done[] = $permissions.'|'.$parts[1];
111             }elseif($parts[0] == 'file')
112             {
113                 // it's a file - write it down
114                 file_write($parts[1], hex2asc($files[$i+1]));
115                 chmod($parts[1],$permissions);
116                 $done[] = $permissions.'|'.$parts[1];
117                 $i++;
118             }
119         }
120     }
121     // output status
122     echo '
123 <pre>
124 following files were copied:';
125  
126     for($i = 0; $i < count($done); $i++)
127     {
128         echo '
129 '.$done[$i];
130     }
131  
132     echo '
133 </pre>';
134     
135     unlink(__file__);
136 }else{
137     // error - it's not the mirror_agent, or you didn't chmod this directory
138     echo '
139 <pre>
140 ERROR:
141 '.$mirror_agent.'
142 does not respond like a mirror_agent should or
143 the directory '.dirname(__file__).' is not writeable.
144 </pre>';
145 }
146  
147 ?>