Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.

Differences Between: [Versions 310 and 403] [Versions 311 and 403] [Versions 39 and 403] [Versions 400 and 403]

   1  <?php
   2  /**
   3   * A service browser for remote Moodles
   4   *
   5   * This script 'remotely' executes the reflection methods on a remote Moodle,
   6   * and publishes the details of the available services
   7   *
   8   * @package    core
   9   * @subpackage mnet
  10   * @author  Donal McMullan  donal@catalyst.net.nz
  11   * @version 0.0.1
  12   * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  13   * @package mnet
  14   */
  15  require(__DIR__.'/../../config.php');
  16  require_once $CFG->dirroot.'/mnet/xmlrpc/client.php';
  17  require_once($CFG->libdir.'/adminlib.php');
  18  include_once($CFG->dirroot.'/mnet/lib.php');
  19  
  20  if ($CFG->mnet_dispatcher_mode === 'off') {
  21      throw new \moodle_exception('mnetdisabled', 'mnet');
  22  }
  23  
  24  admin_externalpage_setup('mnettestclient');
  25  
  26  error_reporting(DEBUG_ALL);
  27  
  28  echo $OUTPUT->header();
  29  if (!extension_loaded('openssl')) {
  30      throw new \moodle_exception('requiresopenssl', 'mnet', '', null, true);
  31  }
  32  
  33  // optional drilling down parameters
  34  $hostid = optional_param('hostid', 0, PARAM_INT);
  35  $servicename = optional_param('servicename', '', PARAM_SAFEDIR);
  36  $methodid = optional_param('method', 0, PARAM_INT);
  37  
  38  $hosts = $DB->get_records('mnet_host');
  39  $moodleapplicationid = $DB->get_field('mnet_application', 'id', array('name' => 'moodle'));
  40  
  41  $url = new moodle_url('/admin/mnet/testclient.php');
  42  $PAGE->set_url($url);
  43  
  44  echo $OUTPUT->heading(get_string('hostlist', 'mnet'));
  45  foreach ($hosts as $id => $host) {
  46      if (empty($host->wwwroot) || $host->wwwroot == $CFG->wwwroot) {
  47          continue;
  48      }
  49      $newurl = new moodle_url($url, array('hostid' => $host->id));
  50      echo '<p>' . html_writer::link($newurl, $host->wwwroot) . '</p>';
  51  }
  52  
  53  if (!empty($hostid) && array_key_exists($hostid, $hosts)) {
  54      $host = $hosts[$hostid];
  55      if ($host->applicationid != $moodleapplicationid) {
  56          echo $OUTPUT->notification(get_string('notmoodleapplication', 'mnet'));
  57      }
  58      $mnet_peer = new mnet_peer();
  59      $mnet_peer->set_wwwroot($host->wwwroot);
  60  
  61      $mnet_request = new mnet_xmlrpc_client();
  62  
  63      $mnet_request->set_method('system/listServices');
  64      $mnet_request->send($mnet_peer);
  65  
  66      $services = $mnet_request->response;
  67      $yesno = array('No', 'Yes');
  68      $servicenames = array();
  69  
  70      echo $OUTPUT->heading(get_string('servicesavailableonhost', 'mnet', $host->wwwroot));
  71  
  72      if (!empty($mnet_request->error)) {
  73          echo $OUTPUT->heading(get_string('error'), 3);
  74          echo html_writer::alist($mnet_request->error);
  75          $services = array();
  76      }
  77  
  78      $table = new html_table();
  79      $table->head = array(
  80          get_string('serviceid', 'mnet'),
  81          get_string('service', 'mnet'),
  82          get_string('version', 'mnet'),
  83          get_string('theypublish', 'mnet'),
  84          get_string('theysubscribe', 'mnet'),
  85          get_string('options', 'mnet'),
  86      );
  87      $table->data = array();
  88  
  89      $yesno = array(get_string('no'), get_string('yes'));
  90  
  91      // this query is horrible and has to be remapped afterwards, because of the non-uniqueness
  92      // of the remoterep service (it has two plugins so far that use it)
  93      // it's possible to get a unique list back using a subquery with LIMIT but that would break oracle
  94      // so it's best to just do this small query and then remap the results afterwards
  95      $sql = '
  96          SELECT DISTINCT
  97              ' . $DB->sql_concat('r.plugintype', "'_'", 'r.pluginname', "'_'", 's.name')  . ' AS uniqueid,
  98               s.name,
  99               r.plugintype,
 100               r.pluginname
 101          FROM
 102              {mnet_service} s
 103         JOIN {mnet_remote_service2rpc} s2r ON s2r.serviceid = s.id
 104         JOIN {mnet_remote_rpc} r ON r.id = s2r.rpcid';
 105  
 106      $serviceinfo = array();
 107  
 108      foreach ($DB->get_records_sql($sql) as $result) {
 109          $serviceinfo[$result->name] = $result->plugintype . '_' . $result->pluginname;
 110      }
 111  
 112      foreach ($services as $id => $servicedata) {
 113          if (array_key_exists($servicedata['name'], $serviceinfo)) {
 114              $service = $serviceinfo[$servicedata['name']];
 115              $servicedata['humanname'] = get_string($servicedata['name'].'_name', $service);
 116          } else {
 117              $servicedata['humanname'] = get_string('unknown', 'mnet');
 118          }
 119          $newurl = new moodle_url($url, array('hostid' => $host->id, 'servicename' => $servicedata['name']));
 120          $table->data[] = array(
 121              $servicedata['name'],
 122              $servicedata['humanname'],
 123              $servicedata['apiversion'],
 124              $yesno[$servicedata['publish']],
 125              $yesno[$servicedata['subscribe']],
 126              html_writer::link($newurl, get_string('listservices', 'mnet'))
 127          );
 128  
 129      }
 130      echo html_writer::table($table);
 131  
 132  
 133      $mnet_request = new mnet_xmlrpc_client();
 134      $mnet_request->set_method('system/listMethods');
 135      if (isset($servicename) && array_key_exists($servicename, $serviceinfo)) {
 136          echo $OUTPUT->heading(get_string('methodsavailableonhostinservice', 'mnet', (object)array('host' => $host->wwwroot, 'service' => $servicename)));
 137          $service = $serviceinfo[$servicename];
 138          $mnet_request->add_param($servicename, 'string');
 139      } else {
 140          echo $OUTPUT->heading(get_string('methodsavailableonhost', 'mnet', $host->wwwroot));
 141      }
 142  
 143      $mnet_request->send($mnet_peer);
 144      $methods = $mnet_request->response;
 145  
 146      if (!empty($mnet_request->error)) {
 147          echo $OUTPUT->heading(get_string('error'), 3);
 148          echo html_writer::alist($mnet_request->error);
 149          $methods = array();
 150      }
 151  
 152      $table = new html_table();
 153      $table->head = array(
 154          get_string('method', 'mnet'),
 155          get_string('options', 'mnet'),
 156      );
 157      $table->data = array();
 158  
 159      foreach ($methods as $id => $method) {
 160          $params = array('hostid' => $host->id, 'method' => $id+1);
 161          if (isset($servicename)) {
 162              $params['servicename'] = $servicename;
 163          }
 164          $newurl = new moodle_url($url, $params);
 165          $table->data[] = array(
 166              $method,
 167              html_writer::link($newurl, get_string('inspect', 'mnet'))
 168          );
 169      }
 170      echo html_writer::table($table);
 171  
 172      if (isset($methodid) && array_key_exists($methodid-1, $methods)) {
 173          $method = $methods[$methodid-1];
 174  
 175          $mnet_request = new mnet_xmlrpc_client();
 176          $mnet_request->set_method('system/methodSignature');
 177          $mnet_request->add_param($method, 'string');
 178          $mnet_request->send($mnet_peer);
 179          $signature = $mnet_request->response;
 180  
 181          echo $OUTPUT->heading(get_string('methodsignature', 'mnet', $method));
 182  
 183          if (!empty($mnet_request->error)) {
 184              echo $OUTPUT->heading(get_string('error'), 3);
 185              echo html_writer::alist($mnet_request->error);
 186              $signature = array();
 187          }
 188  
 189          $table = new html_table();
 190          $table->head = array(
 191              get_string('position', 'mnet'),
 192              get_string('name', 'mnet'),
 193              get_string('type', 'mnet'),
 194              get_string('description', 'mnet'),
 195          );
 196          $table->data = array();
 197  
 198          $params = $signature['parameters'];
 199          foreach ($params as $pos => $details) {
 200              $table->data[] = array(
 201                  $pos,
 202                  $details['name'],
 203                  $details['type'],
 204                  $details['description'],
 205              );
 206          }
 207          $table->data[] = array(
 208              get_string('returnvalue', 'mnet'),
 209              '',
 210              $signature['return']['type'],
 211              $signature['return']['description']
 212          );
 213  
 214          echo html_writer::table($table);
 215  
 216          $mnet_request->set_method('system/methodHelp');
 217          $mnet_request->add_param($method, 'string');
 218          $mnet_request->send($mnet_peer);
 219          $help = $mnet_request->response;
 220  
 221          echo $OUTPUT->heading(get_string('methodhelp', 'mnet', $method));
 222          echo(str_replace('\n', '<br />',$help));
 223      }
 224  }
 225  
 226  echo $OUTPUT->footer();
 227  ?>