@@ -29,61 +29,70 @@ def get_linked_objects(_target, target_api):
2929
3030def to_d42 (source , mapping , _target , _resource , target_api , resource_api ):
3131 key = mapping .attrib ['key' ]
32- for row in source ['result' ]:
33- data = {}
34- fields = mapping .findall ('field' )
35- sys_id = row ['sys_id' ]
36- stored_device42_id = row ['u_device42_id' ] if len (row ['u_device42_id' ]) > 0 else None
37- for field in fields :
38- if field .attrib ['resource' ] not in row or row [field .attrib ['resource' ]] is None :
39- continue
40-
41- if field .attrib ['resource' ] == 'name' :
42- data [field .attrib ['target' ]] = typer (field .attrib ['type' ],
43- row [field .attrib ['resource' ]]) + ' copied from ServiceNow'
44-
45- elif 'sub_field' in field .attrib :
46- sub_link = re .search (r'.service-now.com(.+)' , row [field .attrib ['resource' ]]['link' ])
47- sub_link = sub_link .group (1 )
48- sub_field_objects = resource_api .request (sub_link , 'GET' )['result' ]
49- data [field .attrib ['target' ]] = typer (field .attrib ['type' ], sub_field_objects [field .attrib ['sub_field' ]])
50-
51- if 'sub_field2' in field .attrib :
52- sub_link2 = re .search (r'.service-now.com(.+)' , sub_field_objects [field .attrib ['sub_field' ]]['link' ])
53- sub_link2 = sub_link2 .group (1 )
54- sub_field2_objects = resource_api .request (sub_link2 , 'GET' )['result' ]
55- data [field .attrib ['target' ]] = \
56- typer (field .attrib ['type' ], sub_field2_objects [field .attrib ['sub_field2' ]])
32+ try :
33+ for row in source ['result' ]:
34+ data = {}
35+ fields = mapping .findall ('field' )
36+ sys_id = row ['sys_id' ]
37+
38+ try :
39+ stored_device42_id = row ['u_device42_id' ] if len (row ['u_device42_id' ]) > 0 else None
40+ except KeyError :
41+ stored_device42_id = None
5742
43+ for field in fields :
44+ if field .attrib ['resource' ] not in row or row [field .attrib ['resource' ]] is None :
45+ continue
46+
47+ if field .attrib ['resource' ] == 'name' :
48+ data [field .attrib ['target' ]] = typer (field .attrib ['type' ],
49+ row [field .attrib ['resource' ]]) + ' copied from ServiceNow'
50+
51+ # D42
52+ elif 'sub_field' in field .attrib and 'link' in row [field .attrib ['resource' ]]:
53+ sub_link = re .search (r'.service-now.com(.+)' , row [field .attrib ['resource' ]]['link' ])
54+ sub_link = sub_link .group (1 )
55+ sub_field_objects = resource_api .request (sub_link , 'GET' )['result' ]
56+ data [field .attrib ['target' ]] = typer (field .attrib ['type' ], sub_field_objects [field .attrib ['sub_field' ]])
57+
58+ if 'sub_field2' in field .attrib and 'link' in sub_field_objects [field .attrib ['sub_field' ]]:
59+ sub_link2 = re .search (r'.service-now.com(.+)' , sub_field_objects [field .attrib ['sub_field' ]]['link' ])
60+ sub_link2 = sub_link2 .group (1 )
61+ sub_field2_objects = resource_api .request (sub_link2 , 'GET' )['result' ]
62+ data [field .attrib ['target' ]] = \
63+ typer (field .attrib ['type' ], sub_field2_objects [field .attrib ['sub_field2' ]])
64+
65+ else :
66+ data [field .attrib ['target' ]] = typer (field .attrib ['type' ], row [field .attrib ['resource' ]])
67+
68+ # update or create new
69+ if stored_device42_id is not None :
70+ data [key ] = stored_device42_id
71+ old_name = data ['name' ]
72+ data .pop ('name' , None )
73+ api_result = target_api .request (_target .attrib ['path' ], _target .attrib ['update_method' ], data )
74+
75+ if int (api_result ['code' ]) == 3 :
76+ # resend if device removed
77+ stored_device42_id = None
78+ data ['name' ] = old_name
79+ api_result = target_api .request (_target .attrib ['path' ], _target .attrib ['method' ], data )
5880 else :
59- data [field .attrib ['target' ]] = typer (field .attrib ['type' ], row [field .attrib ['resource' ]])
60-
61- # update or create new
62- if stored_device42_id is not None :
63- data [key ] = stored_device42_id
64- old_name = data ['name' ]
65- data .pop ('name' , None )
66- api_result = target_api .request (_target .attrib ['path' ], _target .attrib ['update_method' ], data )
67-
68- if int (api_result ['code' ]) == 3 :
69- # resend if device removed
70- stored_device42_id = None
71- data ['name' ] = old_name
7281 api_result = target_api .request (_target .attrib ['path' ], _target .attrib ['method' ], data )
73- else :
74- api_result = target_api .request (_target .attrib ['path' ], _target .attrib ['method' ], data )
7582
76- if DEBUG :
77- print data
78- print api_result
83+ if DEBUG :
84+ print data
85+ print api_result
7986
80- # update stored device in ServiceNow
81- if stored_device42_id is None :
82- resource_api .request (_resource .attrib ['path' ] + '/' + sys_id , 'PATCH' , {
83- 'u_device42_id' : api_result ['msg' ][1 ]
84- })
87+ # update stored device in ServiceNow
88+ if stored_device42_id is None :
89+ resource_api .request (_resource .attrib ['path' ] + '/' + sys_id , 'PATCH' , {
90+ 'u_device42_id' : api_result ['msg' ][1 ]
91+ })
8592
86- print '.'
93+ print '.'
94+ except KeyError :
95+ print ('[Warning] No Data in Resource, Continuing' )
8796
8897
8998def from_d42 (source , mapping , _target , _resource , target_api , resource_api ):
@@ -112,19 +121,19 @@ def from_d42(source, mapping, _target, _resource, target_api, resource_api):
112121 row [field .attrib ['resource' ]]) + ' copied from Device42'
113122
114123 elif field .attrib ['resource' ] == 'mac_addresses' :
115- row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
124+ row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
116125 if len (row [field .attrib ['resource' ]]) > 0 :
117126 data [field .attrib ['target' ]] = \
118127 typer (field .attrib ['type' ], row [field .attrib ['resource' ]][int (field .attrib ['element' ])]['mac' ])
119128
120129 elif field .attrib ['resource' ] == 'ip_addresses' :
121- row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
130+ row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
122131 if len (row [field .attrib ['resource' ]]) > 0 :
123132 data [field .attrib ['target' ]] = \
124133 typer (field .attrib ['type' ], row [field .attrib ['resource' ]][int (field .attrib ['element' ])]['ip' ])
125134
126135 elif field .attrib ['resource' ] == 'custom_fields' :
127- row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
136+ row [field .attrib ['resource' ]] = [x for x in row [field .attrib ['resource' ]] if x is not None ]
128137 if len (row [field .attrib ['resource' ]]) > 0 :
129138 for x in row [field .attrib ['resource' ]]:
130139 if x ['key' ] == str (field .attrib ['key' ]):
0 commit comments