Вот и обещанная утилита, которая выбирает зеркала пакетов в Archlinux.
Выбирает она не отдельные зеркала, а группами - по странам
Выглядит она так:
Требования: PHP 5.2.x (с отключенным open_basedir, safe_mode и разрешенным вызовом exec()), dialog
Запускается так:
Ниже приведен исходный код
class Mirrorlist
{
protected $_filename;
protected $_data;
public function __construct()
{
$this->_data = ();
$this->_filename = false;
}
public function read($filename)
{
if(!($filename) || !($filename)) {
throw new Exception ("Cannot read file: $filename");
}
$this->_filename = $filename;
$f = ($this->_filename, 'r');
$currentTitle = '';
while(!($f)) {
$line = ($f, 1024);
$isServer = ("/^[\s]?([#]?)[\s]?Server[\s]+=[\s]+([^\s]+)[\s]?$/", $line, $serverMatches);
$isTitle = $isServer ? false : ("/^[\s]?#[\w\s]+$/i", $line, $titleMatches);
$trimmed = (($line, "#"));
if(!$trimmed) {
continue;
}
if($isTitle) {
$currentTitle = $trimmed;
} elseif ($isServer) {
$active = ($serverMatches[1]);
$uri = $serverMatches[2];
$title = $currentTitle ? $currentTitle : "Custom servers";
if(!($this->_data[$title])) {
$this->_data[$title] = ( 'servers' => (), 'allactive' => true, 'count' => 0 );
}
$this->_data[$title]['count']++;
$this->_data[$title]['servers'][$uri] = $active;
if($active == false) {
$this->_data[$title]['allactive'] = false;
}
}
}
($f);
return $this;
}
public function __toString()
{
if(!($this->_data)) {
return '';
}
$data = "# Selectmirror generated \n\n";
foreach($this->_data as $country=>$cdata) {
if(!$data['servers']) {
continue;
}
$data .= "# $country\n";
foreach($cdata['servers'] as $uri=>$enabled) {
$data .= ($enabled ? '' : '#') . "Server = " . $uri . "\n";
}
$data .= "\n\n";
}
return $data;
}
public function save($filename = false)
{
if(false == $filename) {
$filename = $this->_filename;
}
if(false === $filename) {
return $this;
}
if (false === file_put_contents($filename, $this->__toString())) {
throw new Exception ("Cannot write to file: $filename");
}
return $this;
}
public function getCountriesList()
{
return $this->_data;
}
public function setEnabledCountries($countries, $disableRest = true)
{
if(!$countries) {
return $this;
}
$countries = () $countries;
foreach($this->_data as $c => $data) {
foreach($this->_data[$c]['servers'] as $k=>$v) {
if(($c, $countries)) {
$this->_data[$c]['servers'][$k] = true;
$this->_data[$c]['allactive'] = true;
} elseif($disableRest) {
$this->_data[$c]['servers'][$k] = false;
$this->_data[$c]['allactive'] = false;
}
}
}
return $this;
}
}
class DialogMirrorlist extends Mirrorlist
{
public function getCommand()
{
if(!($this->_data)) {
return false;
}
$command = "dialog --checklist --stdout \"Select countries closest to you\" 0 0 0 ";
foreach($this->_data as $name => $data) {
$count = $data['count'];
$active = $data['allactive'] ? 'on' : 'off';
$command .= " \"${name}\" \"Mirrors count: ${count}\" $active ";
}
return $command;
}
public function setEnabledCountries($countriesString, $disableRest = true)
{
$countriesList = ('/"[\s]+"/', ($countriesString, '"'));
return parent::setEnabledCountries($countriesList, $disableRest);
}
}
class App {
public function ($cmd)
{
$outArr = ();
$returnInt = null;
$out = (($cmd), $outArr, $returnInt);
return ('code'=> (int) $returnInt, 'out' => $out, 'all' =>$outArr);
}
public function findOnPath($cmd)
{
$return = self::("which $cmd");
return $return['code'] == 0;
}
public function checkRequirements()
{
if(('open_basedir')) {
throw new Exception("Set open_basedir = Off directive in your php.ini before using this script.");
}
if(!("exec")) {
throw new Exception("exec() function is disabled in PHP. Can't work without it's support.");
}
if(!self::findOnPath('dialog')) {
throw new Exception("dialog utility is not found on path");
}
}
public function run()
{
try {
self::checkRequirements();
$mirrors = new DialogMirrorlist();
$command = $mirrors->read('/etc/pacman.d/mirrorlist')->getCommand();
if(!$command) {
"No mirrors detected it given mirrorlist. Nothing to do. \n";
(0);
}
$return = self::($command);
if($return['code'] == 0) {
$mirrors->setEnabledCountries($return['out'])->save();
}
(0);
} catch (Exception $e) {
"Error: {$e->getMessage()} \n";
(1);
}
}
}
App::run();
Читайте также
Последние новости
План занятий
Обучение детей от года до 3 лет плаванию, как правило, проходит в три этапа. На первом этапе ребенок должен адаптироваться к воде, избавиться от страха перед глубиной, неизвестной средой. Намного проще дети привыкают к бассейну, где есть бортики, вода теплая и прозрачная. Чуть сложнее дети адаптируются к открытым водоемам с темной и прохладной ...Читать далее »
Гимнастика от 2 лет до 2 лет 6 месяцев
1. Самостоятельная ходьба. 2. Бег вдогонку за взрослым или к взрослому в разном темпе. 3. Руки вверх, потянуться – «деревья большие большие», развести руки в стороны. 4. Ходьба по доске, приподнятой над полом на 15–20 см. 5. Приседания. 6. Подъем туловища с опорой на ладони в положении лежа на животе. 7. Хлопк...Читать далее »
Проблема: ожоги, ушибы, травмы
Немного повзрослев, ребенок начинает интересоваться источниками огня, что чревато ожогом. При незначительном ожоге необходимо поврежденный участок тела поместить под холодную проточную воду, а затем обработать антиожоговым аэрозолем. В период выздоровления применяют массаж, который способствует улучшению лимфо– и кровотока. В резуль...Читать далее »
Проблема: плоскостопие
Когда ребенок начинает ходить, его первые шаги могут быть омрачены плоскостопием. К сожалению, если эта болезнь наследственная, то волнения вполне обоснованны. И здесь без посещения детского врача ортопеда не обойтись. Его рекомендации относятся к укреплению подошвенного свода стопы вашего ребенка. Костная структура стопы ребенка ...Читать далее »
Рефлекторные движения
Рефлекторные гимнастические упражнения, В основе которых лежат врожденные двигательные рефлекторные реакции, проводятся первые три пять месяцев жизни ребенка, когда еще не утрачены безусловные двигательные рефлексы – «автоматическая походка», ладонно ротовой рефлекс, хоботковый рефлекс, сохранение равновесия, защитно оборонительные рефлексы. Рефлекторные гимнасти...Читать далее »
Техника выполнения: растирание
Прямолинейное растирание Выполняется концевыми фалангами одного или нескольких пальцев. Движение проводится прямолинейно одной рукой или обеими, иногда с отягощением. Круговое растирание Проводится с помощью круговых движений концевыми фалангами одного или нескольких пальцев. Кисть располагается с опорой на основании ладони, а манипуляции выполняют в сторону мизинца одной рук...Читать далее »
Проблема: пупочная грыжа
Пупочная грыжа – это патологическое состояние, в котором через несколько расширенное пупочное кольцо происходит выпячивание брюшины, сальника и даже кишечника. Причина заболевания следующая: вследствие дефекта передней брюшной стенки и пупочного кольца проявляется округлое или овальное выпячивание. Чаще факторами, провоцирующими повышение внутрибрюшного давления, являются кашель, запоры ...Читать далее »
