0
|
1 <?php |
|
2 require_once './pdo.php'; |
|
3 require_once './config.php'; |
|
4 |
|
5 foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { |
|
6 $socket = stream_socket_client($peer['address']); |
|
7 if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); |
|
8 $line = nntp_readline($socket); |
|
9 $code = strtok($line, " \t"); |
|
10 if ($code != 200) die("Error code $code from $peer[address]\n"); |
|
11 foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { |
|
12 $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); |
|
13 nntp_writeline($socket, 'GROUP '.$group['name']); |
|
14 $line = nntp_readline($socket); |
|
15 $code = strtok($line, " \t"); |
|
16 if ($code != 211) die("Error code $code from $peer[address]\n"); |
|
17 strtok(" \t"); //number of articles |
|
18 $low = strtok(" \t"); |
|
19 $high = strtok(" \t"); |
|
20 strtok(" \t"); //group name |
|
21 if ($low != $peergroup['low'] || $high != $peergroup['high'] || $peergroup['low'] === NULL || $peergroup['high'] === NULL) { |
|
22 for ($i = $low; $i <= $high; $i++) { |
|
23 if ($i >= $peergroup['low'] && $i <= $peergroup['high'] && $peergroup['low'] !== NULL && $peergroup['high'] !== NULL) continue; |
|
24 nntp_writeline($socket, 'STAT '.$i); |
|
25 $line = nntp_readline($socket); |
|
26 $code = strtok($line, " \t"); |
|
27 if ($code == 423) { |
|
28 print("Gap in article numbering at $i\n"); |
|
29 continue; |
|
30 } |
|
31 if ($code != 223) die("Error code $code from $peer[address]\n"); |
|
32 strtok(" \t"); //article number |
|
33 $messageid = strtok(" \t"); |
|
34 if ($messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') die("Malformed message ID $messageid\n"); |
|
35 $messageid = substr($messageid, 1, -1); |
|
36 $message = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); |
|
37 if ($message) { |
|
38 $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); |
|
39 if (!$groupmessage) { |
|
40 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); |
|
41 } |
|
42 } else { |
|
43 nntp_writeline($socket, 'HEAD '.$i); |
|
44 $line = nntp_readline($socket); |
|
45 $code = strtok($line, " \t"); |
|
46 if ($code != 221) die("Error code $code from $peer[address]\n"); |
|
47 strtok(" \t"); //article number |
|
48 $lines = nntp_readlines($socket); |
|
49 $header = implode("\r\n", $lines); |
|
50 |
|
51 nntp_writeline($socket, 'BODY '.$i); |
|
52 $line = nntp_readline($socket); |
|
53 $code = strtok($line, " \t"); |
|
54 if ($code != 222) die("Error code $code from $peer[address]\n"); |
|
55 strtok(" \t"); //article number |
|
56 $lines = nntp_readlines($socket); |
|
57 $body = implode("\r\n", $lines); |
|
58 |
|
59 $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $header, $body)); |
|
60 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $id)); |
|
61 } |
|
62 } |
|
63 $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); |
|
64 } |
|
65 } |
|
66 nntp_writeline($socket, 'QUIT'); |
|
67 fclose($socket); |
|
68 } |
|
69 |
|
70 function nntp_readline($socket) { |
|
71 $line = rtrim(fgets($socket, 512), "\r\n"); |
|
72 print('R: '.$line."\n"); |
|
73 return $line; |
|
74 } |
|
75 function nntp_writeline($socket, $line) { |
|
76 print('W: '.$line."\n"); |
|
77 fwrite($socket, $line."\r\n"); |
|
78 } |
|
79 function nntp_readlines($socket) { |
|
80 $line = nntp_readline($socket); |
|
81 $lines = array(); |
|
82 while ($line != '.' && $line !== FALSE && $line !== FALSE) { |
|
83 $lines[] = $line; |
|
84 $line = nntp_readline($socket); |
|
85 } |
|
86 if ($line != '.') die("Unexpected end of message header\n"); |
|
87 return $lines; |
|
88 } |