namespace PS.IPAM.Cmdlets; using System; using System.Collections.Generic; using System.Linq; using System.Management.Automation; using System.Net; using PS.IPAM; using PS.IPAM.Helpers; [Cmdlet(VerbsCommon.Get, "Subnet", DefaultParameterSetName = "NoParams")] [OutputType(typeof(Subnetwork))] public class GetSubnetCmdlet : PSCmdlet { [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "ByCIDR")] [ValidatePattern(@"^\d+\.\d+\.\d+\.\d+/\d{1,2}$")] [ValidateNotNullOrEmpty] public string? CIDR { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "ByID")] [ValidateNotNullOrEmpty] public int? Id { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "BySectionId")] [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 2, ParameterSetName = "ByVlanNumber")] [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 1, ParameterSetName = "ByVlanId")] [ValidateNotNullOrEmpty] public int? SectionId { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "BySectionName")] [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 3, ParameterSetName = "ByVlanNumber")] [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 2, ParameterSetName = "ByVlanId")] [ValidateNotNullOrEmpty] public string? SectionName { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "ByVrfId")] [ValidateNotNullOrEmpty] public int? VrfId { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "ByVlanId")] [ValidateNotNullOrEmpty] public int? VlanId { get; set; } [Parameter( Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 0, ParameterSetName = "ByVlanNumber")] [ValidateNotNullOrEmpty] public int? VlanNumber { get; set; } [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 1, ParameterSetName = "ByID")] public SwitchParameter Slaves { get; set; } [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 2, ParameterSetName = "ByID")] public SwitchParameter Recurse { get; set; } [Parameter( Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, Position = 1, ParameterSetName = "ByVlanNumber")] [ValidateNotNullOrEmpty] public int? VlanDomainId { get; set; } protected override void ProcessRecord() { try { var controller = controllers.subnets; var identifiers = new List(); switch (ParameterSetName) { case "ByCIDR": identifiers.Add("cidr"); identifiers.Add(CIDR!); break; case "ByID": identifiers.Add(Id!.Value.ToString()); if (Slaves.IsPresent) { identifiers.Add(Recurse.IsPresent ? "slaves_recursive" : "slaves"); } break; case "BySectionId": controller = controllers.sections; identifiers.Add(SectionId!.Value.ToString()); identifiers.Add("subnets"); break; case "BySectionName": controller = controllers.sections; var section = RequestHelper.InvokeRequest("GET", controllers.sections, types.Section, null, null, new[] { SectionName! }) .GetAwaiter().GetResult(); if (section == null) { throw new Exception("Cannot find section!"); } var sectionObj = section as Section; identifiers.Add(sectionObj!.Id.ToString()); identifiers.Add("subnets"); break; case "ByVrfId": controller = controllers.vrf; identifiers.Add(VrfId!.Value.ToString()); identifiers.Add("subnets"); break; case "ByVlanId": controller = controllers.vlan; identifiers.Add(VlanId!.Value.ToString()); identifiers.Add("subnets"); if (SectionId.HasValue) { identifiers.Add(SectionId.Value.ToString()); } else if (!string.IsNullOrEmpty(SectionName)) { var section2 = RequestHelper.InvokeRequest("GET", controllers.sections, types.Section, null, null, new[] { SectionName }) .GetAwaiter().GetResult(); if (section2 != null) { var sectionObj2 = section2 as Section; identifiers.Add(sectionObj2!.Id.ToString()); } } break; case "ByVlanNumber": controller = controllers.vlan; var vlans = RequestHelper.InvokeRequest("GET", controllers.vlan, types.Vlan, null, null, new[] { "search", VlanNumber!.Value.ToString() }) .GetAwaiter().GetResult(); if (vlans == null) { throw new Exception("Cannot find Vlan!"); } var vlanList = vlans as System.Collections.IEnumerable; Vlan? foundVlan = null; if (vlanList != null) { foreach (var v in vlanList) { if (v is Vlan vlan) { if (VlanDomainId.HasValue && vlan.DomainId != VlanDomainId.Value) continue; if (foundVlan != null) { throw new Exception($"More than one vLan with {VlanNumber} number is present!"); } foundVlan = vlan; } } } if (foundVlan == null) { throw new Exception("Cannot find Vlan!"); } identifiers.Add(foundVlan.Id.ToString()); identifiers.Add("subnets"); if (SectionId.HasValue) { identifiers.Add(SectionId.Value.ToString()); } else if (!string.IsNullOrEmpty(SectionName)) { var section3 = RequestHelper.InvokeRequest("GET", controllers.sections, types.Section, null, null, new[] { SectionName }) .GetAwaiter().GetResult(); if (section3 != null) { var sectionObj3 = section3 as Section; identifiers.Add(sectionObj3!.Id.ToString()); } } break; } var result = RequestHelper.InvokeRequest("GET", controller, types.Subnetwork, null, null, identifiers.ToArray()) .GetAwaiter().GetResult(); if (result != null) { if (result is System.Collections.IEnumerable enumerable && !(result is string)) { foreach (var item in enumerable) { WriteObject(item); } } else { WriteObject(result); } } } catch (Exception ex) { WriteError(new ErrorRecord(ex, "GetSubnetError", ErrorCategory.InvalidOperation, null)); } } }