using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Threading.Tasks;
public static void Main()
var rfRule = @"{'total':1,'page':0,'pageSize':10,'count':1,'results':[{'ndError':'false','name':'Policy_17','matchId':'76b970aa-cc24-4731-a96b-2f5810b883f4','ruleName':'CM-52','ruleOrder':17,'ruleNumber':17,'disabled':false,'tunnel':false,'log':true,'createDate':'2020-06-25T21:28:46+0000','cumulativeRuleSeverity':0,'lastRuleSeverityComputeDate':'2020-08-10T00:36:54+0000','ruleAction':'ACCEPT','commentText':'ccn:CM-52;own:ao;jst:bz;{CM-52}','policy':{'name':'Policy','matchId':'5e5cc836-a460-4536-a552-61a534aa2769','type':'DUAL'},'sources':[{'ndError':'false','name':'10.5.5.5','matchId':'fc868444-7e16-42a6-a4d7-b1bf43a7a1e0','displayName':'10.5.5.5','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'10.5.5.5/32','objectType':'HOST','isSource':true,'isDestination':false}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'HOST','displayNetworkType':'HOST'},{'ndError':'false','name':'10.5.5.8_30','matchId':'fca76182-fbdd-487b-928c-9357dbf6bef6','displayName':'10.5.5.8_30','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'10.5.5.8/30','objectType':'NETWORK','isSource':true,'isDestination':false}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'NETWORK','displayNetworkType':'NETWORK'},{'ndError':'false','name':'10.5.5.6_31','matchId':'bffc393f-c594-4c8b-b804-eff0d040708d','displayName':'10.5.5.6_31','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'10.5.5.6/31','objectType':'NETWORK','isSource':true,'isDestination':false}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'NETWORK','displayNetworkType':'NETWORK'}],'destinations':[{'ndError':'false','name':'144.9.9.42_31','matchId':'dc12644e-08ad-491c-b8c4-744cbc7f877d','displayName':'144.9.9.42_31','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'144.9.9.42/31','objectType':'NETWORK','isSource':false,'isDestination':true}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'NETWORK','displayNetworkType':'NETWORK'},{'ndError':'false','name':'144.9.9.41','matchId':'83b8e1d3-fabc-4932-ae4c-7f0b6025a7f4','displayName':'144.9.9.41','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'144.9.9.41/32','objectType':'HOST','isSource':false,'isDestination':true}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'HOST','displayNetworkType':'HOST'},{'ndError':'false','name':'144.9.9.44_30','matchId':'076498ac-2e5f-4d6b-8732-21b188bf78bd','displayName':'144.9.9.44_30','type':'SINGLE','members':[],'addresses':[{'type':'IPV4','address':'144.9.9.44/30','objectType':'NETWORK','isSource':false,'isDestination':true}],'ipStackType':'DUAL','gpcManaged':false,'networkType':'NETWORK','displayNetworkType':'NETWORK'}],'services':[{'ndError':'false','name':'tcp_22','matchId':'f828edc2-5431-4b2d-9f52-cb8d287437e1','type':'SINGLE','members':[],'services':[{'type':'TCP','protocol':6,'startPort':22,'endPort':22,'formattedValue':'tcp/22'}],'gpcManaged':false},{'ndError':'false','name':'tcp_81-83','matchId':'b340d07b-3721-4c60-89e7-5146b1001b22','type':'SINGLE','members':[],'services':[{'type':'TCP','protocol':6,'startPort':81,'endPort':83,'formattedValue':'tcp/81-83'}],'gpcManaged':false}],'users':[{'ndError':'false','name':'Any','matchId':'9eb3c067-7a98-4219-8bfb-6cca530b863b','type':'ANY','members':[],'admin':false}],'apps':[{'ndError':'false','name':'Any','matchId':'cb524242-4797-423f-b354-6a94d7f8371f','type':'ANY','members':[]}],'profiles':[],'schedules':[],'srcContext':{'zones':[{'ndError':'false','name':'Lab-untrust','matchId':'73695f95-3d22-4449-8b92-04018d1a23b0','type':'SINGLE','members':[],'interfaces':[{'name':'ethernet1/5','inactive':false,'secondaryAddresses':[]}]}]},'dstContext':{'zones':[{'ndError':'false','name':'Zone144','matchId':'a63cff81-b78f-460c-8d16-c96bffa8b03a','type':'SINGLE','members':[],'interfaces':[{'name':'ethernet1/10.144','inactive':false,'secondaryAddresses':[]}]}]},'srcNegated':false,'dstNegated':false,'svcNegated':false,'userNegated':false,'appNegated':false,'system':false,'complexity':18,'redundant':false,'shadowed':false,'ndProblem':false,'ruleGroup':'Orlando Testbed-LAB vsys1 main_Pre Rules','ruleGroupProtected':false,'gpcManaged':false,'accessRuleIds':[]}]}";
var rrecj = @"{'device':{'id':38,'name':'orl-pmgm-test-fw1-admin','description':'Discovered by Panorama - 192.91.161.69','managementIp':'192.168.90.49','children':[],'syslogMatchName':'001801025468','securityConcernIndex':2.68,'gpcDirtyDate':'2020-01-23T14:44:24-06:00','gpcComputeDate':'1969-12-31T18:00:00-06:00','gpcImplementDate':'1969-12-31T18:00:00-06:00','state':'ACTIVE','managedType':'MANAGED','gpcStatus':'NOT_IMPORTED'},'impact':'IMPACTED_WITH_CHANGE','recs':[{'action':'CREATE','location':'ABOVE','source':'APA','policy':{'name':'Policy','matchId':'5e5cc836-a460-4536-a552-61a534aa2769','type':'DUAL'},'refRulesMatchIds':['d9bf647a-50d0-49a4-adb2-f637009a061e'],'recRule':{'sources':['10.5.5.16/29','10.5.15.13','158.185.69.106'],'potentialSourceObjects':{'158.185.69.106':{'total':1,'query':'device {id = 38} and networkobj {addressspace equals 158.185.69.106 and derived = false}','objects':[{'ndError':'false','name':'host-158.185.69.106','matchId':'949ae2ff-e0eb-4072-be67-d673cc93d7e6','displayName':'host-158.185.69.106','type':'SINGLE','members':[],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL','addresses':[{'type':'IPV4','address':'158.185.69.106/32','objectType':'HOST'}],'derived':false,'system':false,'empty':false,'referenced':true,'addressCount':1,'duplicate':false,'ipStackType':'DUAL','gpcManaged':false,'networkType':'HOST','displayNetworkType':'HOST'}]}},'destinations':['144.9.9.18','144.9.9.53','144.9.9.57'],'potentialDestinationObjects':{'144.9.9.18':{'total':1,'query':'device {id = 38} and networkobj {addressspace equals 144.9.9.18 and derived = false}','objects':[{'ndError':'false','name':'host-144.9.9.18','matchId':'53b3b910-8876-4b61-afb0-99d0c34cf571','displayName':'host-144.9.9.18','type':'SINGLE','members':[],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL','parents':[{'matchId':'8d556493-a292-43a4-9b50-bea35a5056a4','name':'test-group','type':'GROUP'},{'matchId':'90dbf65a-8e3d-4662-822f-291a1473218c','name':'Group149','type':'GROUP'}],'addresses':[{'type':'IPV4','address':'144.9.9.18/32','objectType':'HOST'}],'derived':false,'system':false,'empty':false,'referenced':true,'addressCount':1,'duplicate':false,'ipStackType':'DUAL','gpcManaged':false,'networkType':'HOST','displayNetworkType':'HOST'}]}},'services':['icmp/8,0','tcp/22','tcp/87-91','tcp/4783','udp/1300-1350','51/0-65535'],'potentialServiceObjects':{'tcp/22':{'total':1,'query':'device {id = 38} and serviceobj {service equals tcp/22 and derived = false}','objects':[{'ndError':'false','name':'tcp_22','matchId':'f828edc2-5431-4b2d-9f52-cb8d287437e1','type':'SINGLE','members':[],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL','services':[{'type':'TCP','protocol':6,'startPort':22,'endPort':22,'formattedValue':'tcp/22'}],'derived':false,'system':false,'dstPortCount':1,'duplicate':false,'gpcManaged':false,'empty':false,'referenced':true}]}},'users':['Any'],'potentialUserObjects':{'Any':{'total':1,'query':'device {id = 38} and userobj {type = ANY}','objects':[{'ndError':'false','name':'Any','matchId':'9eb3c067-7a98-4219-8bfb-6cca530b863b','type':'ANY','members':[],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL','admin':false,'derived':false,'system':false,'exObjCount':1}]}},'applications':['Any'],'potentialApplicationObjects':{'Any':{'total':1,'query':'device {id = 38} and appobj {type = ANY}','objects':[{'ndError':'false','name':'Any','matchId':'cb524242-4797-423f-b354-6a94d7f8371f','type':'ANY','members':[],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL','exObjCount':1,'system':true}]}},'accept':true,'srcZone':'Lab-untrust','potentialSourceZoneObjects':{'Lab-untrust':{'total':1,'objects':[{'name':'Lab-untrust','matchId':'73695f95-3d22-4449-8b92-04018d1a23b0','type':'SINGLE','interfaces':[{'name':'ethernet1/5','primaryAddress':{'type':'IPV4','address':'192.168.90.52/24','objectType':'NETWORK'},'inactive':false,'secondaryAddresses':[]}],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL'}]}},'dstZone':'Zone144','potentialDestinationZoneObjects':{'Zone144':{'total':1,'objects':[{'name':'Zone144','matchId':'a63cff81-b78f-460c-8d16-c96bffa8b03a','type':'SINGLE','interfaces':[{'name':'ethernet1/10.144','primaryAddress':{'type':'IPV4','address':'144.9.9.1/28','objectType':'NETWORK'},'inactive':false,'secondaryAddresses':[]}],'deviceid':38,'deviceName':'orl-pmgm-test-fw1-admin','deviceType':'FIREWALL'}]}}},'message':'Recommend creating a rule above the referenced rule because it completely matches the requested access but with a different action','modifiedColumn':'NONE'}]}";
var rrec = JObject.Parse(rrecj);
var rcps = CreateRuleChgParams(38, rrec, rfRule);
public static JObject CreateRuleChgParams(int deviceId, JObject ruleRec, string rfRule)
dynamic refRule = JObject.Parse(rfRule);
dynamic ruleRef = JsonConvert.DeserializeObject<refRule>(JsonConvert.SerializeObject(refRule["results"][0]));
var sources = JArray.FromObject(ruleRef.sources);
var destinations = JArray.FromObject(ruleRef.destinations);
var services = JArray.FromObject(ruleRef.services);
var users = JArray.FromObject(ruleRef.users);
var apps = JArray.FromObject(ruleRef.apps);
var sourceZones = JArray.FromObject(ruleRef.srcContext.zones);
var destZones = JArray.FromObject(ruleRef.dstContext.zones);
JObject ruleChangeParams = new JObject(
new JProperty("changes", new JArray(
new JProperty("changeType", "RULE"),
new JProperty("deviceId", deviceId),
new JProperty("deviceType", "FIREWALL"),
new JProperty("implementationStatus", "PENDING"),
new JProperty("action", ruleRec["action"]),
new JProperty("location", ruleRec["location"]),
new JProperty("referencedRules", new JArray(new JObject(
new JProperty("sources", new JArray(sources)),
new JProperty("destinations", new JArray(destinations)),
new JProperty("services", new JArray(services)),
new JProperty("users", new JArray(users)),
new JProperty("apps", new JArray(apps)),
new JProperty("sourceZones", new JArray(sourceZones)),
new JProperty("destinationZones", new JArray(destZones)),
new JProperty("ruleUUID", ruleRec["refRulesMatchIds"][0]),
new JProperty("ruleName", refRule["results"][0]["ruleName"]),
new JProperty("ruleNumberStr", refRule["results"][0]["ruleNumber"]),
new JProperty("ruleNumber", refRule["results"][0]["ruleNumber"]),
new JProperty("ruleAction", refRule["results"][0]["ruleAction"]),
new JProperty("log", refRule["results"][0]["log"])))),
new JProperty("summary", (string)ruleRec["action"]+(string)ruleRec["location"]),
new JProperty("requirementType", "RULE"),
new JProperty("testedRule", new JObject(
new JProperty("apps", new JArray()),
new JProperty("destinations", new JArray()),
new JProperty("services", new JArray()),
new JProperty("sources", new JArray()),
new JProperty("users", new JArray()),
new JProperty("destinationZones", new JArray()),
new JProperty("sourceZones", new JArray()),
new JProperty("ruleAction", ""),
new JProperty("log", ""),
new JProperty("commentText", "")))
Console.WriteLine(ruleChangeParams.ToString());
#region Change Plan Reference Rule Deserialization classes
public string name { get; set; }
public string name { get; set; }
public string name { get; set; }
public string name { get; set; }
public string name { get; set; }
public string name { get; set; }
public List<Zone> zones { get; set; }
public List<Zone> zones { get; set; }
public List<Source> sources { get; set; }
public List<Destination> destinations { get; set; }
public List<Service> services { get; set; }
public List<User> users { get; set; }
public List<App> apps { get; set; }
public SrcContext srcContext { get; set; }
public DstContext dstContext { get; set; }