Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove dependency on local_aws #176

Merged
merged 1 commit into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ In general a metric is any real time value that you might push to another servic

## Branches

| Moodle version | Branch | PHP |
|-------------------|------------------|------|
| Moodle 3.5+ | MOODLE_35_STABLE | 7.1+ |
| Totara 10+ | MOODLE_35_STABLE | 7.1+ |
| Moodle version | Branch | PHP |
|------------------|-------------------|------|
| Moodle 3.5 - 4.3 | MOODLE_35_STABLE | 7.1+ |
| Moodle 4.4+ | MOODLE_404_STABLE | 8.1+ |
| Totara 10+ | MOODLE_35_STABLE | 7.1+ |

## Architecture

Expand Down Expand Up @@ -106,7 +107,6 @@ Sends metric data to AWS Cloudwatch
https://docs.aws.amazon.com/cloudwatch/

#### Requires
- local/aws AWS SDK plugin (https://github.com/catalyst/moodle-local_aws)
- AWS account
- IAM user

Expand Down
87 changes: 87 additions & 0 deletions classes/admin_settings_aws_region.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Admin setting for AWS regions.
*
* @package tool_cloudmetrics
* @author Dmitrii Metelkin <[email protected]>
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace tool_cloudmetrics;

defined('MOODLE_INTERNAL') || die();

require_once($CFG->dirroot . '/lib/adminlib.php');

/**
* Admin setting for a list of AWS regions.
*
* @package tool_cloudmetrics
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class admin_settings_aws_region extends \admin_setting_configtext {

/**
* Return part of form with setting.
*
* @param mixed $data array or string depending on setting
* @param string $query
* @return string
*/
public function output_html($data, $query='') {
global $CFG;

$default = $this->get_defaultsetting();

$options = [];

$all = require($CFG->dirroot . '/lib/aws-sdk/src/data/endpoints.json.php');
$ends = $all['partitions'][0]['regions'];
if ($ends) {
foreach ($ends as $key => $value) {
$options[] = [
'value' => $key,
'label' => $key . ' - ' . $value['description'],
];
}
}

$inputparams = array(
'type' => 'text',
'list' => $this->get_full_name(),
'name' => $this->get_full_name(),
'value' => $data,
'size' => $this->size,
'id' => $this->get_id(),
'class' => 'form-control text-ltr',
);

$element = \html_writer::start_tag('div', array('class' => 'form-text defaultsnext'));
$element .= \html_writer::empty_tag('input', $inputparams);
$element .= \html_writer::start_tag('datalist', array('id' => $this->get_full_name()));
foreach ($options as $option) {
$element .= \html_writer::tag('option', $option['label'], array('value' => $option['value']));
}
$element .= \html_writer::end_tag('datalist');
$element .= \html_writer::end_tag('div');

return format_admin_setting($this, $this->visiblename, $element, $this->description, true, '', $default, $query);
}
}
100 changes: 100 additions & 0 deletions classes/aws_helper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* AWS helper class. Contains useful functions when interacting with the SDK.
*
* @package tool_cloudmetrics
* @author Peter Burnett <[email protected]>
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace tool_cloudmetrics;

use Aws\CommandInterface;
use Aws\AwsClient;
use Psr\Http\Message\RequestInterface;

/**
* This class contains functions that help plugins to interact with the AWS SDK.
*
* @copyright 2020 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class aws_helper {

/**
* This creates a proxy string suitable for use with the AWS SDK.
*
* @return string the string to use for proxy settings.
*/
public static function get_proxy_string() {
global $CFG;
$proxy = '';
if (empty($CFG->proxytype)) {
return $proxy;
}
if ($CFG->proxytype === 'SOCKS5') {
// If it is a SOCKS proxy, append the protocol info.
$protocol = 'socks5://';
} else {
$protocol = '';
}
if (!empty($CFG->proxyhost)) {
$proxy = $CFG->proxyhost;
if (!empty($CFG->proxyport)) {
$proxy .= ':'. $CFG->proxyport;
}
if (!empty($CFG->proxyuser) && !empty($CFG->proxypassword)) {
$proxy = $protocol . $CFG->proxyuser . ':' . $CFG->proxypassword . '@' . $proxy;
}
}
return $proxy;
}

/**
* Configure the provided AWS client to route traffic via the moodle proxy for any hosts not excluded.
*
* @param AwsClient $client
* @return AwsClient
*/
public static function configure_client_proxy(AwsClient $client): AwsClient {
$client->getHandlerList()->appendBuild(self::add_proxy_when_required(), 'proxy_bypass');
return $client;
}

/**
* Generate a middleware higher order function to wrap the handler and append proxy configuration based on target.
*
* @return callable Middleware high order callable.
*/
protected static function add_proxy_when_required(): callable {
return function (callable $fn) {
return function (CommandInterface $command, ?RequestInterface $request = null) use ($fn) {
if (isset($request)) {
$target = (string) $request->getUri();
if (!is_proxybypass($target)) {
$command['@http']['proxy'] = self::get_proxy_string();
}
}

$promise = $fn($command, $request);
return $promise;
};
};
}
}
62 changes: 62 additions & 0 deletions classes/client_factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* AWS Client factory. Retrieves a client with moodle specific HTTP configuration.
*
* @package tool_cloudmetrics
* @author Peter Burnett <[email protected]>
* @copyright 2022 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace tool_cloudmetrics;
use \Aws\AwsClient;

/**
* AWS Client factory. Retrieves a client with moodle specific HTTP configuration.
*
* @copyright 2022 Catalyst IT
* @author Peter Burnett <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class client_factory {
/**
* Get an AWS client with moodle specific HTTP configuration.
*
* @param string $class Fully qualified AWS classname e.g. \Aws\S3\S3Client
* @param array $opts array of constructor options for AWS Client.
* @return AwsClient
*/
public static function get_client(string $class, array $opts): AwsClient {
// Modify the opts to add HTTP timeouts.
if (empty($opts['http'])) {
$opts['http'] = ['connect_timeout' => HOURSECS];
} else if (is_array($opts['http'] && !array_key_exists('connect_timeout', $opts['http']))) {
// Try not to override existing settings.
$opts['http']['connect_timeout'] = HOURSECS;
}

// Blindly trust the call here. If it exceptions, the raw message is the most useful.
$client = new $class($opts);
if (!$client instanceof \Aws\AwsClient) {
throw new \moodle_exception('clientnotfound', 'tool_cloudmetrics');
}

// Now we can configure the proxy with the routing aware middleware.
return aws_helper::configure_client_proxy($client);
}
}
10 changes: 2 additions & 8 deletions collector/cloudwatch/classes/collector.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,9 @@

namespace cltr_cloudwatch;

use local_aws\local\client_factory;
use tool_cloudmetrics\collector\base;
use tool_cloudmetrics\metric\metric_item;

defined('MOODLE_INTERNAL') || die();

require_once($CFG->dirroot . '/local/aws/sdk/aws-autoloader.php');


use tool_cloudmetrics\client_factory;
/**
* Collector class for AWS Cloudwatch.
*
Expand Down Expand Up @@ -130,6 +124,6 @@ public function is_ready(): bool {
return false;
}

return lib::is_plugin_usable() && !is_null(self::$client);
return !is_null(self::$client);
}
}
12 changes: 0 additions & 12 deletions collector/cloudwatch/classes/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,6 @@
class lib {
/** @var string AWS version*/
const AWS_VERSION = '2010-08-01';
/** @var int Local AWS version*/
const LOCAL_AWS_VERSION = 2022033100;

/**
* Returns if the plugin can be used.
*
* @return bool
*/
public static function is_plugin_usable() {
return (class_exists('\local_aws\local\client_factory') &&
class_exists('\local_aws\admin_settings_aws_region'));
}

/**
* Get the configuration values for the plugin, substituting in defaults where
Expand Down
2 changes: 0 additions & 2 deletions collector/cloudwatch/lang/en/cltr_cloudwatch.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,3 @@

// Missing requirements.
$string['unsatisfied_requirements'] = 'Unsatisfied Requirements';
$string['aws:installneeded'] = 'Plugin \'local_aws\' of version {$a} is required.';
$string['aws:upgradeneeded'] = 'Plugin \'local_aws\' needs to be upgraded to version {$a}.';
Loading
Loading