Successful build of server. Ready for testing.
This commit is contained in:
12
README.md
12
README.md
@@ -12,12 +12,22 @@ This module requires VirtFusion v1.7.3 or higher as this is what it's based on.
|
||||
1. Download the latest release from the [releases](https://github.com/EZSCALE/virtfusion-whmcs-module/releases) page.
|
||||
2. Extract the contents of the archive and upload the modules folder to your WHMCS installation directory.
|
||||
|
||||
## :heavy_exclamation_mark: Important Notes :heavy_exclamation_mark:
|
||||
|
||||
You must create two custom fields in WHMCS for this module to work. You need to configure the following custom fields on
|
||||
each product you want to use this module with.
|
||||
|
||||
| Field Name | Field Type | Description | Validation | Select Options | Admin Only | Required Field | Show on Order Form | Show on Invoice |
|
||||
|--------------------------|------------|--------------------------|-------------|----------------|------------|--------------------|--------------------|-----------------|
|
||||
| Initial Operating System | Text Box | Set to whatever you want | Leave Blank | Leave Blank | :x: | :white_check_mark: | :white_check_mark: | :x: |
|
||||
| Initial SSH Key | Text Box | Set to whatever you want | Leave Blank | Leave Blank | :x: | :x: | :white_check_mark: | :x: |
|
||||
|
||||
## What does this module change?
|
||||
|
||||
This module changes the following things:
|
||||
|
||||
- Adds configurable options to the product configuration page to allow the user to select the operating system and add
|
||||
a ssh key to the initial deployment.
|
||||
an ssh key to the initial deployment.
|
||||
|
||||
## TODO
|
||||
|
||||
|
||||
@@ -7,14 +7,7 @@ if (!defined("WHMCS")) {
|
||||
die("This file cannot be accessed directly");
|
||||
}
|
||||
|
||||
if (!function_exists('add_hook_os_templates')) {
|
||||
/**
|
||||
* @param array $vars
|
||||
* @return array|null
|
||||
* @throws JsonException
|
||||
*/
|
||||
function add_hook_os_templates(array $vars): ?array
|
||||
{
|
||||
add_hook('ClientAreaFooterOutput', 1, function ($vars) {
|
||||
if (!isset($vars['productinfo']['module']) || $vars['productinfo']['module'] !== 'VirtFusionDirect') {
|
||||
return null;
|
||||
}
|
||||
@@ -44,21 +37,8 @@ if (!function_exists('add_hook_os_templates')) {
|
||||
return strcmp($a['name'], $b['name']);
|
||||
});
|
||||
|
||||
$osTemplates = [
|
||||
'id' => 'os_template',
|
||||
'optionname' => 'Initial Operating System',
|
||||
'optiontype' => 1,
|
||||
'options' => $dropdownOptions,
|
||||
'selectedvalue' => ''
|
||||
];
|
||||
|
||||
$sshKeys = $cs->getUserSshKeys($vars['loggedinuser']);
|
||||
|
||||
$sshKeysOptions = [
|
||||
'id' => 'ssh_key',
|
||||
'optionname' => 'Initial SSH Key',
|
||||
'optiontype' => 1,
|
||||
'options' => array_map(function ($sshKey) {
|
||||
$sshKeysOptions = array_map(function ($sshKey) {
|
||||
if ($sshKey['enabled'] === false) {
|
||||
return null;
|
||||
}
|
||||
@@ -67,21 +47,77 @@ if (!function_exists('add_hook_os_templates')) {
|
||||
'id' => $sshKey['id'],
|
||||
'name' => $sshKey['name']
|
||||
];
|
||||
}, $sshKeys['data'] ?? []),
|
||||
'selectedvalue' => ''
|
||||
];
|
||||
}, $sshKeys['data'] ?? []);
|
||||
|
||||
$configurableoptions = $vars['configurableoptions'];
|
||||
array_push(
|
||||
$configurableoptions,
|
||||
$osTemplates,
|
||||
$sshKeysOptions
|
||||
);
|
||||
|
||||
return [
|
||||
'configurableoptions' => $configurableoptions,
|
||||
];
|
||||
$osID = array_values(array_filter(array_map(function ($option) {
|
||||
if ($option['textid'] === 'initialoperatingsystem') {
|
||||
return $option['id'];
|
||||
}
|
||||
}, $vars['customfields'])));
|
||||
|
||||
add_hook('ClientAreaPageCart', 1, 'add_hook_os_templates');
|
||||
}
|
||||
$sshID = array_values(array_filter(array_map(function ($option) {
|
||||
if ($option['textid'] === 'initialsshkey') {
|
||||
return $option['id'];
|
||||
}
|
||||
}, $vars['customfields'])));
|
||||
|
||||
// Construct the JavaScript code
|
||||
return "
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var osTemplates = " . json_encode($dropdownOptions) . ";
|
||||
var sshKeys = " . json_encode($sshKeysOptions) . ";
|
||||
|
||||
var osInputField = document.querySelector('[name=\"customfield[" . ($osID[0] ?? null) . "]\"]');
|
||||
var sshInputField = document.querySelector('[name=\"customfield[" . ($sshID[0] ?? null) . "]\"]');
|
||||
|
||||
// Create dropdown options menu, then add it to the DOM then on change, update the regular input.
|
||||
var osSelect = document.createElement('select');
|
||||
osSelect.className = 'form-control';
|
||||
|
||||
osTemplates.forEach(function(template) {
|
||||
var option = document.createElement('option');
|
||||
option.value = template.id;
|
||||
option.text = template.name;
|
||||
osSelect.appendChild(option);
|
||||
});
|
||||
|
||||
// Set the default value of the input field to the first option in the dropdown.
|
||||
osInputField.value = osSelect.options[0].value;
|
||||
|
||||
osSelect.addEventListener('change', function() {
|
||||
osInputField.value = this.value;
|
||||
console.log(this.value);
|
||||
});
|
||||
|
||||
osInputField.parentNode.insertBefore(osSelect, osInputField.nextSibling);
|
||||
osInputField.style.display = 'none';
|
||||
|
||||
if (sshKeys.length > 0) {
|
||||
// Create dropdown options menu, then add it to the DOM then on change, update the regular input.
|
||||
var sshSelect = document.createElement('select');
|
||||
sshSelect.className = 'form-control';
|
||||
|
||||
sshKeys.forEach(function(sshkey) {
|
||||
var option = document.createElement('option');
|
||||
option.value = sshkey.id;
|
||||
option.text = sshkey.name;
|
||||
sshSelect.appendChild(option);
|
||||
});
|
||||
|
||||
// Set the default value of the input field to the first option in the dropdown.
|
||||
sshInputField.value = sshSelect.options[0].value;
|
||||
|
||||
sshSelect.addEventListener('change', function() {
|
||||
sshInputField.value = this.value;
|
||||
});
|
||||
|
||||
sshInputField.parentNode.insertBefore(sshSelect, sshInputField.nextSibling);
|
||||
sshInputField.style.display = 'none';
|
||||
} else {
|
||||
sshInputField.style.display = 'none';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
";
|
||||
});
|
||||
@@ -116,4 +116,38 @@ class ConfigureService extends Module
|
||||
|
||||
return isset($response['msg']) && $response['msg'] === "ext_relation_id not found" ? null : $response['data'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
* @param array $vars
|
||||
* @return bool
|
||||
*/
|
||||
public function initServerBuild(int $id, array $vars): bool
|
||||
{
|
||||
$request = $this->initCurl($this->cp['token']);
|
||||
|
||||
// Generate a random 8 character hostname
|
||||
$hostname = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 8);
|
||||
|
||||
$inputData = [
|
||||
"operatingSystemId" => $vars['customfields']['Initial Operating System'],
|
||||
"name" => $hostname,
|
||||
"sshKeys" => [
|
||||
$vars['customfields']['Initial SSH Key']
|
||||
],
|
||||
'email' => true
|
||||
];
|
||||
|
||||
if (empty($vars['customfields']['Initial SSH Key'])) {
|
||||
unset($inputData['sshKeys']);
|
||||
}
|
||||
|
||||
$request->addOption(CURLOPT_POSTFIELDS, json_encode($inputData));
|
||||
|
||||
$request->post(
|
||||
sprintf("%s/servers/%d/build", $this->cp['url'], $id)
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -163,6 +163,10 @@ class ModuleFunctions extends Module
|
||||
Database::systemOnServerCreate($params['serviceid'], $data);
|
||||
$this->updateWhmcsServiceParamsOnServerObject($params['serviceid'], $data);
|
||||
|
||||
// If the server is created successfully, we can initialize the server build.
|
||||
$cs = new ConfigureService();
|
||||
$cs->initServerBuild($data->data->id, $params);
|
||||
|
||||
/**
|
||||
*
|
||||
* Server was created successfully.
|
||||
|
||||
Reference in New Issue
Block a user