aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Downloads.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Downloads.php')
-rw-r--r--lib/Downloads.php292
1 files changed, 292 insertions, 0 deletions
diff --git a/lib/Downloads.php b/lib/Downloads.php
new file mode 100644
index 000000000..a44404ea0
--- /dev/null
+++ b/lib/Downloads.php
@@ -0,0 +1,292 @@
+<?php
+/**
+ * Class regrouping basic methods for download page.
+ *
+ * @copyright 2009-2011 Romain d'Alverny <rda>
+ * @license GPL-3+
+ *
+*/
+class Downloads
+{
+ /**
+ */
+ function __construct()
+ {
+ }
+ /**
+ * @param string $ua
+ *
+ * @return array
+ *
+ * @todo unit tests or use something else
+ * Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.1.2 Safari/533.18.5
+ * Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20110330 Firefox/4.0
+ * other old ones
+ *
+ * @todo refactor this
+ */
+ public static function get_platform($ua = null)
+ {
+ if ($ua == '')
+ return array(
+ 'arch' => 'i586',
+ 'system' => 'unknown',
+ 'locale' => 'en',
+ 'browser' => null
+ );
+
+ $locale = null;
+
+ if (preg_match_all('/([.^\(^\)]*) \((.*)\) (.*)/', $ua, $r))
+ {
+ $r = $r[2][0];
+ $r = explode(';', $r);
+ if (isset($r[3])) {
+ $r = explode(')', trim($r[3]));
+ if (strlen($r[0]) > 5)
+ $r = substr($r[0], 0, 5);
+ else
+ $r = $r[0];
+ }
+ else
+ $r = null;
+
+ $locale = $r;
+ }
+
+ $arch = 'i586';
+ if (strpos($ua, 'x86_64') !== false)
+ $arch = 'x86_64';
+
+ $sys = null;
+ if (strpos($ua, 'Windows') !== false)
+ $sys = 'win';
+ elseif (strpos($ua, 'Macintosh') !== false
+ || strpos($ua, 'Mac OS X') !== false)
+ $sys = 'mac';
+ elseif (strpos($ua, 'Linux') !== false)
+ $sys = 'linux';
+
+ $browser = null;
+ if (strpos($ua, 'Firefox') !== false)
+ $browser = 'firefox';
+ elseif (strpos($ua, 'MSIE') !== false)
+ $browser = 'msie';
+ elseif (strpos($ua, 'Safari') !== false)
+ $browser = 'safari';
+ elseif (strpos($ua, 'Opera') !== false)
+ $browser = 'opera';
+
+ return array(
+ 'arch' => $arch,
+ 'system' => $sys,
+ 'locale' => $locale, // FIXME (rda) use Accept-Language instead
+ 'browser' => $browser
+ );
+ }
+
+ /**
+ * Get mirrors list from mirrors.mageia.org,
+ * store/cache it in a different key/value format
+ * (keys are: "$country" and "_C:$continent"),
+ * and return it.
+ *
+ * Note that the mirrors list doesn't change with versions, for now;
+ * it's a full or nothing list.
+ *
+ * @return array
+ */
+ public static function get_all_mirrors($prod = true)
+ {
+ $cache_file = realpath(__DIR__ . '/cached.list.php');
+
+ if ($prod) {
+ require $cache_file;
+
+ } else {
+ $data = file('http://mirrors.mageia.org/api/mageia.1.i586.list');
+ $mirrors = array();
+ foreach ($data as $line) {
+ $line = explode(',', trim($line));
+ $m = array();
+ foreach ($line as $val) {
+ $val = explode('=', trim($val));
+ $m[$val[0]] = $val[1];
+ }
+ $pu = parse_url($m['url']);
+ if (in_array($pu['scheme'], array('http', 'ftp'))) {
+
+ $item = array(
+ 'city' => isset($m['city']) ? $m['city'] : '?',
+ 'continent' => isset($m['continent']) ? $m['continent'] : '?',
+ 'zone' => $m['zone'],
+ // BEWARE of the path substitution here. Must match.
+ 'url' => str_replace('/distrib/1/i586', '', $m['url'])
+ );
+
+ $torrent =$item['url'].'/iso/3/torrents/Mageia-3-LiveDVD-KDE4-x86_64-DVD.torrent' ;
+ if (false === file_get_contents($torrent)){
+ echo "down $torrent \n";
+ } else {
+ echo "Up $torrent \n";
+
+ $mirrors[$m['country']][] = $item;
+ $mirrors['_C:' . $m['continent']][] = $item;
+ }
+ }
+ }
+
+ file_put_contents($cache_file,
+ sprintf('<?php $mirrors = %s; ?>',
+ var_export($mirrors, true)));
+ }
+
+ return $mirrors;
+ }
+
+ /**
+ * Get mirrors from stored dictionnary and find:
+ * - best matching country
+ * - or best matching continent
+ * - or random
+ *
+ * @param string $country
+ * @param string $continent
+ *
+ * @return array
+ */
+ function get_mirror($country, $continent = null)
+ {
+ $mirs = self::get_all_mirrors();
+ $continent = '_C:' . $continent;
+
+ if (array_key_exists($country, $mirs))
+ {
+ $mirs_tmp = $mirs[$country];
+ if ($country == 'FR')
+ {
+ $mirs_tmp = array_merge($mirs_tmp, $mirs['DE']);
+ }
+ $mirs = $mirs_tmp;
+ }
+ elseif (array_key_exists($continent, $mirs)) {
+ $mirs = $mirs[$continent];
+ }
+ else
+ {
+ shuffle($mirs);
+ $mirs = array_shift($mirs);
+ }
+
+ shuffle($mirs);
+
+ return array_shift($mirs);
+ }
+
+ function prepare_download($force = false, $country = null)
+ {
+ return $this->get_one_mirror($force, $country);
+ }
+
+ /**
+ * Setup session data about current visitor for downloads.
+ *
+ * @param boolean $force
+ *
+ * @return array
+ *
+ * TODO extract as much as possible $_SESSION(read) and $_SERVER and $_GET
+ */
+ function get_one_mirror($force = false, $country = null)
+ {
+ $fuzzy_mirror = false;
+
+ if (!is_null($country))
+ $force = true;
+
+ // FIXME break this into smaller parts and extract globals so we can test st
+ if (!$force && isset($_SESSION['dl-data']))
+ {
+ //error_log(sprintf('Got session data: %s', print_r($_SESSION['dl-data'], true)));
+ $system = $_SESSION['dl-data']['system'];
+ if (isset($_GET['mirror']))
+ {
+ $mirror = array('url' => $_GET['mirror']);
+ $mirror['purl'] = parse_url($mirror['url']);
+ $_SESSION['dl-data']['mirror'] = $mirror;
+ $country = '';
+ }
+ else
+ {
+ $country = $_SESSION['dl-data']['country'];
+ $mirror = $_SESSION['dl-data']['mirror'];
+ }
+ }
+ else
+ {
+ //error_log('getting platform');
+ $system = self::get_platform($_SERVER['HTTP_USER_AGENT']);
+ if (isset($_GET['mirror']))
+ {
+ $mirror = array('url' => $_GET['mirror']);
+ $mirror['purl'] = parse_url($mirror['url']);
+ $country = null;
+ }
+ else
+ {
+ //error_log('no mirror set yet');
+ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
+ && $str = $_SERVER['HTTP_X_FORWARDED_FOR'])
+ {
+ $arr = explode(', ', $str);
+ $ip = $arr[0];
+ }
+ else
+ $ip = $_SERVER['REMOTE_ADDR'];
+
+ $_SESSION['ip'] = $ip;
+ if (is_null($country))
+ {
+ require_once realpath(__DIR__ . '/mga_geoip.php');
+ $country = MGA_Geoip::mga_geoip_country_by_ip($ip, false);
+ $continent = MGA_Geoip::mga_geoip_continent_by_country($country);
+ $fuzzy_mirror = true;
+ $_SESSION['country'] = $country;
+ $_SESSION['continent'] = $continent;
+ }
+
+ $mirror = $this->get_mirror($country, $continent);
+ $mirror['purl'] = parse_url($mirror['url']);
+
+ // reassign country, as get_one_mirror() may have decided
+ // to return a mirror from another country than the one
+ // requested initially - @see get_one_mirror()
+ $country = $mirror['zone'];
+ $continent = $mirror['continent'];
+
+ if (is_null($mirror)) {
+ // @todo?
+ }
+ }
+
+ // write to session
+ $_SESSION['dl-data'] = array(
+ 'system' => $system,
+ 'country' => $country,
+ 'continent' => $continent,
+ 'mirror' => $mirror
+ );
+ }
+ //
+ return array(
+ 'arch' => $system['arch'],
+ 'mirror_host' => $mirror['purl']['host'],
+ 'mirror_scheme' => $mirror['purl']['scheme'],
+ 'mirror_url' => $mirror['url'],
+ 'country' => $country,
+ 'continent' => $continent,
+ 'city' => $mirror['city'],
+ 'fuzzy_mirror' => $fuzzy_mirror
+ );
+ }
+}