curl-client.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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 that ALL 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. sendSignal sends a signal (with optional payload) to an instance (-k, -i, -s, optionally -d)
  66. sendSignalByXid sends a signal (with optional payload) to an instance matching XID (-k, -x, -s, optionally -d)
  67. abort aborts a specified process instance (-k, -i)
  68. EOF
  69. }
  70. # Parse command-line options:
  71. SHCNT=0
  72. while getopts ":hve:u:P:c:k:p:i:x:s:d:" OPTION; do
  73. case ${OPTION} in
  74. h)
  75. version
  76. echo
  77. usage
  78. exit 0
  79. ;;
  80. v)
  81. version
  82. exit 0
  83. ;;
  84. e)
  85. tEP="${OPTARG}"
  86. SHCNT=$((SHCNT + 2))
  87. ;;
  88. u)
  89. tAU="${OPTARG}"
  90. SHCNT=$((SHCNT + 2))
  91. ;;
  92. P)
  93. tAP="${OPTARG}"
  94. SHCNT=$((SHCNT + 2))
  95. ;;
  96. c)
  97. CONFIG="${OPTARG}"
  98. SHCNT=$((SHCNT + 2))
  99. ;;
  100. k)
  101. tKC="${OPTARG}"
  102. SHCNT=$((SHCNT + 2))
  103. ;;
  104. p)
  105. tPM="${OPTARG}"
  106. SHCNT=$((SHCNT + 2))
  107. ;;
  108. i)
  109. tII="${OPTARG}"
  110. SHCNT=$((SHCNT + 2))
  111. ;;
  112. x)
  113. tXI="${OPTARG}"
  114. SHCNT=$((SHCNT + 2))
  115. ;;
  116. s)
  117. tSG="${OPTARG}"
  118. SHCNT=$((SHCNT + 2))
  119. ;;
  120. d)
  121. tDT="${OPTARG}"
  122. SHCNT=$((SHCNT + 2))
  123. ;;
  124. :)
  125. echo "FATAL: Missing parameter to option -${OPTARG}" >&2
  126. echo >&2
  127. usage >&2
  128. exit 1
  129. ;;
  130. \?)
  131. echo "FATAL: Unknown option: -${OPTARG}" >&2
  132. echo >&2
  133. usage >&2
  134. exit 1
  135. ;;
  136. esac
  137. done
  138. # Remove parameters from the command line:
  139. shift ${SHCNT}
  140. if [ -z "$*" ]; then
  141. echo "FATAL: Missing command." >&2
  142. echo >&2
  143. usage >&2
  144. fi
  145. # Try loading the config file:
  146. if [ ! -e "${CONFIG}" ]; then
  147. echo "FATAL: Config file does not exist!" >&2
  148. exit 1
  149. fi
  150. if [ ! -r "${CONFIG}" ]; then
  151. echo "FATAL: Config file is not readable!" >&2
  152. exit 1
  153. fi
  154. if [ ! -f "${CONFIG}" ]; then
  155. echo "FATAL: Config file is not a regular file!" >&2
  156. exit 1
  157. fi
  158. #echo -n "Loading configuration from ${CONFIG}... "
  159. . ${CONFIG}
  160. #echo "done."
  161. # Use the command-line overrides, if present:
  162. [ -n "${tEP}" ] && API_ENDPOINT="${tEP}" && unset tEP
  163. [ -n "${tAU}" ] && API_USER="${tAU}" && unset tAU
  164. [ -n "${tAP}" ] && API_PASS="${tAP}" && unset tAP
  165. [ -n "${tKC}" ] && KIE_CONTAINER="${tKC}" && unset tKC
  166. [ -n "${tPM}" ] && PROCESS_MODEL="${tPM}" && unset tPM
  167. [ -n "${tII}" ] && INSTANCE_ID="${tII}" && unset tII
  168. [ -n "${tXI}" ] && CORRELATION_ID="${tXI}" && unset tXI
  169. [ -n "${tSG}" ] && SIGNAL_NAME="${tSG}" && unset tSG
  170. [ -n "${tDT}" ] && REQUEST_DATA="${tDT}" && unset tDT
  171. # See to it that we recognise the command and all parameters are there:
  172. COMMAND="$*"
  173. case ${COMMAND} in
  174. listContainers)
  175. true
  176. ;;
  177. listModels)
  178. if [ -z "${KIE_CONTAINER}" ]; then
  179. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  180. echo >&2
  181. usage >&2
  182. exit 1
  183. fi
  184. ;;
  185. listInstances|listCompleted|listAborted)
  186. if [ -z "${PROCESS_MODEL}" ]; then
  187. echo "FATAL: ${COMMAND} requires -p option to be set." >&2
  188. echo >&2
  189. usage >&2
  190. exit 1
  191. fi
  192. ;;
  193. listXidMatches)
  194. if [ -z "${CORRELATION_ID}" ]; then
  195. echo "FATAL: ${COMMAND} requires -x option to be set." >&2
  196. echo >&2
  197. usage >&2
  198. exit 1
  199. fi
  200. ;;
  201. listVariables|start)
  202. ERRORS=0
  203. if [ -z "${KIE_CONTAINER}" ]; then
  204. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  205. ERRORS=1
  206. fi
  207. if [ -z "${PROCESS_MODEL}" ]; then
  208. echo "FATAL: ${COMMAND} requires -p option to be set." >&2
  209. ERRORS=1
  210. fi
  211. if [ ${ERRORS} -gt 0 ]; then
  212. echo >&2
  213. usage >&2
  214. exit 1
  215. fi
  216. ;;
  217. getInstanceInfo|getInstanceSignals|getInstanceVars|abort)
  218. ERRORS=0
  219. if [ -z "${KIE_CONTAINER}" ]; then
  220. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  221. ERRORS=1
  222. fi
  223. if [ -z "${INSTANCE_ID}" ]; then
  224. echo "FATAL: ${COMMAND} requires -i option to be set." >&2
  225. ERRORS=1
  226. fi
  227. if [ ${ERRORS} -gt 0 ]; then
  228. echo >&2
  229. usage >&2
  230. exit 1
  231. fi
  232. ;;
  233. sendSignal)
  234. ERRORS=0
  235. if [ -z "${KIE_CONTAINER}" ]; then
  236. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  237. ERRORS=1
  238. fi
  239. if [ -z "${INSTANCE_ID}" ]; then
  240. echo "FATAL: ${COMMAND} requires -i option to be set." >&2
  241. ERRORS=1
  242. fi
  243. if [ -z "${SIGNAL_NAME}" ]; then
  244. echo "FATAL: ${COMMAND} requires -s option to be set." >&2
  245. ERRORS=1
  246. fi
  247. if [ ${ERRORS} -gt 0 ]; then
  248. echo >&2
  249. usage >&2
  250. exit 1
  251. fi
  252. ;;
  253. sendSignalByXid)
  254. ERRORS=0
  255. if [ -z "${KIE_CONTAINER}" ]; then
  256. echo "FATAL: ${COMMAND} requires -k option to be set." >&2
  257. ERRORS=1
  258. fi
  259. if [ -z "${CORRELATION_ID}" ]; then
  260. echo "FATAL: ${COMMAND} requires -x option to be set." >&2
  261. ERRORS=1
  262. fi
  263. if [ -z "${SIGNAL_NAME}" ]; then
  264. echo "FATAL: ${COMMAND} requires -s option to be set." >&2
  265. ERRORS=1
  266. fi
  267. if [ ${ERRORS} -gt 0 ]; then
  268. echo >&2
  269. usage >&2
  270. exit 1
  271. fi
  272. ;;
  273. *)
  274. echo "FATAL: Unrecognised command: \"$*\"" >&2
  275. echo >&2
  276. usage >&2
  277. exit 1
  278. ;;
  279. esac
  280. # Show what would have happened:
  281. echo
  282. echo "Executing the following operation: ${COMMAND}"
  283. echo
  284. echo " API_ENDPOINT = ${API_ENDPOINT}"
  285. echo " API_USER = ${API_USER}"
  286. echo " API_PASS = ${API_PASS//?/*}"
  287. CURL_CMD="curl -s -u'${API_USER}:${API_PASS}' -H 'Accept: application/json' -H 'Content-Type: application/json'"
  288. # Do the job
  289. case ${COMMAND} in
  290. listContainers)
  291. echo
  292. echo "Available containers:"
  293. echo
  294. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers | \
  295. jq -r '.result."kie-containers"."kie-container"[]."container-id"' | \
  296. sed 's/^/ - /'
  297. echo
  298. ;;
  299. listModels)
  300. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  301. echo
  302. echo "Available process model definitions:"
  303. echo
  304. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes | \
  305. jq -r '.processes[]."process-id"' | \
  306. sed 's/^/ - /'
  307. echo
  308. ;;
  309. listVariables)
  310. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  311. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  312. echo
  313. echo "Available variables in process model definition of ${PROCESS_MODEL}:"
  314. echo
  315. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/definitions/${PROCESS_MODEL}/variables | \
  316. jq -r '.variables' | \
  317. grep -v '^[\{\}]' | \
  318. sed 's/^[[:space:]]*//; s/^/ - /; s/"//g'
  319. echo
  320. ;;
  321. listInstances|listCompleted|listAborted)
  322. case ${COMMAND} in
  323. listInstances)
  324. STATE=1
  325. WORD=active
  326. ;;
  327. listCompleted)
  328. STATE=2
  329. WORD=completed
  330. ;;
  331. listAborted)
  332. STATE=3
  333. WORD=aborted
  334. ;;
  335. esac
  336. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  337. echo
  338. echo "Available ${WORD} process instances of ${PROCESS_MODEL}:"
  339. echo
  340. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/queries/processes/${PROCESS_MODEL}/instances?status=${STATE} | \
  341. jq -r '."process-instance"[]."process-instance-id"' | \
  342. sed 's/^/ - /'
  343. echo
  344. ;;
  345. listXidMatches)
  346. echo " CORRELATION_ID = ${CORRELATION_ID}"
  347. echo
  348. echo "Available process instances with XID of ${CORRELATION_ID}:"
  349. echo
  350. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/queries/processes/instance/correlation/${CORRELATION_ID} | \
  351. jq -r '"ID \(."process-instance-id"), model \(."process-id"), version \(."process-version"), state \(."process-instance-state"), XID \(."correlation-key")"' | \
  352. sed 's/^/ - /'
  353. echo
  354. ;;
  355. getInstanceInfo)
  356. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  357. echo " INSTANCE_ID = ${INSTANCE_ID}"
  358. echo
  359. echo -n "Process instance ID ${INSTANCE_ID} details: "
  360. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID} | \
  361. jq -r '"model \(."process-id"), version \(."process-version"), state \(."process-instance-state"), XID \(."correlation-key")"'
  362. echo
  363. ;;
  364. getInstanceSignals)
  365. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  366. echo " INSTANCE_ID = ${INSTANCE_ID}"
  367. echo
  368. echo "Process instance ID ${INSTANCE_ID} signals:"
  369. echo
  370. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/signals | \
  371. jq -r '.[]' | \
  372. sed 's/^/ - /'
  373. echo
  374. ;;
  375. getInstanceVars)
  376. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  377. echo " INSTANCE_ID = ${INSTANCE_ID}"
  378. echo
  379. echo "Process instance ID ${INSTANCE_ID} variables:"
  380. echo
  381. eval ${CURL_CMD} -XGET ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/variables | \
  382. jq -r '.' | \
  383. grep -v '^[\{\}]' | \
  384. sed 's/^[[:space:]]*//; s/^/ - /; s/"//g'
  385. echo
  386. ;;
  387. start)
  388. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  389. echo " PROCESS_MODEL = ${PROCESS_MODEL}"
  390. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  391. echo
  392. echo -n "Starting a new instance of process model ${PROCESS_MODEL}... "
  393. if [ -n "${REQUEST_DATA}" ]; then
  394. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  395. fi
  396. NEW_ID=$(eval ${CURL_CMD} -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/${PROCESS_MODEL}/instances)
  397. echo "done."
  398. echo "New instance ID is ${NEW_ID}."
  399. echo
  400. ;;
  401. sendSignal)
  402. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  403. echo " INSTANCE_ID = ${INSTANCE_ID}"
  404. echo " SIGNAL_NAME = ${SIGNAL_NAME}"
  405. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  406. echo
  407. echo -n "Sending signal ${SIGNAL_NAME} to process instance ID ${INSTANCE_ID}... "
  408. if [ -n "${REQUEST_DATA}" ]; then
  409. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  410. fi
  411. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}/signal/${SIGNAL_NAME}
  412. echo "done."
  413. echo
  414. ;;
  415. sendSignalByXid)
  416. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  417. echo " CORRELATION_ID = ${CORRELATION_ID}"
  418. echo " SIGNAL_NAME = ${SIGNAL_NAME}"
  419. echo " REQUEST_DATA = \"${REQUEST_DATA}\""
  420. echo
  421. echo -n "Sending signal ${SIGNAL_NAME} to process instance with XID of ${CORRELATION_ID}... "
  422. if [ -n "${REQUEST_DATA}" ]; then
  423. CURL_CMD="${CURL_CMD} -d '${REQUEST_DATA}'"
  424. fi
  425. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XPOST ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/correlation/${CORRELATION_ID}/signal/${SIGNAL_NAME}
  426. echo "done."
  427. echo
  428. ;;
  429. abort)
  430. echo " KIE_CONTAINER = ${KIE_CONTAINER}"
  431. echo " INSTANCE_ID = ${INSTANCE_ID}"
  432. echo
  433. echo -n "Aborting instance ID ${INSTANCE_ID}... "
  434. eval ${CURL_CMD} -w \''HTTP response %{http_code}... '\' -XDELETE ${API_ENDPOINT}/containers/${KIE_CONTAINER}/processes/instances/${INSTANCE_ID}
  435. echo "done."
  436. echo
  437. ;;
  438. esac
  439. # End of curl-client.sh