86400 ) { try { $latestVer = self::getLatestVersion(); if ( Util::betterVersionCompare($latestVer, $localVer, '<') ) { self::downloadVersion($latestVer); } } catch ( LSCMException $e ) { Logger::error($e->getMessage()); } touch($dashVerFile); } } /** * * @since 1.9 * * @return string * * @throws LSCMException Thrown when unable to retrieve latest Dash * Notifier plugin version. */ public static function getLatestVersion() { $content = Util::get_url_contents( 'https://www.litespeedtech.com/packages/lswpcache/dash_latest' ); if ( empty($content) ) { throw new LSCMException( 'Could not retrieve latest Dash Notifier plugin version' ); } return trim($content); } /** * * @since 1.9 * * @param string $version * * @throws LSCMException Thrown indirectly by self::wgetPlugin() call. */ protected static function downloadVersion( $version ) { $pluginDir = Context::LOCAL_PLUGIN_DIR . '/' . self::PLUGIN_NAME; if ( file_exists($pluginDir) ) { exec("/bin/rm -rf $pluginDir"); } self::wgetPlugin($version, true); } /** * * @since 1.9 * * @param string $version * @param bool $saveMD5 * * @throws LSCMException Thrown when wget command fails to download * requested Dash Notifier plugin version. * @throws LSCMException Thrown when unable to unzip downloaded Dash * Notifier plugin package. * @throws LSCMException Thrown when downloaded Dash Notifier plugin * package is missing an expected file. * @throws LSCMException Thrown indirectly by Logger::info() call. * @throws LSCMException Thrown indirectly by Util::unzipFile() call. */ protected static function wgetPlugin( $version, $saveMD5 = false ) { Logger::info("Downloading Dash Notifier v$version..."); $zipFileName = self::PLUGIN_NAME . ".$version.zip"; exec( "wget -q --tries=1 --no-check-certificate " . "https://downloads.wordpress.org/plugin/$zipFileName -P " . Context::LOCAL_PLUGIN_DIR, $output, $return_var ); if ( $return_var !== 0 ) { throw new LSCMException( "Failed to download Dash Notifier v$version with wget exit " . "status $return_var.", LSCMException::E_NON_FATAL ); } $localZipFile = Context::LOCAL_PLUGIN_DIR . "/$zipFileName"; $extracted = Util::unzipFile($localZipFile, Context::LOCAL_PLUGIN_DIR); unlink($localZipFile); if ( ! $extracted ) { throw new LSCMException( "Unable to unzip $localZipFile", LSCMException::E_NON_FATAL ); } $pluginDir = Context::LOCAL_PLUGIN_DIR . '/' . self::PLUGIN_NAME; if ( ! file_exists("$pluginDir/" . self::PLUGIN_NAME . '.php') ) { throw new LSCMException( "Unable to download Dash Notifier v$version.", LSCMException::E_NON_FATAL ); } if ( $saveMD5 ) { file_put_contents( Context::LOCAL_PLUGIN_DIR . '/' . self::DASH_MD5, Util::DirectoryMd5($pluginDir) ); } file_put_contents( Context::LOCAL_PLUGIN_DIR . '/' . self::VER_FILE, $version ); } /** * Check if WordPress installation should be notified using the Dash * Notifier plugin. * * @param string $wpPath Root directory for WordPress installation. * * @return bool */ public static function canNotify( $wpPath ) { return !file_exists("$wpPath/" . self::BYPASS_FLAG); } /** * Checks the current installation for existing LSCWP plugin files and * copies them to the installation's plugins directory if not found. * This function should only be run as the user. * * @return bool True when new Dash Notifier plugin files are used. * * @throws LSCMException Thrown when unable to copy Dash Notifier plugin * files to WordPress plugin directory. * @throws LSCMException Thrown indirectly by Logger::debug() call. */ public static function prepareUserInstall() { $pluginDir = WpConstants::getWpConstant('WP_PLUGIN_DIR'); $dashNotifierPlugin = "$pluginDir/dash-notifier/dash-notifier.php"; if ( file_exists($dashNotifierPlugin) ) { /** * Existing installation detected. */ return false; } exec( '/bin/cp -rf ' . Context::LOCAL_PLUGIN_DIR . '/' . self::PLUGIN_NAME . " $pluginDir" ); if ( !file_exists($dashNotifierPlugin) ) { throw new LSCMException( "Failed to copy Dash Notifier plugin files to $pluginDir.", LSCMException::E_NON_FATAL ); } Logger::debug( 'Copied Dash Notifier plugin files into plugins directory ' . $pluginDir ); return true; } /** * Activate Dash Notifier plugin if it is not already activated, and give * the plugin any notification data in the form of a JSON encoded array. * * @param string $jsonInfo Dash Notifier plugin info. * * @return bool * * @throws LSCMException Thrown when unable to find Dash Notifier plugin * files. */ public static function doNotify( $jsonInfo ) { if ( file_exists( WpConstants::getWpConstant('WP_PLUGIN_DIR') . '/' . self::DASH_PLUGIN ) ) { /** * Used to pass info to the Dash Notifier Plugin. */ Util::define_wrapper( 'DASH_NOTIFIER_MSG', $jsonInfo); if ( !WpFuncs::isPluginActive(self::DASH_PLUGIN) ) { /** * Should not check directly, can error on success due to object * cache. */ WpFuncs::activatePlugin(self::DASH_PLUGIN); if ( !WpFuncs::isPluginActive(self::DASH_PLUGIN) ) { return false; } } else { include WpConstants::getWpConstant('WP_PLUGIN_DIR') . '/' . self::DASH_PLUGIN; } } else { throw new LSCMException( 'Dash Notifier plugin files are missing. Cannot notify.', LSCMException::E_NON_FATAL ); } return true; } /** * * @param bool $uninstall */ public static function deactivate( $uninstall ) { WpFuncs::deactivatePlugins(self::DASH_PLUGIN); if ( $uninstall ) { //add some msg about having removed plugin files? WpFuncs::deletePlugins(array( self::DASH_PLUGIN )); } } }