mirror of
https://github.com/The-Network-Crew/Proxmox-VE-for-WHMCS.git
synced 2026-04-02 10:38:30 +00:00
SQL tidy; Add new CPU models; #32 post-clone WIP
This commit is contained in:
@@ -2,14 +2,14 @@
|
||||
|
||||
**Salvation, a free and open-source solution for beloved PVE!** If you love it, REVIEW & SHARE IT! ❤️
|
||||
|
||||
<img alt="Logo for the Proxmox VE for WHMCS module" src="zLOGO.png">
|
||||
|
||||
- Configure VM/CT plans with custom CPU/RAM/VLAN/On-boot/Bandwidth/etc
|
||||
- Automatically Provision VMs & CTs in [Proxmox VE](https://proxmox.com/en/proxmox-ve/features) from [WHMCS](https://www.whmcs.com/tour/) easily
|
||||
- Allow clients to view/manage VMs using the WHMCS Client Area
|
||||
- Create/Suspend/Unsuspend/Terminate via WHMCS Admin Area
|
||||
- Statistics/Graphing is available in the Client Area for services :)
|
||||
|
||||
<img alt="Logo for the Proxmox VE for WHMCS module" src="zLOGO.png">
|
||||
|
||||
> **Please review the module!** https://marketplace.whmcs.com/product/6935-proxmox-ve-for-whmcs
|
||||
>
|
||||
> If you want it to remain free and fabulous, it could use a moment of your time in reviewing it. Thanks!
|
||||
@@ -48,8 +48,6 @@ Once you've done all of that, in order to get the module working properly, you n
|
||||
5. WHMCS Admin > Config > Products/Services > New Service (create offering)
|
||||
6. " " > Newly-added Service > Tab 3 > **SAVE** (links Module Plan to WHMCS Service type)
|
||||
|
||||
> Note: At the moment, the new Connection Test in WHMCS shows an empty red box. Try an action to test.
|
||||
|
||||
## 🥽 noVNC: Console Tunnel (Client Area) 🥽
|
||||
|
||||
After forking the module, we considered how to improve security of Console Tunneling via WHMCS. We decided to implement a routing method which uses a secondary user in Proxmox VE with very restrictive permissions. This requires more work to make it function, however improves security.
|
||||
@@ -212,9 +210,7 @@ Please consult the [UPDATE-SQL.md](https://github.com/The-Network-Crew/Proxmox-V
|
||||
## 📄 DIY: Documentation & Resources 📄
|
||||
|
||||
- Proxmox API: https://pve.proxmox.com/pve-docs/api-viewer/
|
||||
- SPICE: https://gitlab.freedesktop.org/spice/spice-html5
|
||||
- TigerVNC: https://github.com/TigerVNC/tigervnc/wiki
|
||||
- Xterm.js: https://github.com/xtermjs/xterm.js/
|
||||
- noVNC: https://github.com/novnc/noVNC/wiki
|
||||
- WHMCS: https://developers.whmcs.com/
|
||||
- x86-64-ABI: [latest PDF download](https://gitlab.com/x86-psABIs/x86-64-ABI/-/jobs/artifacts/master/raw/x86-64-ABI/abi.pdf?job=build)
|
||||
|
||||
@@ -22,13 +22,13 @@ CREATE TABLE IF NOT EXISTS `mod_pvewhmcs_ip_pools` (
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS `mod_pvewhmcs_plans` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT 'Plan - Name',
|
||||
`vmtype` varchar(8) NOT NULL COMMENT 'Guest Type - KVM or LXC',
|
||||
`ostype` varchar(8) DEFAULT NULL COMMENT 'OS - Type',
|
||||
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
|
||||
`vmtype` varchar(8) NOT NULL,
|
||||
`ostype` varchar(8) DEFAULT NULL,
|
||||
`cpus` tinyint(2) unsigned DEFAULT NULL,
|
||||
`cpuemu` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT 'Emulated CPU Type eg. coreduo | core2duo | kvm32 | kvm64 | qemu32 | qemu64 | phenom | host',
|
||||
`cores` tinyint(2) unsigned DEFAULT NULL COMMENT 'Cores per Socket',
|
||||
`cpulimit` smallint(5) unsigned DEFAULT NULL COMMENT 'Limit vs Host CPU (max)',
|
||||
`cpuemu` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`cores` tinyint(2) unsigned DEFAULT NULL,
|
||||
`cpulimit` smallint(5) unsigned DEFAULT NULL,
|
||||
`cpuunits` smallint(5) unsigned DEFAULT NULL,
|
||||
`memory` smallint(5) unsigned NOT NULL,
|
||||
`swap` smallint(5) unsigned DEFAULT NULL,
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
<?php
|
||||
// FILE: /modules/addons/pvewhmcs/pvewhmcs.php
|
||||
// TASK: Handles the Admin and Client Area GUIs etc
|
||||
// NEED: The PHP API Class to interact w/ Proxmox VE API
|
||||
// REPO: GitHub.com/The-Network-Crew/Proxmox-VE-for-WHMCS
|
||||
|
||||
// Pull in the WHMCS database handler Capsule for SQL
|
||||
use Illuminate\Database\Capsule\Manager as Capsule;
|
||||
|
||||
// Define where the module operates in the Admin GUI
|
||||
define( 'pvewhmcs_BASEURL', 'addonmodules.php?module=pvewhmcs' );
|
||||
|
||||
// Require the PHP API Class to interact with Proxmox VE
|
||||
require_once('proxmox.php');
|
||||
|
||||
@@ -21,7 +30,8 @@ function pvewhmcs_version(){
|
||||
return "1.2.2";
|
||||
}
|
||||
|
||||
// WHMCS MODULE: ACTIVATION
|
||||
// WHMCS MODULE: ACTIVATION of the ADDON MODULE
|
||||
// This consists of importing the SQL structure, and then crudely returning yay or nay (needs improving)
|
||||
function pvewhmcs_activate() {
|
||||
// Pull in the SQL structure (includes VNC/etc tweaks)
|
||||
$sql = file_get_contents(ROOTDIR.'/modules/addons/pvewhmcs/db.sql');
|
||||
@@ -442,7 +452,12 @@ function kvm_plan_add() {
|
||||
<option value="Broadwell-noTSX-IBRS">(Intel) Broadwell-noTSX-IBRS</option>
|
||||
<option value="Cascadelake-Server">(Intel) Cascadelake-Server</option>
|
||||
<option value="Cascadelake-Server-noTSX">(Intel) Cascadelake-Server-noTSX</option>
|
||||
<option value="Cascadelake-Server-v2">(Intel) Cascadelake-Server-v2</option>
|
||||
<option value="Cascadelake-Server-v4">(Intel) Cascadelake-Server-v4</option>
|
||||
<option value="Cascadelake-Server-v5">(Intel) Cascadelake-Server-v5</option>
|
||||
<option value="Conroe">(Intel) Conroe</option>
|
||||
<option value="Cooperlake">(Intel) Cooperlake</option>
|
||||
<option value="Cooperlake-v2">(Intel) Cooperlake-v2</option>
|
||||
<option value="Haswell">(Intel) Haswell</option>
|
||||
<option value="Haswell-IBRS">(Intel) Haswell-IBRS</option>
|
||||
<option value="Haswell-noTSX">(Intel) Haswell-noTSX</option>
|
||||
@@ -451,6 +466,10 @@ function kvm_plan_add() {
|
||||
<option value="Icelake-Client-noTSX">(Intel) Icelake-Client-noTSX</option>
|
||||
<option value="Icelake-Server">(Intel) Icelake-Server</option>
|
||||
<option value="Icelake-Server-noTSX">(Intel) Icelake-Server-noTSX</option>
|
||||
<option value="Icelake-Server-v3">(Intel) Icelake-Server-v3</option>
|
||||
<option value="Icelake-Server-v4">(Intel) Icelake-Server-v4</option>
|
||||
<option value="Icelake-Server-v5">(Intel) Icelake-Server-v5</option>
|
||||
<option value="Icelake-Server-v6">(Intel) Icelake-Server-v6</option>
|
||||
<option value="IvyBridge">(Intel) IvyBridge</option>
|
||||
<option value="IvyBridge-IBRS">(Intel) IvyBridge-IBRS</option>
|
||||
<option value="KnightsMill">(Intel) KnightsMill</option>
|
||||
@@ -459,12 +478,16 @@ function kvm_plan_add() {
|
||||
<option value="Penryn">(Intel) Penryn</option>
|
||||
<option value="SandyBridge">(Intel) SandyBridge</option>
|
||||
<option value="SandyBridge-IBRS">(Intel) SandyBridge-IBRS</option>
|
||||
<option value="SapphireRapids">(Intel) SapphireRapids</option>
|
||||
<option value="Skylake-Client">(Intel) Skylake-Client</option>
|
||||
<option value="Skylake-Client-IBRS">(Intel) Skylake-Client-IBRS</option>
|
||||
<option value="Skylake-Client-noTSX-IBRS">(Intel) Skylake-Client-noTSX-IBRS</option>
|
||||
<option value="Skylake-Client-v4">(Intel) Skylake-Client-v4</option>
|
||||
<option value="Skylake-Server">(Intel) Skylake-Server</option>
|
||||
<option value="Skylake-Server-IBRS">(Intel) Skylake-Server-IBRS</option>
|
||||
<option value="Skylake-Server-noTSX-IBRS">(Intel) Skylake-Server-noTSX-IBRS</option>
|
||||
<option value="Skylake-Server-v4">(Intel) Skylake-Server-v4</option>
|
||||
<option value="Skylake-Server-v5">(Intel) Skylake-Server-v5</option>
|
||||
<option value="Westmere">(Intel) Westmere</option>
|
||||
<option value="Westmere-IBRS">(Intel) Westmere-IBRS</option>
|
||||
<option value="pentium">(Intel) Pentium I</option>
|
||||
@@ -478,13 +501,15 @@ function kvm_plan_add() {
|
||||
<option value="EPYC-IBPB">(AMD) EPYC-IBPB</option>
|
||||
<option value="EPYC-Milan">(AMD) EPYC-Milan</option>
|
||||
<option value="EPYC-Rome">(AMD) EPYC-Rome</option>
|
||||
<option value="EPYC-Rome-v2">(AMD) EPYC-Rome-v2</option>
|
||||
<option value="EPYC-v3">(AMD) EPYC-v3</option>
|
||||
<option value="Opteron_G1">(AMD) Opteron_G1</option>
|
||||
<option value="Opteron_G2">(AMD) Opteron_G2</option>
|
||||
<option value="Opteron_G3">(AMD) Opteron_G3</option>
|
||||
<option value="Opteron_G4">(AMD) Opteron_G4</option>
|
||||
<option value="Opteron_G5">(AMD) Opteron_G5</option>
|
||||
</select>
|
||||
CPU emulation type. Default is KVM64
|
||||
CPU emulation type. Default is x86-64 psABI v2-AES
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -725,7 +750,12 @@ function kvm_plan_edit($id) {
|
||||
<option value="Broadwell-noTSX-IBRS" ' . ($plan->cpuemu == "Broadwell-noTSX-IBRS" ? "selected" : "") . '>(Intel) Broadwell-noTSX-IBRS</option>
|
||||
<option value="Cascadelake-Server" ' . ($plan->cpuemu == "Cascadelake-Server" ? "selected" : "") . '>(Intel) Cascadelake-Server</option>
|
||||
<option value="Cascadelake-Server-noTSX" ' . ($plan->cpuemu == "Cascadelake-Server-noTSX" ? "selected" : "") . '>(Intel) Cascadelake-Server-noTSX</option>
|
||||
<option value="Cascadelake-Server-v2" ' . ($plan->cpuemu == "Cascadelake-Server-v2" ? "selected" : "") . '>(Intel) Cascadelake-Server V2</option>
|
||||
<option value="Cascadelake-Server-v4" ' . ($plan->cpuemu == "Cascadelake-Server-v4" ? "selected" : "") . '>(Intel) Cascadelake-Server V4</option>
|
||||
<option value="Cascadelake-Server-v5" ' . ($plan->cpuemu == "Cascadelake-Server-v5" ? "selected" : "") . '>(Intel) Cascadelake-Server V5</option>
|
||||
<option value="Conroe" ' . ($plan->cpuemu == "Conroe" ? "selected" : "") . '>(Intel) Conroe</option>
|
||||
<option value="Cooperlake" ' . ($plan->cpuemu == "Cooperlake" ? "selected" : "") . '>(Intel) Cooperlake</option>
|
||||
<option value="Cooperlake-v2" ' . ($plan->cpuemu == "Cooperlake-v2" ? "selected" : "") . '>(Intel) Cooperlake V2</option>
|
||||
<option value="Haswell" ' . ($plan->cpuemu == "Haswell" ? "selected" : "") . '>(Intel) Haswell</option>
|
||||
<option value="Haswell-IBRS" ' . ($plan->cpuemu == "Haswell-IBRS" ? "selected" : "") . '>(Intel) Haswell-IBRS</option>
|
||||
<option value="Haswell-noTSX" ' . ($plan->cpuemu == "Haswell-noTSX" ? "selected" : "") . '>(Intel) Haswell-noTSX</option>
|
||||
@@ -734,6 +764,10 @@ function kvm_plan_edit($id) {
|
||||
<option value="Icelake-Client-noTSX" ' . ($plan->cpuemu == "Icelake-Client-noTSX" ? "selected" : "") . '>(Intel) Icelake-Client-noTSX</option>
|
||||
<option value="Icelake-Server" ' . ($plan->cpuemu == "Icelake-Server" ? "selected" : "") . '>(Intel) Icelake-Server</option>
|
||||
<option value="Icelake-Server-noTSX" ' . ($plan->cpuemu == "Icelake-Server-noTSX" ? "selected" : "") . '>(Intel) Icelake-Server-noTSX</option>
|
||||
<option value="Icelake-Server-v3" ' . ($plan->cpuemu == "Icelake-Server-v3" ? "selected" : "") . '>(Intel) Icelake-Server V3</option>
|
||||
<option value="Icelake-Server-v4" ' . ($plan->cpuemu == "Icelake-Server-v4" ? "selected" : "") . '>(Intel) Icelake-Server V4</option>
|
||||
<option value="Icelake-Server-v5" ' . ($plan->cpuemu == "Icelake-Server-v5" ? "selected" : "") . '>(Intel) Icelake-Server V5</option>
|
||||
<option value="Icelake-Server-v6" ' . ($plan->cpuemu == "Icelake-Server-v6" ? "selected" : "") . '>(Intel) Icelake-Server V6</option>
|
||||
<option value="IvyBridge" ' . ($plan->cpuemu == "IvyBridge" ? "selected" : "") . '>(Intel) IvyBridge</option>
|
||||
<option value="IvyBridge-IBRS" ' . ($plan->cpuemu == "IvyBridge-IBRS" ? "selected" : "") . '>(Intel) IvyBridge-IBRS</option>
|
||||
<option value="KnightsMill" ' . ($plan->cpuemu == "KnightsMill" ? "selected" : "") . '>(Intel) KnightsMill</option>
|
||||
@@ -742,12 +776,16 @@ function kvm_plan_edit($id) {
|
||||
<option value="Penryn" ' . ($plan->cpuemu == "Penryn" ? "selected" : "") . '>(Intel) Penryn</option>
|
||||
<option value="SandyBridge" ' . ($plan->cpuemu == "SandyBridge" ? "selected" : "") . '>(Intel) SandyBridge</option>
|
||||
<option value="SandyBridge-IBRS" ' . ($plan->cpuemu == "SandyBridge-IBRS" ? "selected" : "") . '>(Intel) SandyBridge-IBRS</option>
|
||||
<option value="SapphireRapids" ' . ($plan->cpuemu == "SapphireRapids" ? "selected" : "") . '>(Intel) Sapphire Rapids</option>
|
||||
<option value="Skylake-Client" ' . ($plan->cpuemu == "Skylake-Client" ? "selected" : "") . '>(Intel) Skylake-Client</option>
|
||||
<option value="Skylake-Client-IBRS" ' . ($plan->cpuemu == "Skylake-Client-IBRS" ? "selected" : "") . '>(Intel) Skylake-Client-IBRS</option>
|
||||
<option value="Skylake-Client-noTSX-IBRS" ' . ($plan->cpuemu == "Skylake-Client-noTSX-IBRS" ? "selected" : "") . '>(Intel) Skylake-Client-noTSX-IBRS</option>
|
||||
<option value="Skylake-Client-v4" ' . ($plan->cpuemu == "Skylake-Client-v4" ? "selected" : "") . '>(Intel) Skylake-Client V4</option>
|
||||
<option value="Skylake-Server" ' . ($plan->cpuemu == "Skylake-Server" ? "selected" : "") . '>(Intel) Skylake-Server</option>
|
||||
<option value="Skylake-Server-IBRS" ' . ($plan->cpuemu == "Skylake-Server-IBRS" ? "selected" : "") . '>(Intel) Skylake-Server-IBRS</option>
|
||||
<option value="Skylake-Server-noTSX-IBRS" ' . ($plan->cpuemu == "Skylake-Server-noTSX-IBRS" ? "selected" : "") . '>(Intel) Skylake-Server-noTSX-IBRS</option>
|
||||
<option value="Skylake-Server-v4" ' . ($plan->cpuemu == "Skylake-Server-v4" ? "selected" : "") . '>(Intel) Skylake-Server V4</option>
|
||||
<option value="Skylake-Server-v5" ' . ($plan->cpuemu == "Skylake-Server-v5" ? "selected" : "") . '>(Intel) Skylake-Server V5</option>
|
||||
<option value="Westmere" ' . ($plan->cpuemu == "Westmere" ? "selected" : "") . '>(Intel) Westmere</option>
|
||||
<option value="Westmere-IBRS" ' . ($plan->cpuemu == "Westmere-IBRS" ? "selected" : "") . '>(Intel) Westmere-IBRS</option>
|
||||
<option value="pentium" ' . ($plan->cpuemu == "pentium" ? "selected" : "") . '>(Intel) Pentium I</option>
|
||||
@@ -761,13 +799,15 @@ function kvm_plan_edit($id) {
|
||||
<option value="EPYC-IBPB" ' . ($plan->cpuemu == "EPYC-IBPB" ? "selected" : "") . '>(AMD) EPYC-IBPB</option>
|
||||
<option value="EPYC-Milan" ' . ($plan->cpuemu == "EPYC-Milan" ? "selected" : "") . '>(AMD) EPYC-Milan</option>
|
||||
<option value="EPYC-Rome" ' . ($plan->cpuemu == "EPYC-Rome" ? "selected" : "") . '>(AMD) EPYC-Rome</option>
|
||||
<option value="EPYC-Rome-v2" ' . ($plan->cpuemu == "EPYC-Rome-v2" ? "selected" : "") . '>(AMD) EPYC-Rome-v2</option>
|
||||
<option value="EPYC-v3" ' . ($plan->cpuemu == "EPYC-v3" ? "selected" : "") . '>(AMD) EPYC-v3</option>
|
||||
<option value="Opteron_G1" ' . ($plan->cpuemu == "Opteron_G1" ? "selected" : "") . '>(AMD) Opteron_G1</option>
|
||||
<option value="Opteron_G2" ' . ($plan->cpuemu == "Opteron_G2" ? "selected" : "") . '>(AMD) Opteron_G2</option>
|
||||
<option value="Opteron_G3" ' . ($plan->cpuemu == "Opteron_G3" ? "selected" : "") . '>(AMD) Opteron_G3</option>
|
||||
<option value="Opteron_G4" ' . ($plan->cpuemu == "Opteron_G4" ? "selected" : "") . '>(AMD) Opteron_G4</option>
|
||||
<option value="Opteron_G5" ' . ($plan->cpuemu == "Opteron_G5" ? "selected" : "") . '>(AMD) Opteron_G5</option>
|
||||
</select>
|
||||
CPU emulation type. Default is KVM64
|
||||
CPU emulation type. Default is x86-64 psABI v2-AES
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
// FILE: /modules/servers/pvewhmcs/pvewhmcs.php
|
||||
// TASK: Handles the server interactions with PVE
|
||||
// NEED: The PHP API Class to interact w/ Proxmox VE
|
||||
// NEED: The PHP API Class to interact w/ Proxmox VE API
|
||||
// REPO: GitHub.com/The-Network-Crew/Proxmox-VE-for-WHMCS
|
||||
|
||||
if (file_exists('../modules/addons/pvewhmcs/proxmox.php'))
|
||||
@@ -112,6 +112,7 @@ function pvewhmcs_CreateAccount($params) {
|
||||
['vm_settings' => $vm_settings, 'v' => $v]
|
||||
);
|
||||
}
|
||||
// KVM TEMPLATE - Conduct the VM CLONE from Template to Machine
|
||||
$response = $proxmox->post('/nodes/' . $first_node . '/qemu/' . $params['customfields']['KVMTemplate'] . '/clone', $vm_settings);
|
||||
if ($response) {
|
||||
Capsule::table('mod_pvewhmcs_vms')->insert(
|
||||
@@ -125,6 +126,15 @@ function pvewhmcs_CreateAccount($params) {
|
||||
'created' => date("Y-m-d H:i:s"),
|
||||
]
|
||||
);
|
||||
// ISSUE #32 relates - amend post-clone to ensure excludes-disk amendments are all done, too.
|
||||
$cloned_tweaks['memory'] = $plan->memory;
|
||||
$cloned_tweaks['ostype'] = $plan->ostype;
|
||||
$cloned_tweaks['sockets'] = $plan->cpus;
|
||||
$cloned_tweaks['cores'] = $plan->cores;
|
||||
$cloned_tweaks['cpu'] = $plan->cpuemu;
|
||||
$cloned_tweaks['kvm'] = $plan->kvm;
|
||||
$cloned_tweaks['onboot'] = $plan->onboot;
|
||||
$amendment = $proxmox->post('/nodes/' . $first_node . '/qemu/' . $vm_settings['newid'] . '/config'. $cloned_tweaks);
|
||||
return true;
|
||||
} else {
|
||||
if (is_array($response) && isset($response['data']['errors'])) {
|
||||
@@ -139,7 +149,7 @@ function pvewhmcs_CreateAccount($params) {
|
||||
} else {
|
||||
throw new Exception("Proxmox Error: PVE API login failed. Please check your credentials.");
|
||||
}
|
||||
// CREATE IF LXC/CONTAINER
|
||||
// PREPARE SETTINGS FOR QEMU/LXC EVENTUALITIES
|
||||
} else {
|
||||
$vm_settings['vmid'] = $params["serviceid"];
|
||||
if ($plan->vmtype == 'lxc') {
|
||||
@@ -195,6 +205,7 @@ function pvewhmcs_CreateAccount($params) {
|
||||
$vm_settings['cpulimit'] = $plan->cpulimit;
|
||||
$vm_settings['memory'] = $plan->memory;
|
||||
|
||||
// CREATION: Attempt to create the QEMU/LXC instance on Proxmox VE via API
|
||||
try {
|
||||
$proxmox = new PVE2_API($serverip, $serverusername, "pam", $serverpassword);
|
||||
|
||||
@@ -219,6 +230,7 @@ function pvewhmcs_CreateAccount($params) {
|
||||
['vm_settings' => $vm_settings, 'v' => $v]
|
||||
);
|
||||
}
|
||||
// ACTION - Fire the attempt to create
|
||||
$response = $proxmox->post('/nodes/' . $first_node . '/' . $v, $vm_settings);
|
||||
if ($response) {
|
||||
unset($vm_settings);
|
||||
|
||||
Reference in New Issue
Block a user