";
204 | echo "";
205 | echo "".$device['Computer_Name']." | ";
206 | if($device['LoanerAvailability'] == "No"){
207 | echo "".$device['Username']." | ";
208 | echo "".$device['DateCheckedOut']." | ";
209 | echo " | ";
210 | echo "";
211 |
212 | echo " | ";
213 | echo "";
214 | } else if ($device['LoanerAvailability'] == "Yes"){
215 | echo " | ";
216 |
217 | echo " | ";
218 | echo "".$device['DateCheckedIn']." | ";
219 |
220 | echo "";
221 | echo " | ";
222 | echo "";
223 | }
224 |
225 | }
226 |
227 | ?>
228 |
229 |
230 |
231 |
232 |
--------------------------------------------------------------------------------
/non-admin-set-date-and-time.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | pashuapath="/usr/local/saes/Pashua.app/Contents/MacOS/Pashua"
4 |
5 |
6 | pashua_run() {
7 |
8 | # Write config file
9 | local pashua_configfile=`/usr/bin/mktemp /tmp/pashua_XXXXXXXXX`
10 | echo "$1" > "$pashua_configfile"
11 |
12 | if [ "" = "$pashuapath" ]
13 | then
14 | >&2 echo "Error: Pashua could not be found"
15 | exit 1
16 | fi
17 |
18 | # Get result
19 | local result=$("$pashuapath" "$pashua_configfile")
20 |
21 | # Remove config file
22 | rm "$pashua_configfile"
23 |
24 | oldIFS="$IFS"
25 | IFS=$'\n'
26 |
27 | # Parse result
28 | for line in $result
29 | do
30 | local name=$(echo $line | sed 's/^\([^=]*\)=.*$/\1/')
31 | local value=$(echo $line | sed 's/^[^=]*=\(.*\)$/\1/')
32 | eval $name='$value'
33 | done
34 |
35 | IFS="$oldIFS"
36 | }
37 |
38 | REFERENCEDATE=$(date -r /System/Library/CoreServices/XProtect.bundle +%Y%m%d)
39 | CURRENTSYSTEMDATE=$(date +%Y%m%d)
40 |
41 | if [ "$CURRENTSYSTEMDATE" -ge "$REFERENCEDATE" ]; then
42 | exit 0
43 | else
44 | echo "Going into one-time clock set..."
45 |
46 | conf="
47 | # Set window title
48 | *.title = Date and Time
49 | *.floating = 1
50 |
51 | img.type = image
52 | img.x = 0
53 | img.y = 125
54 | img.maxwidth = 50
55 | img.maxheight = 50
56 | img.path = /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/AlertNoteIcon.icns
57 |
58 | # Message
59 | txt.type = text
60 | txt.default = Your current date and time is incorrect. This will result in problems connecting to the network.
61 | txt.width = 200
62 | txt.x = 60
63 | txt.y = 110
64 |
65 | # Date and time picker
66 | d.type = date
67 | d.label = Please set the Date and Time
68 | d.textual = 1
69 | d.date = 1
70 | d.time = 1
71 | "
72 | pashua_run "$conf" "$customLocation"
73 |
74 | newmonth=$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $2 }')
75 | newday=$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $3 }')
76 | newyear=$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $1 }' | cut -c 3-)
77 | UserSetDate="$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $2 }'):$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $3 }'):$(echo $d | awk '{ print $1 }' | awk -F "-" '{ print $1 }' | cut -c 3-)"
78 | UserSetClock=$(echo $d | awk '{ print $2 }')
79 |
80 | systemsetup -setusingnetworktime off
81 | systemsetup -setdate $UserSetDate
82 | systemsetup -settime $UserSetClock
83 | shutdown -r NOW
84 | fi
85 |
--------------------------------------------------------------------------------
/pivenforcement.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | #Create an extension attribute
4 | #Create a smart group based off of that extension attribute
5 | #Scope policies or configuration profiles to that smart group.
6 | #Now you have an easy way to toggle that setting on/off for a computer without digging through the JSS
7 |
8 | import urllib2
9 | import base64
10 | import json
11 | import sys
12 | import ssl
13 | import getpass
14 | import os
15 | import subprocess
16 |
17 | #Delete keychain entry
18 | def delete_keychain():
19 | FNULL = open(os.devnull, 'w')
20 | delete_keychain_command ="security delete-generic-password -s piv-enforce"
21 | delete_keychain = subprocess.call(delete_keychain_command,stdout=FNULL, stderr=subprocess.STDOUT, shell=True)
22 | if delete_keychain == 0:
23 | print "Keychain entry deleted successfully"
24 | else:
25 | print "Keychain entry not found"
26 |
27 | #Login function
28 | def login():
29 | #check if the keychain entry is there and use it if it is
30 | keychaincheck_command = "security find-generic-password -s piv-enforce -w"
31 | FNULL = open(os.devnull, 'w')
32 | keychain_entry = subprocess.call(keychaincheck_command,stdout=FNULL, stderr=subprocess.STDOUT, shell=True)
33 | if keychain_entry == 0:
34 | usercommand = "security find-generic-password -s piv-enforce | grep \"acct\" | awk -F \"=\" '{print $2}' | tr -d '\"'"
35 | jssuser = subprocess.check_output(usercommand,stderr=subprocess.STDOUT,shell=True)[:-1]
36 | passcommand = "security find-generic-password -s piv-enforce -w"
37 | jsspass = subprocess.check_output(passcommand,stderr=subprocess.STDOUT,shell=True)[:-1]
38 |
39 | #otherwise use the prompt
40 | else:
41 | jssuser = raw_input("Enter Your JSS Account:")
42 | jsspass = getpass.getpass("Password: ")
43 | while True:
44 | save_to_keychain = raw_input("Save to Keychain? (Y/N)")
45 | if save_to_keychain.lower() == "y":
46 | keychain_entry = "security add-generic-password -U -a " + jssuser + " -s piv-enforce -p '" + jsspass + "'"
47 | keychain_entry_command = subprocess.call(keychain_entry,stdout=FNULL,stderr=subprocess.STDOUT,shell=True)
48 | break
49 | elif save_to_keychain.lower() == "n":
50 | break
51 |
52 | return {'user':jssuser, 'pass':jsspass}
53 |
54 | #Function to build the Jamf Pro Classic API URL Request
55 | def jssapi(arg, item):
56 | #if enrolled, use the current jamf server or set the server below
57 | #example jamfproserver = "https://YOURJAMFPROSERVER:8443/"
58 | #if set to nothing, and it finds the jamf.plist then use the enrolled server
59 | jamfproserver = "" #<---- If you want to hardcode the jamfpro url
60 | pref_path = "/Library/Preferences/com.jamfsoftware.jamf.plist"
61 |
62 | if os.path.exists(pref_path) is True and jamfproserver == "":
63 | command = "defaults read " + pref_path + " jss_url"
64 | jamfproserver = subprocess.check_output(command,stderr=subprocess.STDOUT,shell=True)[:-1]
65 | elif os.path.exists(pref_path) is False and jamfproserver =="":
66 | print "No JamfPro server set. Please set one."
67 | quit()
68 |
69 | if arg == "-u":
70 | jamfproserver = jamfproserver + "JSSResource/users/name/" + item
71 | return jamfproserver
72 | elif arg == "-c":
73 | jamfproserver = jamfproserver + "JSSResource/computers/name/" + item
74 | return jamfproserver
75 |
76 | #If you are enabling or disabling function
77 | def PIVAction(url, action, credentials="MISSING"):
78 | if credentials == "MISSING":
79 | credentials = login()
80 |
81 | #makes sure everything is the same case
82 | action = action.lower()
83 | action = action.capitalize()
84 | #script is nice and fixes your mistake
85 | if action == "Enable" or action == "Disable":
86 | action = action + "d"
87 |
88 | if action == "Enabled" or action == "Disabled":
89 | ###########################################################
90 | #Extension Attribute ID and Name WILL need to be changed #
91 | #Set EA_ID and EA_name #
92 | ###########################################################
93 | EA_ID = "497" #<------Here, extension attribute ID!
94 | EA_name = ".PIV Enforced" #<----Here, extension attribute name!
95 | ####################################
96 | xmldata = "" + EA_ID + "" + EA_name + "String" + action + ""
97 |
98 | try:
99 | opener = urllib2.build_opener(urllib2.HTTPSHandler)
100 | request = urllib2.Request(url, data=xmldata)
101 |
102 | request.add_header('content-type', 'application/xml')
103 | request.add_header('Authorization', 'Basic ' + base64.b64encode(credentials['user'] + ':' + credentials['pass']))
104 | request.get_method = lambda: 'PUT'
105 |
106 | response = opener.open(request)
107 | if response.getcode() != "200":
108 | computer = url.split("/", 6)
109 | print "PIV Enforcement has been " + action + " for computer " + computer[6]
110 | else:
111 | print "Something went wrong"
112 |
113 | except urllib2.URLError, error:
114 | #ERROR Checking, returns HTTP Error Codes
115 | print "Something went wrong.\n", error
116 | return error.code
117 |
118 | else:
119 | print action + " is not an appropriate action."
120 |
121 |
122 | #if you enter the user it will display the computers assigned to that user
123 | def computerlist(requestURL, credentials="MISSING"):
124 | if credentials == "MISSING":
125 | credentials = login()
126 | try:
127 | request = urllib2.Request(requestURL)
128 | request.add_header('Accept', 'application/json')
129 | request.add_header('Authorization', 'Basic ' + base64.b64encode(credentials['user'] + ':' + credentials['pass']))
130 | response = urllib2.urlopen(request)
131 |
132 | if response.getcode() != "200":
133 | response_data = json.loads(response.read())
134 | print "-----------------------------------------------"
135 | print "|\tFull Name: " + response_data['user']['full_name']
136 | print "|\tEmail: " + response_data['user']['email_address']
137 | print "|\tPhone Number: " + response_data['user']['phone_number']
138 | print "-----------------------------------------------"
139 | computers = response_data['user']['links']['computers']
140 | for computer in computers:
141 | print "|\tComputer: " + computer['name']
142 | print "-----------------------------------------------"
143 | return response.getcode()
144 | except urllib2.URLError, error:
145 | #ERROR Checking, returns HTTP Error Codes
146 | print "Something went wrong.\n", error
147 | return error.code
148 |
149 | #Main Function
150 | def main():
151 | if len(sys.argv) > 1:
152 | options = sys.argv[1]
153 | if options == "-h":
154 | print " -h \t\t\t\t\t List help"
155 | print " -u [Username]\t\t\t List the computers assigned to the user"
156 | print " -c [Computer] [enabled/disabled]\t Computer to enable/disable Forced PIV"
157 | print " -d \t\t\t\t\t Delete keychain entry"
158 | elif options == "-d":
159 | delete_keychain()
160 | elif options == "-u":
161 | if len(sys.argv) > 2:
162 | url = jssapi(options, sys.argv[2])
163 | computerlist(url)
164 | else:
165 | print "----------------------------"
166 | print "*** No username inputted ***"
167 | print "----------------------------"
168 | elif options == "-c":
169 | if len(sys.argv) > 3:
170 | PIVAction(jssapi(options, sys.argv[2]), sys.argv[3])
171 | else:
172 | print "------------------------------"
173 | print "*** Missing item or action ***"
174 | print "------------------------------"
175 | else:
176 | print "Command not found"
177 | else:
178 | #########################
179 | #INTERACTIVE MODE BEGINS#
180 | #########################
181 |
182 | print "Interactive Mode!"
183 | print "------------------------------------"
184 |
185 | apilogin = "MISSING"
186 | print ""
187 | print " -h \t\t\t\t\t List help"
188 | print " -u [Username]\t\t\t List the computers assigned to the user"
189 | print " -c [Computer] [enabled/disabled]\t Computer to enable/disable Forced PIV"
190 | print " -d \t\t\t\t\t Delete keychain entry"
191 | print " quit\t\t\t\t\t Type \'quit\' to quit interactive mode"
192 |
193 | while True:
194 |
195 | user_input = raw_input("Please enter an option: ")
196 | if user_input.strip().lower() == "quit" or user_input.strip().lower() == "q":
197 | break
198 |
199 | the_input = user_input.split(" ", 3)
200 | the_input += [None] * (3 - len(the_input))
201 | options, item, action = the_input
202 | action = str(action)
203 | if options == "-h":
204 | print " -h \t\t\t\t\t List help"
205 | print " -u [Username]\t\t\t List the computers assigned to the user"
206 | print " -c [Computer] [enabled/disabled]\t Computer to enable/disable Forced PIV"
207 | print " -d \t\t\t\t\t Delete keychain entry"
208 | print " quit\t\t\t\t\t Type \'quit\' to quit interactive mode"
209 | elif options == "-u":
210 | if item == None:
211 | print "----------------------------"
212 | print "*** No username inputted ***"
213 | print "----------------------------"
214 | else:
215 | if apilogin == "MISSING":
216 | apilogin = login()
217 |
218 | url = jssapi(options, item)
219 | print url
220 | Notsuccessful = str(computerlist(url, apilogin))
221 | if Notsuccessful == "401":
222 | apilogin = "MISSING"
223 | elif options == "-d":
224 | delete_keychain()
225 |
226 | elif options == "-c":
227 | if item == None:
228 | print "--------------------"
229 | print "*** Missing item ***"
230 | print "--------------------"
231 | else:
232 | if action == "None":
233 | print "----------------------"
234 | print "*** Missing action ***"
235 | print "----------------------"
236 | else:
237 | if apilogin == "MISSING":
238 | apilogin = login()
239 |
240 | Notsuccessful = str(PIVAction(jssapi(options, item), action, apilogin))
241 |
242 | if Notsuccessful == "401":
243 | apilogin = "MISSING"
244 | else:
245 | print "-------------------------"
246 | print "*** Command not found ***"
247 | print "-------------------------"
248 |
249 | if __name__== "__main__":
250 | main()
251 |
--------------------------------------------------------------------------------
/printerlist.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | import urllib2
4 | import base64
5 | import json
6 | import sys
7 | import ssl
8 | import urllib
9 |
10 |
11 | #Enter computer name (for example EA1234)
12 | computer_name = sys.argv[1]
13 |
14 | requestURL ="https://myjamfpro:8443/JSSResource/computers/name/" + computer_name
15 |
16 | #build the request
17 | request = urllib2.Request(requestURL)
18 | _create_unverified_https_context = ssl._create_unverified_context
19 | ssl._create_default_https_context = _create_unverified_https_context
20 |
21 | request.add_header('Accept', 'application/json')
22 | request.add_header('Authorization', 'Basic ' + base64.b64encode('JAMF API USERNAME' + ':' + 'JAMF API PASSWORD'))
23 |
24 | response = urllib2.urlopen(request)
25 | response_data = json.loads(response.read())
26 |
27 | #set the layer we're looking into
28 | printers = response_data['computer']['hardware']['mapped_printers']
29 |
30 |
31 | #loops for every instance of mapped printers
32 | for ea in printers:
33 | printer_name = ea['name']
34 | printer_type = ea['type']
35 | print "Printer Name: %s" % printer_name
36 | print "Printer Type: %s" % printer_type
37 | print ""
38 |
--------------------------------------------------------------------------------
/scriptdump.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | import urllib2
4 | import base64
5 | import json
6 | import sys
7 | import ssl
8 | import getpass
9 | import os
10 |
11 | JSSServer='https://Jamf Pro Server:8443'
12 |
13 | JSSUser = raw_input("Enter Your JSS Account:")
14 | JSSPass = getpass.getpass("Password: ")
15 |
16 | ScriptrequestURL = JSSServer + "/JSSResource/scripts"
17 | request = urllib2.Request(ScriptrequestURL)
18 | request.add_header('Accept', 'application/json')
19 | request.add_header('Authorization', 'Basic ' + base64.b64encode(JSSUser + ':' + JSSPass))
20 | response = urllib2.urlopen(request)
21 |
22 | response_data = json.loads(response.read())
23 | JamfScripts = response_data['scripts']
24 | for record in JamfScripts:
25 | scriptrequest = JSSServer + '/JSSResource/scripts/id/%s' % record['id']
26 | request = urllib2.Request(scriptrequest)
27 | request.add_header('Accept', 'application/json')
28 | request.add_header('Authorization', 'Basic ' + base64.b64encode(JSSUser + ':' + JSSPass))
29 | response = urllib2.urlopen(request)
30 | response_data = json.loads(response.read())
31 | contents = str(response_data['script']['script_contents'].encode("ascii", 'ignore'))
32 | contents = contents.replace("\r","")
33 | scriptfile = "/Users/Shared/JAMFScripts/" + record['name']
34 | if scriptfile[-3:] != ".sh":
35 | scriptfile = scriptfile + ".sh"
36 | scriptfile = scriptfile.replace(" ", "_")
37 | target = open(scriptfile, 'w')
38 | target.write(contents)
39 | target.close()
40 |
--------------------------------------------------------------------------------
/setuser-json.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #API login info
4 | apiuser='username'
5 | apipass='password'
6 | jamfProURL="https://myjamfpro:8443"
7 |
8 | ComputerName=$1
9 | getUser=$2
10 |
11 | #update via serial number
12 | apiURL="JSSResource/computers/name"
13 |
14 | #XML header stuff
15 | xmlHeader=""
16 |
17 |
18 | #API data load
19 | #apiData="$getUser"
20 |
21 | apiData="{
22 | \"computer\": {
23 |
24 | \"extension_attributes\": [
25 |
26 | {
27 | \"id\": 69,
28 | \"name\": \"Availability\",
29 | \"type\": \"String\",
30 | \"value\": \"Yes\"
31 | },
32 | {
33 | \"id\": 67,
34 | \"name\": \"DateOut\",
35 | \"type\": \"Date\",
36 | \"value\": \"11/26/81\"
37 | },
38 | {
39 | \"id\": 68,
40 | \"name\": \"DateReturned\",
41 | \"type\": \"Date\",
42 | \"value\": \"11/26/81\"
43 | }
44 |
45 | ]
46 | }
47 | }"
48 |
49 | curl -sSkiu ${apiuser}:${apipass} "${jamfProURL}/${apiURL}/${ComputerName}" \
50 | -H "Content-Type: text/xml" \
51 | -d "${xmlHeader}${apiData}" \
52 | -X PUT > /dev/null
53 |
--------------------------------------------------------------------------------
/setuser.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #API login info
4 | apiuser='username'
5 | apipass='passowrd'
6 | jamfProURL="https://myjamfpro:8443"
7 |
8 | ComputerName=$1
9 | getUser=$2
10 |
11 | #update via serial number
12 | apiURL="JSSResource/computers/name"
13 |
14 | #XML header stuff
15 | xmlHeader=""
16 |
17 |
18 | #API data load
19 | apiData="$getUser"
20 | curl -sSkiu ${apiuser}:${apipass} "${jamfProURL}/${apiURL}/${ComputerName}" \
21 | -H "Content-Type: text/xml" \
22 | -d "${xmlHeader}${apiData}" \
23 | -X PUT > /dev/null
24 |
--------------------------------------------------------------------------------
/sonicwallgroup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #API login info
4 | apiuser='username'
5 | apipass='password'
6 | jamfProURL="https://myjamfpro:8443"
7 |
8 | ComputerName=`hostname`
9 |
10 | #update via serial number
11 | #moves them into the static group
12 | apiURL="JSSResource/computergroups/id/232"
13 |
14 | #XML header stuff
15 | xmlHeader=""
16 |
17 | apiData="
18 | 232
19 | SonicWall Mobile Connect
20 |
21 |
22 | $ComputerName
23 |
24 |
25 | "
26 |
27 | curl -sSkiu ${apiuser}:${apipass} "${jamfProURL}/${apiURL}" \
28 | -H "Content-Type: text/xml" \
29 | -d "${xmlHeader}${apiData}" \
30 | -X PUT > /dev/null
31 |
--------------------------------------------------------------------------------
/student list.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | import urllib2
4 | import base64
5 | import json
6 | import sys
7 | import ssl
8 |
9 |
10 |
11 | #Pass graduation year in 2 number format
12 | classYear = sys.argv[1]
13 |
14 | requestURL = "https://myjamfpro/JSSResource/computerreports/id/61"
15 |
16 | #build the request
17 | request = urllib2.Request(requestURL)
18 | context = ssl._create_unverified_context()
19 | _create_unverified_https_context = ssl._create_unverified_context
20 | ssl._create_default_https_context = _create_unverified_https_context
21 |
22 | request.add_header('Accept', 'application/json')
23 | request.add_header('Authorization', 'Basic ' + base64.b64encode('ENTER USERNAME' + ':' + 'ENTER PASSWORD'))
24 |
25 | reponse = urllib2.urlopen(request, context=context)
26 |
27 | #request the json data
28 | response = urllib2.urlopen(request)
29 | response_data = json.loads(response.read())
30 |
31 | #set the layer we're looking into
32 | computers = response_data['computer_reports']
33 |
34 | #loops and stuff
35 | counter = 0
36 | for record in computers:
37 | if record['Department'] == "Class of " + classYear:
38 | counter+=1
39 | student_laptop = record['Computer_Name']
40 | student_username = record['Username']
41 | print "Student UserName: %s" % student_username
42 | print "Student Computer: %s" % student_laptop
43 | print ""
44 | print "Number of Students in Class of " + classYear + " NOT on macOS Sierra:", counter
45 | print
--------------------------------------------------------------------------------
/student mass email.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | import urllib2
4 | import base64
5 | import json
6 | import sys
7 | import ssl
8 | import os
9 |
10 |
11 | requestURL = "https://myjamfpro:8443/JSSResource/computerreports/id/67"
12 |
13 | #build the request
14 | request = urllib2.Request(requestURL)
15 | context = ssl._create_unverified_context()
16 | _create_unverified_https_context = ssl._create_unverified_context
17 | ssl._create_default_https_context = _create_unverified_https_context
18 |
19 | request.add_header('Accept', 'application/json')
20 | request.add_header('Authorization', 'Basic ' + base64.b64encode('API-USERNAME' + ':' + 'API-PASS'))
21 |
22 | reponse = urllib2.urlopen(request, context=context)
23 |
24 | #request the json data
25 | response = urllib2.urlopen(request)
26 | response_data = json.loads(response.read())
27 |
28 | #set the layer we're looking into
29 | computers = response_data['computer_reports']
30 |
31 | #loops and stuff
32 | for record in computers:
33 | student_laptop = record['Computer_Name']
34 | student_username = record['Username']
35 | Email = record['Email_Address']
36 | FullName = record['Full_Name']
37 | FirstName = FullName.strip(" ")
38 | FirstName = FirstName.split(' ')[0]
39 | mycommand = "echo 'Hello "+FirstName+",\n\nYour computer has not reported into our inventory system in a while. It is reporting your computer missing or stolen. It is nothing you have done, these things sometimes happen. If you can swing by with your computer, it should only take a few minutes to get it to check back in with our system. \n\nThanks, Mr. Gendler' | mail -s 'Please swing by the Tech Department' " + Email
40 | os.system(mycommand)
41 | print mycommand
42 |
--------------------------------------------------------------------------------
/update-group.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #API login info
4 | apiuser="USERNAME"
5 | apipass='PASSWORD'
6 | jamfProURL="https://jamfproserver:8443"
7 |
8 | ComputerName=$(hostname)
9 |
10 | #update group with ID 232 aka group you want
11 | GroupID="1234"
12 | apiURL="JSSResource/computergroups/id/${GroupID}"
13 |
14 | #XML header stuff
15 | xmlHeader=""
16 |
17 | apiData="${GroupID}Whatever the GroupName Is$ComputerName"
18 |
19 | curl -sSkiu ${apiuser}:${apipass} "${jamfProURL}/${apiURL}" \
20 | -H "Content-Type: text/xml" \
21 | -d "${xmlHeader}${apiData}" \
22 | -X PUT > /dev/null
23 |
--------------------------------------------------------------------------------