curl-client.sh 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. #!/bin/bash
  2. #
  3. # A simple curl client to RHPAM.
  4. #
  5. # Requires:
  6. # - jq
  7. # - curl-client.conf to load the configuration from
  8. #
  9. # Variables in curl-client.conf:
  10. #
  11. # API_ENDPOINT= base URL to REST endpoints (http://.../services/rest/server)
  12. # API_USER= some username with rest-server role
  13. # API_PASS= the password for the above user
  14. # KIE_CONTAINER= the name of the KIE container to work with
  15. # PROCESS_MODEL= the ID of the process model to work with
  16. #
  17. # All of the above can be overriden. Use with --help or -h to see the command line options and commands.
  18. #
  19. # NOTE: YOU MUST ALWAYS FIRST SPECIFY OPTIONS, THE COMMAND MUST BE LAST!
  20. #
  21. # Base variables:
  22. MYNAME="$(basename $0 .sh)"
  23. WORKDIR="$(cd $(dirname $0) && pwd)"
  24. CONFIG="${WORKDIR}/${MYNAME}.conf"
  25. # Version function.
  26. version() {
  27. cat <<EOF
  28. ${MYNAME}, version 1.0, copyright 2021, Grega Bremec <gregab@p0f.net>
  29. A simple curl client to RHPAM.
  30. Requires:
  31. - jq
  32. - curl-client.conf to load the configuration from
  33. EOF
  34. }
  35. # Usage function.
  36. usage() {
  37. cat <<EOF
  38. Usage: ${MYNAME}.sh [-h][-v][-c <cf>][-e <ep>][-u <usr>][-P <pw>][-k <kc>][-p <pm>][-i <id>][-x <id>][-s <sig>][-d <data>] <command>
  39. Where:
  40. -h displays this message and exits successfully
  41. -v displays program version and exits successfully
  42. -c <cf> is the location (and name) of the configuration file
  43. -e <ep> is the API endpoint base URL (API_ENDPOINT cfg)
  44. -u <usr> is an API user with rest-server role (API_USER cfg)
  45. -P <pw> is the password for the above user (API_PASS cfg)
  46. -k <kc> is the name of the KieContainer to work with (KIE_CONTAINER cfg)
  47. -p <pm> is the process model ID to work with (PROCESS_MODEL cfg)
  48. -i <id> is the process instance ID to work with
  49. -x <id> is the process correlation ID (XID) to work with
  50. -s <sig> is the name of the signal to work with
  51. -d <data> is the request payload, if operation requires some data
  52. NOTE: command line options override config file values.
  53. And <command> is one of (required parameters in parentheses):
  54. listContainers lists available KieContainer names
  55. listModels lists process model definitions for a KieContainer (-k)
  56. listVariables lists all variables defined in a process model (-k, -p)
  57. listInstances lists running process instances for a model (-p)
  58. listCompleted lists completed process instances for a model (-p)
  59. listAborted lists aborted process instances for a model (-p)
  60. listXidMatches lists process instances with a given correlation ID (-x)
  61. getInstanceInfo displays basic information about a process instance (-k, -i)
  62. getInstanceSignals displays all signals available for a process instance (-k, -i)
  63. getInstanceVars displays all variables currently set in an process instance (-k, -i)
  64. start starts a process instance from a model (-k, -p, optionally -d)
  65. startWithXid starts a process instance from a model (-k, -p, -x, optionally -d)
  66. sendSignal sends a signal (with optional payload) to an instance (-k, -i, -s, optionally -d)
  67. sendSignalByXid sends a signal (with optional payload) to an instance matching XID (-k, -x, -s, optionally -d)
  68. abort aborts a specified process instance (-k, -i)
  69. NOTE: you must always specify the command LAST on the line.
  70. EOF
  71. }
  72. # Parse command-line options:
  73. SHCNT=0
  74. while getopts ":hve:u:P:c:k:p:i:x:s:d:" OPTION; do
  75. case ${OPTION} in
  76. h)
  77. version
  78. echo
  79. usage
  80. exit 0
  81. ;;
  82. v)
  83. version
  84. exit 0
  85. ;;
  86. e)
  87. tEP="${OPTARG}"
  88. SHCNT=$((SHCNT + 2))
  89. ;;
  90. u)
  91. tAU="${OPTARG}"
  92. SHCNT=$((SHCNT + 2))
  93. ;;
  94. P)
  95. tAP="${OPTARG}"
  96. SHCNT=$((SHCNT + 2))
  97. ;;
  98. c)
  99. CONFIG="${OPTARG}"
  100. SHCNT=$((SHCNT + 2))
  101. ;;
  102. k)
  103. tKC="${OPTARG}"
  104. SHCNT=$((SHCNT + 2))
  105. ;;
  106. p)
  107. tPM="${OPTARG}"
  108. SHCNT=$((SHCNT + 2))
  109. ;;
  110. i)
  111. tII="${OPTARG}"
  112. SHCNT=$((SHCNT + 2))
  113. ;;
  114. x)
  115. tXI="${OPTARG}"
  116. SHCNT=$((SHCNT + 2))
  117. ;;
  118. s)
  119. tSG="${OPTARG}"
  120. SHCNT=$((SHCNT + 2))
  121. ;;
  122. d)
  123. tDT="${OPTARG}"
  124. SHCNT=$((SHCNT + 2))
  125. ;;
  126. :)
  127. echo "FATAL: Missing parameter to option -${OPTARG}" >&2
  128. echo >&2
  129. usage >&2
  130. exit 1
  131. ;;
  132. \?)
  133. echo "FATAL: Unknown option: -${OPTARG}" >&2
  134. echo >&2
  135. usage >&2
  136. exit 1
  137. ;;
  138. esac
  139. done
  140. # Remove parameters from the command line:
  141. shift ${SHCNT}
  142. if [ -z "$*" ]; then
  143. echo "FATAL: Missing command." >&2
  144. echo >&2
  145. usage >&2
  146. exit 1
  147. fi
  148. # Try loading the config file:
  149. if [ ! -e "${CONFIG}" ]; then
  150. echo "FATAL: Config file does not exist!" >&2
  151. exit 1
  152. fi
  153. if [ ! -r "${CONFIG}" ]; then
  154. echo "FATAL: Config file is not readable!" >&2
  155. exit 1
  156. fi
  157. if [ ! -f "${CONFIG}" ]; then
  158. echo "FATAL: Config file is not a regular file!" >&2
  159. exit 1
  160. fi
  161. #echo -n "Loading configuration from ${CONFIG}... "
  162. . ${CONFIG}
  163. #echo "done."
  164. # Use the command-line overrides, if present:
  165. [ -n "${tEP}" ] && API_ENDPOINT="${tEP}" && unset tEP
  166. [ -n "${tAU}" ] && API_USER="${tAU}" && unset tAU
  167. [ -n "${tAP}" ] && API_PASS="${tAP}" && unset tAP
  168. [ -n "${tKC}" ] && KIE_CONTAINER="${tKC}" && unset tKC
  169. [ -n "${tPM}" ] && PROCESS_MODEL="${tPM}" && unset tPM
  170. [ -n "${tII}" ] && INSTANCE_ID="${tII}" && unset tII
  171. [ -n "${tXI}" ] && CORRELATION_ID="${tXI}" && unset tXI
  172. [ -n "${tSG}" ] && SIGNAL_NAME="${tSG}" && unset tSG
  173. [ -n "${tDT}" ] && REQUEST_DATA="${tDT}" && unset tDT
  174. # See to it that we recognise the command and all parameters are there:
  175. COMMAND="$*"
  176. case ${COMMAND} in
  177. listContainers)
  178. true
  179. ;;
  180. listModels)
  181. if [ -z "${KIE_CONTAINER}" ]; then
  182. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  183. echo >&2
  184. usage >&2
  185. exit 1
  186. fi
  187. ;;
  188. listInstances|listCompleted|listAborted)
  189. if [ -z "${PROCESS_MODEL}" ]; then
  190. echo "FATAL: ${COMMAND} requires -p option to be set." >&2
  191. echo >&2
  192. usage >&2
  193. exit 1
  194. fi
  195. ;;
  196. listXidMatches)
  197. if [ -z "${CORRELATION_ID}" ]; then
  198. echo "FATAL: ${COMMAND} requires -x option to be set." >&2
  199. echo >&2
  200. usage >&2
  201. exit 1
  202. fi
  203. ;;
  204. listVariables|start)
  205. ERRORS=0
  206. if [ -z "${KIE_CONTAINER}" ]; then
  207. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  208. ERRORS=1
  209. fi
  210. if [ -z "${PROCESS_MODEL}" ]; then
  211. echo "FATAL: ${COMMAND} requires -p option to be set." >&2
  212. ERRORS=1
  213. fi
  214. if [ ${ERRORS} -gt 0 ]; then
  215. echo >&2
  216. usage >&2
  217. exit 1
  218. fi
  219. ;;
  220. getInstanceInfo|getInstanceSignals|getInstanceVars|abort)
  221. ERRORS=0
  222. if [ -z "${KIE_CONTAINER}" ]; then
  223. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  224. ERRORS=1
  225. fi
  226. if [ -z "${INSTANCE_ID}" ]; then
  227. echo "FATAL: ${COMMAND} requires -i option to be set." >&2
  228. ERRORS=1
  229. fi
  230. if [ ${ERRORS} -gt 0 ]; then
  231. echo >&2
  232. usage >&2
  233. exit 1
  234. fi
  235. ;;
  236. sendSignal)
  237. ERRORS=0
  238. if [ -z "${KIE_CONTAINER}" ]; then
  239. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  240. ERRORS=1
  241. fi
  242. if [ -z "${INSTANCE_ID}" ]; then
  243. echo "FATAL: ${COMMAND} requires -i option to be set." >&2
  244. ERRORS=1
  245. fi
  246. if [ -z "${SIGNAL_NAME}" ]; then
  247. echo "FATAL: ${COMMAND} requires -s option to be set." >&2
  248. ERRORS=1
  249. fi
  250. if [ ${ERRORS} -gt 0 ]; then
  251. echo >&2
  252. usage >&2
  253. exit 1
  254. fi
  255. ;;
  256. sendSignalByXid)
  257. ERRORS=0
  258. if [ -z "${KIE_CONTAINER}" ]; then
  259. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  260. ERRORS=1
  261. fi
  262. if [ -z "${CORRELATION_ID}" ]; then
  263. echo "FATAL: ${COMMAND} requires -x option to be set." >&2
  264. ERRORS=1
  265. fi
  266. if [ -z "${SIGNAL_NAME}" ]; then
  267. echo "FATAL: ${COMMAND} requires -s option to be set." >&2
  268. ERRORS=1
  269. fi
  270. if [ ${ERRORS} -gt 0 ]; then
  271. echo >&2
  272. usage >&2
  273. exit 1
  274. fi
  275. ;;
  276. startWithXid)
  277. ERRORS=0
  278. if [ -z "${KIE_CONTAINER}" ]; then
  279. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  280. ERRORS=1
  281. fi
  282. if [ -z "${PROCESS_MODEL}" ]; then
  283. echo "FATAL: ${COMMAND} requires -p option to be set." >&2
  284. ERRORS=1
  285. fi
  286. if [ -z "${CORRELATION_ID}" ]; then
  287. echo "FATAL: ${COMMAND} requires -x option to be set." >&2
  288. ERRORS=1
  289. fi
  290. if [ ${ERRORS} -gt 0 ]; then
  291. echo >&2
  292. usage >&2
  293. exit 1
  294. fi
  295. ;;
  296. *)
  297. echo "FATAL: Unrecognised command: \"$*\"" >&2
  298. echo >&2
  299. usage >&2
  300. exit 1
  301. ;;
  302. esac
  303. # Show what would have happened:
  304. echo
  305. echo "Executing the following operation: ${COMMAND}"
  306. echo
  307. echo " API_ENDPOINT = ${API_ENDPOINT}"
  308. echo " API_USER = ${API_USER}"
  309. echo " API_PASS = ${API_PASS//?/*}"
  310. CURL_CMD="curl -s -u'${API_USER}:${API_PASS}' -H 'Accept: application/json' -H 'Content-Type: application/json'"
  311. # Do the job
  312. case ${COMMAND} in
  313. listContainers)
  314. echo
  315. echo "Available containers:"
  316. echo
  317. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers | \
  318. jq -r '.result."kie-containers"."kie-container"[]."container-id"' | \
  319. sed 's/^/ - /'
  320. echo
  321. ;;
  322. listModels)
  323. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  324. echo
  325. echo "Available process model definitions:"
  326. echo
  327. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes | \
  328. jq -r '.processes[]."process-id"' | \
  329. sed 's/^/ - /'
  330. echo
  331. ;;
  332. listVariables)
  333. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  334. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  335. echo
  336. echo "Available variables in process model definition of ${PROCESS_MODEL}:"
  337. echo
  338. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/definitions/${PROCESS_MODEL}/variables | \
  339. jq -r '.variables' | \
  340. grep -v '^[\{\}]' | \
  341. sed 's/^[[:space:]]*//; s/^/ - /; s/"//g'
  342. echo
  343. ;;
  344. listInstances|listCompleted|listAborted)
  345. case ${COMMAND} in
  346. listInstances)
  347. STATE=1
  348. WORD=active
  349. ;;
  350. listCompleted)
  351. STATE=2
  352. WORD=completed
  353. ;;
  354. listAborted)
  355. STATE=3
  356. WORD=aborted
  357. ;;
  358. esac
  359. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  360. echo
  361. echo "Available ${WORD} process instances of ${PROCESS_MODEL}:"
  362. echo
  363. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/queries/processes/${PROCESS_MODEL}/instances?status=${STATE} | \
  364. jq -r '."process-instance"[]."process-instance-id"' | \
  365. sed 's/^/ - /'
  366. echo
  367. ;;
  368. listXidMatches)
  369. echo " CORRELATION_ID = ${CORRELATION_ID}"
  370. echo
  371. echo "Available process instances with XID of ${CORRELATION_ID}:"
  372. echo
  373. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/queries/processes/instance/correlation/${CORRELATION_ID} | \
  374. jq -r '"ID \(."process-instance-id"), model \(."process-id"), version \(."process-version"), state \(."process-instance-state"), XID \(."correlation-key")"' | \
  375. sed 's/^/ - /'
  376. echo
  377. ;;
  378. getInstanceInfo)
  379. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  380. echo " INSTANCE_ID = ${INSTANCE_ID}"
  381. echo
  382. echo -n "Process instance ID ${INSTANCE_ID} details: "
  383. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID} | \
  384. jq -r '"model \(."process-id"), version \(."process-version"), state \(."process-instance-state"), XID \(."correlation-key")"'
  385. echo
  386. ;;
  387. getInstanceSignals)
  388. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  389. echo " INSTANCE_ID = ${INSTANCE_ID}"
  390. echo
  391. echo "Process instance ID ${INSTANCE_ID} signals:"
  392. echo
  393. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/signals | \
  394. jq -r '.[]' | \
  395. sed 's/^/ - /'
  396. echo
  397. ;;
  398. getInstanceVars)
  399. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  400. echo " INSTANCE_ID = ${INSTANCE_ID}"
  401. echo
  402. echo "Process instance ID ${INSTANCE_ID} variables:"
  403. echo
  404. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/variables | \
  405. jq -r '.' | \
  406. grep -v '^[\{\}]' | \
  407. sed 's/^[[:space:]]*//; s/^/ - /; s/"//g'
  408. echo
  409. ;;
  410. start)
  411. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  412. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  413. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  414. echo
  415. echo -n "Starting a new instance of process model ${PROCESS_MODEL}... "
  416. if [ -n "${REQUEST_DATA}" ]; then
  417. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  418. fi
  419. NEW_ID=$(eval ${CURL_CMD} -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/${PROCESS_MODEL}/instances)
  420. echo "done."
  421. echo "New instance ID is ${NEW_ID}."
  422. echo
  423. ;;
  424. startWithXid)
  425. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  426. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  427. echo " CORRELATION_ID = ${CORRELATION_ID}"
  428. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  429. echo
  430. echo -n "Starting a new instance of process model ${PROCESS_MODEL} with XID ${CORRELATION_ID}... "
  431. if [ -n "${REQUEST_DATA}" ]; then
  432. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  433. fi
  434. NEW_ID=$(eval ${CURL_CMD} -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/${PROCESS_MODEL}/instances/correlation/${CORRELATION_ID})
  435. echo "done."
  436. echo "New instance ID is ${NEW_ID}."
  437. echo
  438. ;;
  439. sendSignal)
  440. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  441. echo " INSTANCE_ID = ${INSTANCE_ID}"
  442. echo " SIGNAL_NAME = ${SIGNAL_NAME}"
  443. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  444. echo
  445. echo -n "Sending signal ${SIGNAL_NAME} to process instance ID ${INSTANCE_ID}... "
  446. if [ -n "${REQUEST_DATA}" ]; then
  447. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  448. fi
  449. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/signal/${SIGNAL_NAME}
  450. echo "done."
  451. echo
  452. ;;
  453. sendSignalByXid)
  454. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  455. echo " CORRELATION_ID = ${CORRELATION_ID}"
  456. echo " SIGNAL_NAME = ${SIGNAL_NAME}"
  457. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  458. echo
  459. echo -n "Sending signal ${SIGNAL_NAME} to process instance with XID of ${CORRELATION_ID}... "
  460. if [ -n "${REQUEST_DATA}" ]; then
  461. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  462. fi
  463. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/correlation/${CORRELATION_ID}/signal/${SIGNAL_NAME}
  464. echo "done."
  465. echo
  466. ;;
  467. abort)
  468. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  469. echo " INSTANCE_ID = ${INSTANCE_ID}"
  470. echo
  471. echo -n "Aborting instance ID ${INSTANCE_ID}... "
  472. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XDELETE ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}
  473. echo "done."
  474. echo
  475. ;;
  476. esac
  477. # End of curl-client.sh