From c7232cd07c612932b2067ca42431dc5b1bda4796 Mon Sep 17 00:00:00 2001 From: jonnyboy Date: Tue, 8 Jan 2013 09:22:09 -0500 Subject: [PATCH] split development to it's own branch --- README.md | 18 +- bin/innodb/backfill.php | 14 - bin/innodb/backfill_threaded.php | 76 --- bin/innodb/config.php | 3 - bin/innodb/lib/backfill.php | 300 --------- bin/innodb/lib/binaries.php | 742 ---------------------- bin/innodb/lib/framework/db.php | 175 ----- bin/innodb/lib/groups.php | 27 - bin/innodb/lib/innodb/backfill.php | 300 --------- bin/innodb/lib/innodb/binaries.php | 741 --------------------- bin/innodb/lib/innodb/config.php | 3 - bin/innodb/lib/innodb/convertToInnoDB.php | 18 - bin/innodb/lib/nntp.php | 312 --------- bin/innodb/lib/powerspawn.php | 174 ----- bin/innodb/lib/site.php | 146 ----- bin/innodb/nzb-import.php | 143 ----- bin/innodb/update_binaries.php | 24 - bin/innodb/update_binaries_threaded.php | 77 --- bin/myisam/backfill.php | 15 - bin/myisam/backfill_threaded.php | 77 --- bin/myisam/powerspawn.php | 174 ----- bin/myisam/update_binaries.php | 25 - bin/myisam/update_binaries_threaded.php | 77 --- bin/workhorse.sh | 12 +- edit_these.sh | 19 +- start.sh | 4 - 26 files changed, 22 insertions(+), 3674 deletions(-) delete mode 100755 bin/innodb/backfill.php delete mode 100755 bin/innodb/backfill_threaded.php delete mode 100755 bin/innodb/config.php delete mode 100755 bin/innodb/lib/backfill.php delete mode 100755 bin/innodb/lib/binaries.php delete mode 100755 bin/innodb/lib/framework/db.php delete mode 100755 bin/innodb/lib/groups.php delete mode 100755 bin/innodb/lib/innodb/backfill.php delete mode 100755 bin/innodb/lib/innodb/binaries.php delete mode 100755 bin/innodb/lib/innodb/config.php delete mode 100755 bin/innodb/lib/innodb/convertToInnoDB.php delete mode 100755 bin/innodb/lib/nntp.php delete mode 100644 bin/innodb/lib/powerspawn.php delete mode 100755 bin/innodb/lib/site.php delete mode 100755 bin/innodb/nzb-import.php delete mode 100755 bin/innodb/update_binaries.php delete mode 100755 bin/innodb/update_binaries_threaded.php delete mode 100644 bin/myisam/backfill.php delete mode 100755 bin/myisam/backfill_threaded.php delete mode 100644 bin/myisam/powerspawn.php delete mode 100644 bin/myisam/update_binaries.php delete mode 100755 bin/myisam/update_binaries_threaded.php diff --git a/README.md b/README.md index 58b68fcf0..282e86f48 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SETUP - * These scripts were written and tested on Ubuntu 12.10 where bash is located at /bin/bash. You may need to create a symlink or edit these script accordingly. + * These scripts were written and tested on Ubuntu 12.10 where bash is located at /bin/bash. You may need to create a symlink or edit these scripts accordingly. * Please backup your database first. Something like this should do it. @@ -11,16 +11,16 @@ * If you decide to convert your database, I recommend using [kevin123's github](https://github.com/kevinlekiller/Newznab-Barracuda.git). I recommend only converting the binaries a parts table, using compressed tables. But, there are many choices. I suggest you read his README and follow his recommendations. Or, simply: - `cd /var/www/newznab/misc/testing/` + `cd /var/www/newznab/misc/testing` - `git clone https://github.com/kevinlekiller/Newznab-InnoDB-Dropin.git innodb` + `git clone https://github.com/kevinlekiller/Newznab-InnoDB-Dropin.git kev-innodb` - `cd innodb/lib/innodb` + `cd innodb/lib/kev-innodb` `php convertToInnoDB.php` - * If, you have already converted your database, and didn't to the steps above. You will need to clone [kevin123's github](https://github.com/kevinlekiller/Newznab-InnoDB-Dropin.git) and get the scripts. + * Now, you will need to clone [andrewit's github](https://github.com/itandrew/Newznab-InnoDB-Dropin.git) and get his scripts. `cd /var/www/newznab/misc/testing/` @@ -33,10 +33,6 @@ `git clone https://github.com/jonnyboy/newznab-tmux.git tmux` - -or- - - `git clone https://github.com/kevinlekiller/newznab-tmux tmux` - `cd tmux` `nano edit_these.sh` @@ -56,7 +52,7 @@ * If something looks stalled, it probably isn't. If all 13 panes are still there, it is most likely, as it should be. - * update_cleanup needs to be uncommented to actually do something, and update_parsing is good for fixing a few releases everytime it runs, not a silver bullet though + * **misc/testing/update_cleanup.php** needs to be edited to actually do something, and update_parsing is good for fixing a few releases everytime it runs, not a silver bullet though * If you are running this on an OVH or kimsufi server, you may need to run sudo ./start.sh because they built grsecurity into the kernel. @@ -64,6 +60,8 @@ * Join in the converstion at irc://moonlight.se.eu.synirc.net/newznab-tmux. + * The development branch of this git is still under heavy development. + * Thanks go to all who offered their assistance and improvement to these scripts.
diff --git a/bin/innodb/backfill.php b/bin/innodb/backfill.php deleted file mode 100755 index 3d1b0c72f..000000000 --- a/bin/innodb/backfill.php +++ /dev/null @@ -1,14 +0,0 @@ -backfillAllGroups($groupName); - -?> diff --git a/bin/innodb/backfill_threaded.php b/bin/innodb/backfill_threaded.php deleted file mode 100755 index 820b69e01..000000000 --- a/bin/innodb/backfill_threaded.php +++ /dev/null @@ -1,76 +0,0 @@ -getActive(); -unset($groups); - -$ps = new PowerSpawn; -$ps->setCallback('psUpdateComplete'); -$ps->maxChildren = 10; -$ps->timeLimit = 0; // Disable child timeout - -echo "Starting threaded backfill process\n"; - -while ($ps->runParentCode()) -{ - // Start the parent loop - if (count($groupList)) - { - // We still have groups to process - if ($ps->spawnReady()) - { - // Spawn another thread - $ps->childData = array_pop($groupList); - echo "[Thread-MASTER] Spawning new thread. Still have " . count($groupList) ." group(s) to update after this\n"; - $ps->spawnChild(); - } - else - { - // There are no more slots available to run - $ps->tick(); - #echo ". \n"; - } - } - else - { - // No more groups to process - echo "No more groups to process - Initiating shutdown\n"; - $ps->shutdown(); - echo "Shutdown complete\n"; - } -} - -unset($groupList); - -if ($ps->runChildCode()) -{ - $group = $ps->childData; - - $thread = sprintf("%05d",$ps->myPID()); - - echo "[Thread-{$thread}] Begining backfill processing for group {$group['name']}\n"; - - $param = $group['name']; - - $dir = dirname(__FILE__); - $file = 'backfill.php'; - - $output = shell_exec("php {$dir}/{$file} {$param}"); - - echo "[Thread-{$thread}] Completed update for group {$group['name']}\n"; -} - -// Exit to call back to parent - Let know that child has completed -exit(0); - -// Create callback function -function psUpdateComplete() -{ - echo "[Thread-MASTER] Threaded backfill process complete\n"; -} - -?> diff --git a/bin/innodb/config.php b/bin/innodb/config.php deleted file mode 100755 index 7ec2852f4..000000000 --- a/bin/innodb/config.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/bin/innodb/lib/backfill.php b/bin/innodb/lib/backfill.php deleted file mode 100755 index 6e34c2d7c..000000000 --- a/bin/innodb/lib/backfill.php +++ /dev/null @@ -1,300 +0,0 @@ -db = new DB(); - } - else - { - $this->db = $db; - } - $this->n = "\n"; - } - - /** - * Update all active groups categories and descriptions. - */ - function backfillAllGroups($groupName='', $backfillDate=null) - { - $n = $this->n; - $groups = new Groups; - $res = false; - if ($groupName != '') - { - $grp = $groups->getByName($groupName); - if ($grp) - $res = array($grp); - } - else - { - $res = $groups->getActive(); - } - - if ($res) - { - $nntp = new Nntp(); - $nntp->doConnect(); - - foreach($res as $groupArr) - { - $this->backfillGroup($nntp, $groupArr, $backfillDate); - } - - $nntp->doQuit(); - } - else - { - echo "No groups specified. Ensure groups are added to newznab's database for updating.$n"; - } - } - - /** - * Update a group back to a specified date. - */ - function backfillGroup($nntp, $groupArr, $backfillDate=null) - { - $this->db->disableAutoCommit(); //Turn off auto committing - - $binaries = new Binaries($this->db); - - $n = $this->n; - $this->startGroup = microtime(true); - - echo 'Processing '.$groupArr['name'].$n; - - $data = $nntp->selectGroup($groupArr['name']); - if(PEAR::isError($data)) - { - echo "Could not select group (bad name?): {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return; - } - if ($backfillDate) - $targetpost = $this->daytopost($nntp,$groupArr['name'],$this->dateToDays($backfillDate),TRUE); // get targetpost based on date - else - $targetpost = $this->daytopost($nntp,$groupArr['name'],$groupArr['backfill_target'],TRUE); //get targetpost based on days target - if($groupArr['first_record'] == 0 || $groupArr['backfill_target'] == 0) - { - echo "Group ".$groupArr['name']." has invalid numbers. Have you run update on it? Have you set the backfill days amount?$n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return; - } - - echo "Group ".$data["group"].": server has ".$data['first']." - ".$data['last'].", or ~"; - echo((int) (($this->postdate($nntp,$data['last'],FALSE) - $this->postdate($nntp,$data['first'],FALSE))/86400)); - echo " days.".$n."Local first = ".$groupArr['first_record']." ("; - echo((int) ((date('U') - $this->postdate($nntp,$groupArr['first_record'],FALSE))/86400)); - echo " days). Backfill target of ".$groupArr['backfill_target']."days is post $targetpost.$n"; - - if($targetpost >= $groupArr['first_record']) //if our estimate comes back with stuff we already have, finish - { - echo "Nothing to do, we already have the target post.$n $n"; - - $this->db->commit(); //Not an error so commit and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - //get first and last part numbers from newsgroup - if($targetpost < $data['first']) - { - echo "WARNING: Backfill came back as before server's first. Setting targetpost to server first.$n"; - echo "Skipping Group $n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - //calculate total number of parts - $total = $groupArr['first_record'] - $targetpost; - $done = false; - //set first and last, moving the window by maxxMssgs - $last = $groupArr['first_record'] - 1; - $first = $last - $binaries->messagebuffer + 1; //set initial "chunk" - if($targetpost > $first) //just in case this is the last chunk we needed - $first = $targetpost; - while($done === false) - { - $binaries->startLoop = microtime(true); - echo "Getting ".($last-$first+1)." parts (".($first-$targetpost)." in queue)".$n; - flush(); - $success = $binaries->scan($nntp, $groupArr, $first, $last, 'backfill'); - if (!$success) - { - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString($first), $groupArr['ID'])); - - $this->db->commit(); //At this point we are ready to commit a set up updates to the db. - - if($first==$targetpost) - $done = true; - else - { //Keep going: set new last, new first, check for last chunk. - $last = $first - 1; - $first = $last - $binaries->messagebuffer + 1; - if($targetpost > $first) - $first = $targetpost; - } - } - $first_record_postdate = $this->postdate($nntp,$first,false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record_postdate = FROM_UNIXTIME(".$first_record_postdate."), last_updated = now() WHERE ID = %d", $groupArr['ID'])); //Set group's first postdate - - $this->db->commit(); //Commit and re-enable auto committing we are done with this group. - $this->db->enableAutoCommit(); - - $timeGroup = number_format(microtime(true) - $this->startGroup, 2); - echo "Group processed in $timeGroup seconds $n"; - } - - /** - * Returns single timestamp from a local article number. - */ - function postdate($nntp,$post,$debug=true) - { - $n = $this->n; - $attempts=0; - do - { - $msgs = $nntp->getOverview($post."-".$post,true,false); - if(PEAR::isError($msgs)) - { - echo "Error {$msgs->code}: {$msgs->message}$n"; - echo "Returning from postdate$n"; - return ""; - } - - if(!isset($msgs[0]['Date']) || $msgs[0]['Date']=="" || is_null($msgs[0]['Date'])) - { - $success=false; - } else { - $date = $msgs[0]['Date']; - $success=true; - } - if($debug && $attempts > 0) echo "retried $attempts time(s)".$n; - $attempts++; - } while($attempts <= 3 && $success == false); - - if (!$success) { return ""; } - - if($debug) echo "DEBUG: postdate for post: $post came back $date ("; - $date = strtotime($date); - if($debug) echo "$date seconds unixtime or ".$this->daysOld($date)." days)".$n; - return $date; - } - - /** - * Calculates the post number for a given number of days back in a group. - */ - function daytopost($nntp, $group, $days, $debug=true) - { - $n = $this->n; - $pddebug = false; //DEBUG every postdate call?!?! - if ($debug) echo "INFO: daytopost finding post for $group $days days back.".$n; - - $data = $nntp->selectGroup($group); - if(PEAR::isError($data)) - { - echo "Error {$data->code}: {$data->message}$n"; - echo "Returning from daytopost$n"; - return ""; - } - $goaldate = date('U')-(86400*$days); //goaltimestamp - $totalnumberofarticles = $data['last'] - $data['first']; - $upperbound = $data['last']; - $lowerbound = $data['first']; - - if ($debug) echo "Total Articles: $totalnumberofarticles $n Upper: $upperbound $n Lower: $lowerbound $n Goal: ".date("r", $goaldate)." ($goaldate) $n"; - if ($data['last']==PHP_INT_MAX) { echo "ERROR: Group data is coming back as php's max value. You should not see this since we use a patched Net_NNTP that fixes this bug.$n"; die(); } - - $firstDate = $this->postdate($nntp, $data['first'], $pddebug); - $lastDate = $this->postdate($nntp, $data['last'], $pddebug); - if ($goaldate < $firstDate) - { - echo "WARNING: Backfill target of $days day(s) is older than the first article stored on your news server.$n"; - echo "Starting from the first available article (".date("r", $firstDate)." or ".$this->daysOld($firstDate)." days).$n"; - return $data['first']; - } - elseif ($goaldate > $lastDate) - { - echo "ERROR: Backfill target of $days day(s) is newer than the last article stored on your news server.$n"; - echo "To backfill this group you need to set Backfill Days to at least ".ceil($this->daysOld($lastDate)+1)." days (".date("r", $lastDate-86400).").$n"; - return ""; - } - if ($debug) echo "DEBUG: Searching for postdate $n Goaldate: $goaldate (".date("r", $goaldate).") $n Firstdate: $firstDate (".((is_int($firstDate))?date("r", $firstDate):'n/a').") $n Lastdate: $lastDate (".date("r", $lastDate).") $n"; - - $interval = floor(($upperbound - $lowerbound) * 0.5); - $dateofnextone = ""; - $templowered = ""; - - if ($debug) echo "Start: ".$data['first']." $n End: ".$data['last']." $n Interval: $interval $n"; - - $dateofnextone = $lastDate; - - while($this->daysOld($dateofnextone) < $days) //match on days not timestamp to speed things up - { - $nskip = 1; - while(($tmpDate = $this->postdate($nntp,($upperbound-$interval),$pddebug))>$goaldate) - { - $upperbound = $upperbound - $interval - ($nskip - 1); - if($debug) echo "New upperbound ($upperbound) is ".$this->daysOld($tmpDate)." days old. $n"; - $nskip = $nskip * 2; - } - if(!$templowered) - { - $interval = ceil(($interval/2)); - if($debug) echo "Set interval to $interval articles. $n"; - } - $dateofnextone = $this->postdate($nntp,($upperbound-1),$pddebug); - - $skip = 1; - while(!$dateofnextone) - { - $upperbound = $upperbound - $skip; - $skip = $skip * 2; - if($debug) echo "Getting next article date... $upperbound\n"; - $dateofnextone = $this->postdate($nntp,($upperbound-1),$pddebug); - } - } - echo "Determined to be article $upperbound which is ".$this->daysOld($dateofnextone)." days old (".date("r", $dateofnextone).") $n"; - return $upperbound; - } - - /** - * Calculate the number of days from a timestamp. - */ - private function daysOld($timestamp) - { - return round((time()-$timestamp)/86400, 1); - } - - /** - * Calculate the number of days from a date. - */ - private function dateToDays($backfillDate) - { - return floor(-($backfillDate - time())/(60*60*24)); - } -} diff --git a/bin/innodb/lib/binaries.php b/bin/innodb/lib/binaries.php deleted file mode 100755 index a7b8b2236..000000000 --- a/bin/innodb/lib/binaries.php +++ /dev/null @@ -1,742 +0,0 @@ -n = "\n"; - - $s = new Sites(); - $site = $s->get(); - $this->compressedHeaders = ($site->compressedheaders == "1") ? true : false; - $this->messagebuffer = (!empty($site->maxmssgs)) ? $site->maxmssgs : 20000; - $this->NewGroupScanByDays = ($site->newgroupscanmethod == "1") ? true : false; - $this->NewGroupMsgsToScan = (!empty($site->newgroupmsgstoscan)) ? $site->newgroupmsgstoscan : 50000; - $this->NewGroupDaysToScan = (!empty($site->newgroupdaystoscan)) ? $site->newgroupdaystoscan : 3; - - $this->blackList = array(); //cache of our black/white list - $this->message = array(); - - if($db == null) - { - $this->db = new DB(); - } - else - { - $this->db = $db; - } - - } - - /* - * Allows you to set the db that the current object should use - */ - public function setDB($db) - { - $this->db = $db; - } - - /** - * Process headers and store in database for all active groups. - */ - function updateAllGroups() - { - $n = $this->n; - $groups = new Groups; - $res = $groups->getActive(); - - $s = new Sites(); - echo $s->getLicense(); - - if ($res) - { - shuffle($res); - $alltime = microtime(true); - echo 'Updating: '.sizeof($res).' groups - Using compression? '.(($this->compressedHeaders)?'Yes':'No').$n; - - $nntp = new Nntp(); - $nntp->doConnect(); - - $pos = 0; - foreach($res as $groupArr) - { - $pos++; - echo 'Group '.$pos.' of '.sizeof($res).$n; - $this->message = array(); - $this->updateGroup($nntp, $groupArr); - } - - $nntp->doQuit(); - echo 'Updating completed in '.number_format(microtime(true) - $alltime, 2).' seconds'.$n; - } - else - { - echo "No groups specified. Ensure groups are added to newznab's database and activated before updating.$n"; - } - } - - /** - * Process headers and store in database for a group. - */ - function updateGroup($nntp=null, $groupArr) - { - $this->db->disableAutoCommit(); - - $blnDoDisconnect = false; - if ($nntp == null) - { - $nntp = new Nntp(); - $nntp->doConnect(); - $this->message = array(); - $blnDoDisconnect = true; - } - - $backfill = new Backfill(); - $n = $this->n; - $this->startGroup = microtime(true); - - echo 'Processing '.$groupArr['name'].$n; - - // Connect to server - $data = $nntp->selectGroup($groupArr['name']); - if (PEAR::isError($data)) - { - echo "Could not select group (bad name?): {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - - //Attempt to repair any missing parts before grabbing new ones - $this->partRepair($nntp, $groupArr); - - //Get first and last part numbers from newsgroup - $last = $grouplast = $data['last']; - - // For new newsgroups - determine here how far you want to go back. - if ($groupArr['last_record'] == 0) - { - if ($this->NewGroupScanByDays) - { - $first = $backfill->daytopost($nntp, $groupArr['name'], $this->NewGroupDaysToScan, true); - if ($first == '') - { - echo "Skipping group: {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - } - else - { - if ($data['first'] > ($data['last'] - $this->NewGroupMsgsToScan)) - $first = $data['first']; - else - $first = $data['last'] - $this->NewGroupMsgsToScan; - } - $first_record_postdate = $backfill->postdate($nntp, $first, false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record = %s, first_record_postdate = FROM_UNIXTIME(".$first_record_postdate.") WHERE ID = %d", $this->db->escapeString($first), $groupArr['ID'])); - } - else - { - if ($data['last'] < $groupArr['last_record']) - { - echo "Warning: Server's last num {$data['last']} is lower than the local last num {$groupArr['last_record']}".$n; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - $first = $groupArr['last_record'] + 1; - } - - // Generate postdates for first and last records, for those that upgraded - if ((is_null($groupArr['first_record_postdate']) || is_null($groupArr['last_record_postdate'])) && ($groupArr['last_record'] != "0" && $groupArr['first_record'] != "0")) - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record_postdate = FROM_UNIXTIME(".$backfill->postdate($nntp,$groupArr['first_record'],false)."), last_record_postdate = FROM_UNIXTIME(".$backfill->postdate($nntp,$groupArr['last_record'],false).") WHERE ID = %d", $groupArr['ID'])); - - // Deactivate empty groups - if (($data['last'] - $data['first']) <= 5) - $this->db->mysqliQuery(sprintf("UPDATE groups SET active = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString('0'), $groupArr['ID'])); - - // Calculate total number of parts - $total = $grouplast - $first + 1; - - // If total is bigger than 0 it means we have new parts in the newsgroup - if($total > 0) - { - echo "Group ".$data["group"]." has ".number_format($total)." new parts.".$n; - echo "First: ".$data['first']." Last: ".$data['last']." Local last: ".$groupArr['last_record'].$n; - if ($groupArr['last_record'] == 0) - echo "New group starting with ".(($this->NewGroupScanByDays) ? $this->NewGroupDaysToScan." days" : $this->NewGroupMsgsToScan." messages")." worth.".$n; - - $done = false; - - // Get all the parts (in portions of $this->messagebuffer to not use too much memory) - while ($done === false) - { - $this->startLoop = microtime(true); - - if ($total > $this->messagebuffer) - { - if ($first + $this->messagebuffer > $grouplast) - $last = $grouplast; - else - $last = $first + $this->messagebuffer; - } - - echo "Getting ".number_format($last-$first+1)." parts (".$first." to ".$last.") - ".number_format($grouplast - $last)." in queue".$n; - flush(); - - //get headers from newsgroup - $lastId = $this->scan($nntp, $groupArr, $first, $last); - if ($lastId === false) - { - //scan failed - skip group - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - $this->db->mysqliQuery(sprintf("UPDATE groups SET last_record = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString($lastId), $groupArr['ID'])); - - $this->db->commit(); //At this point we are ready to commit a whole group to the db. - - if ($last == $grouplast) - $done = true; - else - { - $last = $lastId; - $first = $last + 1; - } - } - - $last_record_postdate = $backfill->postdate($nntp,$last,false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET last_record_postdate = FROM_UNIXTIME(".$last_record_postdate."), last_updated = now() WHERE ID = %d", $groupArr['ID'])); //Set group's last postdate - $timeGroup = number_format(microtime(true) - $this->startGroup, 2); - echo "Group processed in $timeGroup seconds $n $n"; - } - else - { - echo "No new records for ".$data["group"]." (first $first last $last total $total) grouplast ".$groupArr['last_record'].$n.$n; - } - - if ($blnDoDisconnect) - { - $nntp->doQuit(); - } - - /* - * Got through the updating of this group successfully - * so commit and re-enable the auto committing. - */ - $this->db->commit(); //For anything not yet committed. - $this->db->enableAutoCommit(); - - } - - /** - * Download a range of usenet messages. Store binaries with subjects matching a - * specific pattern in the database. - */ - function scan($nntp, $groupArr, $first, $last, $type='update') - { - $n = $this->n; - $this->startHeaders = microtime(true); - - if ($this->compressedHeaders) - $msgs = $nntp->getXOverview($first."-".$last, true, false); - else - $msgs = $nntp->getOverview($first."-".$last, true, false); - - if (PEAR::isError($msgs) && $msgs->code == 400) - { - echo "NNTP connection timed out. Reconnecting...$n"; - $nntp->doConnect(); - $nntp->selectGroup($groupArr['name']); - if ($this->compressedHeaders) - $msgs = $nntp->getXOverview($first."-".$last, true, false); - else - $msgs = $nntp->getOverview($first."-".$last, true, false); - } - - $rangerequested = range($first, $last); - $msgsreceived = array(); - $msgsblacklisted = array(); - $msgsignored = array(); - $msgsinserted = array(); - $msgsnotinserted = array(); - - $timeHeaders = number_format(microtime(true) - $this->startHeaders, 2); - - if(PEAR::isError($msgs)) - { - echo "Error {$msgs->code}: {$msgs->message}$n"; - echo "Skipping group$n"; - return false; - } - - $this->startUpdate = microtime(true); - if (is_array($msgs)) - { - //loop headers, figure out parts - foreach($msgs AS $msg) - { - if (!isset($msg['Number'])) - continue; - - $msgsreceived[] = $msg['Number']; - $msgPart = $msgTotalParts = 0; - - $pattern = '|\((\d+)[\/](\d+)\)|i'; - preg_match_all($pattern, $msg['Subject'], $matches, PREG_PATTERN_ORDER); - $matchcnt = sizeof($matches[0]); - for ($i=0; $i<$matchcnt; $i++) - { - $msgPart = $matches[1][$i]; - $msgTotalParts = $matches[2][$i]; - } - - if (!isset($msg['Subject']) || $matchcnt == 0) // not a binary post most likely.. continue - { - $msgsignored[] = $msg['Number']; - continue; - } - - //Filter binaries based on black/white list - if ($this->isBlackListed($msg, $groupArr['name'])) - { - $msgsblacklisted[] = $msg['Number']; - continue; - } - - if((int)$msgPart > 0 && (int)$msgTotalParts > 0) - { - $subject = utf8_encode(trim(preg_replace('|\('.$msgPart.'[\/]'.$msgTotalParts.'\)|i', '', $msg['Subject']))); - - if(!isset($this->message[$subject])) - { - $this->message[$subject] = $msg; - $this->message[$subject]['MaxParts'] = (int) $msgTotalParts; - $this->message[$subject]['Date'] = strtotime($this->message[$subject]['Date']); - } - if((int)$msgPart > 0) - { - $this->message[$subject]['Parts'][(int)$msgPart] = array('Message-ID' => substr($msg['Message-ID'],1,-1), 'number' => $msg['Number'], 'part' => (int)$msgPart, 'size' => $msg['Bytes']); - } - } - } - unset($msg); - unset($msgs); - $count = 0; - $updatecount = 0; - $partcount = 0; - $maxnum = $last; - - $rangenotreceived = array_diff($rangerequested, $msgsreceived); - - - if ($type != 'partrepair') - echo "Received ".sizeof($msgsreceived)." articles of ".($last-$first+1)." requested, ".sizeof($msgsblacklisted)." blacklisted, ".sizeof($msgsignored)." not binaries $n"; - - if ($type == 'update' && sizeof($msgsreceived) == 0) - { - echo "Error: Server did not return any articles.$n"; - echo "Skipping group$n"; - return false; - } - - if (sizeof($rangenotreceived) > 0) { - switch($type) - { - case 'backfill': - //don't add missing articles - break; - case 'partrepair': - case 'update': - default: - $this->addMissingParts($rangenotreceived, $groupArr['ID']); - break; - } - echo "Server did not return ".count($rangenotreceived)." article(s).$n"; - } - - if(isset($this->message) && count($this->message)) - { - $maxnum = $first; - //insert binaries and parts into database. when binary already exists; only insert new parts - foreach($this->message AS $subject => $data) - { - if(isset($data['Parts']) && count($data['Parts']) > 0 && $subject != '') - { - $binaryHash = md5($subject.$data['From'].$groupArr['ID']); - $res = $this->db->mysqliQueryOneRow(sprintf("SELECT ID FROM binaries WHERE binaryhash = %s", $this->db->escapeString($binaryHash))); - if(!$res) - { - $sql = sprintf("INSERT INTO binaries (name, fromname, date, xref, totalparts, groupID, binaryhash, dateadded) VALUES (%s, %s, FROM_UNIXTIME(%s), %s, %s, %d, %s, now())", $this->db->escapeString($subject), $this->db->escapeString($data['From']), $this->db->escapeString($data['Date']), $this->db->escapeString($data['Xref']), $this->db->escapeString($data['MaxParts']), $groupArr['ID'], $this->db->escapeString($binaryHash)); - $binaryID = $this->db->mysqliQueryInsert($sql); - $count++; - if ($count%500==0) echo "$count bin adds..."; - } - else - { - $binaryID = $res["ID"]; - $updatecount++; - if ($updatecount%500==0) echo "$updatecount bin updates..."; - } - - foreach($data['Parts'] AS $partdata) - { - $maxnum = ($partdata['number'] > $maxnum) ? $partdata['number'] : $maxnum; - $partcount++; - $pidata = $this->db->mysqliQueryInsert(sprintf("INSERT INTO parts (binaryID, messageID, number, partnumber, size, dateadded) VALUES (%d, %s, %s, %s, %s, now())", $binaryID, $this->db->escapeString($partdata['Message-ID']), $this->db->escapeString($partdata['number']), $this->db->escapeString(round($partdata['part'])), $this->db->escapeString($partdata['size'])), false); - if (!$pidata) { - $msgsnotinserted[] = $partdata['number']; - } else { - $msgsinserted[] = $partdata['number']; - } - } - } - } - //TODO: determine whether to add to missing articles if insert failed - if (sizeof($msgsnotinserted) > 0) - { - echo 'WARNING: ' . count($msgsnotinserted) . ' Parts failed to insert'.$n; - $this->addMissingParts($msgsnotinserted, $groupArr['ID']); - } - if (($count >= 500) || ($updatecount >= 500)) { echo $n; } //line break for bin adds output - } - $timeUpdate = number_format(microtime(true) - $this->startUpdate, 2); - $timeLoop = number_format(microtime(true)-$this->startLoop, 2); - - if ($type != 'partrepair') - { - echo number_format($count).' new, '.number_format($updatecount).' updated, '.number_format($partcount).' parts.'; - echo " $timeHeaders headers, $timeUpdate update, $timeLoop range.$n"; - } - unset($this->message); - unset($data); - return $maxnum; - } - else - { - echo "Error: Can't get parts from server (msgs not array) $n"; - echo "Skipping group$n"; - return false; - } - } - - /** - * Go through all rows in partrepair table and see if theyve arrived on usenet yet. - */ - private function partRepair($nntp, $groupArr) - { - $n = $this->n; - - //get all parts in partrepair table - - $missingParts = $this->db->mysqliQuery(sprintf("SELECT * FROM partrepair WHERE groupID = %d AND attempts < 5 ORDER BY numberID ASC LIMIT 30000", $groupArr['ID'])); - $partsRepaired = $partsFailed = 0; - - if (sizeof($missingParts) > 0) - { - echo 'Attempting to repair '.sizeof($missingParts).' parts...'; - - //loop through each part to group into ranges - $ranges = array(); - $lastnum = $lastpart = 0; - foreach($missingParts as $part) - { - if (($lastnum+1) == $part['numberID']) { - $ranges[$lastpart] = $part['numberID']; - } else { - $lastpart = $part['numberID']; - $ranges[$lastpart] = $part['numberID']; - } - $lastnum = $part['numberID']; - } - - //download missing parts in ranges - foreach($ranges as $partfrom=>$partto) - { - $this->startLoop = microtime(true); - - echo "."; - - //get article from newsgroup - $this->scan($nntp, $groupArr, $partfrom, $partto, 'partrepair'); - - //check if the articles were added - $articles = implode(',', range($partfrom, $partto)); - $sql = sprintf("SELECT pr.ID, pr.numberID, p.number from partrepair pr LEFT JOIN parts p ON p.number = pr.numberID WHERE pr.groupID=%d AND pr.numberID IN (%s) ORDER BY pr.numberID ASC", $groupArr['ID'], $articles); - - $result = $this->db->mysqliQueryDirect($sql); - while ($r = mysqli_fetch_assoc($result)) - { - if (isset($r['number']) && $r['number'] == $r['numberID']) - { - $partsRepaired++; - - //article was added, delete from partrepair - $this->db->mysqliQuery(sprintf("DELETE FROM partrepair WHERE ID=%d", $r['ID'])); - } - else - { - $partsFailed++; - - //article was not added, increment attempts - $this->db->mysqliQuery(sprintf("UPDATE partrepair SET attempts=attempts+1 WHERE ID=%d", $r['ID'])); - } - } - } - - echo $n.$partsRepaired.' parts repaired.'.$n; - } - - //remove articles that we cant fetch after 5 attempts - $this->db->mysqliQuery(sprintf("DELETE FROM partrepair WHERE attempts >= 5 AND groupID = %d", $groupArr['ID'])); - - } - - /** - * Insert a missing part to the database. - */ - private function addMissingParts($numbers, $groupID) - { - - $added = false; - $insertStr = "INSERT INTO partrepair (numberID, groupID) VALUES "; - foreach($numbers as $number) - { - if ($number > 0) - { - $added = true; - $insertStr .= sprintf("(%u, %d), ", $number, $groupID); - } - } - if ($added) - { - $insertStr = substr($insertStr, 0, -2); - $insertStr .= " ON DUPLICATE KEY UPDATE attempts=attempts+1"; - return $this->db->mysqliQueryInsert($insertStr, false); - } - - return -1; - } - - /** - * Return internally cached list of binary blacklist patterns. - */ - public function retrieveBlackList() - { - if (is_array($this->blackList) && !empty($this->blackList)) { return $this->blackList; } - $blackList = $this->getBlacklist(true); - $this->blackList = $blackList; - return $blackList; - } - - /** - * Test if a message subject is blacklisted. - */ - public function isBlackListed($msg, $groupName) - { - $blackList = $this->retrieveBlackList(); - $field = array(); - if (isset($msg["Subject"])) - $field[Binaries::BLACKLIST_FIELD_SUBJECT] = $msg["Subject"]; - - if (isset($msg["From"])) - $field[Binaries::BLACKLIST_FIELD_FROM] = $msg["From"]; - - if (isset($msg["Message-ID"])) - $field[Binaries::BLACKLIST_FIELD_MESSAGEID] = $msg["Message-ID"]; - - foreach ($blackList as $blist) - { - if (preg_match('/^'.$blist['groupname'].'$/i', $groupName)) - { - //blacklist - if ($blist['optype'] == 1) - { - if (preg_match('/'.$blist['regex'].'/i', $field[$blist['msgcol']])) { - return true; - } - } - else if ($blist['optype'] == 2) - { - if (!preg_match('/'.$blist['regex'].'/i', $field[$blist['msgcol']])) { - return true; - } - } - } - } - - return false; - } - - /** - * Rawsearch. Perform a simple like match on binary subjects matching a pattern. - */ - public function search($search, $limit=1000, $excludedcats=array()) - { - - - // - // if the query starts with a ^ it indicates the search is looking for items which start with the term - // still do the like match, but mandate that all items returned must start with the provided word - // - $words = explode(" ", $search); - $searchsql = ""; - $intwordcount = 0; - if (count($words) > 0) - { - foreach ($words as $word) - { - // - // see if the first word had a caret, which indicates search must start with term - // - if ($intwordcount == 0 && (strpos($word, "^") === 0)) - $searchsql.= sprintf(" and b.name like %s", $this->db->escapeString(substr($word, 1)."%")); - else - $searchsql.= sprintf(" and b.name like %s", $this->db->escapeString("%".$word."%")); - - $intwordcount++; - } - } - - $exccatlist = ""; - if (count($excludedcats) > 0) - $exccatlist = " and b.categoryID not in (".implode(",", $excludedcats).") "; - - $res = $this->db->mysqliQuery(sprintf(" - SELECT b.*, - g.name AS group_name, - r.guid, - (SELECT COUNT(ID) FROM parts p where p.binaryID = b.ID) as 'binnum' - FROM binaries b - INNER JOIN groups g ON g.ID = b.groupID - LEFT OUTER JOIN releases r ON r.ID = b.releaseID - WHERE 1=1 %s %s order by DATE DESC LIMIT %d ", - $searchsql, $exccatlist, $limit)); - - return $res; - } - - /** - * Get all binaries for a release. - */ - public function getForReleaseId($id) - { - return $this->db->mysqliQuery(sprintf("select binaries.* from binaries where releaseID = %d order by relpart", $id)); - } - - /** - * Get a binary row. - */ - public function getById($id) - { - - return $this->db->mysqliQueryOneRow(sprintf("select binaries.*, groups.name as groupname from binaries left outer join groups on binaries.groupID = groups.ID where binaries.ID = %d ", $id)); - } - - /** - * Get list of blacklists from database. - */ - public function getBlacklist($activeonly=true) - { - - $where = ""; - if ($activeonly) - $where = " where binaryblacklist.status = 1 "; - - return $this->db->mysqliQuery("SELECT binaryblacklist.ID, binaryblacklist.optype, binaryblacklist.status, binaryblacklist.description, binaryblacklist.groupname AS groupname, binaryblacklist.regex, - groups.ID AS groupID, binaryblacklist.msgcol FROM binaryblacklist - left outer JOIN groups ON groups.name = binaryblacklist.groupname - ".$where." - ORDER BY coalesce(groupname,'zzz')"); - } - - /** - * Get a blacklist row from database. - */ - public function getBlacklistByID($id) - { - return $this->db->mysqliQueryOneRow(sprintf("select * from binaryblacklist where ID = %d ", $id)); - } - - /** - * Delete a blacklist row from database. - */ - public function deleteBlacklist($id) - { - - return $this->db->mysqliQuery(sprintf("delete from binaryblacklist where ID = %d", $id)); - } - - /** - * Update a blacklist row. - */ - public function updateBlacklist($regex) - { - - $groupname = $regex["groupname"]; - if ($groupname == "") - $groupname = "null"; - else - { - $groupname = preg_replace("/a\.b\./i", "alt.binaries.", $groupname); - $groupname = sprintf("%s", $this->db->escapeString($groupname)); - } - - $this->db->mysqliQuery(sprintf("update binaryblacklist set groupname=%s, regex=%s, status=%d, description=%s, optype=%d, msgcol=%d where ID = %d ", $groupname, $this->db->escapeString($regex["regex"]), $regex["status"], $this->db->escapeString($regex["description"]), $regex["optype"], $regex["msgcol"], $regex["id"])); - } - - /** - * Add a new blacklist row. - */ - public function addBlacklist($regex) - { - - - $groupname = $regex["groupname"]; - if ($groupname == "") - $groupname = "null"; - else - { - $groupname = preg_replace("/a\.b\./i", "alt.binaries.", $groupname); - $groupname = sprintf("%s", $this->db->escapeString($groupname)); - } - - return $this->db->mysqliQueryInsert(sprintf("insert into binaryblacklist (groupname, regex, status, description, optype, msgcol) values (%s, %s, %d, %s, %d, %d) ", - $groupname, $this->db->escapeString($regex["regex"]), $regex["status"], $this->db->escapeString($regex["description"]), $regex["optype"], $regex["msgcol"])); - } - - /** - * Add a new binary row and its associated parts. - */ - public function delete($id) - { - - $this->db->mysqliQuery(sprintf("delete from parts where binaryID = %d", $id)); - $this->db->mysqliQuery(sprintf("delete from binaries where ID = %d", $id)); - } -} diff --git a/bin/innodb/lib/framework/db.php b/bin/innodb/lib/framework/db.php deleted file mode 100755 index e85e2bcc0..000000000 --- a/bin/innodb/lib/framework/db.php +++ /dev/null @@ -1,175 +0,0 @@ -mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); - if (mysqli_connect_errno()) { - printf("Connect failed: %s\n", mysqli_connect_error()); - exit(); - } - } - - public function escapeString($str) - { - return "'".mysql_real_escape_string($str)."'"; - } - - public function makeLookupTable($rows, $keycol) - { - $arr = array(); - foreach($rows as $row) - $arr[$row[$keycol]] = $row; - return $arr; - } - - public function queryInsert($query, $returnlastid=true) - { - $result = mysql_query($query); - return ($returnlastid) ? mysql_insert_id() : $result; - } - - public function queryOneRow($query) - { - $rows = $this->query($query); - - if (!$rows) - return false; - - if ($rows) - return $rows[0]; - else - return $rows; - } - - public function query($query) - { - $result = mysql_query($query); - - if ($result === false || $result === true) - return array(); - - $rows = array(); - - while ($row = mysql_fetch_assoc($result)) - $rows[] = $row; - - mysql_free_result($result); - return $rows; - } - - public function queryDirect($query) - { - $result = mysql_query($query); - return $result; - } - - - public function optimise() - { - $ret = array(); - $alltables = $this->query("SHOW TABLES"); - - foreach ($alltables as $tablename) - { - $ret[] = $tablename['Tables_in_'.DB_NAME]; - $this->queryDirect("REPAIR TABLE `".$tablename['Tables_in_'.DB_NAME]."`"); - $this->queryDirect("OPTIMIZE TABLE `".$tablename['Tables_in_'.DB_NAME]."`"); - } - - return $ret; - } - - /* Mysqli Functions */ - public function multiQueryTransaction($query) - { - $this->mysqli->autocommit(FALSE); - $this->mysqli->multi_query($query); - - while($this->mysqli->next_result()) { - $result = $this->mysqli->use_result(); - if($result instanceof mysqli_result) - $result->free(); - } - - $this->mysqli->commit(); - } - - public function disableAutoCommit() - { - $this->mysqli->autocommit(FALSE); - } - - public function mysqliQuery($sql) - { - $result = $this->mysqli->query($sql); - if ($result === false || $result === true) - return array(); - - $rows = array(); - - while ($row = mysqli_fetch_assoc($result)) - $rows[] = $row; - - mysqli_free_result($result); - return $rows; - } - - public function mysqliQueryOneRow($query) - { - $rows = $this->mysqliQuery($query); - - if (!$rows) - return false; - - if ($rows) - return $rows[0]; - else - return $rows; - } - - public function mysqliQueryInsert($query, $returnlastid=true) - { - $result = $this->mysqli->query($query); - return ($returnlastid) ? $this->mysqli->insert_id : $result; - } - - public function commit() - { - $this->mysqli->commit(); - } - - public function rollback() - { - $this->mysqli->rollback(); - } - - public function mysqliQueryDirect($query) - { - return $this->mysqli->query($query); - } - - - public function enableAutoCommit() - { - $this->mysqli->autocommit(TRUE); - } -} -?> diff --git a/bin/innodb/lib/groups.php b/bin/innodb/lib/groups.php deleted file mode 100755 index 571f5b5bb..000000000 --- a/bin/innodb/lib/groups.php +++ /dev/null @@ -1,27 +0,0 @@ -query("SELECT * FROM groups WHERE active = 1 ORDER BY name"); - } - - /** - * Get a group row by name. - */ - public function getByName($grp) - { - $db = new DB(); - return $db->queryOneRow(sprintf("select * from groups where name = '%s' ", $grp)); - } - -} diff --git a/bin/innodb/lib/innodb/backfill.php b/bin/innodb/lib/innodb/backfill.php deleted file mode 100755 index b91a5bc0e..000000000 --- a/bin/innodb/lib/innodb/backfill.php +++ /dev/null @@ -1,300 +0,0 @@ -db = new DB(); - } - else - { - $this->db = $db; - } - $this->n = "\n"; - } - - /** - * Update all active groups categories and descriptions. - */ - function backfillAllGroups($groupName='', $backfillDate=null) - { - $n = $this->n; - $groups = new Groups; - $res = false; - if ($groupName != '') - { - $grp = $groups->getByName($groupName); - if ($grp) - $res = array($grp); - } - else - { - $res = $groups->getActive(); - } - - if ($res) - { - $nntp = new Nntp(); - $nntp->doConnect(); - - foreach($res as $groupArr) - { - $this->backfillGroup($nntp, $groupArr, $backfillDate); - } - - $nntp->doQuit(); - } - else - { - echo "No groups specified. Ensure groups are added to newznab's database for updating.$n"; - } - } - - /** - * Update a group back to a specified date. - */ - function backfillGroup($nntp, $groupArr, $backfillDate=null) - { - $this->db->disableAutoCommit(); //Turn off auto committing - - $binaries = new Binaries($this->db); - - $n = $this->n; - $this->startGroup = microtime(true); - - echo 'Processing '.$groupArr['name'].$n; - - $data = $nntp->selectGroup($groupArr['name']); - if(PEAR::isError($data)) - { - echo "Could not select group (bad name?): {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return; - } - if ($backfillDate) - $targetpost = $this->daytopost($nntp,$groupArr['name'],$this->dateToDays($backfillDate),TRUE); // get targetpost based on date - else - $targetpost = $this->daytopost($nntp,$groupArr['name'],$groupArr['backfill_target'],TRUE); //get targetpost based on days target - if($groupArr['first_record'] == 0 || $groupArr['backfill_target'] == 0) - { - echo "Group ".$groupArr['name']." has invalid numbers. Have you run update on it? Have you set the backfill days amount?$n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return; - } - - echo "Group ".$data["group"].": server has ".$data['first']." - ".$data['last'].", or ~"; - echo((int) (($this->postdate($nntp,$data['last'],FALSE) - $this->postdate($nntp,$data['first'],FALSE))/86400)); - echo " days.".$n."Local first = ".$groupArr['first_record']." ("; - echo((int) ((date('U') - $this->postdate($nntp,$groupArr['first_record'],FALSE))/86400)); - echo " days). Backfill target of ".$groupArr['backfill_target']."days is post $targetpost.$n"; - - if($targetpost >= $groupArr['first_record']) //if our estimate comes back with stuff we already have, finish - { - echo "Nothing to do, we already have the target post.$n $n"; - - $this->db->commit(); //Not an error so commit and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - //get first and last part numbers from newsgroup - if($targetpost < $data['first']) - { - echo "WARNING: Backfill came back as before server's first. Setting targetpost to server first.$n"; - echo "Skipping Group $n"; - - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - //calculate total number of parts - $total = $groupArr['first_record'] - $targetpost; - $done = false; - //set first and last, moving the window by maxxMssgs - $last = $groupArr['first_record'] - 1; - $first = $last - $binaries->messagebuffer + 1; //set initial "chunk" - if($targetpost > $first) //just in case this is the last chunk we needed - $first = $targetpost; - while($done === false) - { - $binaries->startLoop = microtime(true); - echo "Getting ".($last-$first+1)." parts (".($first-$targetpost)." in queue)".$n; - flush(); - $success = $binaries->scan($nntp, $groupArr, $first, $last, 'backfill'); - if (!$success) - { - $this->db->rollback(); //Rollback and re-enable autocommitting - $this->db->enableAutoCommit(); - return ""; - } - - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString($first), $groupArr['ID'])); - - $this->db->commit(); //At this point we are ready to commit a set up updates to the db. - - if($first==$targetpost) - $done = true; - else - { //Keep going: set new last, new first, check for last chunk. - $last = $first - 1; - $first = $last - $binaries->messagebuffer + 1; - if($targetpost > $first) - $first = $targetpost; - } - } - $first_record_postdate = $this->postdate($nntp,$first,false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record_postdate = FROM_UNIXTIME(".$first_record_postdate."), last_updated = now() WHERE ID = %d", $groupArr['ID'])); //Set group's first postdate - - $this->db->commit(); //Commit and re-enable auto committing we are done with this group. - $this->db->enableAutoCommit(); - - $timeGroup = number_format(microtime(true) - $this->startGroup, 2); - echo "Group processed in $timeGroup seconds $n"; - } - - /** - * Returns single timestamp from a local article number. - */ - function postdate($nntp,$post,$debug=true) - { - $n = $this->n; - $attempts=0; - do - { - $msgs = $nntp->getOverview($post."-".$post,true,false); - if(PEAR::isError($msgs)) - { - echo "Error {$msgs->code}: {$msgs->message}$n"; - echo "Returning from postdate$n"; - return ""; - } - - if(!isset($msgs[0]['Date']) || $msgs[0]['Date']=="" || is_null($msgs[0]['Date'])) - { - $success=false; - } else { - $date = $msgs[0]['Date']; - $success=true; - } - if($debug && $attempts > 0) echo "retried $attempts time(s)".$n; - $attempts++; - } while($attempts <= 3 && $success == false); - - if (!$success) { return ""; } - - if($debug) echo "DEBUG: postdate for post: $post came back $date ("; - $date = strtotime($date); - if($debug) echo "$date seconds unixtime or ".$this->daysOld($date)." days)".$n; - return $date; - } - - /** - * Calculates the post number for a given number of days back in a group. - */ - function daytopost($nntp, $group, $days, $debug=true) - { - $n = $this->n; - $pddebug = false; //DEBUG every postdate call?!?! - if ($debug) echo "INFO: daytopost finding post for $group $days days back.".$n; - - $data = $nntp->selectGroup($group); - if(PEAR::isError($data)) - { - echo "Error {$data->code}: {$data->message}$n"; - echo "Returning from daytopost$n"; - return ""; - } - $goaldate = date('U')-(86400*$days); //goaltimestamp - $totalnumberofarticles = $data['last'] - $data['first']; - $upperbound = $data['last']; - $lowerbound = $data['first']; - - if ($debug) echo "Total Articles: $totalnumberofarticles $n Upper: $upperbound $n Lower: $lowerbound $n Goal: ".date("r", $goaldate)." ($goaldate) $n"; - if ($data['last']==PHP_INT_MAX) { echo "ERROR: Group data is coming back as php's max value. You should not see this since we use a patched Net_NNTP that fixes this bug.$n"; die(); } - - $firstDate = $this->postdate($nntp, $data['first'], $pddebug); - $lastDate = $this->postdate($nntp, $data['last'], $pddebug); - if ($goaldate < $firstDate) - { - echo "WARNING: Backfill target of $days day(s) is older than the first article stored on your news server.$n"; - echo "Starting from the first available article (".date("r", $firstDate)." or ".$this->daysOld($firstDate)." days).$n"; - return $data['first']; - } - elseif ($goaldate > $lastDate) - { - echo "ERROR: Backfill target of $days day(s) is newer than the last article stored on your news server.$n"; - echo "To backfill this group you need to set Backfill Days to at least ".ceil($this->daysOld($lastDate)+1)." days (".date("r", $lastDate-86400).").$n"; - return ""; - } - if ($debug) echo "DEBUG: Searching for postdate $n Goaldate: $goaldate (".date("r", $goaldate).") $n Firstdate: $firstDate (".((is_int($firstDate))?date("r", $firstDate):'n/a').") $n Lastdate: $lastDate (".date("r", $lastDate).") $n"; - - $interval = floor(($upperbound - $lowerbound) * 0.5); - $dateofnextone = ""; - $templowered = ""; - - if ($debug) echo "Start: ".$data['first']." $n End: ".$data['last']." $n Interval: $interval $n"; - - $dateofnextone = $lastDate; - - while($this->daysOld($dateofnextone) < $days) //match on days not timestamp to speed things up - { - $nskip = 1; - while(($tmpDate = $this->postdate($nntp,($upperbound-$interval),$pddebug))>$goaldate) - { - $upperbound = $upperbound - $interval - ($nskip - 1); - if($debug) echo "New upperbound ($upperbound) is ".$this->daysOld($tmpDate)." days old. $n"; - $nskip = $nskip * 2; - } - if(!$templowered) - { - $interval = ceil(($interval/2)); - if($debug) echo "Set interval to $interval articles. $n"; - } - $dateofnextone = $this->postdate($nntp,($upperbound-1),$pddebug); - - $skip = 1; - while(!$dateofnextone) - { - $upperbound = $upperbound - $skip; - $skip = $skip * 2; - if($debug) echo "Getting next article date... $upperbound\n"; - $dateofnextone = $this->postdate($nntp,($upperbound-1),$pddebug); - } - } - echo "Determined to be article $upperbound which is ".$this->daysOld($dateofnextone)." days old (".date("r", $dateofnextone).") $n"; - return $upperbound; - } - - /** - * Calculate the number of days from a timestamp. - */ - private function daysOld($timestamp) - { - return round((time()-$timestamp)/86400, 1); - } - - /** - * Calculate the number of days from a date. - */ - private function dateToDays($backfillDate) - { - return floor(-($backfillDate - time())/(60*60*24)); - } -} diff --git a/bin/innodb/lib/innodb/binaries.php b/bin/innodb/lib/innodb/binaries.php deleted file mode 100755 index 0179b2d02..000000000 --- a/bin/innodb/lib/innodb/binaries.php +++ /dev/null @@ -1,741 +0,0 @@ -n = "\n"; - - $s = new Sites(); - $site = $s->get(); - $this->compressedHeaders = ($site->compressedheaders == "1") ? true : false; - $this->messagebuffer = (!empty($site->maxmssgs)) ? $site->maxmssgs : 20000; - $this->NewGroupScanByDays = ($site->newgroupscanmethod == "1") ? true : false; - $this->NewGroupMsgsToScan = (!empty($site->newgroupmsgstoscan)) ? $site->newgroupmsgstoscan : 50000; - $this->NewGroupDaysToScan = (!empty($site->newgroupdaystoscan)) ? $site->newgroupdaystoscan : 3; - - $this->blackList = array(); //cache of our black/white list - $this->message = array(); - - if($db == null) - { - $this->db = new DB(); - } - else - { - $this->db = $db; - } - - } - - /* - * Allows you to set the db that the current object should use - */ - public function setDB($db) - { - $this->db = $db; - } - - /** - * Process headers and store in database for all active groups. - */ - function updateAllGroups() - { - $n = $this->n; - $groups = new Groups; - $res = $groups->getActive(); - - $s = new Sites(); - echo $s->getLicense(); - - if ($res) - { - shuffle($res); - $alltime = microtime(true); - echo 'Updating: '.sizeof($res).' groups - Using compression? '.(($this->compressedHeaders)?'Yes':'No').$n; - - $nntp = new Nntp(); - $nntp->doConnect(); - - $pos = 0; - foreach($res as $groupArr) - { - $pos++; - echo 'Group '.$pos.' of '.sizeof($res).$n; - $this->message = array(); - $this->updateGroup($nntp, $groupArr); - } - - $nntp->doQuit(); - echo 'Updating completed in '.number_format(microtime(true) - $alltime, 2).' seconds'.$n; - } - else - { - echo "No groups specified. Ensure groups are added to newznab's database and activated before updating.$n"; - } - } - - /** - * Process headers and store in database for a group. - */ - function updateGroup($nntp=null, $groupArr) - { - $this->db->disableAutoCommit(); - - $blnDoDisconnect = false; - if ($nntp == null) - { - $nntp = new Nntp(); - $nntp->doConnect(); - $this->message = array(); - $blnDoDisconnect = true; - } - - $backfill = new Backfill(); - $n = $this->n; - $this->startGroup = microtime(true); - - echo 'Processing '.$groupArr['name'].$n; - - // Connect to server - $data = $nntp->selectGroup($groupArr['name']); - if (PEAR::isError($data)) - { - echo "Could not select group (bad name?): {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - - //Attempt to repair any missing parts before grabbing new ones - $this->partRepair($nntp, $groupArr); - - //Get first and last part numbers from newsgroup - $last = $grouplast = $data['last']; - - // For new newsgroups - determine here how far you want to go back. - if ($groupArr['last_record'] == 0) - { - if ($this->NewGroupScanByDays) - { - $first = $backfill->daytopost($nntp, $groupArr['name'], $this->NewGroupDaysToScan, true); - if ($first == '') - { - echo "Skipping group: {$groupArr['name']}$n"; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - } - else - { - if ($data['first'] > ($data['last'] - $this->NewGroupMsgsToScan)) - $first = $data['first']; - else - $first = $data['last'] - $this->NewGroupMsgsToScan; - } - $first_record_postdate = $backfill->postdate($nntp, $first, false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record = %s, first_record_postdate = FROM_UNIXTIME(".$first_record_postdate.") WHERE ID = %d", $this->db->escapeString($first), $groupArr['ID'])); - } - else - { - if ($data['last'] < $groupArr['last_record']) - { - echo "Warning: Server's last num {$data['last']} is lower than the local last num {$groupArr['last_record']}".$n; - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - $first = $groupArr['last_record'] + 1; - } - - // Generate postdates for first and last records, for those that upgraded - if ((is_null($groupArr['first_record_postdate']) || is_null($groupArr['last_record_postdate'])) && ($groupArr['last_record'] != "0" && $groupArr['first_record'] != "0")) - $this->db->mysqliQuery(sprintf("UPDATE groups SET first_record_postdate = FROM_UNIXTIME(".$backfill->postdate($nntp,$groupArr['first_record'],false)."), last_record_postdate = FROM_UNIXTIME(".$backfill->postdate($nntp,$groupArr['last_record'],false).") WHERE ID = %d", $groupArr['ID'])); - - // Deactivate empty groups - if (($data['last'] - $data['first']) <= 5) - $this->db->mysqliQuery(sprintf("UPDATE groups SET active = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString('0'), $groupArr['ID'])); - - // Calculate total number of parts - $total = $grouplast - $first + 1; - - // If total is bigger than 0 it means we have new parts in the newsgroup - if($total > 0) - { - echo "Group ".$data["group"]." has ".number_format($total)." new parts.".$n; - echo "First: ".$data['first']." Last: ".$data['last']." Local last: ".$groupArr['last_record'].$n; - if ($groupArr['last_record'] == 0) - echo "New group starting with ".(($this->NewGroupScanByDays) ? $this->NewGroupDaysToScan." days" : $this->NewGroupMsgsToScan." messages")." worth.".$n; - - $done = false; - - // Get all the parts (in portions of $this->messagebuffer to not use too much memory) - while ($done === false) - { - $this->startLoop = microtime(true); - - if ($total > $this->messagebuffer) - { - if ($first + $this->messagebuffer > $grouplast) - $last = $grouplast; - else - $last = $first + $this->messagebuffer; - } - - echo "Getting ".number_format($last-$first+1)." parts (".$first." to ".$last.") - ".number_format($grouplast - $last)." in queue".$n; - flush(); - - //get headers from newsgroup - $lastId = $this->scan($nntp, $groupArr, $first, $last); - if ($lastId === false) - { - //scan failed - skip group - - $this->db->rollback(); //Rollback and re-enable auto committing - $this->db->enableAutoCommit(); - return; - } - $this->db->mysqliQuery(sprintf("UPDATE groups SET last_record = %s, last_updated = now() WHERE ID = %d", $this->db->escapeString($lastId), $groupArr['ID'])); - - $this->db->commit(); //At this point we are ready to commit a whole group to the db. - - if ($last == $grouplast) - $done = true; - else - { - $last = $lastId; - $first = $last + 1; - } - } - - $last_record_postdate = $backfill->postdate($nntp,$last,false); - $this->db->mysqliQuery(sprintf("UPDATE groups SET last_record_postdate = FROM_UNIXTIME(".$last_record_postdate."), last_updated = now() WHERE ID = %d", $groupArr['ID'])); //Set group's last postdate - $timeGroup = number_format(microtime(true) - $this->startGroup, 2); - echo "Group processed in $timeGroup seconds $n $n"; - } - else - { - echo "No new records for ".$data["group"]." (first $first last $last total $total) grouplast ".$groupArr['last_record'].$n.$n; - } - - if ($blnDoDisconnect) - { - $nntp->doQuit(); - } - - /* - * Got through the updating of this group successfully - * so commit and re-enable the auto committing. - */ - $this->db->commit(); //For anything not yet committed. - $this->db->enableAutoCommit(); - - } - - /** - * Download a range of usenet messages. Store binaries with subjects matching a - * specific pattern in the database. - */ - function scan($nntp, $groupArr, $first, $last, $type='update') - { - $n = $this->n; - $this->startHeaders = microtime(true); - - if ($this->compressedHeaders) - $msgs = $nntp->getXOverview($first."-".$last, true, false); - else - $msgs = $nntp->getOverview($first."-".$last, true, false); - - if (PEAR::isError($msgs) && $msgs->code == 400) - { - echo "NNTP connection timed out. Reconnecting...$n"; - $nntp->doConnect(); - $nntp->selectGroup($groupArr['name']); - if ($this->compressedHeaders) - $msgs = $nntp->getXOverview($first."-".$last, true, false); - else - $msgs = $nntp->getOverview($first."-".$last, true, false); - } - - $rangerequested = range($first, $last); - $msgsreceived = array(); - $msgsblacklisted = array(); - $msgsignored = array(); - $msgsinserted = array(); - $msgsnotinserted = array(); - - $timeHeaders = number_format(microtime(true) - $this->startHeaders, 2); - - if(PEAR::isError($msgs)) - { - echo "Error {$msgs->code}: {$msgs->message}$n"; - echo "Skipping group$n"; - return false; - } - - $this->startUpdate = microtime(true); - if (is_array($msgs)) - { - //loop headers, figure out parts - foreach($msgs AS $msg) - { - if (!isset($msg['Number'])) - continue; - - $msgsreceived[] = $msg['Number']; - $msgPart = $msgTotalParts = 0; - - $pattern = '|\((\d+)[\/](\d+)\)|i'; - preg_match_all($pattern, $msg['Subject'], $matches, PREG_PATTERN_ORDER); - $matchcnt = sizeof($matches[0]); - for ($i=0; $i<$matchcnt; $i++) - { - $msgPart = $matches[1][$i]; - $msgTotalParts = $matches[2][$i]; - } - - if (!isset($msg['Subject']) || $matchcnt == 0) // not a binary post most likely.. continue - { - $msgsignored[] = $msg['Number']; - continue; - } - - //Filter binaries based on black/white list - if ($this->isBlackListed($msg, $groupArr['name'])) - { - $msgsblacklisted[] = $msg['Number']; - continue; - } - - if((int)$msgPart > 0 && (int)$msgTotalParts > 0) - { - $subject = utf8_encode(trim(preg_replace('|\('.$msgPart.'[\/]'.$msgTotalParts.'\)|i', '', $msg['Subject']))); - - if(!isset($this->message[$subject])) - { - $this->message[$subject] = $msg; - $this->message[$subject]['MaxParts'] = (int) $msgTotalParts; - $this->message[$subject]['Date'] = strtotime($this->message[$subject]['Date']); - } - if((int)$msgPart > 0) - { - $this->message[$subject]['Parts'][(int)$msgPart] = array('Message-ID' => substr($msg['Message-ID'],1,-1), 'number' => $msg['Number'], 'part' => (int)$msgPart, 'size' => $msg['Bytes']); - } - } - } - unset($msg); - unset($msgs); - $count = 0; - $updatecount = 0; - $partcount = 0; - $maxnum = $last; - - $rangenotreceived = array_diff($rangerequested, $msgsreceived); - - - if ($type != 'partrepair') - echo "Received ".sizeof($msgsreceived)." articles of ".($last-$first+1)." requested, ".sizeof($msgsblacklisted)." blacklisted, ".sizeof($msgsignored)." not binaries $n"; - - if ($type == 'update' && sizeof($msgsreceived) == 0) - { - echo "Error: Server did not return any articles.$n"; - echo "Skipping group$n"; - return false; - } - - if (sizeof($rangenotreceived) > 0) { - switch($type) - { - case 'backfill': - //don't add missing articles - break; - case 'partrepair': - case 'update': - default: - $this->addMissingParts($rangenotreceived, $groupArr['ID']); - break; - } - echo "Server did not return ".count($rangenotreceived)." article(s).$n"; - } - - if(isset($this->message) && count($this->message)) - { - $maxnum = $first; - //insert binaries and parts into database. when binary already exists; only insert new parts - foreach($this->message AS $subject => $data) - { - if(isset($data['Parts']) && count($data['Parts']) > 0 && $subject != '') - { - $binaryHash = md5($subject.$data['From'].$groupArr['ID']); - $res = $this->db->mysqliQueryOneRow(sprintf("SELECT ID FROM binaries WHERE binaryhash = %s", $this->db->escapeString($binaryHash))); - if(!$res) - { - $sql = sprintf("INSERT INTO binaries (name, fromname, date, xref, totalparts, groupID, binaryhash, dateadded) VALUES (%s, %s, FROM_UNIXTIME(%s), %s, %s, %d, %s, now())", $this->db->escapeString($subject), $this->db->escapeString($data['From']), $this->db->escapeString($data['Date']), $this->db->escapeString($data['Xref']), $this->db->escapeString($data['MaxParts']), $groupArr['ID'], $this->db->escapeString($binaryHash)); - $binaryID = $this->db->mysqliQueryInsert($sql); - $count++; - if ($count%500==0) echo "$count bin adds..."; - } - else - { - $binaryID = $res["ID"]; - $updatecount++; - if ($updatecount%500==0) echo "$updatecount bin updates..."; - } - - foreach($data['Parts'] AS $partdata) - { - $maxnum = ($partdata['number'] > $maxnum) ? $partdata['number'] : $maxnum; - $partcount++; - $pidata = $this->db->mysqliQueryInsert(sprintf("INSERT INTO parts (binaryID, messageID, number, partnumber, size, dateadded) VALUES (%d, %s, %s, %s, %s, now())", $binaryID, $this->db->escapeString($partdata['Message-ID']), $this->db->escapeString($partdata['number']), $this->db->escapeString(round($partdata['part'])), $this->db->escapeString($partdata['size'])), false); - if (!$pidata) { - $msgsnotinserted[] = $partdata['number']; - } else { - $msgsinserted[] = $partdata['number']; - } - } - } - } - //TODO: determine whether to add to missing articles if insert failed - if (sizeof($msgsnotinserted) > 0) - { - echo 'WARNING: ' . count($msgsnotinserted) . ' Parts failed to insert'.$n; - $this->addMissingParts($msgsnotinserted, $groupArr['ID']); - } - if (($count >= 500) || ($updatecount >= 500)) { echo $n; } //line break for bin adds output - } - $timeUpdate = number_format(microtime(true) - $this->startUpdate, 2); - $timeLoop = number_format(microtime(true)-$this->startLoop, 2); - - if ($type != 'partrepair') - { - echo number_format($count).' new, '.number_format($updatecount).' updated, '.number_format($partcount).' parts.'; - echo " $timeHeaders headers, $timeUpdate update, $timeLoop range.$n"; - } - unset($this->message); - unset($data); - return $maxnum; - } - else - { - echo "Error: Can't get parts from server (msgs not array) $n"; - echo "Skipping group$n"; - return false; - } - } - - /** - * Go through all rows in partrepair table and see if theyve arrived on usenet yet. - */ - private function partRepair($nntp, $groupArr) - { - $n = $this->n; - - //get all parts in partrepair table - - $missingParts = $this->db->mysqliQuery(sprintf("SELECT * FROM partrepair WHERE groupID = %d AND attempts < 5 ORDER BY numberID ASC LIMIT 30000", $groupArr['ID'])); - $partsRepaired = $partsFailed = 0; - - if (sizeof($missingParts) > 0) - { - echo 'Attempting to repair '.sizeof($missingParts).' parts...'; - - //loop through each part to group into ranges - $ranges = array(); - $lastnum = $lastpart = 0; - foreach($missingParts as $part) - { - if (($lastnum+1) == $part['numberID']) { - $ranges[$lastpart] = $part['numberID']; - } else { - $lastpart = $part['numberID']; - $ranges[$lastpart] = $part['numberID']; - } - $lastnum = $part['numberID']; - } - - //download missing parts in ranges - foreach($ranges as $partfrom=>$partto) - { - $this->startLoop = microtime(true); - - echo "."; - - //get article from newsgroup - $this->scan($nntp, $groupArr, $partfrom, $partto, 'partrepair'); - - //check if the articles were added - $articles = implode(',', range($partfrom, $partto)); - $sql = sprintf("SELECT pr.ID, pr.numberID, p.number from partrepair pr LEFT JOIN parts p ON p.number = pr.numberID WHERE pr.groupID=%d AND pr.numberID IN (%s) ORDER BY pr.numberID ASC", $groupArr['ID'], $articles); - - $result = $this->db->mysqliQueryDirect($sql); - while ($r = mysqli_fetch_assoc($result)) - { - if (isset($r['number']) && $r['number'] == $r['numberID']) - { - $partsRepaired++; - - //article was added, delete from partrepair - $this->db->mysqliQuery(sprintf("DELETE FROM partrepair WHERE ID=%d", $r['ID'])); - } - else - { - $partsFailed++; - - //article was not added, increment attempts - $this->db->mysqliQuery(sprintf("UPDATE partrepair SET attempts=attempts+1 WHERE ID=%d", $r['ID'])); - } - } - } - - echo $n.$partsRepaired.' parts repaired.'.$n; - } - - //remove articles that we cant fetch after 5 attempts - $this->db->mysqliQuery(sprintf("DELETE FROM partrepair WHERE attempts >= 5 AND groupID = %d", $groupArr['ID'])); - - } - - /** - * Insert a missing part to the database. - */ - private function addMissingParts($numbers, $groupID) - { - - $added = false; - $insertStr = "INSERT INTO partrepair (numberID, groupID) VALUES "; - foreach($numbers as $number) - { - if ($number > 0) - { - $added = true; - $insertStr .= sprintf("(%u, %d), ", $number, $groupID); - } - } - if ($added) - { - $insertStr = substr($insertStr, 0, -2); - $insertStr .= " ON DUPLICATE KEY UPDATE attempts=attempts+1"; - return $this->db->mysqliQueryInsert($insertStr, false); - } - - return -1; - } - - /** - * Return internally cached list of binary blacklist patterns. - */ - public function retrieveBlackList() - { - if (is_array($this->blackList) && !empty($this->blackList)) { return $this->blackList; } - $blackList = $this->getBlacklist(true); - $this->blackList = $blackList; - return $blackList; - } - - /** - * Test if a message subject is blacklisted. - */ - public function isBlackListed($msg, $groupName) - { - $blackList = $this->retrieveBlackList(); - $field = array(); - if (isset($msg["Subject"])) - $field[Binaries::BLACKLIST_FIELD_SUBJECT] = $msg["Subject"]; - - if (isset($msg["From"])) - $field[Binaries::BLACKLIST_FIELD_FROM] = $msg["From"]; - - if (isset($msg["Message-ID"])) - $field[Binaries::BLACKLIST_FIELD_MESSAGEID] = $msg["Message-ID"]; - - foreach ($blackList as $blist) - { - if (preg_match('/^'.$blist['groupname'].'$/i', $groupName)) - { - //blacklist - if ($blist['optype'] == 1) - { - if (preg_match('/'.$blist['regex'].'/i', $field[$blist['msgcol']])) { - return true; - } - } - else if ($blist['optype'] == 2) - { - if (!preg_match('/'.$blist['regex'].'/i', $field[$blist['msgcol']])) { - return true; - } - } - } - } - - return false; - } - - /** - * Rawsearch. Perform a simple like match on binary subjects matching a pattern. - */ - public function search($search, $limit=1000, $excludedcats=array()) - { - - - // - // if the query starts with a ^ it indicates the search is looking for items which start with the term - // still do the like match, but mandate that all items returned must start with the provided word - // - $words = explode(" ", $search); - $searchsql = ""; - $intwordcount = 0; - if (count($words) > 0) - { - foreach ($words as $word) - { - // - // see if the first word had a caret, which indicates search must start with term - // - if ($intwordcount == 0 && (strpos($word, "^") === 0)) - $searchsql.= sprintf(" and b.name like %s", $this->db->escapeString(substr($word, 1)."%")); - else - $searchsql.= sprintf(" and b.name like %s", $this->db->escapeString("%".$word."%")); - - $intwordcount++; - } - } - - $exccatlist = ""; - if (count($excludedcats) > 0) - $exccatlist = " and b.categoryID not in (".implode(",", $excludedcats).") "; - - $res = $this->db->mysqliQuery(sprintf(" - SELECT b.*, - g.name AS group_name, - r.guid, - (SELECT COUNT(ID) FROM parts p where p.binaryID = b.ID) as 'binnum' - FROM binaries b - INNER JOIN groups g ON g.ID = b.groupID - LEFT OUTER JOIN releases r ON r.ID = b.releaseID - WHERE 1=1 %s %s order by DATE DESC LIMIT %d ", - $searchsql, $exccatlist, $limit)); - - return $res; - } - - /** - * Get all binaries for a release. - */ - public function getForReleaseId($id) - { - return $this->db->mysqliQuery(sprintf("select binaries.* from binaries where releaseID = %d order by relpart", $id)); - } - - /** - * Get a binary row. - */ - public function getById($id) - { - - return $this->db->mysqliQueryOneRow(sprintf("select binaries.*, groups.name as groupname from binaries left outer join groups on binaries.groupID = groups.ID where binaries.ID = %d ", $id)); - } - - /** - * Get list of blacklists from database. - */ - public function getBlacklist($activeonly=true) - { - - $where = ""; - if ($activeonly) - $where = " where binaryblacklist.status = 1 "; - - return $this->db->mysqliQuery("SELECT binaryblacklist.ID, binaryblacklist.optype, binaryblacklist.status, binaryblacklist.description, binaryblacklist.groupname AS groupname, binaryblacklist.regex, - groups.ID AS groupID, binaryblacklist.msgcol FROM binaryblacklist - left outer JOIN groups ON groups.name = binaryblacklist.groupname - ".$where." - ORDER BY coalesce(groupname,'zzz')"); - } - - /** - * Get a blacklist row from database. - */ - public function getBlacklistByID($id) - { - return $this->db->mysqliQueryOneRow(sprintf("select * from binaryblacklist where ID = %d ", $id)); - } - - /** - * Delete a blacklist row from database. - */ - public function deleteBlacklist($id) - { - - return $this->db->mysqliQuery(sprintf("delete from binaryblacklist where ID = %d", $id)); - } - - /** - * Update a blacklist row. - */ - public function updateBlacklist($regex) - { - - $groupname = $regex["groupname"]; - if ($groupname == "") - $groupname = "null"; - else - { - $groupname = preg_replace("/a\.b\./i", "alt.binaries.", $groupname); - $groupname = sprintf("%s", $this->db->escapeString($groupname)); - } - - $this->db->mysqliQuery(sprintf("update binaryblacklist set groupname=%s, regex=%s, status=%d, description=%s, optype=%d, msgcol=%d where ID = %d ", $groupname, $this->db->escapeString($regex["regex"]), $regex["status"], $this->db->escapeString($regex["description"]), $regex["optype"], $regex["msgcol"], $regex["id"])); - } - - /** - * Add a new blacklist row. - */ - public function addBlacklist($regex) - { - - - $groupname = $regex["groupname"]; - if ($groupname == "") - $groupname = "null"; - else - { - $groupname = preg_replace("/a\.b\./i", "alt.binaries.", $groupname); - $groupname = sprintf("%s", $this->db->escapeString($groupname)); - } - - return $this->db->mysqliQueryInsert(sprintf("insert into binaryblacklist (groupname, regex, status, description, optype, msgcol) values (%s, %s, %d, %s, %d, %d) ", - $groupname, $this->db->escapeString($regex["regex"]), $regex["status"], $this->db->escapeString($regex["description"]), $regex["optype"], $regex["msgcol"])); - } - - /** - * Add a new binary row and its associated parts. - */ - public function delete($id) - { - - $this->db->mysqliQuery(sprintf("delete from parts where binaryID = %d", $id)); - $this->db->mysqliQuery(sprintf("delete from binaries where ID = %d", $id)); - } -} diff --git a/bin/innodb/lib/innodb/config.php b/bin/innodb/lib/innodb/config.php deleted file mode 100755 index 8202b16b3..000000000 --- a/bin/innodb/lib/innodb/config.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/bin/innodb/lib/innodb/convertToInnoDB.php b/bin/innodb/lib/innodb/convertToInnoDB.php deleted file mode 100755 index aaee5c13d..000000000 --- a/bin/innodb/lib/innodb/convertToInnoDB.php +++ /dev/null @@ -1,18 +0,0 @@ -query("ALTER TABLE binaries ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;"); -echo "Finished converting the binaries table to InnoDB with compressed row format..\n\n"; - -echo "Converting the parts table to InnoDB with compressed row format.\n"; -$db->query("ALTER TABLE parts ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;"); -echo "Finished converting the parts table to InnoDB with compressed row format..\n\n"; - -?> diff --git a/bin/innodb/lib/nntp.php b/bin/innodb/lib/nntp.php deleted file mode 100755 index 5d068cdb7..000000000 --- a/bin/innodb/lib/nntp.php +++ /dev/null @@ -1,312 +0,0 @@ -connect(NNTP_SERVER, $enc, NNTP_PORT); - if(PEAR::isError($ret)) - { - echo "Cannot connect to server ".NNTP_SERVER.(!$enc?" (nonssl) ":"(ssl) ").": ".$ret->getMessage(); - die(); - } - if(!defined(NNTP_USERNAME) && NNTP_USERNAME!="" ) - { - $ret2 = $this->authenticate(NNTP_USERNAME, NNTP_PASSWORD); - if(PEAR::isError($ret2)) - { - echo "Cannot authenticate to server ".NNTP_SERVER.(!$enc?" (nonssl) ":" (ssl) ")." - ".NNTP_USERNAME." (".$ret2->getMessage().")"; - die(); - } - } - } - - /** - * End an NNTP connection. - */ - function doQuit() - { - $this->quit(); - } - - /** - * Retrieve an NNTP message and decode it. - */ - function getMessage($groupname, $partMsgId) - { - $summary = $this->selectGroup($groupname); - $message = $dec = ''; - - if (PEAR::isError($summary)) - { - echo "NntpPrc : ".substr($summary->getMessage(), 0, 30)."\n"; - return false; - } - - $body = $this->getBody('<'.$partMsgId.'>', true); - if (PEAR::isError($body)) - { - //echo 'NntpPrc : Error fetching part number '.$partMsgId.' in '.$groupname.' (Server response: '. $body->getMessage().')\n'; - return false; - } - - $message = $this->decodeYenc($body); - if (!$message) - { - // - // Yenc decode failed - // - return false; - } - - echo $message . "\n"; - return $message; - } - - /** - * Retrieve a series of NNTP messages and decode them. - */ - function getMessages($groupname, $msgIds) - { - $summary = $this->selectGroup($groupname); - $message = $dec = ''; - - if (PEAR::isError($summary)) - { - echo "NntpPrc : ".substr($summary->getMessage(), 0, 30)."\n"; - return false; - } - - foreach($msgIds as $msgId) - { - $messageID = '<'.$msgId.'>'; - $body = $this->getBody($messageID, true); - if (PEAR::isError($body)) - { - //echo 'NntpPrc : Error fetching '.$messageID.' in '.$groupname.' (Server response: '. $body->getMessage().')'; - return false; - } - - $dec = $this->decodeYenc($body); - if (!$dec) - { - // - // Yenc decode failed - // - return false; - } - - $message .= $dec; - } - return $message; - } - - /** - * Retrieve all NNTP messages associated with a binaries.ID - */ - function getBinary($binaryId, $isNfo=false) - { - $db = new DB(); - $bin = new Binaries(); - - $binary = $bin->getById($binaryId); - if (!$binary) - return false; - - $summary = $this->selectGroup($binary['groupname']); - $message = $dec = ''; - - if (PEAR::isError($summary)) - { - echo "NntpPrc : ".substr($summary->getMessage(), 0, 30)."\n"; - return false; - } - - $resparts = $db->query(sprintf("SELECT size, partnumber, messageID FROM parts WHERE binaryID = %d ORDER BY partnumber", $binaryId)); - - // - // Dont attempt to download nfos which are larger than one part. - // - if (sizeof($resparts) > 1 && $isNfo === true) - { - return false; - } - - foreach($resparts as $part) - { - $messageID = '<'.$part['messageID'].'>'; - $body = $this->getBody($messageID, true); - if (PEAR::isError($body)) - { - //echo 'NntpPrc : Error fetching part number '.$part['messageID'].' in '.$binary['groupname'].' (Server response: '. $body->getMessage().')'; - return false; - } - - $dec = $this->decodeYenc($body); - if (!$dec) - { - // - // Yenc decode failed - // - return false; - } - - $message .= $dec; - } - return $message; - } - - /** - * Get XZVER for a range of NNTP messages. - */ - function getXOverview($range, $_names = true, $_forceNames = true) - { - // Fetch overview from server - $overview = $this->cmdXZver($range); - if (PEAR::isError($overview)) { - return $overview; - } - - // Use field names from overview format as keys? - if ($_names) - { - // Already cached? - if (is_null($this->_overviewFormatCache)) { - // Fetch overview format - $format = $this->getOverviewFormat($_forceNames, true); - if (PEAR::isError($format)){ - return $format; - } - - // Prepend 'Number' field - $format = array_merge(array('Number' => false), $format); - - // Cache format - $this->_overviewFormatCache = $format; - } - else - { - $format = $this->_overviewFormatCache; - } - - // Loop through all articles - foreach ($overview as $key => $article) - { - if (sizeof($format) == sizeof($article)) - { - //Replace overview using $format as keys, $article as values - $overview[$key] = array_combine(array_keys($format), $article); - - // If article prefixed by field name, remove it - foreach($format as $fkey=>$fval) - { - if ($fval === true) - { - $overview[$key][$fkey] = trim(str_replace($fkey.':', '', $overview[$key][$fkey])); - } - } - } - } - } - - switch (true) - { - // Expect one article - case is_null($range); - case is_int($range); - case is_string($range) && ctype_digit($range): - case is_string($range) && substr($range, 0, 1) == '<' && substr($range, -1, 1) == '>': - if (count($overview) == 0) { - return false; - } else { - return reset($overview); - } - break; - - // Expect multiple articles - default: - return $overview; - } - } - - /** - * Send XZVER command over NNTP connection. - */ - function cmdXZver($range = NULL) - { - if (is_null($range)) - $command = 'XZVER'; - else - $command = 'XZVER ' . $range; - - $response = $this->_sendCommand($command); - - switch ($response) { - case 224: // 224, RFC2980: 'Overview information follows' - $data = $this->_getTextResponse(); - - //de-yenc - $dec = $this->decodeYenc(implode("\r\n", $data)); - if (!$dec) - { - $this->throwError("yenc decode failure"); - } - - //inflate deflated string - $data = explode("\r\n", gzinflate($dec)); - - foreach ($data as $key => $value) - $data[$key] = explode("\t", ltrim($value)); - - return $data; - break; - case 412: // 412, RFC2980: 'No news group current selected' - $this->throwError("No news group current selected ({$this->_currentStatusResponse()})", $response); - break; - case 420: // 420, RFC2980: 'No article(s) selected' - $this->throwError("No article(s) selected ({$this->_currentStatusResponse()})", $response); - break; - case 502: // 502 RFC2980: 'no permission' - $this->throwError("No permission ({$this->_currentStatusResponse()})", $response); - break; - case 500: // 500 RFC2980: 'unknown command' - $this->throwError("XZver not supported ({$this->_currentStatusResponse()})", $response); - break; - default: - return $this->_handleUnexpectedResponse($response); - } - } - - /** - * Decode a yenc encoded string. - */ - function decodeYenc($yencodedvar) - { - $input = array(); - preg_match("/^(=ybegin.*=yend[^$]*)$/ims", $yencodedvar, $input); - if (isset($input[1])) - { - $ret = ""; - $input = trim(preg_replace("/\r\n/im", "", preg_replace("/(^=yend.*)/im", "", preg_replace("/(^=ypart.*\\r\\n)/im", "", preg_replace("/(^=ybegin.*\\r\\n)/im", "", $input[1], 1), 1), 1))); - - for( $chr = 0; $chr < strlen($input) ; $chr++) - $ret .= ($input[$chr] != "=" ? chr(ord($input[$chr]) - 42) : chr((ord($input[++$chr]) - 64) - 42)); - - return $ret; - } - return false; - } -} diff --git a/bin/innodb/lib/powerspawn.php b/bin/innodb/lib/powerspawn.php deleted file mode 100644 index bdc5860c5..000000000 --- a/bin/innodb/lib/powerspawn.php +++ /dev/null @@ -1,174 +0,0 @@ - - * @link https://github.com/lordgnu/PowerSpawn - * @version 1.0 - */ -class PowerSpawn -{ - private $myChildren; - private $parentPID; - private $shutdownCallback = null; - private $killCallback = null; - - public $maxChildren = 10; // Max number of children allowed to Spawn - public $timeLimit = 0; // Time limit in seconds (0 to disable) - public $sleepCount = 1; // Number of seconds to sleep on Tick() - - public $childData; // Variable for storage of data to be passed to the next spawned child - public $complete; - - public function __construct() { - if (function_exists('pcntl_fork') && function_exists('posix_getpid')) { - // Everything is good - $this->parentPID = $this->myPID(); - $this->myChildren = array(); - $this->complete = false; - - // Install the signal handler - pcntl_signal(SIGCHLD, array($this, 'sigHandler')); - } else { - die("You must have POSIX and PCNTL functions to use PowerSpawn\n"); - } - } - - public function __destruct() { - - } - - public function sigHandler($signo) { - switch ($signo) { - case SIGCHLD: - $this->checkChildren(); - break; - } - } - - public function checkChildren() { - foreach ($this->myChildren as $i => $child) { - // Check for time running and if still running - if ($this->pidDead($child['pid']) != 0) { - // Child is dead - unset($this->myChildren[$i]); - } elseif ($this->timeLimit > 0) { - // Check the time limit - if (time() - $child['time'] >= $this->timeLimit) { - // Child had exceeded time limit - $this->killChild($child['pid']); - unset($this->myChildren[$i]); - } - } - } - } - - public function myPID() { - return posix_getpid(); - } - - public function myParent() { - return posix_getppid(); - } - - public function spawnChild() { - $time = time(); - $pid = pcntl_fork(); - if ($pid) $this->myChildren[] = array('time'=>$time,'pid'=>$pid); - } - - public function killChild($pid = 0) { - if ($pid > 0) { - posix_kill($pid, SIGTERM); - if ($this->killCallback !== null) call_user_func($this->killCallback); - } - } - - public function parentCheck() { - if ($this->myPID() == $this->parentPID) { - return true; - } else { - return false; - } - } - - public function pidDead($pid = 0) { - if ($pid > 0) { - return pcntl_waitpid($pid, $status, WUNTRACED OR WNOHANG); - } else { - return 0; - } - } - - public function setCallback($callback = null) { - $this->shutdownCallback = $callback; - } - - public function setKillCallback($callback = null) { - $this->killCallback = $callback; - } - - public function childCount() { - return count($this->myChildren); - } - - public function runParentCode() { - if (!$this->complete) { - return $this->parentCheck(); - } else { - if ($this->shutdownCallback !== null) - call_user_func($this->shutdownCallback); - return false; - } - } - - public function runChildCode() { - return !$this->parentCheck(); - } - - public function spawnReady() { - if (count($this->myChildren) < $this->maxChildren) { - return true; - } else { - return false; - } - } - - public function shutdown() { - while($this->childCount()) { - $this->checkChildren(); - $this->tick(); - } - $this->complete = true; - } - - public function tick() { - sleep($this->sleepCount); - } -} - - -/* -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -https://github.com/lordgnu/PowerSpawn for usage examples -*/ diff --git a/bin/innodb/lib/site.php b/bin/innodb/lib/site.php deleted file mode 100755 index a9d6fd6e1..000000000 --- a/bin/innodb/lib/site.php +++ /dev/null @@ -1,146 +0,0 @@ -row2Object($form); - - if (substr($site->nzbpath, strlen($site->nzbpath) - 1) != '/') - $site->nzbpath = $site->nzbpath."/"; - - // - // Validate site settings - // - if ($site->mediainfopath != "" && !is_file($site->mediainfopath)) - return Sites::ERR_BADMEDIAINFOPATH; - - if ($site->ffmpegpath != "" && !is_file($site->ffmpegpath)) - return Sites::ERR_BADFFMPEGPATH; - - if ($site->unrarpath != "" && !is_file($site->unrarpath)) - return Sites::ERR_BADUNRARPATH; - - if ($site->nzbpath != "" && !file_exists($site->nzbpath)) - return Sites::ERR_BADNZBPATH; - - if ($site->checkpasswordedrar == 2 && !is_file($site->unrarpath)) - return Sites::ERR_DEEPNOUNRAR; - - if ($site->tmpunrarpath != "" && !file_exists($site->tmpunrarpath)) - return Sites::ERR_BADTMPUNRARPATH; - - if ($site->lamepath != "" && !file_exists($site->lamepath)) - return Sites::ERR_BADLAMEPATH; - - if ($site->sabcompletedir != "" && !file_exists($site->sabcompletedir)) - return Sites::ERR_SABCOMPLETEPATH; - - $sql = $sqlKeys = array(); - foreach($form as $settingK=>$settingV) - { - $sql[] = sprintf("WHEN %s THEN %s", $db->escapeString($settingK), $db->escapeString(trim($settingV))); - $sqlKeys[] = $db->escapeString($settingK); - } - - $db->query(sprintf("UPDATE site SET value = CASE setting %s END WHERE setting IN (%s)", implode(' ', $sql), implode(', ', $sqlKeys))); - - return $site; - } - - public function get() - { - $db = new DB(); - $rows = $db->query("select * from site"); - - if ($rows === false) - return false; - - return $this->rows2Object($rows); - } - - public function rows2Object($rows) - { - $obj = new stdClass; - foreach($rows as $row) - $obj->{$row['setting']} = $row['value']; - - $obj->{'version'} = $this->version(); - return $obj; - } - - public function row2Object($row) - { - $obj = new stdClass; - $rowKeys = array_keys($row); - foreach($rowKeys as $key) - $obj->{$key} = $row[$key]; - - return $obj; - } - - public function getUnappliedPatches($site) - { - preg_match("/\d+/", $site->dbversion, $matches); - $currentrev = $matches[0]; - - $patchpath = WWW_DIR."../db/patch/0.2.3/"; - $patchfiles = glob($patchpath."*.sql"); - $missingpatch = array(); - foreach($patchfiles as $file) - { - $filecontents = file_get_contents($file); - if (preg_match("/Rev\: (\d+)/", $filecontents, $matches)) - { - $patchrev = $matches[1]; - if ($patchrev > $currentrev) - $missingpatch[] = $file; - } - } - return $missingpatch; - } - - public function updateItem($setting, $value) - { - $db = new DB(); - $sql = sprintf("update site set value = %s where setting = %s", $db->escapeString($value), $db->escapeString($setting)); - return $db->query($sql); - } - - public function updateLatestRegexRevision($rev) - { - return $this->updateItem("latestregexrevision", $rev); - } - - public function getLicense($html=false) - { - $n = "\r\n"; - if ($html) - $n = "
"; - - return $n."newznab ".$this->version()." Copyright (C) ".date("Y")." newznab.com".$n." - -This program is distributed with a commercial licence. See LICENCE.txt for -further details.".$n; - } -} diff --git a/bin/innodb/nzb-import.php b/bin/innodb/nzb-import.php deleted file mode 100755 index fc78e7148..000000000 --- a/bin/innodb/nzb-import.php +++ /dev/null @@ -1,143 +0,0 @@ -query("SELECT ID, name FROM groups"); -foreach ($groups as $group) - $siteGroups[$group["name"]] = $group["ID"]; - -if (!isset($groups) || count($groups) == 0) { - echo "no groups available in the database, add first.\n"; -} else { - $nzbCount = 0; - - - - if (count($filestoprocess) == 0) - $filestoprocess = glob($path . "*.nzb"); - $start = date('Y-m-d H:i:s'); - - foreach ($filestoprocess as $nzbFile) { - $importfailed = false; - $transaction = ""; - $nzb = file_get_contents($nzbFile); - - $xml = @simplexml_load_string($nzb); - if (!$xml || strtolower($xml->getName()) != 'nzb') { - continue; - } - - $i = 0; - foreach ($xml->file as $file) { - //file info - $groupID = -1; - $name = (string)$file->attributes()->subject; - $fromname = (string)$file->attributes()->poster; - $unixdate = (string)$file->attributes()->date; - $date = date("Y-m-d H:i:s", (string)$file->attributes()->date); - - //groups - $groupArr = array(); - foreach ($file->groups->group as $group) { - $group = (string)$group; - if (array_key_exists($group, $siteGroups)) { - $groupID = $siteGroups[$group]; - } - $groupArr[] = $group; - } - - if ($groupID != -1) { - $xref = implode(': ', $groupArr) . ':'; - - $totalParts = sizeof($file->segments->segment); - - //insert binary - $binaryHash = md5($name . $fromname . $groupID); - - - if ($usenzbname) { //Use the binary names - $usename = str_replace('.nzb', '', basename($nzbFile)); - - $binarySql = sprintf("INSERT INTO binaries (name, fromname, date, xref, totalParts, groupID, binaryhash, dateadded, importname, relname, relpart, reltotalpart, procstat, categoryID, regexID, reqID) values (%s, %s, %s, %s, %s, %s, %s, NOW(), %s, replace(%s, '_', ' '), %d, %d, %d, %s, %d, %s);", - $db->escapeString($name), $db->escapeString($fromname), $db->escapeString($date), - $db->escapeString($xref), $db->escapeString($totalParts), $db->escapeString($groupID), $db->escapeString($binaryHash), $db->escapeString($nzbFile), - $db->escapeString($usename), 1, 1, 5, "null", "null", "null"); - - $transaction = $transaction . $binarySql; - - } else { //Don't use the binary names - $binarySql = sprintf("INSERT INTO binaries (name, fromname, date, xref, totalParts, groupID, binaryhash, dateadded, importname) values (%s, %s, %s, %s, %s, %s, %s, NOW(), %s);", - $db->escapeString($name), $db->escapeString($fromname), $db->escapeString($date), - $db->escapeString($xref), $db->escapeString($totalParts), $db->escapeString($groupID), $db->escapeString($binaryHash), $db->escapeString($nzbFile)); - - $transaction = $transaction . $binarySql; - } - - $sessionVarSQL = "SET @binID = last_insert_id();"; - $transaction = $transaction . $sessionVarSQL; - - //segments (i.e. parts) - if (count($file->segments->segment) > 0) { - $partsSql = "INSERT INTO parts (binaryID, messageID, number, partnumber, size, dateadded) values "; - foreach ($file->segments->segment as $segment) { - $messageId = (string)$segment; - $partnumber = $segment->attributes()->number; - $size = $segment->attributes()->bytes; - - $partsSql .= sprintf("(%s, %s, 0, %s, %s, NOW()),", - "@binID", $db->escapeString($messageId), $db->escapeString($partnumber), - $db->escapeString($size)); - } - $partsSql = substr($partsSql, 0, -1) . ";"; - $transaction = $transaction . $partsSql; - } - - } else { - $importfailed = true; - - echo ("no group found for " . $name . " (one of " . implode(', ', $groupArr) . " are missing)" . $strTerminator); - flush(); - break; - } - } - - if (!$importfailed) { - $db->multiQueryTransaction($transaction); - - $nzbCount++; - @unlink($nzbFile); - - echo ("imported " . $nzbFile . $strTerminator); - flush(); - } - if ($nzbCount == 100) { - break; - } - } -} -$seconds = strtotime(date('Y-m-d H:i:s')) - strtotime($start); -$retval .= 'Processed ' . $nzbCount . ' nzbs in ' . $seconds . ' second(s)'; - -echo $retval; -die(); diff --git a/bin/innodb/update_binaries.php b/bin/innodb/update_binaries.php deleted file mode 100755 index db5a59596..000000000 --- a/bin/innodb/update_binaries.php +++ /dev/null @@ -1,24 +0,0 @@ -getByName($group); - - $bin = new Binaries; - $bin->updateGroup(null, $group); -} -else -{ - $binaries = new Binaries; - $binaries->updateAllGroups(); -} - -?> diff --git a/bin/innodb/update_binaries_threaded.php b/bin/innodb/update_binaries_threaded.php deleted file mode 100755 index 965d47d33..000000000 --- a/bin/innodb/update_binaries_threaded.php +++ /dev/null @@ -1,77 +0,0 @@ -getActive(); -unset($groups); - -$ps = new PowerSpawn; -$ps->setCallback('psUpdateComplete'); -$ps->maxChildren = 10; -$ps->timelimit = 0; // Disable child timeout - -echo "Starting threaded binary update process\n"; - -while ($ps->runParentCode()) -{ - // Start the parent loop - if (count($groupList)) - { - // We still have groups to process - if ($ps->spawnReady()) - { - // Spawn another thread - $ps->childData = array_pop($groupList); - echo "[Thread-MASTER] Spawning new thread. Still have " . count($groupList) ." group(s) to update after this\n"; - $ps->spawnChild(); - } - else - { - // There are no more slots available to run - $ps->tick(); - #echo "- \n"; - } - } - else - { - // No more groups to process - echo "No more groups to process - Initiating shutdown\n"; - $ps->shutdown(); - echo "Shutdown complete\n"; - } -} - -unset($groupList); - -if ($ps->runChildCode()) -{ - $group = $ps->childData; - - $thread = sprintf("%05d",$ps->myPID()); - - echo "[Thread-{$thread}] Begining processing for group {$group['name']}\n"; - - $param = $group['name']; - - $dir = dirname(__FILE__); - $file = 'update_binaries.php'; - - $output = shell_exec("php {$dir}/{$file} {$param}"); - - echo "[Thread-{$thread}] Completed update for group {$group['name']}\n"; -} - -// Exit to call back to parent - Let know that child has completed -exit(0); - -// Create callback function -function psUpdateComplete() -{ - echo "[Thread-MASTER] Threaded update process complete\n"; -} - -?> diff --git a/bin/myisam/backfill.php b/bin/myisam/backfill.php deleted file mode 100644 index 43690e0d7..000000000 --- a/bin/myisam/backfill.php +++ /dev/null @@ -1,15 +0,0 @@ -backfillAllGroups($groupName); - -?> diff --git a/bin/myisam/backfill_threaded.php b/bin/myisam/backfill_threaded.php deleted file mode 100755 index 06c7ec0e5..000000000 --- a/bin/myisam/backfill_threaded.php +++ /dev/null @@ -1,77 +0,0 @@ -getActive(); -unset($groups); - -$ps = new PowerSpawn; -$ps->setCallback('psUpdateComplete'); -$ps->maxChildren = 10; -$ps->timeLimit = 0; // Disable child timeout - -echo "Starting threaded backfill process\n"; - -while ($ps->runParentCode()) -{ - // Start the parent loop - if (count($groupList)) - { - // We still have groups to process - if ($ps->spawnReady()) - { - // Spawn another thread - $ps->childData = array_pop($groupList); - echo "[Thread-MASTER] Spawning new thread. Still have " . count($groupList) ." group(s) to update after this\n"; - $ps->spawnChild(); - } - else - { - // There are no more slots available to run - $ps->tick(); - #echo ". \n"; - } - } - else - { - // No more groups to process - echo "No more groups to process - Initiating shutdown\n"; - $ps->shutdown(); - echo "Shutdown complete\n"; - } -} - -unset($groupList); - -if ($ps->runChildCode()) -{ - $group = $ps->childData; - - $thread = sprintf("%05d",$ps->myPID()); - - echo "[Thread-{$thread}] Begining backfill processing for group {$group['name']}\n"; - - $param = $group['name']; - - $dir = dirname(__FILE__); - $file = 'backfill.php'; - - $output = shell_exec("php {$dir}/{$file} {$param}"); - - echo "[Thread-{$thread}] Completed update for group {$group['name']}\n"; -} - -// Exit to call back to parent - Let know that child has completed -exit(0); - -// Create callback function -function psUpdateComplete() -{ - echo "[Thread-MASTER] Threaded backfill process complete\n"; -} - -?> diff --git a/bin/myisam/powerspawn.php b/bin/myisam/powerspawn.php deleted file mode 100644 index bdc5860c5..000000000 --- a/bin/myisam/powerspawn.php +++ /dev/null @@ -1,174 +0,0 @@ - - * @link https://github.com/lordgnu/PowerSpawn - * @version 1.0 - */ -class PowerSpawn -{ - private $myChildren; - private $parentPID; - private $shutdownCallback = null; - private $killCallback = null; - - public $maxChildren = 10; // Max number of children allowed to Spawn - public $timeLimit = 0; // Time limit in seconds (0 to disable) - public $sleepCount = 1; // Number of seconds to sleep on Tick() - - public $childData; // Variable for storage of data to be passed to the next spawned child - public $complete; - - public function __construct() { - if (function_exists('pcntl_fork') && function_exists('posix_getpid')) { - // Everything is good - $this->parentPID = $this->myPID(); - $this->myChildren = array(); - $this->complete = false; - - // Install the signal handler - pcntl_signal(SIGCHLD, array($this, 'sigHandler')); - } else { - die("You must have POSIX and PCNTL functions to use PowerSpawn\n"); - } - } - - public function __destruct() { - - } - - public function sigHandler($signo) { - switch ($signo) { - case SIGCHLD: - $this->checkChildren(); - break; - } - } - - public function checkChildren() { - foreach ($this->myChildren as $i => $child) { - // Check for time running and if still running - if ($this->pidDead($child['pid']) != 0) { - // Child is dead - unset($this->myChildren[$i]); - } elseif ($this->timeLimit > 0) { - // Check the time limit - if (time() - $child['time'] >= $this->timeLimit) { - // Child had exceeded time limit - $this->killChild($child['pid']); - unset($this->myChildren[$i]); - } - } - } - } - - public function myPID() { - return posix_getpid(); - } - - public function myParent() { - return posix_getppid(); - } - - public function spawnChild() { - $time = time(); - $pid = pcntl_fork(); - if ($pid) $this->myChildren[] = array('time'=>$time,'pid'=>$pid); - } - - public function killChild($pid = 0) { - if ($pid > 0) { - posix_kill($pid, SIGTERM); - if ($this->killCallback !== null) call_user_func($this->killCallback); - } - } - - public function parentCheck() { - if ($this->myPID() == $this->parentPID) { - return true; - } else { - return false; - } - } - - public function pidDead($pid = 0) { - if ($pid > 0) { - return pcntl_waitpid($pid, $status, WUNTRACED OR WNOHANG); - } else { - return 0; - } - } - - public function setCallback($callback = null) { - $this->shutdownCallback = $callback; - } - - public function setKillCallback($callback = null) { - $this->killCallback = $callback; - } - - public function childCount() { - return count($this->myChildren); - } - - public function runParentCode() { - if (!$this->complete) { - return $this->parentCheck(); - } else { - if ($this->shutdownCallback !== null) - call_user_func($this->shutdownCallback); - return false; - } - } - - public function runChildCode() { - return !$this->parentCheck(); - } - - public function spawnReady() { - if (count($this->myChildren) < $this->maxChildren) { - return true; - } else { - return false; - } - } - - public function shutdown() { - while($this->childCount()) { - $this->checkChildren(); - $this->tick(); - } - $this->complete = true; - } - - public function tick() { - sleep($this->sleepCount); - } -} - - -/* -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -https://github.com/lordgnu/PowerSpawn for usage examples -*/ diff --git a/bin/myisam/update_binaries.php b/bin/myisam/update_binaries.php deleted file mode 100644 index bedcb7fc4..000000000 --- a/bin/myisam/update_binaries.php +++ /dev/null @@ -1,25 +0,0 @@ -getByName($group); - - $bin = new Binaries; - $bin->updateGroup(null, $group); -} -else -{ - $binaries = new Binaries; - $binaries->updateAllGroups(); -} - -?> diff --git a/bin/myisam/update_binaries_threaded.php b/bin/myisam/update_binaries_threaded.php deleted file mode 100755 index 6e472fe2b..000000000 --- a/bin/myisam/update_binaries_threaded.php +++ /dev/null @@ -1,77 +0,0 @@ -getActive(); -unset($groups); - -$ps = new PowerSpawn; -$ps->setCallback('psUpdateComplete'); -$ps->maxChildren = 10; -$ps->timelimit = 0; // Disable child timeout - -echo "Starting threaded binary update process\n"; - -while ($ps->runParentCode()) -{ - // Start the parent loop - if (count($groupList)) - { - // We still have groups to process - if ($ps->spawnReady()) - { - // Spawn another thread - $ps->childData = array_pop($groupList); - echo "[Thread-MASTER] Spawning new thread. Still have " . count($groupList) ." group(s) to update after this\n"; - $ps->spawnChild(); - } - else - { - // There are no more slots available to run - $ps->tick(); - #echo "- \n"; - } - } - else - { - // No more groups to process - echo "No more groups to process - Initiating shutdown\n"; - $ps->shutdown(); - echo "Shutdown complete\n"; - } -} - -unset($groupList); - -if ($ps->runChildCode()) -{ - $group = $ps->childData; - - $thread = sprintf("%05d",$ps->myPID()); - - echo "[Thread-{$thread}] Begining processing for group {$group['name']}\n"; - - $param = $group['name']; - - $dir = dirname(__FILE__); - $file = 'update_binaries.php'; - - $output = shell_exec("php {$dir}/{$file} {$param}"); - - echo "[Thread-{$thread}] Completed update for group {$group['name']}\n"; -} - -// Exit to call back to parent - Let know that child has completed -exit(0); - -// Create callback function -function psUpdateComplete() -{ - echo "[Thread-MASTER] Threaded update process complete\n"; -} - -?> diff --git a/bin/workhorse.sh b/bin/workhorse.sh index cd86525cd..29ad4ad7f 100755 --- a/bin/workhorse.sh +++ b/bin/workhorse.sh @@ -18,20 +18,19 @@ if [ "$THREADS" == "true" -a "$INNODB" == "true" ]; then #make active groups current if [[ $BINARIES == "true" ]] ; then - cd $INNODB_PATH + cd $NEWZNAB_PATH [ -f update_binaries_threaded.php ] && $PHP update_binaries_threaded.php fi #get backfill for all active groups if [[ $BACKFILL == "true" ]] ; then - cd $INNODB_PATH + cd $NEWZNAB_PATH [ -f backfill_threaded.php ] && $PHP backfill_threaded.php fi wait if [[ $BACKFILL == "true" ]] ; then - cd $INNODB_PATH #increment backfill days $MYSQL -u$DB_USER -h $DB_HOST --password=$DB_PASSWORD $DB_NAME -e "${MYSQL_CMD}" fi @@ -65,7 +64,6 @@ elif [ "$THREADS" != "true" -a "$INNODB" == "true" ]; then wait if [[ $BACKFILL == "true" ]] ; then - cd $INNODB_PATH #increment backfill days $MYSQL -u$DB_USER -h $DB_HOST --password=$DB_PASSWORD $DB_NAME -e "${MYSQL_CMD}" fi @@ -87,20 +85,19 @@ elif [ "$THREADS" == "true" -a "$INNODB" != "true" ]; then #make active groups current if [[ $BINARIES == "true" ]] ; then - cd $MYISAM_PATH + cd $NEWZNAB_PATH [ -f update_binaries_threaded.php ] && $PHP update_binaries_threaded.php fi #get backfill for all active groups if [[ $BACKFILL == "true" ]] ; then - cd $MYISAM_PATH + cd $NEWZNAB_PATH [ -f backfill_threaded.php ] && $PHP backfill_threaded.php fi wait if [[ $BACKFILL == "true" ]] ; then - cd $INNODB_PATH #increment backfill days $MYSQL -u$DB_USER -h $DB_HOST --password=$DB_PASSWORD $DB_NAME -e "${MYSQL_CMD}" fi @@ -135,7 +132,6 @@ elif [ "$THREADS" != "true" -a "$INNODB" != "true" ]; then wait if [[ $BACKFILL == "true" ]] ; then - cd $INNODB_PATH #increment backfill days $MYSQL -u$DB_USER -h $DB_HOST --password=$DB_PASSWORD $DB_NAME -e "${MYSQL_CMD}" fi diff --git a/edit_these.sh b/edit_these.sh index 36eb700f0..bbb3bd583 100755 --- a/edit_these.sh +++ b/edit_these.sh @@ -7,6 +7,7 @@ export NEWZPATH="/var/www/newznab" export NEWZNAB_PATH=$NEWZPATH"/misc/update_scripts" export TESTING_PATH=$NEWZPATH"/misc/testing" export ADMIN_PATH=$NEWZPATH"/www/admin" +export INNODB_PATH=$TESTING_PATH"/innodb" export USERNAME="what is your name" # this is the user name that will run these scripts export NEWZNAB_IMPORT_SLEEP_TIME="1" # in seconds - this includes import_nzb backfill and current fill, 0 may cause errors export NEWZNAB_POST_SLEEP_TIME="1" # in seconds - this is for post processing - sleep between loops, 0 may cause errors @@ -14,16 +15,16 @@ export MAXDAYS="210" #max days for backfill export NZBS="/path/to/nzbs" #The path to the nzb dump you downloaded from torrents #Choose to run the threaded or non-threaded newznab scripts true/false -export THREADS="true" +export THREADS="false" #Choose your database, comment the one true/false -export INNODB="true" +export INNODB="false" #Choose to run update_cleanup.php true/false -export CLEANUP="true" +export CLEANUP="false" #Choose to run update_binaries true/false -export BINARIES="true" +export BINARIES="false" #Choose to run backfill script true/false export BACKFILL="true" @@ -32,11 +33,11 @@ export BACKFILL="true" export IMPORT="true" #Select some monitoring script, if they are not installed, it will not affect the running of the scripts -export USE_HTOP="true" -export USE_NMON="true" -export USE_BWMNG="true" -export USE_IOTOP="true" -export USE_MYTOP="true" +export USE_HTOP="false" +export USE_NMON="false" +export USE_BWMNG="false" +export USE_IOTOP="false" +export USE_MYTOP="false" #By using this script you understand that the programmer is not responsible for any loss of data, users, or sanity. #You also agree that you were smart enough to make a backup of your database and files. Do you agree? yes/no diff --git a/start.sh b/start.sh index 3bb8a14ec..1f243b3ed 100755 --- a/start.sh +++ b/start.sh @@ -18,10 +18,6 @@ if [[ $AGREED == "no" ]]; then exit fi -export INNODB_PATH=$DIR"/bin/innodb" -export MYISAM_PATH=$DIR"/bin/myisam" -export START_PATH=$DIR - #delete some files [ -f bin/lib/postprocess4.php ];rm bin/lib/postprocess4.php [ -f bin/processAlternate4.php ];rm bin/processAlternate4.php