1 |
<?php |
2 |
/** |
3 |
*/ |
4 |
|
5 |
class Mageia_Data_Cron_Releases extends Mageia_Data_Cron |
6 |
{ |
7 |
function __construct($spec, $ts, $appdir, $logtmpdir) { parent::__construct($spec, $ts, $appdir, $logtmpdir); } |
8 |
|
9 |
/** |
10 |
* Convert access_log from releases.mageia.org into a digested, resolved log |
11 |
* aimed to be published. |
12 |
* |
13 |
* For instance, it will convert: |
14 |
* |
15 |
* 79.246.71.12 - - [01/Apr/2012:04:03:15 +0200] "GET /api/a/i586?product=Default&version=1&mgaonline_version=2.77.29 HTTP/1.1" 200 283 "-" "curl/7.21.5 (i586-mageia-linux-gnu) libcurl/7.21.5 OpenSSL/1.0.0d zlib/1.2.5 libidn/1.19 libssh2/1.2.8" |
16 |
* |
17 |
* into: |
18 |
* |
19 |
* 2012-04-01 06 1 i586 EU FR Ile-de-France Paris |
20 |
* (date / hour / version / arch / continent / country / region / city) |
21 |
* |
22 |
* with one line = one HTTP GET request. |
23 |
*/ |
24 |
function digest_log($infile = 'php://stdin', $outfile = 'php://stdout') |
25 |
{ |
26 |
echo "Digest. "; |
27 |
|
28 |
$source = 'releases'; |
29 |
$cache = array(); |
30 |
|
31 |
require_once realpath($this->appdir . '/lib/maxmind/geoip/geoip.inc.php'); |
32 |
require_once realpath($this->appdir . '/lib/maxmind/geoip/geoipcity.inc.php'); |
33 |
|
34 |
$gi = geoip_open(realpath($this->appdir . '/lib/maxmind/geoip/GeoLiteCityv6.dat'), GEOIP_STANDARD); |
35 |
$infile = fopen($infile, 'r'); |
36 |
$outfile = fopen($outfile, 'w'); |
37 |
|
38 |
while (!feof($infile)) { |
39 |
|
40 |
$s = fgets($infile); |
41 |
$s = trim($s); |
42 |
|
43 |
if ($s == '') |
44 |
continue; |
45 |
|
46 |
$s = explode(' ', $s); |
47 |
$ip = $s[0]; |
48 |
|
49 |
// NOTE (rda) dates are local time, not UTC here. |
50 |
// FIXME (rda) change dates to UTC |
51 |
// that involves getting logs of the day before, and filtering _after_ conversion. |
52 |
$sdate = str_replace(array('[', ']'), '', $s[3] . ' ' . $s[4]); |
53 |
$sdate2 = explode(':', $sdate); |
54 |
$date = $sdate2[0]; |
55 |
$date2 = date('Y-m-d', strtotime($sdate)); // N for week day, or Y-m-d |
56 |
$time = date('H', strtotime($sdate)); |
57 |
$date = $date2; |
58 |
|
59 |
$query = $s[6]; |
60 |
$url = parse_url($query); |
61 |
parse_str($url['query'], $query); |
62 |
|
63 |
$arch = end(explode('/', $url['path'])); |
64 |
$vers = $query['version']; |
65 |
|
66 |
if ($vers == '') |
67 |
continue; |
68 |
|
69 |
if (strpos($ip, ':') === false) |
70 |
$ip = '::' . $ip; |
71 |
|
72 |
$record = geoip_record_by_addr_v6($gi, $ip); |
73 |
|
74 |
//global $GEOIP_REGION_NAME; |
75 |
|
76 |
$rec = array( |
77 |
'country' => $record->country_code, |
78 |
'region' => $GEOIP_REGION_NAME[$record->country_code][$record->region], |
79 |
'city' => $record->city, |
80 |
'code' => $record->postal_code, |
81 |
'area' => $record->area_code, |
82 |
'continent' => $record->continent_code |
83 |
); |
84 |
|
85 |
$data = array( |
86 |
$date, |
87 |
$time, |
88 |
$vers, |
89 |
$arch, |
90 |
$rec['continent'], |
91 |
$rec['country'], |
92 |
mb_convert_encoding($rec['region'], 'ASCII'), |
93 |
mb_convert_encoding($rec['city'], 'ASCII') |
94 |
); |
95 |
$ret = implode(" ", $data) . "\n"; |
96 |
fputs($outfile, $ret, mb_strlen($ret, 'utf-8')); |
97 |
} |
98 |
fclose($outfile); |
99 |
fclose($infile); |
100 |
geoip_close($gi); |
101 |
} |
102 |
} |