Successful build of server. Ready for testing.

This commit is contained in:
2023-09-10 23:32:59 -04:00
parent bb2e8ac538
commit b25530f063
4 changed files with 161 additions and 77 deletions

View File

@@ -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. 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. 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? ## What does this module change?
This module changes the following things: 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 - 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 ## TODO

View File

@@ -7,14 +7,7 @@ if (!defined("WHMCS")) {
die("This file cannot be accessed directly"); die("This file cannot be accessed directly");
} }
if (!function_exists('add_hook_os_templates')) { add_hook('ClientAreaFooterOutput', 1, function ($vars) {
/**
* @param array $vars
* @return array|null
* @throws JsonException
*/
function add_hook_os_templates(array $vars): ?array
{
if (!isset($vars['productinfo']['module']) || $vars['productinfo']['module'] !== 'VirtFusionDirect') { if (!isset($vars['productinfo']['module']) || $vars['productinfo']['module'] !== 'VirtFusionDirect') {
return null; return null;
} }
@@ -44,21 +37,8 @@ if (!function_exists('add_hook_os_templates')) {
return strcmp($a['name'], $b['name']); return strcmp($a['name'], $b['name']);
}); });
$osTemplates = [
'id' => 'os_template',
'optionname' => 'Initial Operating System',
'optiontype' => 1,
'options' => $dropdownOptions,
'selectedvalue' => ''
];
$sshKeys = $cs->getUserSshKeys($vars['loggedinuser']); $sshKeys = $cs->getUserSshKeys($vars['loggedinuser']);
$sshKeysOptions = array_map(function ($sshKey) {
$sshKeysOptions = [
'id' => 'ssh_key',
'optionname' => 'Initial SSH Key',
'optiontype' => 1,
'options' => array_map(function ($sshKey) {
if ($sshKey['enabled'] === false) { if ($sshKey['enabled'] === false) {
return null; return null;
} }
@@ -67,21 +47,77 @@ if (!function_exists('add_hook_os_templates')) {
'id' => $sshKey['id'], 'id' => $sshKey['id'],
'name' => $sshKey['name'] 'name' => $sshKey['name']
]; ];
}, $sshKeys['data'] ?? []), }, $sshKeys['data'] ?? []);
'selectedvalue' => ''
];
$configurableoptions = $vars['configurableoptions']; $osID = array_values(array_filter(array_map(function ($option) {
array_push( if ($option['textid'] === 'initialoperatingsystem') {
$configurableoptions, return $option['id'];
$osTemplates,
$sshKeysOptions
);
return [
'configurableoptions' => $configurableoptions,
];
} }
}, $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>
";
});

View File

@@ -116,4 +116,38 @@ class ConfigureService extends Module
return isset($response['msg']) && $response['msg'] === "ext_relation_id not found" ? null : $response['data']; 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;
}
} }

View File

@@ -163,6 +163,10 @@ class ModuleFunctions extends Module
Database::systemOnServerCreate($params['serviceid'], $data); Database::systemOnServerCreate($params['serviceid'], $data);
$this->updateWhmcsServiceParamsOnServerObject($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. * Server was created successfully.