_resetError();
$err_no = 0;
$err_msg = “”;
$this->controlSocket = @fsockopen($host, $port, $err\_no, $err\_msg, $timeout) or $this->_setError(-1,”fsockopen failed”);
if ($err\_no<>0) $this->setError($err\_no,$err_msg);
if ($this->_isError()) return false;
@socket\_set\_timeout($this->controlSocket,$timeout) or $this->\_setError(-1,”socket\_set_timeout failed”);
if ($this->_isError()) return false;
$this->_waitForResult();
if ($this->_isError()) return false;
return $this->getLastResult() == FTP\_SERVICE\_READY;
}
function isConnected() {
return $this->controlSocket != NULL;
}
function disconnect() {
if (!$this->isConnected()) return;
@fclose($this->controlSocket);
}
function close() { //Closes an FTP connection
$this->disconnect();
}
function login($user, $pass) { //Logs in to an FTP connection
$this->_resetError();
$this->_printCommand(“USER $user”);
if ($this->_isError()) return false;
$this->_waitForResult();
if ($this->_isError()) return false;
if ($this->getLastResult() == FTP\_PASSWORD\_NEEDED){
$this->_printCommand(“PASS $pass”);
if ($this->_isError()) return FALSE;
$this->_waitForResult();
if ($this->_isError()) return FALSE;
}
$result = $this->getLastResult() == FTP\_USER\_LOGGED_IN;
return $result;
}
function cdup() { //Changes to the parent directory
$this->_resetError();
$this->_printCommand(“CDUP”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND_OK);
}
function cwd($path) {
$this->_resetError();
$this->_printCommand(“CWD $path”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND_OK);
}
function cd($path) {
return $this->cwd($path);
}
function chdir($path) { //Changes directories on a FTP server
return $this->cwd($path);
}
function chmod($mode,$filename) { //Set permissions on a file via FTP
return $this->site(“CHMOD $mode $filename”);
}
function delete($filename) { //Deletes a file on the FTP server
$this->_resetError();
$this->_printCommand(“DELE $filename”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND_OK);
}
function exec($cmd) { //Requests execution of a program on the FTP server
return $this->site(“EXEC $cmd”);
}
function fget($fp,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server and saves to an open file
$this->_resetError();
$type = “I”;
if ($mode==FTP_ASCII) $type = “A”;
$this->_printCommand(“TYPE $type”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
$result = $this->_download(“RETR $remote”);
if ($result) {
fwrite($fp,$result);
}
return $result;
}
function fput($remote,$resource,$mode=FTP_BINARY,$startpos=0) { //Uploads from an open file to the FTP server
$this->_resetError();
$type = “I”;
if ($mode==FTP_ASCII) $type = “A”;
$this->_printCommand(“TYPE $type”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
if ($startpos>0) fseek($resource,$startpos);
$result = $this->_uploadResource(“STOR $remote”,$resource);
return $result;
}
function get_option($option) { //Retrieves various runtime behaviours of the current FTP stream
$this->_resetError();
switch ($option) {
case “FTP\_TIMEOUT\_SEC” : return FTP_TIMEOUT;
case “PHP\_FTP\_OPT_AUTOSEEK” : return FALSE;
}
setError(-1,”Unknown option: $option”);
return false;
}
function get($locale,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server
if (!($fp = @fopen($locale,”wb”))) return FALSE;
$result = $this->fget($fp,$remote,$mode,$resumepos);
@fclose($fp);
if (!$result) @unlink($locale);
return $result;
}
function mdtm($name) { //Returns the last modified time of the given file
$this->_resetError();
$this->_printCommand(“MDTM $name”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
if ($lr!=FTP\_FILE\_STATUS) return FALSE;
$subject = trim(substr($this->lastLine,4));
$lucifer = array();
if (preg_match(“/(\[0-9\]\[0-9\]\[0-9\]\[0-9\])(\[0-9\]\[0-9\])(\[0-9\]\[0-9\])(\[0-9\]\[0-9\])(\[0-9\]\[0-9\])(\[0-9\]\[0-9\])/”,$subject,$lucifer)) return mktime($lucifer[4],$lucifer[5],$lucifer[6],$lucifer[2],$lucifer[3],$lucifer[1],0);
return FALSE;
}
function mkdir($name) { //Creates a directory
$this->_resetError();
$this->_printCommand(“MKD $name”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_PATHNAME || $lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND\_OK);
}
function nb_continue() { //Continues retrieving/sending a file (non-blocking)
$this->_resetError();
// todo
}
function nb_fget() { //Retrieves a file from the FTP server and writes it to an open file (non-blocking)
$this->_resetError();
// todo
}
function nb_fput() { //Stores a file from an open file to the FTP server (non-blocking)
$this->_resetError();
// todo
}
function nb_get() { //Retrieves a file from the FTP server and writes it to a local file (non-blocking)
$this->_resetError();
// todo
}
function nb_put() { //Stores a file on the FTP server (non-blocking)
$this->_resetError();
// todo
}
function nlist($remote_filespec=””) { //Returns a list of files in the given directory
$this->_resetError();
$result = $this->\_download(trim(“NLST $remote\_filespec”));
return ($result !== FALSE) ? explode(“\n”,str_replace(“\r”,””,trim($result))) : $result;
}
function pasv($pasv) { //Turns passive mode on or off
if (!$pasv) {
$this->_setError(“Active (PORT) mode is not supported”);
return false;
}
return true;
}
function put($remote,$local,$mode=FTP_BINARY,$startpos=0) { //Uploads a file to the FTP server
if (!($fp = @fopen($local,”rb”))) return FALSE;
$result = $this->fput($remote,$fp,$mode,$startpos);
@fclose($fp);
return $result;
}
function pwd() { //Returns the current directory name
$this->_resetError();
$this->_printCommand(“PWD”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
if ($lr!=FTP_PATHNAME) return FALSE;
$subject = trim(substr($this->lastLine,4));
$lucifer = array();
if (preg_match(“/\”(.*)\”/”,$subject,$lucifer)) return $lucifer[1];
return FALSE;
}
function quit() { //Alias of close
$this->close();
}
function raw($cmd) { //Sends an arbitrary command to an FTP server
$this->_resetError();
$this->_printCommand($cmd);
$this->_waitForResult();
$this->getLastResult();
return array($this->lastLine);
}
function rawlist($remote_filespec=””) { //Returns a detailed list of files in the given directory
$this->_resetError();
$result = $this->\_download(trim(“LIST $remote\_filespec”));
return ($result !== FALSE) ? explode(“\n”,str_replace(“\r”,””,trim($result))) : $result;
}
function ls($remote_filespec=””) { //Returns a parsed rawlist in an assoc array
$a = $this->rawlist($remote_filespec);
if (!$a) return $a;
$systype = $this->systype();
$is_windows = stristr($systype,”WIN”)!==FALSE;
$b = array();
while (list($i,$line) = each($a)) {
if ($is\_windows && preg\_match(“/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|
) +(.+)/”,$line,$lucifer)) {
$b[$i] = array();
if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
$b\[$i\]\[‘isdir’\] = ($lucifer[7]==””);
$b\[$i\]\[‘size’\] = $lucifer[7];
$b\[$i\]\[‘month’\] = $lucifer[1];
$b\[$i\]\[‘day’\] = $lucifer[2];
$b\[$i\]\[‘year’\] = $lucifer[3];
$b\[$i\]\[‘hour’\] = $lucifer[4];
$b\[$i\]\[‘minute’\] = $lucifer[5];
$b\[$i\]\[‘time’\] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],”PM”)==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
$b\[$i\]\[‘am/pm’\] = $lucifer[6];
$b\[$i\]\[‘name’\] = $lucifer[8];
} else if (!$is\_windows && $lucifer=preg\_split(“/[ ]/”,$line,9,PREG\_SPLIT\_NO_EMPTY)) {
echo $line.”\n”;
$lcount=count($lucifer);
if ($lcount<8) continue;
$b[$i] = array();
$b\[$i\]\[‘isdir’\] = $lucifer[0]{0} === “d”;
$b\[$i\]\[‘islink’\] = $lucifer[0]{0} === “l”;
$b\[$i\]\[‘perms’\] = $lucifer[0];
$b\[$i\]\[‘number’\] = $lucifer[1];
$b\[$i\]\[‘owner’\] = $lucifer[2];
$b\[$i\]\[‘group’\] = $lucifer[3];
$b\[$i\]\[‘size’\] = $lucifer[4];
if ($lcount==8) {
sscanf($lucifer\[5],”%d-%d-%d”,$b[$i\]\[‘year’\],$b\[$i\]\[‘month’\],$b\[$i\]\[‘day’\]);
sscanf($lucifer\[6],”%d:%d”,$b[$i\]\[‘hour’\],$b\[$i\]\[‘minute’\]);
$b\[$i\]\[‘time’\] = @mktime($b\[$i\]\[‘hour’\],$b\[$i\]\[‘minute’\],0,$b\[$i\]\[‘month’\],$b\[$i\]\[‘day’\],$b\[$i\]\[‘year’\]);
$b\[$i\]\[‘name’\] = $lucifer[7];
} else {
$b\[$i\]\[‘month’\] = $lucifer[5];
$b\[$i\]\[‘day’\] = $lucifer[6];
if (preg_match(“/([0-9]{2}):([0-9]{2})/”,$lucifer[7],$l2)) {
$b\[$i\]\[‘year’\] = date(“Y”);
$b\[$i\]\[‘hour’\] = $l2[1];
$b\[$i\]\[‘minute’\] = $l2[2];
} else {
$b\[$i\]\[‘year’\] = $lucifer[7];
$b\[$i\]\[‘hour’\] = 0;
$b\[$i\]\[‘minute’\] = 0;
}
$b\[$i\]\[‘time’\] = strtotime(sprintf(“%d %s %d %02d:%02d”,$b\[$i\]\[‘day’\],$b\[$i\]\[‘month’\],$b\[$i\]\[‘year’\],$b\[$i\]\[‘hour’\],$b\[$i\]\[‘minute’\]));
$b\[$i\]\[‘name’\] = $lucifer[8];
}
}
}
return $b;
}
function rename($from,$to) { //Renames a file on the FTP server
$this->_resetError();
$this->_printCommand(“RNFR $from”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
$this->_printCommand(“RNTO $to”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND_OK);
}
function rmdir($name) { //Removes a directory
$this->_resetError();
$this->_printCommand(“RMD $name”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return ($lr==FTP\_FILE\_ACTION\_OK || $lr==FTP\_COMMAND_OK);
}
function set_option() { //Set miscellaneous runtime FTP options
$this->_resetError();
$this->\_setError(-1,”set\_option not supported”);
return false;
}
function site($cmd) { //Sends a SITE command to the server
$this->_resetError();
$this->_printCommand(“SITE $cmd”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return true;
}
function size($name) { //Returns the size of the given file
$this->_resetError();
$this->_printCommand(“SIZE $name”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return $lr==FTP\_FILE\_STATUS ? trim(substr($this->lastLine,4)) : FALSE;
}
function ssl_connect() { //Opens an Secure SSL-FTP connection
$this->_resetError();
$this->\_setError(-1,”ssl\_connect not supported”);
return false;
}
function systype() { // Returns the system type identifier of the remote FTP server
$this->_resetError();
$this->_printCommand(“SYST”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
return $lr==FTP\_NAME\_SYSTEM_TYPE ? trim(substr($this->lastLine,4)) : FALSE;
}
function getLastResult() {
$this->newResult = FALSE;
return $this->lastResult;
}
/\* private \*/
function _hasNewResult() {
return $this->newResult;
}
/\* private \*/
function _waitForResult() {
while(!$this->\_hasNewResult() && $this->\_readln()!==FALSE && !$this->_isError()) { /\* noop \*/ }
}
/\* private \*/
function _readln() {
$line = fgets($this->controlSocket);
if ($line === FALSE) {
$this->\_setError(-1,”fgets failed in \_readln”);
return FALSE;
}
if (strlen($line)==0) return $line;
$lucifer = array();
if (preg_match(“/^\[0-9\]\[0-9\][0-9] /”,$line,$lucifer)) {
//its a resultline
$this->lastResult = intval($lucifer[0]);
$this->newResult = TRUE;
if (substr($lucifer[0],0,1)==’5′) {
$this->_setError($this->lastResult,trim(substr($line,4)));
}
}
$this->lastLine = trim($line);
$this->lastLines[] = “< “.trim($line);
return $line;
}
/\* private \*/
function _printCommand($line) {
$this->lastLines[] = “> “.$line;
fwrite($this->controlSocket,$line.”\r\n”);
fflush($this->controlSocket);
}
/\* private \*/
function _pasv() {
$this->_resetError();
$this->_printCommand(“PASV”);
$this->_waitForResult();
$lr = $this->getLastResult();
if ($this->_isError()) return FALSE;
if ($lr!=FTP\_PASSIVE\_MODE) return FALSE;
$subject = trim(substr($this->lastLine,4));
$lucifer = array();
if (preg_match(“/\\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\\)/”,$subject,$lucifer)) {
$this->pasvAddr=$lucifer;
$host = sprintf(“%d.%d.%d.%d”,$lucifer[1],$lucifer[2],$lucifer[3],$lucifer[4]);
$port = $lucifer[5]*256 + $lucifer[6];
$err_no=0;
$err_msg=””;
$passiveConnection = fsockopen($host,$port,$err\_no,$err\_msg, FTP_TIMEOUT);
if ($err_no!=0) {
$this->\_setError($err\_no,$err_msg);
return FALSE;
}
return $passiveConnection;
}
return FALSE;
}
/\* private \*/
function _download($cmd) {
if (!($passiveConnection = $this->_pasv())) return FALSE;
$this->_printCommand($cmd);
$this->_waitForResult();
$lr = $this->getLastResult();
if (!$this->_isError()) {
$result = “”;
while (!feof($passiveConnection)) {
$result .= fgets($passiveConnection);
}
fclose($passiveConnection);
$this->_waitForResult();
$lr = $this->getLastResult();
return ($lr==FTP\_FILE\_TRANSFER\_OK) || ($lr==FTP\_FILE\_ACTION\_OK) || ($lr==FTP\_COMMAND\_OK) ? $result : FALSE;
} else {
fclose($passiveConnection);
return FALSE;
}
}
/\* upload \*/
function _uploadResource($cmd,$resource) {
if (!($passiveConnection = $this->_pasv())) return FALSE;
$this->_printCommand($cmd);
$this->_waitForResult();
$lr = $this->getLastResult();
if (!$this->_isError()) {
$result = “”;
while (!feof($resource)) {
$buf = fread($resource,1024);
fwrite($passiveConnection,$buf);
}
fclose($passiveConnection);
$this->_waitForResult();
$lr = $this->getLastResult();
return ($lr==FTP\_FILE\_TRANSFER\_OK) || ($lr==FTP\_FILE\_ACTION\_OK) || ($lr==FTP\_COMMAND\_OK) ? $result : FALSE;
} else {
fclose($passiveConnection);
return FALSE;
}
}
/\* private \*/
function _resetError() {
$this->error_no = NULL;
$this->error_msg = NULL;
}
/\* private \*/
function _setError($no,$msg) {
if (is\_array($this->error\_no)) {
$this->error_no[] = $no;
$this->error_msg[] = $msg;
} else if ($this->error_no!=NULL) {
$this->error\_no = array($this->error\_no,$no);
$this->error\_msg = array($this->error\_msg,$msg);
} else {
$this->error_no = $no;
$this->error_msg = $msg;
}
}
/\* private \*/
function _isError() {
return ($this->error\_no != NULL) && ($this->error\_no !== 0);
}
}
//echo “argv[] = “;
//print_r($argv); // just to see what was passed in
if ($argc > 0)
{
for ($i=1;$i < $argc;$i++)
{
parse_str($argv[$i],$tmp);
$\_REQUEST = array\_merge($_REQUEST, $tmp);
}
}
//echo “\$_REQUEST = “;
//print\_r($\_REQUEST);
$backup_dir = ‘/var/backup’;
$www= ‘/var/www’;
$db=’/var/db/mysql’;
$etc= ‘/usr/local/etc’;
$dates = date(“Ymd”);
$filename\_www = $backup\_dir.’/’.$dates.’www.tar.gz’;
$filename\_db = $backup\_dir.’/’.$dates.’db.tar.gz’;
$filename\_etc = $backup\_dir.’/’.$dates.’etc.tar.gz’;
$ftp_www = $dates.’www.tar.gz’;
$ftp_db = $dates.’db.tar.gz’;
$ftp_etc = $dates.’etc.tar.gz’;
if (file\_exists($backup\_dir)) {
echo “備份目錄存在 $filename 開始備份 www 備份到 $filename_www \n”;
} else {
echo “備份目錄不存在 $backup_dir \n”;
mkdir($backup_dir, 755);
echo “\n 備份目錄建立 開始備份 $www 備份到 $filename_www \n”;
}
$run = ‘tar -zcpf ‘.$filename_www.’ ‘.$www.’ > /dev/null’;
$output = shell_exec($run);
echo “\n 備份資料庫 開始備份 $db 備份到 $filename_db \n”;
$run = ‘/usr/local/etc/rc.d/mysql-server stop > /dev/null’;
$output = shell_exec($run);
echo “\n mysql 停止 \n”;
$run = ‘tar -zcpf ‘.$filename_db.’ ‘.$db.’ > /dev/null’;
$output = shell_exec($run);
$run = ‘/usr/local/etc/rc.d/mysql-server start > /dev/null’;
$output = shell_exec($run);
echo “\n mysql 啟動 \n”;
echo “\n 設定檔備份 $etc 備份到 $filename_etc \n”;
$run = ‘tar -zcpf ‘.$filename_etc.’ ‘.$etc.’ > /dev/null’;
$output = shell_exec($run);
$ftp_server = “ip”;
$ftp_user = “backup”;
$ftp_passwd = “passwd”;
echo “連線到 $ftp\_server $ftp\_user $ftp_passwd \n”;
/\* direct object methods \*/
$ftp =& new FTP();
if ($ftp->connect($ftp_server)) {
if ($ftp->login($ftp\_user,$ftp\_passwd)) {
echo “\n”.$ftp->sysType() . “\n”;
echo $ftp->pwd() . “\n”;
$ftp->put($ftp\_www,$filename\_www );
$ftp->put($ftp\_db,$filename\_db );
$ftp->put($ftp\_etc,$filename\_etc );
} else {
echo “連線失敗: “;
print\_r($ftp->error\_no);
print\_r($ftp->error\_msg);
}
$ftp->disconnect();
$end=$ftp->lastLines;
} else {
echo “連線失敗: “;
print\_r($ftp->error\_no);
print\_r($ftp->error\_msg);
}
echo “$end \n”;
?>