feat: add LXC container support to Proxmox extension
- Add is_lxc boolean column to ext_proxmox_nodes (default false, existing nodes unaffected) - Add LXC checkbox to admin node creation form (disabled on edit) - Dynamic API path selection via Node::vmType() (returns 'lxc' or 'qemu') - LXC deployment: syncLxcSettings() for cores, memory, swap, hostname, rootfs, net config - LXC network uses name=eth0 format with applyLxcPoolSettings() for VLAN/firewall/MTU - All lifecycle operations LXC-aware: install, suspend, unsuspend, terminate, upgrade, reinstall - VNC/xterm console uses correct type (lxc vs kvm) - All 20+ Livewire components use vmType() for Proxmox API paths - LXC user interface shows basic-only view (no advanced toggle, no KVM-specific tabs) - Basic tabs for LXC: Overview, Network Configuration, Backups, Console
This commit is contained in:
@@ -363,7 +363,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/config'
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/config'
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -456,7 +456,7 @@ class Firewall extends Component
|
||||
|
||||
// Send the full modified configuration back to Proxmox
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/config',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/config',
|
||||
'put',
|
||||
[$adapter => $newConfigString]
|
||||
);
|
||||
@@ -483,7 +483,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/options'
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/options'
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -506,7 +506,7 @@ class Firewall extends Component
|
||||
|
||||
// Always force DHCP disabled and NDP enabled
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/options',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/options',
|
||||
'put',
|
||||
[
|
||||
'enable' => $newState ? 1 : 0,
|
||||
@@ -551,7 +551,7 @@ class Firewall extends Component
|
||||
}
|
||||
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/options',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/options',
|
||||
'put',
|
||||
[
|
||||
'policy_in' => $this->policyIn,
|
||||
@@ -608,7 +608,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules'
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules'
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -731,13 +731,13 @@ class Firewall extends Component
|
||||
if ($this->editingRuleIndex !== null && isset($this->rules[$this->editingRuleIndex])) {
|
||||
$pos = $this->rules[$this->editingRuleIndex]['pos'];
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'put',
|
||||
$payload
|
||||
);
|
||||
} else {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules',
|
||||
'post',
|
||||
$payload
|
||||
);
|
||||
@@ -777,7 +777,7 @@ class Firewall extends Component
|
||||
$newEnable = $currentEnable == 0 ? 1 : 0;
|
||||
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'put',
|
||||
['enable' => $newEnable]
|
||||
);
|
||||
@@ -818,7 +818,7 @@ class Firewall extends Component
|
||||
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||
'delete'
|
||||
);
|
||||
|
||||
@@ -848,7 +848,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $fromPos,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules/' . $fromPos,
|
||||
'put',
|
||||
['moveto' => $toPos]
|
||||
);
|
||||
@@ -895,7 +895,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/aliases'
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/aliases'
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -953,13 +953,13 @@ class Firewall extends Component
|
||||
return;
|
||||
}
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/aliases/' . $this->editingAliasName,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/aliases/' . $this->editingAliasName,
|
||||
'put',
|
||||
$payload
|
||||
);
|
||||
} else {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/aliases',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/aliases',
|
||||
'post',
|
||||
$payload
|
||||
);
|
||||
@@ -1010,7 +1010,7 @@ class Firewall extends Component
|
||||
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/aliases/' . $this->deletingAliasName,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/aliases/' . $this->deletingAliasName,
|
||||
'delete'
|
||||
);
|
||||
|
||||
@@ -1056,7 +1056,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset'
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset'
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -1092,7 +1092,7 @@ class Firewall extends Component
|
||||
}
|
||||
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset',
|
||||
'post',
|
||||
$payload
|
||||
);
|
||||
@@ -1141,7 +1141,7 @@ class Firewall extends Component
|
||||
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset/' . $this->deletingIPSetName,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset/' . $this->deletingIPSetName,
|
||||
'delete'
|
||||
);
|
||||
|
||||
@@ -1205,7 +1205,7 @@ class Firewall extends Component
|
||||
{
|
||||
try {
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset/' . $name
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset/' . $name
|
||||
);
|
||||
|
||||
if ($response->successful()) {
|
||||
@@ -1256,7 +1256,7 @@ class Firewall extends Component
|
||||
return;
|
||||
}
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset/' . $this->selectedIPSetName,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset/' . $this->selectedIPSetName,
|
||||
'post',
|
||||
$payload
|
||||
);
|
||||
@@ -1309,7 +1309,7 @@ class Firewall extends Component
|
||||
$encodedCidr = urlencode($this->deletingMemberCidr);
|
||||
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/ipset/' . $this->selectedIPSetName . '/' . $encodedCidr,
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/ipset/' . $this->selectedIPSetName . '/' . $encodedCidr,
|
||||
'delete'
|
||||
);
|
||||
|
||||
@@ -1353,7 +1353,7 @@ class Firewall extends Component
|
||||
// Proxmox returns logs with newest first when using start=0
|
||||
// Fetch a larger batch to ensure we get the most recent logs
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/log',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/log',
|
||||
'get',
|
||||
[
|
||||
'limit' => 5000, // Fetch more logs to get the recent ones
|
||||
@@ -2180,7 +2180,7 @@ class Firewall extends Component
|
||||
$this->policyOut = $config->outgoing_policy;
|
||||
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/options',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/options',
|
||||
'put',
|
||||
[
|
||||
'policy_in' => $this->policyIn,
|
||||
@@ -2198,7 +2198,7 @@ class Firewall extends Component
|
||||
foreach (array_reverse($this->rules) as $rule) {
|
||||
if (isset($rule['pos'])) {
|
||||
$this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $rule['pos'],
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules/' . $rule['pos'],
|
||||
'delete'
|
||||
);
|
||||
}
|
||||
@@ -2267,7 +2267,7 @@ class Firewall extends Component
|
||||
|
||||
// Create the rule
|
||||
$this->firewallRequest(
|
||||
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules',
|
||||
'/nodes/' . $this->server->node->name . '/' . $this->server->node->vmType() . '/' . $this->server->vm_id . '/firewall/rules',
|
||||
'post',
|
||||
$rulePayload
|
||||
);
|
||||
@@ -2695,10 +2695,11 @@ class Firewall extends Component
|
||||
$savedRules = $config['firewall_rules'] ?? [];
|
||||
$incomingPolicy = $config['incoming_policy'] ?? 'DROP';
|
||||
$outgoingPolicy = $config['outgoing_policy'] ?? 'ACCEPT';
|
||||
$vmType = $server->node->vmType();
|
||||
|
||||
// Step 1: Update policies
|
||||
$response = $this->firewallRequest(
|
||||
'/nodes/' . $server->node->name . '/qemu/' . $server->vm_id . '/firewall/options',
|
||||
'/nodes/' . $server->node->name . '/' . $vmType . '/' . $server->vm_id . '/firewall/options',
|
||||
'put',
|
||||
[
|
||||
'policy_in' => $incomingPolicy,
|
||||
@@ -2714,7 +2715,7 @@ class Firewall extends Component
|
||||
|
||||
// Step 2: Get existing rules and delete them
|
||||
$existingRulesResponse = $this->firewallRequest(
|
||||
'/nodes/' . $server->node->name . '/qemu/' . $server->vm_id . '/firewall/rules'
|
||||
'/nodes/' . $server->node->name . '/' . $vmType . '/' . $server->vm_id . '/firewall/rules'
|
||||
);
|
||||
|
||||
if ($existingRulesResponse->successful()) {
|
||||
@@ -2722,7 +2723,7 @@ class Firewall extends Component
|
||||
foreach (array_reverse($existingRules) as $rule) {
|
||||
if (isset($rule['pos'])) {
|
||||
$this->firewallRequest(
|
||||
'/nodes/' . $server->node->name . '/qemu/' . $server->vm_id . '/firewall/rules/' . $rule['pos'],
|
||||
'/nodes/' . $server->node->name . '/' . $vmType . '/' . $server->vm_id . '/firewall/rules/' . $rule['pos'],
|
||||
'delete'
|
||||
);
|
||||
}
|
||||
@@ -2749,7 +2750,7 @@ class Firewall extends Component
|
||||
// Skip iface as it may not exist on other servers
|
||||
|
||||
$this->firewallRequest(
|
||||
'/nodes/' . $server->node->name . '/qemu/' . $server->vm_id . '/firewall/rules',
|
||||
'/nodes/' . $server->node->name . '/' . $vmType . '/' . $server->vm_id . '/firewall/rules',
|
||||
'post',
|
||||
$rulePayload
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user