[ Index ]
 

Code source de PHP PEAR 1.4.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/PEAR/Command/ -> Channels.php (source)

   1  <?php
   2  // /* vim: set expandtab tabstop=4 shiftwidth=4: */
   3  /**
   4   * PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add,
   5   * channel-update, channel-info, channel-alias, channel-discover commands)
   6   *
   7   * PHP versions 4 and 5
   8   *
   9   * LICENSE: This source file is subject to version 3.0 of the PHP license
  10   * that is available through the world-wide-web at the following URI:
  11   * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  12   * the PHP License and are unable to obtain it through the web, please
  13   * send a note to license@php.net so we can mail you a copy immediately.
  14   *
  15   * @category   pear
  16   * @package    PEAR
  17   * @author     Stig Bakken <ssb@php.net>
  18   * @author     Greg Beaver <cellog@php.net>
  19   * @copyright  1997-2006 The PHP Group
  20   * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  21   * @version    CVS: $Id: Channels.php,v 1.46 2006/07/17 18:19:25 pajoye Exp $
  22   * @link       http://pear.php.net/package/PEAR
  23   * @since      File available since Release 1.4.0a1
  24   */
  25  
  26  /**
  27   * base class
  28   */
  29  require_once  'PEAR/Command/Common.php';
  30  
  31  /**
  32   * PEAR commands for managing channels.
  33   *
  34   * @category   pear
  35   * @package    PEAR
  36   * @author     Greg Beaver <cellog@php.net>
  37   * @copyright  1997-2006 The PHP Group
  38   * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  39   * @version    Release: 1.5.0
  40   * @link       http://pear.php.net/package/PEAR
  41   * @since      Class available since Release 1.4.0a1
  42   */
  43  class PEAR_Command_Channels extends PEAR_Command_Common
  44  {
  45      // {{{ properties
  46  
  47      var $commands = array(
  48          'list-channels' => array(
  49              'summary' => 'List Available Channels',
  50              'function' => 'doList',
  51              'shortcut' => 'lc',
  52              'options' => array(),
  53              'doc' => '
  54  List all available channels for installation.
  55  ',
  56              ),
  57          'update-channels' => array(
  58              'summary' => 'Update the Channel List',
  59              'function' => 'doUpdateAll',
  60              'shortcut' => 'uc',
  61              'options' => array(),
  62              'doc' => '
  63  List all installed packages in all channels.
  64  '
  65              ),
  66          'channel-delete' => array(
  67              'summary' => 'Remove a Channel From the List',
  68              'function' => 'doDelete',
  69              'shortcut' => 'cde',
  70              'options' => array(),
  71              'doc' => '<channel name>
  72  Delete a channel from the registry.  You may not
  73  remove any channel that has installed packages.
  74  '
  75              ),
  76          'channel-add' => array(
  77              'summary' => 'Add a Channel',
  78              'function' => 'doAdd',
  79              'shortcut' => 'ca',
  80              'options' => array(),
  81              'doc' => '<channel.xml>
  82  Add a private channel to the channel list.  Note that all
  83  public channels should be synced using "update-channels".
  84  Parameter may be either a local file or remote URL to a
  85  channel.xml.
  86  '
  87              ),
  88          'channel-update' => array(
  89              'summary' => 'Update an Existing Channel',
  90              'function' => 'doUpdate',
  91              'shortcut' => 'cu',
  92              'options' => array(
  93                  'force' => array(
  94                      'shortopt' => 'f',
  95                      'doc' => 'will force download of new channel.xml if an existing channel name is used',
  96                      ),
  97                  'channel' => array(
  98                      'shortopt' => 'c',
  99                      'arg' => 'CHANNEL',
 100                      'doc' => 'will force download of new channel.xml if an existing channel name is used',
 101                      ),
 102  ),
 103              'doc' => '[<channel.xml>|<channel name>]
 104  Update a channel in the channel list directly.  Note that all
 105  public channels can be synced using "update-channels".
 106  Parameter may be a local or remote channel.xml, or the name of
 107  an existing channel.
 108  '
 109              ),
 110          'channel-info' => array(
 111              'summary' => 'Retrieve Information on a Channel',
 112              'function' => 'doInfo',
 113              'shortcut' => 'ci',
 114              'options' => array(),
 115              'doc' => '<package>
 116  List the files in an installed package.
 117  '
 118              ),
 119          'channel-alias' => array(
 120              'summary' => 'Specify an alias to a channel name',
 121              'function' => 'doAlias',
 122              'shortcut' => 'cha',
 123              'options' => array(),
 124              'doc' => '<channel> <alias>
 125  Specify a specific alias to use for a channel name.
 126  The alias may not be an existing channel name or
 127  alias.
 128  '
 129              ),
 130          'channel-discover' => array(
 131              'summary' => 'Initialize a Channel from its server',
 132              'function' => 'doDiscover',
 133              'shortcut' => 'di',
 134              'options' => array(),
 135              'doc' => '[<channel.xml>|<channel name>]
 136  Initialize a Channel from its server and creates the local channel.xml.
 137  '
 138              ),
 139          );
 140  
 141      // }}}
 142      // {{{ constructor
 143  
 144      /**
 145       * PEAR_Command_Registry constructor.
 146       *
 147       * @access public
 148       */
 149      function PEAR_Command_Channels(&$ui, &$config)
 150      {
 151          parent::PEAR_Command_Common($ui, $config);
 152      }
 153  
 154      // }}}
 155  
 156      // {{{ doList()
 157      
 158      function _sortChannels($a, $b)
 159      {
 160          return strnatcasecmp($a->getName(), $b->getName());
 161      }
 162  
 163      function doList($command, $options, $params)
 164      {
 165          $reg = &$this->config->getRegistry();
 166          $registered = $reg->getChannels();
 167          usort($registered, array(&$this, '_sortchannels'));
 168          $i = $j = 0;
 169          $data = array(
 170              'caption' => 'Registered Channels:',
 171              'border' => true,
 172              'headline' => array('Channel', 'Summary')
 173              );
 174          foreach ($registered as $channel) {
 175              $data['data'][] = array($channel->getName(),
 176                                        $channel->getSummary());
 177          }
 178          if (count($registered)==0) {
 179              $data = '(no registered channels)';
 180          }
 181          $this->ui->outputData($data, $command);
 182          return true;
 183      }
 184      
 185      function doUpdateAll($command, $options, $params)
 186      {
 187          $reg = &$this->config->getRegistry();
 188          $savechannel = $this->config->get('default_channel');
 189          if (isset($options['channel'])) {
 190              if (!$reg->channelExists($options['channel'])) {
 191                  return $this->raiseError('Unknown channel "' . $options['channel'] . '"');
 192              }
 193              $this->config->set('default_channel', $options['channel']);
 194          } else {
 195              $this->config->set('default_channel', 'pear.php.net');
 196          }
 197          $remote = &$this->config->getRemote();
 198          $channels = $remote->call('channel.listAll');
 199          if (PEAR::isError($channels)) {
 200              $this->config->set('default_channel', $savechannel);
 201              return $channels;
 202          }
 203          if (!is_array($channels) || isset($channels['faultCode'])) {
 204              $this->config->set('default_channel', $savechannel);
 205              return $this->raiseError("Incorrect channel listing returned from channel '$chan'");
 206          }
 207          if (!count($channels)) {
 208              $data = 'no updates available';
 209          }
 210          $dl = &$this->getDownloader();
 211          if (!class_exists('System')) {
 212              require_once  'System.php';
 213          }
 214          $tmpdir = System::mktemp(array('-d'));
 215          foreach ($channels as $channel) {
 216              $channel = $channel[0];
 217              $save = $channel;
 218              if ($reg->channelExists($channel, true)) {
 219                  $this->ui->outputData("Updating channel \"$channel\"", $command);
 220                  $test = $reg->getChannel($channel, true);
 221                  if (PEAR::isError($test)) {
 222                      $this->ui->outputData("Channel '$channel' is corrupt in registry!", $command);
 223                      $lastmodified = false;
 224                  } else {
 225                      $lastmodified = $test->lastModified();
 226                      
 227                  }
 228                  PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 229                  $contents = $dl->downloadHttp('http://' . $test->getName() . '/channel.xml',
 230                      $this->ui, $tmpdir, null, $lastmodified);
 231                  PEAR::staticPopErrorHandling();
 232                  if (PEAR::isError($contents)) {
 233                      $this->ui->outputData('ERROR: Cannot retrieve channel.xml for channel "' .
 234                          $test->getName() . '"', $command);
 235                      continue;
 236                  }
 237                  if (!$contents) {
 238                      $this->ui->outputData("Channel \"$channel\" is up-to-date", $command);
 239                      continue;
 240                  }
 241                  list($contents, $lastmodified) = $contents;
 242                  $info = implode('', file($contents));
 243                  if (!$info) {
 244                      $this->ui->outputData("Channel \"$channel\" is up-to-date", $command);
 245                      continue;
 246                  }
 247                  if (!class_exists('PEAR_ChannelFile')) {
 248                      require_once  'PEAR/ChannelFile.php';
 249                  }
 250                  $channelinfo = new PEAR_ChannelFile;
 251                  $channelinfo->fromXmlString($info);
 252                  if ($channelinfo->getErrors()) {
 253                      $this->ui->outputData("Downloaded channel data from channel \"$channel\" " . 
 254                          'is corrupt, skipping', $command);
 255                      continue;
 256                  }
 257                  $channel = $channelinfo;
 258                  if ($channel->getName() != $save) {
 259                      $this->ui->outputData('ERROR: Security risk - downloaded channel ' .
 260                          'definition file for channel "'
 261                          . $channel->getName() . ' from channel "' . $save .
 262                          '".  To use anyway, use channel-update', $command);
 263                      continue;
 264                  }
 265                  $reg->updateChannel($channel, $lastmodified);
 266              } else {
 267                  if ($reg->isAlias($channel)) {
 268                      $temp = &$reg->getChannel($channel);
 269                      if (PEAR::isError($temp)) {
 270                          return $this->raiseError($temp);
 271                      }
 272                      $temp->setAlias($temp->getName(), true); // set the alias to the channel name
 273                      if ($reg->channelExists($temp->getName())) {
 274                          $this->ui->outputData('ERROR: existing channel "' . $temp->getName() .
 275                              '" is aliased to "' . $channel . '" already and cannot be ' .
 276                              're-aliased to "' . $temp->getName() . '" because a channel with ' .
 277                              'that name or alias already exists!  Please re-alias and try ' .
 278                              'again.', $command);
 279                          continue;
 280                      }
 281                  }
 282                  $this->ui->outputData("Adding new channel \"$channel\"", $command);
 283                  PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 284                  $contents = $dl->downloadHttp('http://' . $channel . '/channel.xml',
 285                      $this->ui, $tmpdir, null, false);
 286                  PEAR::staticPopErrorHandling();
 287                  if (PEAR::isError($contents)) {
 288                      $this->ui->outputData('ERROR: Cannot retrieve channel.xml for channel "' .
 289                          $channel . '"', $command);
 290                      continue;
 291                  }
 292                  list($contents, $lastmodified) = $contents;
 293                  $info = implode('', file($contents));
 294                  if (!class_exists('PEAR_ChannelFile')) {
 295                      require_once  'PEAR/ChannelFile.php';
 296                  }
 297                  $channelinfo = new PEAR_Channelfile;
 298                  $channelinfo->fromXmlString($info);
 299                  if ($channelinfo->getErrors()) {
 300                      $this->ui->outputData("Downloaded channel data from channel \"$channel\"" .
 301                          ' is corrupt, skipping', $command);
 302                      continue;
 303                  }
 304                  $channel = $channelinfo;
 305                  if ($channel->getName() != $save) {
 306                      $this->ui->outputData('ERROR: Security risk - downloaded channel ' .
 307                          'definition file for channel "'
 308                          . $channel->getName() . '" from channel "' . $save .
 309                          '".  To use anyway, use channel-update', $command);
 310                      continue;
 311                  }
 312                  $reg->addChannel($channel, $lastmodified);
 313              }
 314          }
 315          $this->config->set('default_channel', $savechannel);
 316          $this->ui->outputData('update-channels complete', $command);
 317          return true;
 318      }
 319      
 320      function doInfo($command, $options, $params)
 321      {
 322          if (sizeof($params) != 1) {
 323              return $this->raiseError("No channel specified");
 324          }
 325          $reg = &$this->config->getRegistry();
 326          $channel = strtolower($params[0]);
 327          if ($reg->channelExists($channel)) {
 328              $chan = $reg->getChannel($channel);
 329              if (PEAR::isError($chan)) {
 330                  return $this->raiseError($chan);
 331              }
 332          } else {
 333              if (strpos($channel, '://')) {
 334                  $downloader = &$this->getDownloader();
 335                  if (!class_exists('System')) {
 336                      require_once  'System.php';
 337                  }
 338                  $tmpdir = System::mktemp(array('-d'));
 339                  PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 340                  $loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir);
 341                  PEAR::staticPopErrorHandling();
 342                  if (PEAR::isError($loc)) {
 343                      return $this->raiseError('Cannot open "' . $channel . '"');
 344                  } else {
 345                      $contents = implode('', file($loc));
 346                  }
 347              } else {
 348                  if (file_exists($params[0])) {
 349                      $fp = fopen($params[0], 'r');
 350                      if (!$fp) {
 351                          return $this->raiseError('Cannot open "' . $params[0] . '"');
 352                      }
 353                  } else {
 354                      return $this->raiseError('Unknown channel "' . $channel . '"');
 355                  }
 356                  $contents = '';
 357                  while (!feof($fp)) {
 358                      $contents .= fread($fp, 1024);
 359                  }
 360                  fclose($fp);
 361              }
 362              if (!class_exists('PEAR_ChannelFile')) {
 363                  require_once  'PEAR/ChannelFile.php';
 364              }
 365              $chan = new PEAR_ChannelFile;
 366              $chan->fromXmlString($contents);
 367              $chan->validate();
 368              if ($errs = $chan->getErrors(true)) {
 369                  foreach ($errs as $err) {
 370                      $this->ui->outputData($err['level'] . ': ' . $err['message']);
 371                  }
 372                  return $this->raiseError('Channel file "' . $params[0] . '" is not valid');
 373              }
 374          }
 375          if ($chan) {
 376              $channel = $chan->getName();
 377              $caption = 'Channel ' . $channel . ' Information:';
 378              $data1 = array(
 379                  'caption' => $caption,
 380                  'border' => true);
 381              $data1['data']['server'] = array('Name and Server', $chan->getName());
 382              if ($chan->getAlias() != $chan->getName()) {
 383                  $data1['data']['alias'] = array('Alias', $chan->getAlias());
 384              }
 385              $data1['data']['summary'] = array('Summary', $chan->getSummary());
 386              $validate = $chan->getValidationPackage();
 387              $data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']);
 388              $data1['data']['vpackageversion'] =
 389                  array('Validation Package Version', $validate['attribs']['version']);
 390              $d = array();
 391              $d['main'] = $data1;
 392  
 393              $data['data'] = array();
 394              $data['caption'] = 'Server Capabilities';
 395              $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
 396              $capabilities = $chan->getFunctions('xmlrpc');
 397              $soaps = $chan->getFunctions('soap');
 398              if ($capabilities || $soaps || $chan->supportsREST()) {
 399                  if ($capabilities) {
 400                      if (!isset($capabilities[0])) {
 401                          $capabilities = array($capabilities);
 402                      }
 403                      foreach ($capabilities as $protocol) {
 404                          $data['data'][] = array('xmlrpc', $protocol['attribs']['version'],
 405                              $protocol['_content']);
 406                      }
 407                  }
 408                  if ($soaps) {
 409                      if (!isset($soaps[0])) {
 410                          $soaps = array($soaps);
 411                      }
 412                      foreach ($soaps as $protocol) {
 413                          $data['data'][] = array('soap', $protocol['attribs']['version'],
 414                              $protocol['_content']);
 415                      }
 416                  }
 417                  if ($chan->supportsREST()) {
 418                      $funcs = $chan->getFunctions('rest');
 419                      if (!isset($funcs[0])) {
 420                          $funcs = array($funcs);
 421                      }
 422                      foreach ($funcs as $protocol) {
 423                          $data['data'][] = array('rest', $protocol['attribs']['type'],
 424                              $protocol['_content']); 
 425                      }
 426                  }
 427              } else {
 428                  $data['data'][] = array('No supported protocols');
 429              }
 430              $d['protocols'] = $data;
 431              $data['data'] = array();
 432              $mirrors = $chan->getMirrors();
 433              if ($mirrors) {
 434                  $data['caption'] = 'Channel ' . $channel . ' Mirrors:';
 435                  unset($data['headline']);
 436                  foreach ($mirrors as $mirror) {
 437                      $data['data'][] = array($mirror['attribs']['host']);
 438                      $d['mirrors'] = $data;
 439                  }
 440                  foreach ($mirrors as $mirror) {
 441                      $data['data'] = array();
 442                      $data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities';
 443                      $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
 444                      $capabilities = $chan->getFunctions('xmlrpc', $mirror['attribs']['host']);
 445                      $soaps = $chan->getFunctions('soap', $mirror['attribs']['host']);
 446                      if ($capabilities || $soaps || $chan->supportsREST($mirror['attribs']['host'])) {
 447                          if ($capabilities) {
 448                              if (!isset($capabilities[0])) {
 449                                  $capabilities = array($capabilities);
 450                              }
 451                              foreach ($capabilities as $protocol) {
 452                                  $data['data'][] = array('xmlrpc', $protocol['attribs']['version'],
 453                                      $protocol['_content']);
 454                              }
 455                          }
 456                          if ($soaps) {
 457                              if (!isset($soaps[0])) {
 458                                  $soaps = array($soaps);
 459                              }
 460                              foreach ($soaps as $protocol) {
 461                                  $data['data'][] = array('soap', $protocol['attribs']['version'],
 462                                      $protocol['_content']);
 463                              }
 464                          }
 465                          if ($chan->supportsREST($mirror['attribs']['host'])) {
 466                              $funcs = $chan->getFunctions('rest', $mirror['attribs']['host']);
 467                              if (!isset($funcs[0])) {
 468                                  $funcs = array($funcs);
 469                              }
 470                              foreach ($funcs as $protocol) {
 471                                  $data['data'][] = array('rest', $protocol['attribs']['type'],
 472                                      $protocol['_content']); 
 473                              }
 474                          }
 475                      } else {
 476                          $data['data'][] = array('No supported protocols');
 477                      }
 478                      $d['mirrorprotocols'] = $data;
 479                  }
 480              }
 481              $this->ui->outputData($d, 'channel-info');
 482          } else {
 483              return $this->raiseError('Serious error: Channel "' . $params[0] .
 484                  '" has a corrupted registry entry');
 485          }
 486      }
 487  
 488      // }}}
 489      
 490      function doDelete($command, $options, $params)
 491      {
 492          if (sizeof($params) != 1) {
 493              return $this->raiseError('channel-delete: no channel specified');
 494          }
 495          $reg = &$this->config->getRegistry();
 496          if (!$reg->channelExists($params[0])) {
 497              return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist');
 498          }
 499          $channel = $reg->channelName($params[0]);
 500          if ($channel == 'pear.php.net') {
 501              return $this->raiseError('Cannot delete the pear.php.net channel');
 502          }
 503          if ($channel == 'pecl.php.net') {
 504              return $this->raiseError('Cannot delete the pecl.php.net channel');
 505          }
 506          if ($channel == '__uri') {
 507              return $this->raiseError('Cannot delete the __uri pseudo-channel');
 508          }
 509          if (PEAR::isError($err = $reg->listPackages($channel))) {
 510              return $err;
 511          }
 512          if (count($err)) {
 513              return $this->raiseError('Channel "' . $channel .
 514                  '" has installed packages, cannot delete');
 515          }
 516          if (!$reg->deleteChannel($channel)) {
 517              return $this->raiseError('Channel "' . $channel . '" deletion failed');
 518          } else {
 519              $this->config->deleteChannel($channel);
 520              $this->ui->outputData('Channel "' . $channel . '" deleted', $command);
 521          }
 522      }
 523  
 524      function doAdd($command, $options, $params)
 525      {
 526          if (sizeof($params) != 1) {
 527              return $this->raiseError('channel-add: no channel file specified');
 528          }
 529          if (strpos($params[0], '://')) {
 530              $downloader = &$this->getDownloader();
 531              if (!class_exists('System')) {
 532                  require_once  'System.php';
 533              }
 534              $tmpdir = System::mktemp(array('-d'));
 535              PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 536              $loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false);
 537              PEAR::staticPopErrorHandling();
 538              if (PEAR::isError($loc)) {
 539                  return $this->raiseError('channel-add: Cannot open "' . $params[0] . '"');
 540              } else {
 541                  list($loc, $lastmodified) = $loc;
 542                  $contents = implode('', file($loc));
 543              }
 544          } else {
 545              $lastmodified = $fp = false;
 546              if (file_exists($params[0])) {
 547                  $fp = fopen($params[0], 'r');
 548              }
 549              if (!$fp) {
 550                  return $this->raiseError('channel-add: cannot open "' . $params[0] . '"');
 551              }
 552              $contents = '';
 553              while (!feof($fp)) {
 554                  $contents .= fread($fp, 1024);
 555              }
 556              fclose($fp);
 557          }
 558          if (!class_exists('PEAR_ChannelFile')) {
 559              require_once  'PEAR/ChannelFile.php';
 560          }
 561          $channel = new PEAR_ChannelFile;
 562          PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 563          $result = $channel->fromXmlString($contents);
 564          PEAR::staticPopErrorHandling();
 565          if (!$result) {
 566              $exit = false;
 567              if (count($errors = $channel->getErrors(true))) {
 568                  foreach ($errors as $error) {
 569                      $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
 570                      if (!$exit) {
 571                          $exit = $error['level'] == 'error' ? true : false;
 572                      }
 573                  }
 574                  if ($exit) {
 575                      return $this->raiseError('channel-add: invalid channel.xml file');
 576                  }
 577              }
 578          }
 579          $reg = &$this->config->getRegistry();
 580          if ($reg->channelExists($channel->getName())) {
 581              return $this->raiseError('channel-add: Channel "' . $channel->getName() .
 582                  '" exists, use channel-update to update entry');
 583          }
 584          $ret = $reg->addChannel($channel, $lastmodified);
 585          if (PEAR::isError($ret)) {
 586              return $ret;
 587          }
 588          if (!$ret) {
 589              return $this->raiseError('channel-add: adding Channel "' . $channel->getName() .
 590                  '" to registry failed');
 591          }
 592          $this->config->setChannels($reg->listChannels());
 593          $this->config->writeConfigFile();
 594          $this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command);
 595      }
 596  
 597      function doUpdate($command, $options, $params)
 598      {
 599          if (!class_exists('System')) {
 600              require_once  'System.php';
 601          }
 602          $tmpdir = System::mktemp(array('-d'));
 603          $reg = &$this->config->getRegistry();
 604          if (sizeof($params) != 1) {
 605              return $this->raiseError("No channel file specified");
 606          }
 607          $lastmodified = false;
 608          if ((!file_exists($params[0]) || is_dir($params[0]))
 609                && $reg->channelExists(strtolower($params[0]))) {
 610              $c = $reg->getChannel(strtolower($params[0]));
 611              if (PEAR::isError($c)) {
 612                  return $this->raiseError($c);
 613              }
 614              $this->ui->outputData('Retrieving channel.xml from remote server');
 615              $dl = &$this->getDownloader(array());
 616              // if force is specified, use a timestamp of "1" to force retrieval
 617              $lastmodified = isset($options['force']) ? false : $c->lastModified();
 618              PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 619              $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml',
 620                  $this->ui, $tmpdir, null, $lastmodified);
 621              PEAR::staticPopErrorHandling();
 622              if (PEAR::isError($contents)) {
 623                  return $this->raiseError('Cannot retrieve channel.xml for channel "' .
 624                      $c->getName() . '"');
 625              }
 626              list($contents, $lastmodified) = $contents;
 627              if (!$contents) {
 628                  $this->ui->outputData("Channel $params[0] channel.xml is up to date");
 629                  return;
 630              }
 631              $contents = implode('', file($contents));
 632              if (!class_exists('PEAR_ChannelFile')) {
 633                  require_once  'PEAR/ChannelFile.php';
 634              }
 635              $channel = new PEAR_ChannelFile;
 636              $channel->fromXmlString($contents);
 637              if (!$channel->getErrors()) {
 638                  // security check: is the downloaded file for the channel we got it from?
 639                  if (strtolower($channel->getName()) != strtolower($c->getName())) {
 640                      if (isset($options['force'])) {
 641                          $this->ui->log(0, 'WARNING: downloaded channel definition file' .
 642                              ' for channel "' . $channel->getName() . '" from channel "' .
 643                              strtolower($c->getName()) . '"');
 644                      } else {
 645                          return $this->raiseError('ERROR: downloaded channel definition file' .
 646                              ' for channel "' . $channel->getName() . '" from channel "' .
 647                              strtolower($c->getName()) . '"');
 648                      }
 649                  }
 650              }
 651          } else {
 652              if (strpos($params[0], '://')) {
 653                  $dl = &$this->getDownloader();
 654                  PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 655                  $loc = $dl->downloadHttp($params[0],
 656                      $this->ui, $tmpdir, null, $lastmodified);
 657                  PEAR::staticPopErrorHandling();
 658                  if (PEAR::isError($loc)) {
 659                      return $this->raiseError("Cannot open " . $params[0]);
 660                  } else {
 661                      list($loc, $lastmodified) = $loc;
 662                      $contents = implode('', file($loc));
 663                  }
 664              } else {
 665                  $fp = false;
 666                  if (file_exists($params[0])) {
 667                      $fp = fopen($params[0], 'r');
 668                  }
 669                  if (!$fp) {
 670                      return $this->raiseError("Cannot open " . $params[0]);
 671                  }
 672                  $contents = '';
 673                  while (!feof($fp)) {
 674                      $contents .= fread($fp, 1024);
 675                  }
 676                  fclose($fp);
 677              }
 678              if (!class_exists('PEAR_ChannelFile')) {
 679                  require_once  'PEAR/ChannelFile.php';
 680              }
 681              $channel = new PEAR_ChannelFile;
 682              $channel->fromXmlString($contents);
 683          }
 684          $exit = false;
 685          if (count($errors = $channel->getErrors(true))) {
 686              foreach ($errors as $error) {
 687                  $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
 688                  if (!$exit) {
 689                      $exit = $error['level'] == 'error' ? true : false;
 690                  }
 691              }
 692              if ($exit) {
 693                  return $this->raiseError('Invalid channel.xml file');
 694              }
 695          }
 696          if (!$reg->channelExists($channel->getName())) {
 697              return $this->raiseError('Error: Channel "' . $channel->getName() .
 698                  '" does not exist, use channel-add to add an entry');
 699          }
 700          $ret = $reg->updateChannel($channel, $lastmodified);
 701          if (PEAR::isError($ret)) {
 702              return $ret;
 703          }
 704          if (!$ret) {
 705              return $this->raiseError('Updating Channel "' . $channel->getName() .
 706                  '" in registry failed');
 707          }
 708          $this->config->setChannels($reg->listChannels());
 709          $this->config->writeConfigFile();
 710          $this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded');
 711      }
 712  
 713      function &getDownloader()
 714      {
 715          if (!class_exists('PEAR_Downloader')) {
 716              require_once  'PEAR/Downloader.php';
 717          }
 718          $a = new PEAR_Downloader($this->ui, array(), $this->config);
 719          return $a;
 720      }
 721  
 722      function doAlias($command, $options, $params)
 723      {
 724          $reg = &$this->config->getRegistry();
 725          if (sizeof($params) == 1) {
 726              return $this->raiseError('No channel alias specified');
 727          }
 728          if (sizeof($params) != 2) {
 729              return $this->raiseError(
 730                  'Invalid format, correct is: channel-alias channel alias');
 731          }
 732          if (!$reg->channelExists($params[0], true)) {
 733              if ($reg->isAlias($params[0])) {
 734                  $extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' .
 735                      strtolower($params[1]) . '")';
 736              } else {
 737                  $extra = '';
 738              }
 739              return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra);
 740          }
 741          if ($reg->isAlias($params[1])) {
 742              return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' .
 743                  'already aliased to "' . strtolower($params[1]) . '", cannot re-alias');
 744          }
 745          $chan = &$reg->getChannel($params[0]);
 746          if (PEAR::isError($chan)) {
 747              return $this->raiseError('Corrupt registry?  Error retrieving channel "' . $params[0] .
 748                  '" information (' . $chan->getMessage() . ')');
 749          }
 750          // make it a local alias
 751          if (!$chan->setAlias(strtolower($params[1]), true)) {
 752              return $this->raiseError('Alias "' . strtolower($params[1]) .
 753                  '" is not a valid channel alias');
 754          }
 755          $reg->updateChannel($chan);
 756          $this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' .
 757              strtolower($params[1]) . '"');
 758      }
 759  
 760      function doDiscover($command, $options, $params)
 761      {
 762          $reg = &$this->config->getRegistry();
 763          if (sizeof($params) != 1) {
 764              return $this->raiseError("No channel server specified");
 765          }
 766          if ($reg->channelExists($params[0])) {
 767              if ($reg->isAlias($params[0])) {
 768                  return $this->raiseError("A channel alias named \"$params[0]\" " .
 769                      'already exists, aliasing channel "' . $reg->channelName($params[0])
 770                      . '"');
 771              } else {
 772                  return $this->raiseError("Channel \"$params[0]\" is already initialized");
 773              }
 774          }
 775          $this->pushErrorHandling(PEAR_ERROR_RETURN);
 776          $err = $this->doAdd($command, $options, array('http://' . $params[0] . '/channel.xml'));
 777          $this->popErrorHandling();
 778          if (PEAR::isError($err)) {
 779              return $this->raiseError("Discovery of channel \"$params[0]\" failed (" .
 780                  $err->getMessage() . ')');
 781          }
 782          $this->ui->outputData("Discovery of channel \"$params[0]\" succeeded", $command);
 783      }
 784  }
 785  ?>


Généré le : Sun Feb 25 14:08:00 2007 par Balluche grâce à PHPXref 0.7