-
Notifications
You must be signed in to change notification settings - Fork 44
/
GeoIPUpdater.php
102 lines (79 loc) · 2.6 KB
/
GeoIPUpdater.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace PulkitJalan\GeoIP;
use PharData;
use Exception;
use Illuminate\Support\Arr;
use GuzzleHttp\Client as GuzzleClient;
use PulkitJalan\GeoIP\Exceptions\InvalidDatabaseException;
use PulkitJalan\GeoIP\Exceptions\InvalidCredentialsException;
class GeoIPUpdater
{
/**
* @var array
*/
protected $config;
/**
* @var \GuzzleHttp\Client
*/
protected $guzzle;
/**
* @param array $config
*/
public function __construct(array $config, GuzzleClient $guzzle = null)
{
$this->config = $config;
$this->guzzle = $guzzle ?? new GuzzleClient();
}
/**
* Main update function.
*
* @return string|false
*/
public function update()
{
if (! Arr::get($this->config, 'maxmind_database.database', false)) {
throw new InvalidDatabaseException();
}
if (! Arr::get($this->config, 'maxmind_database.license_key', false)) {
throw new InvalidCredentialsException();
}
return $this->updateMaxmindDatabase();
}
/**
* Update function for maxmind database.
*
* @return string
*/
protected function updateMaxmindDatabase()
{
$maxmindDatabaseUrl = Arr::get($this->config, 'maxmind_database.download', 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&suffix=tar.gz&license_key=');
$maxmindDatabaseUrl = $maxmindDatabaseUrl.Arr::get($this->config, 'maxmind_database.license_key');
$database = Arr::get($this->config, 'maxmind_database.database', false);
if (! file_exists($dir = pathinfo($database, PATHINFO_DIRNAME))) {
mkdir($dir, 0777, true);
}
$tempDir = pathinfo($database, PATHINFO_DIRNAME);
try {
// Download database temp dir
$tempFile = $tempDir.'/geoip';
$this->guzzle->get($maxmindDatabaseUrl, ['save_to' => $tempFile.'.tar.gz']);
$p = new PharData($tempFile.'.tar.gz');
$p->decompress();
// Extract from the tar
$phar = new PharData($tempFile.'.tar');
$phar->extractTo($tempDir);
$dir = head(glob("$tempDir/GeoLite2-City_*"));
@unlink($database);
@unlink($tempFile.'.tar');
// Save database to final location
rename($dir.'/GeoLite2-City.mmdb', $database);
// Delete temp file
@unlink($tempFile);
array_map('unlink', glob("$dir/*.*"));
@rmdir($dir);
} catch (Exception $e) {
return false;
}
return $database;
}
}