/** * Gets wikis an IP address might have edits on * * @author Daniel Grunwell (Grunny) * @param String $ipAddress The IP address to lookup */ public static function lookupIPActivity($ipAddress) { global $wgDevelEnvironment, $wgSpecialsDB; wfProfileIn(__METHOD__); if (empty($ipAddress) || !IP::isIPAddress($ipAddress)) { wfProfileOut(__METHOD__); return false; } $result = []; $ipLong = ip2long($ipAddress); if (empty($wgDevelEnvironment)) { $dbr = wfGetDB(DB_SLAVE, [], $wgSpecialsDB); $res = $dbr->select(['multilookup'], ['ml_city_id'], ['ml_ip' => $ipLong], __METHOD__); foreach ($res as $row) { if (!in_array($row->ml_city_id, self::$excludedWikis)) { if (WikiFactory::isPublic($row->ml_city_id)) { $result[] = (int) $row->ml_city_id; } } } $dbr->freeResult($res); } else { // on devbox - set up the list manually $result = [165]; } wfProfileOut(__METHOD__); return $result; }
public function delete($pageList, $suppress = false) { global $IP; $user = \User::newFromId($this->createdBy); $userName = $user->getName(); $articlesDeleted = 0; foreach ($pageList as $imageData) { list($wikiId, $imageId) = $imageData; if (!\WikiFactory::isPublic($wikiId)) { $this->notice('wiki has been disabled', ['wiki_id' => $wikiId]); continue; } $dbname = \WikiFactory::getWikiByID($wikiId); if (!$dbname) { $this->warning('did not find database', ['wiki_id' => $wikiId]); continue; } $cityUrl = \WikiFactory::getVarValueByName('wgServer', $wikiId); if (empty($cityUrl)) { $this->warning('could not determine city url', ['wiki_id' => $wikiId]); continue; } $cityLang = \WikiFactory::getVarValueByName('wgLanguageCode', $wikiId); $reason = wfMsgExt('imagereview-reason', ['language' => $cityLang]); $command = "SERVER_ID={$wikiId} php {$IP}/maintenance/wikia/deleteOn.php" . ' -u ' . escapeshellarg($userName) . ' --id ' . $imageId; if ($reason) { $command .= ' -r ' . escapeshellarg($reason); } if ($suppress) { $command .= ' -s'; } $title = wfShellExec($command, $exitStatus); if ($exitStatus !== 0) { $this->error('article deletion error', ['city_url' => $cityUrl, 'exit_status' => $exitStatus, 'error' => $title]); continue; } $cityPath = \WikiFactory::getVarValueByName('wgScript', $wikiId); $escapedTitle = wfEscapeWikiText($title); $this->info('removed image', ['link' => "{$cityUrl}{$cityPath}?title={$escapedTitle}", 'title' => $escapedTitle]); ++$articlesDeleted; } $success = $articlesDeleted == count($pageList); if (!$success) { $this->sendNotification(); } return $success; }
function getRecentAdminEdits($fromWikiId = null, $toWikiId = null) { global $wgStatsDB, $wgStatsDBEnabled; $recentAdminEdit = array(); if (!empty($wgStatsDBEnabled) && !empty($fromWikiId) && !empty($toWikiId)) { $dbrStats = wfGetDB(DB_SLAVE, array(), $wgStatsDB); //get wikis with edits < 1000 and admins not active in last 45 days //260000 = ID of wiki created on 2011-05-01 so it will work for wikis created after this project has been deployed $res = $dbrStats->query('select e1.wiki_id, sum(e1.edits) as sum_edits from specials.events_local_users e1 ' . 'where e1.wiki_id > ' . $fromWikiId . ' and e1.wiki_id <= ' . $toWikiId . ' ' . 'group by e1.wiki_id ' . 'having sum_edits < 1000 and (' . 'select count(0) from specials.events_local_users e2 ' . 'where e1.wiki_id = e2.wiki_id and ' . 'all_groups like "%sysop%" and ' . 'editdate > now() - interval 45 day ' . ') = 0', __METHOD__); while ($row = $dbrStats->fetchObject($res)) { $wikiDbname = WikiFactory::IDtoDB($row->wiki_id); if ($wikiDbname === false) { //check if wiki exists in city_list continue; } if (WikiFactory::isPublic($row->wiki_id) === false) { //check if wiki is closed continue; } if (self::isFlagSet($row->wiki_id, WikiFactory::FLAG_ADOPTABLE)) { // check if adoptable flag is set continue; } $res2 = $dbrStats->query("select user_id, max(editdate) as lastedit from specials.events_local_users where wiki_id = {$row->wiki_id} and all_groups like '%sysop%' group by 1 order by null;", __METHOD__); $recentAdminEdit[$row->wiki_id] = array('recentEdit' => time(), 'admins' => array()); while ($row2 = $dbrStats->fetchObject($res2)) { if (($lastedit = wfTimestamp(TS_UNIX, $row2->lastedit)) < $recentAdminEdit[$row->wiki_id]['recentEdit']) { $recentAdminEdit[$row->wiki_id]['recentEdit'] = $lastedit; } else { if ($row2->lastedit == '0000-00-00 00:00:00') { // use city_created if no lastedit $wiki = WikiFactory::getWikiByID($row->wiki_id); if (!empty($wiki)) { $recentAdminEdit[$row->wiki_id]['recentEdit'] = wfTimestamp(TS_UNIX, $wiki->city_created); } } } $recentAdminEdit[$row->wiki_id]['admins'][] = $row2->user_id; } } } return $recentAdminEdit; }
/** * @author Federico "Lox" Lucignano * @param $userID int the registered user ID * @return Array A list of wikis' IDs related to user activity, false if the user is not an existing one or an anon * * Finds on which wikis a REGISTERED user (see LookupContribs for anons) has been active using the events table stored in the stats DB * instead of the blobs table in dataware, tests showed is faster and more accurate */ public static function lookupRegisteredUserActivity($userID) { wfProfileIn(__METHOD__); global $wgDevelEnvironment, $wgStatsDB, $wgStatsDBEnabled; //check for non admitted values if (empty($userID) || !is_int($userID)) { wfProfileOut(__METHOD__); return false; } wfDebugLog(__CLASS__ . '::' . __METHOD__, "Looking up registered user activity for user with ID {$userID}"); $result = array(); if (empty($wgDevelEnvironment)) { // on production if (!empty($wgStatsDBEnabled)) { $dbr =& wfGetDB(DB_SLAVE, array(), $wgStatsDB); $res = $dbr->select('events', 'wiki_id', array('user_id' => $userID), __METHOD__, array('DISTINCT')); $result = array(); while ($row = $dbr->fetchObject($res)) { if (!in_array($row->wiki_id, self::$excludedWikis)) { if (WikiFactory::isPublic($row->wiki_id)) { $result[] = (int) $row->wiki_id; wfDebugLog(__CLASS__ . '::' . __METHOD__, "Registered user with ID {$userID} was active on wiki with ID {$row->wiki_id}"); } else { wfDebugLog(__CLASS__ . '::' . __METHOD__, "Skipped wiki with ID {$row->wiki_id} (inactive wiki)"); } } else { wfDebugLog(__CLASS__ . '::' . __METHOD__, "Skipped wiki with ID {$row->wiki_id} (excluded wiki)"); } } $dbr->freeResult($res); } } else { // on devbox - set up the list manually $result = array(165); } wfProfileOut(__METHOD__); return $result; }
/** * check if page exists * * @return int 0/1 */ public function exists() { $this->loadAll(); if (!is_null($this->mExists)) { return $this->mExists; } if (WikiFactory::isPublic($this->mCityId)) { $dbName = WikiFactory::IDtoDB($this->mCityId); $dbr = wfGetDB(DB_SLAVE, array(), $dbName); $oRow = $dbr->selectRow(array('page'), array('page_id'), array('page_title' => $this->mText, 'page_namespace' => $this->mNamespace), __METHOD__); $this->mExists = intval($oRow ? $oRow->page_id > 0 : 0); } else { $this->mExists = 0; } return $this->mExists; }
protected function disableWikis($wikis, &$deleted = array(), &$notDeleted = array()) { $flags = $this->getFlags(); foreach ($wikis as $id => $wiki) { if ($this->debug) { echo "{$id} STATUS " . intval(WikiFactory::isPublic($id)) . "\n"; } echo "Closing wiki \"{$wiki['dbname']}\" (#{$id}) ... "; if ($this->deletedLimit > 0 && $this->deletedCount >= $this->deletedLimit) { echo "cancelled (limit exceeded)\n"; $notDeleted[$id] = $wiki; continue; } if ($this->readOnly) { echo "cancelled (read-only mode)\n"; $deleted[$id] = $wiki; $this->deletedCount++; continue; } if ($this->doDisableWiki($id, $flags, self::DELETION_REASON)) { echo "ok\n"; $this->deleteWikiStats($id); $deleted[$id] = $wiki; $this->deletedCount++; } else { echo "failed\n"; $notDeleted[$id] = $wiki; } } }
<?php /* * Simple script to enable Founder Progress Bar on wikis with < 250 edits * * USAGE: withcity --maintenance-script=EnableProgressBar.php --conf /usr/wikia/conf/current/wiki.factory/LocalSettings.php * * @date 2011-09-01 * @author Owen Dais <owen at wikia-inc> */ #error_reporting( E_ERROR ); include '../commandLine.inc'; // list of allowed languages taken from Release plan $allowedLanguages = array('en'); //$oFlag = WikiFactory::getVarByName( 'wgEnableFounderProgressBarExt', $wgCityId ); if (!WikiFactory::isPublic($wgCityId)) { echo "{$wgCityId}: SKIPPING! Wiki is disabled. \n"; exit; } if (!in_array($wgLanguageCode, $allowedLanguages)) { echo "{$wgCityId}: SKIPPING! Wiki's language ({$wgLanguageCode}) is not on the allowed languaes list.\n"; exit; } $db = wfGetDB(DB_SLAVE); $oRow = $db->selectRow(array('revision'), array('count(*) as count'), array()); if (isset($oRow) && isset($oRow->count) && $oRow->count < 250 && $oRow->count > 5) { echo "{$wgCityId} enabled\n"; WikiFactory::setVarByName('wgEnableFounderProgressBarExt', $wgCityId, 1); WikiFactory::clearCache($wgCityId); } else { echo "{$wgCityId} skipped, too many edits\n";