web/wp-content/plugins/duplicator/duplicator.php
changeset 195 c7c0fbc09788
child 204 09a1c134465b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/duplicator/duplicator.php	Mon Dec 03 16:30:36 2012 -0800
@@ -0,0 +1,304 @@
+<?php
+/*
+Plugin Name: Duplicator
+Plugin URI: http://www.lifeinthegrid.com/duplicator/
+Description: Create a full WordPress backup of your files and database with one click. Duplicate and move an entire site from one location to another in 3 easy steps. Create full snapshot of your site at any point in time.
+Version: 0.3.2
+Author: LifeInTheGrid
+Author URI: http://www.lifeinthegrid.com
+License: GPLv2 or later
+*/
+
+/* ================================================================================ 
+Copyright 2011-2012  Cory Lamle 
+Copyright 2011  Gaurav Aggarwal  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License, version 2, as 
+published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+	
+Contributors:
+ Many thanks go out to Gaurav Aggarwal for starting the Backup and Move Plugin.
+ This project is a fork of that project see backup-and-move for more details.		
+
+================================================================================ */
+
+require_once("define.php");
+
+if (is_admin() == true) {
+	
+	$_tmpDuplicatorOptions = get_option('duplicator_options', false);
+	$GLOBALS['duplicator_opts'] = ($_tmpDuplicatorOptions == false) ? array() : @unserialize($_tmpDuplicatorOptions);
+	
+	//OPTIONS
+	$GLOBALS['duplicator_opts']['dbhost']		= isset($GLOBALS['duplicator_opts']['dbhost'])			? $GLOBALS['duplicator_opts']['dbhost']			: '';
+	$GLOBALS['duplicator_opts']['dbname']		= isset($GLOBALS['duplicator_opts']['dbname'])			? $GLOBALS['duplicator_opts']['dbname']			: '';
+	$GLOBALS['duplicator_opts']['dbuser']		= isset($GLOBALS['duplicator_opts']['dbuser'])			? $GLOBALS['duplicator_opts']['dbuser'] 		: '';
+	$GLOBALS['duplicator_opts']['dbiconv']		= isset($GLOBALS['duplicator_opts']['dbiconv'])			? $GLOBALS['duplicator_opts']['dbiconv']		: '1';
+	$GLOBALS['duplicator_opts']['dbadd_drop']	= isset($GLOBALS['duplicator_opts']['dbadd_drop'])		? $GLOBALS['duplicator_opts']['dbadd_drop']     : '0';
+	$GLOBALS['duplicator_opts']['nurl']  		= isset($GLOBALS['duplicator_opts']['nurl'] ) 			? $GLOBALS['duplicator_opts']['nurl']  			: '';
+	$GLOBALS['duplicator_opts']['email-me']		= isset($GLOBALS['duplicator_opts']['email-me'])		? $GLOBALS['duplicator_opts']['email-me']		: '0';
+	$GLOBALS['duplicator_opts']['log_level'] 	= isset($GLOBALS['duplicator_opts']['log_level'])		? $GLOBALS['duplicator_opts']['log_level']  	: '0';
+	$GLOBALS['duplicator_opts']['max_time']		= is_numeric($GLOBALS['duplicator_opts']['max_time'])	? $GLOBALS['duplicator_opts']['max_time']   	: 1000;
+	$GLOBALS['duplicator_opts']['max_memory']	= isset($GLOBALS['duplicator_opts']['max_memory'])  	? $GLOBALS['duplicator_opts']['max_memory'] 	: '1000M';
+	$GLOBALS['duplicator_opts']['email_others']	= isset($GLOBALS['duplicator_opts']['email_others']) 	? $GLOBALS['duplicator_opts']['email_others']	: '';
+	$GLOBALS['duplicator_opts']['skip_ext']		= isset($GLOBALS['duplicator_opts']['skip_ext'])  		? $GLOBALS['duplicator_opts']['skip_ext'] 		: '';
+	$GLOBALS['duplicator_opts']['dir_bypass']	= isset($GLOBALS['duplicator_opts']['dir_bypass'])		? $GLOBALS['duplicator_opts']['dir_bypass']		: '';
+	$GLOBALS['duplicator_opts']['rm_snapshot']  = isset($GLOBALS['duplicator_opts']['rm_snapshot']) 	? $GLOBALS['duplicator_opts']['rm_snapshot'] 	: '1';
+	
+	//Default Arrays
+	$GLOBALS['duplicator_bypass-array']	  = explode(";", $GLOBALS['duplicator_opts']['dir_bypass'], -1);
+	$GLOBALS['duplicator_bypass-array']   = count($GLOBALS['duplicator_bypass-array']) 			  ? $GLOBALS['duplicator_bypass-array'] 			      : null;
+	$GLOBALS['duplicator_skip_ext-array'] = explode(";", $GLOBALS['duplicator_opts']['skip_ext']) ? explode(";", $GLOBALS['duplicator_opts']['skip_ext']) : array();
+
+	require_once 'inc/functions.php';
+	require_once 'inc/class.zip.php';
+	require_once 'inc/actions.php';
+	
+	/* ACTIVATION 
+	Only called when plugin is activated */
+	function duplicator_activate() {
+
+		global $wpdb;
+		$table_name = $wpdb->prefix . "duplicator";
+		
+		//PRIMARY KEY must have 2 spaces before for dbDelta
+		$sql = "CREATE TABLE `{$table_name}` (
+		 id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT  PRIMARY KEY,
+		 token 	 	 VARCHAR(25) NOT NULL, 
+		 packname 	 VARCHAR(250) NOT NULL, 
+		 zipname 	 VARCHAR(250) NOT NULL, 
+		 zipsize 	 INT (11),
+		 created 	 DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+		 owner 		 VARCHAR(60) NOT NULL,
+		 settings 	 LONGTEXT NOT NULL)" ;
+
+		require_once(DUPLICATOR_WPROOTPATH . 'wp-admin/includes/upgrade.php');
+		@dbDelta($sql);
+		
+		$duplicator_opts = array(
+			'dbhost'		=>'localhost',
+			'dbname'		=>'',
+			'dbuser'		=>'',
+			'nurl'			=>'',
+			'email-me'		=>"{$GLOBALS['duplicator_opts']['email-me']}",
+			'email_others'	=>"{$GLOBALS['duplicator_opts']['email_others']}",
+			'max_time'		=>$GLOBALS['duplicator_opts']['max_time'],
+			'max_memory'	=>$GLOBALS['duplicator_opts']['max_memory'],
+			'dir_bypass'	=>"{$GLOBALS['duplicator_opts']['dir_bypass']}",
+			'log_level'		=>'0',
+			'dbiconv'		=>"{$GLOBALS['duplicator_opts']['dbiconv']}",
+			'skip_ext'		=>"{$GLOBALS['duplicator_opts']['skip_ext']}",
+			'rm_snapshot'	=>"{$GLOBALS['duplicator_opts']['rm_snapshot']}");
+				
+		update_option('duplicator_version_plugin', 	DUPLICATOR_VERSION);
+		update_option('duplicator_options', serialize($duplicator_opts));
+
+		//CLEANUP LEGACY
+		//PRE 0.2.9
+		delete_option('duplicator_version_database');
+		$wpdb->query("ALTER TABLE `{$table_name}` CHANGE bid id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT");
+		$wpdb->query("ALTER TABLE `{$table_name}` DROP COLUMN ver_db");
+		$wpdb->query("ALTER TABLE `{$table_name}` DROP COLUMN ver_plug");
+		$wpdb->query("ALTER TABLE `{$table_name}` DROP COLUMN status");
+		$wpdb->query("ALTER TABLE `{$table_name}` DROP COLUMN type");	
+		
+		//Setup All Directories
+		duplicator_init_snapshotpath();
+	}
+	
+	/* UPDATE 
+	register_activation_hook is not called when a plugin is updated
+	so we need to use the following function */
+	function duplicator_update() {
+		if (DUPLICATOR_VERSION != get_option("duplicator_version_plugin")) {
+			duplicator_activate();
+		}
+	}
+
+
+	/* DEACTIVATION 
+	Only called when plugin is deactivated */
+	function duplicator_deactivate() {
+		//No actions needed yet
+	}
+	
+	
+	/* UNINSTALL 
+	Uninstall all duplicator logic */
+	function duplicator_uninstall() {
+		global $wpdb;
+		$table_name = $wpdb->prefix . "duplicator";
+		$wpdb->query("DROP TABLE `{$table_name}`");
+	
+		delete_option('duplicator_version_plugin');
+		delete_option('duplicator_options');
+		
+		if ($GLOBALS['duplicator_opts']['rm_snapshot']) {
+		
+			$ssdir = duplicator_safe_path(DUPLICATOR_SSDIR_PATH);
+		
+			//Sanity check for strange setup
+			$check = glob("{$ssdir}/wp-config.php");
+			if (count($check) == 0) {
+
+				//PHP is sometimes flaky so lets do a sanity check
+				foreach (glob("{$ssdir}/*_database.sql")  as $file) { if (strstr($file, '_database.sql'))  {@unlink("{$file}");} }
+				foreach (glob("{$ssdir}/*_installer.php") as $file) { if (strstr($file, '_installer.php')) {@unlink("{$file}");} }
+				foreach (glob("{$ssdir}/*_package.zip")   as $file) { if (strstr($file, '_package.zip'))   {@unlink("{$file}");} }
+				foreach (glob("{$ssdir}/*.log") as $file) 			{ if (strstr($file, '.log'))   		   {@unlink("{$file}");} }
+				
+				//Check for core files and only continue removing data if the snapshots directory
+				//has not been edited by 3rd party sources, this helps to keep the system stable
+				$files = glob("{$ssdir}/*");
+				if(is_array($files) && count($files) == 3)
+				{
+					$defaults = array("{$ssdir}/index.php", "{$ssdir}/robots.txt", "{$ssdir}/dtoken.php");
+					$compare = array_diff($defaults, $files);
+					
+					if (count($compare) == 0) {
+						foreach($defaults as $file) {@unlink("{$file}");}
+						@unlink("{$ssdir}/.htaccess");
+						@rmdir($ssdir);
+					}
+				//No packages have ever been created
+				} else if(is_array($files) && count($files) == 1) {
+					$defaults = array("{$ssdir}/index.php");
+					$compare  = array_diff($defaults, $files);
+					if (count($compare) == 0) {
+						@unlink("{$ssdir}/index.php");
+						@rmdir($ssdir);
+					}
+				} 
+			
+			}
+		}
+	}
+	
+	
+	/* META LINK ADDONS
+	Adds links to the plugins manager page */
+	function duplicator_meta_links( $links, $file ) {
+		$plugin = plugin_basename(__FILE__);
+		// create link
+		if ( $file == $plugin ) {
+			$links[] = '<a href="' . DUPLICATOR_HELPLINK . '" title="' . __( 'FAQ', 'wpduplicator' ) . '" target="_blank">' . __( 'FAQ', 'wpduplicator' ) . '</a>';
+			$links[] = '<a href="' . DUPLICATOR_GIVELINK . '" title="' . __( 'Partner', 'wpduplicator' )  . '" target="_blank">' . __( 'Partner', 'wpduplicator' )  . '</a>';
+			$links[] = '<a href="' . DUPLICATOR_CERTIFIED .'" title="' . __( 'Approved Hosts', 'wpduplicator'  ) . '"  target="_blank">' . __( 'Approved Hosts', 'wpduplicator'  ) . '</a>';
+			return $links;
+		}
+		return $links;
+	}
+	
+	//HOOKS & ACTIONS
+	load_plugin_textdomain('wpduplicator' , FALSE, basename( dirname( __FILE__ ) ) . '/lang/' );
+	register_activation_hook(__FILE__ ,	    'duplicator_activate');
+	register_deactivation_hook(__FILE__ ,	'duplicator_deactivate');
+	register_uninstall_hook(__FILE__ , 		'duplicator_uninstall');
+	
+	add_action('plugins_loaded', 						'duplicator_update');
+	add_action('admin_init', 							'duplicator_init' );
+	add_action('admin_menu', 							'duplicator_menu');
+	add_action('wp_ajax_duplicator_system_check',		'duplicator_system_check');
+	add_action('wp_ajax_duplicator_system_directory',	'duplicator_system_directory');
+	add_action('wp_ajax_duplicator_delete',				'duplicator_delete');
+	add_action('wp_ajax_duplicator_create',				'duplicator_create');
+	add_action('wp_ajax_duplicator_settings',			'duplicator_settings');
+	add_filter('plugin_action_links', 					'duplicator_manage_link', 10, 2 );
+	add_filter('plugin_row_meta', 						'duplicator_meta_links', 10, 2 );
+
+
+	/**
+	 *  DUPLICATOR_INIT
+	 *  Init routines  */
+	function duplicator_init() {
+	   /* Register our stylesheet. */
+	   wp_register_style('jquery-ui', 		  DUPLICATOR_PLUGIN_URL . 'css/jquery-ui.css', null , "1.8.21" );
+	   wp_register_style('duplicator_style',  DUPLICATOR_PLUGIN_URL . 'css/style.css' );
+	}
+
+	/**
+	 *  DUPLICATOR_VIEWS
+	 *  Inlcude all visual elements  */
+	function duplicator_main_page() {include 'inc/page.main.php';}
+	//Diagnostics Page
+	function duplicator_diag_page() {include 'inc/page.diag.php';}
+	//Support Page
+	function duplicator_support_page() {include 'inc/page.support.php';}
+	//All About Page
+	function duplicator_about_page() {include 'inc/page.about.php';}
+	
+	/**
+	 *  DUPLICATOR_MENU
+	 *  Loads the menu item into the WP tools section and queues the actions for only this plugin */
+	function duplicator_menu() {	
+		//Main Menu
+		$page_main = add_menu_page('Duplicator', 'Duplicator', "import", basename(__FILE__), 'duplicator_main_page', plugins_url('duplicator/img/create.png'));
+		add_submenu_page(basename(__FILE__), __('Dashboard', 'wpduplicator'),  __('Dashboard', 'wpduplicator'), "import" , basename(__FILE__), 'duplicator_main_page');
+		//Sub Menus
+		$page_diag  	= add_submenu_page(basename(__FILE__), __('Diagnostics', 'wpduplicator'), __('Diagnostics', 'wpduplicator'), 'import', 'duplicator_diag_page', 'duplicator_diag_page');
+		$page_support 	= add_submenu_page(basename(__FILE__), __('Support', 'wpduplicator'), __('Support', 'wpduplicator'), 'import', 'duplicator_support_page', 'duplicator_support_page');
+		$page_about 	= add_submenu_page(basename(__FILE__), __('All About', 'wpduplicator'), __('All About', 'wpduplicator'), 'import', 'duplicator_about_page', 'duplicator_about_page');
+		
+
+		//Apply scripts and styles
+		add_action('admin_print_scripts-' . $page_main, 'duplicator_scripts');
+		add_action('admin_print_styles-'  . $page_main, 'duplicator_styles' );
+		add_action('admin_print_styles-'  . $page_diag, 'duplicator_styles' );
+		add_action('admin_print_styles-'  . $page_about, 'duplicator_styles' );
+		add_action('admin_print_styles-'  . $page_support, 'duplicator_styles' );
+	}
+
+	/**
+	 *  DUPLICATOR_SCRIPTS
+	 *  Loads the required javascript libs only for this plugin  */
+	function duplicator_scripts() {
+		wp_enqueue_script("jquery-ui", DUPLICATOR_PLUGIN_URL . "js/jquery-ui.min.js", array( 'jquery' ), "1.8.21");
+	}
+
+	/**
+	 *  DUPLICATOR_STYLES
+	 *  Loads the required css links only for this plugin  */
+	function duplicator_styles() {
+	   wp_enqueue_style('jquery-ui');
+	   wp_enqueue_style('duplicator_style');
+	}
+	
+	/**
+	 *  DUPLICATOR_MANAGE_LINK
+	 *  Adds the manage link in the plugins list */
+	function duplicator_manage_link($links, $file) {
+		static $this_plugin;
+		if (!$this_plugin) $this_plugin = plugin_basename(__FILE__);
+		 
+		if ($file == $this_plugin){
+			$settings_link = '<a href="admin.php?page=duplicator.php">'. __("Manage", 'wpduplicator') .'</a>';
+		    array_unshift($links, $settings_link);
+		}
+		return $links;
+	}
+	
+	//Use WordPress Debugging log file. file is written to wp-content/debug.log
+	//trace with tail command to see real-time issues.
+	if(!function_exists('duplicator_debug')){
+		function duplicator_debug( $message ) {
+			if( WP_DEBUG === true ){
+			  if( is_array( $message ) || is_object( $message ) ){
+				error_log( print_r( $message, true ) );
+			  } else {
+				error_log( $message );
+			  }
+			}
+		}
+	}
+
+}
+?>
\ No newline at end of file