procd.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # procd API:
  2. #
  3. # procd_open_service(name, [script]):
  4. # Initialize a new procd command message containing a service with one or more instances
  5. #
  6. # procd_close_service()
  7. # Send the command message for the service
  8. #
  9. # procd_open_instance([name]):
  10. # Add an instance to the service described by the previous procd_open_service call
  11. #
  12. # procd_set_param(type, [value...])
  13. # Available types:
  14. # command: command line (array).
  15. # env: environment variable (passed to the process)
  16. # data: arbitrary name/value pairs for detecting config changes (table)
  17. # file: configuration files (array)
  18. # netdev: bound network device (detects ifindex changes)
  19. #
  20. # No space separation is done for arrays/tables - use one function argument per command line argument
  21. #
  22. # procd_close_instance():
  23. # Complete the instance being prepared
  24. #
  25. # procd_kill(service, [instance]):
  26. # Kill a service instance (or all instances)
  27. #
  28. . $IPKG_INSTROOT/usr/share/libubox/jshn.sh
  29. _PROCD_SERVICE=
  30. _procd_call() {
  31. local old_cb
  32. json_set_namespace procd old_cb
  33. "$@"
  34. json_set_namespace $old_cb
  35. }
  36. _procd_wrapper() {
  37. while [ -n "$1" ]; do
  38. eval "$1() { _procd_call _$1 \"\$@\"; }"
  39. shift
  40. done
  41. }
  42. _procd_ubus_call() {
  43. local cmd="$1"
  44. ubus call service "$cmd" "$(json_dump)"
  45. json_cleanup
  46. }
  47. _procd_open_service() {
  48. local name="$1"
  49. local script="$2"
  50. _PROCD_SERVICE="$name"
  51. _PROCD_INSTANCE_SEQ=0
  52. json_init
  53. json_add_string name "$name"
  54. [ -n "$script" ] && json_add_string script "$script"
  55. json_add_object instances
  56. }
  57. _procd_close_service() {
  58. json_close_object
  59. _procd_ubus_call set
  60. }
  61. _procd_add_array_data() {
  62. while [ -n "$1" ]; do
  63. json_add_string "" "$1"
  64. shift
  65. done
  66. }
  67. _procd_add_array() {
  68. json_add_array "$1"
  69. shift
  70. _procd_add_array_data "$@"
  71. json_close_array
  72. }
  73. _procd_add_table_data() {
  74. while [ -n "$1" ]; do
  75. local var="${1%%=*}"
  76. local val="${1#*=}"
  77. [[ "$1" == "$val" ]] && val=
  78. json_add_string "$var" "$val"
  79. shift
  80. done
  81. }
  82. _procd_add_table() {
  83. json_add_object "$1"
  84. shift
  85. _procd_add_table_data "$@"
  86. json_close_object
  87. }
  88. _procd_open_instance() {
  89. local name="$1"; shift
  90. _PROCD_INSTANCE_SEQ="$(($_PROCD_INSTANCE_SEQ + 1))"
  91. name="${name:-instance$_PROCD_INSTANCE_SEQ}"
  92. json_add_object "$name"
  93. }
  94. _procd_set_param() {
  95. local type="$1"; shift
  96. case "$type" in
  97. env|data)
  98. _procd_add_table "$type" "$@"
  99. ;;
  100. command|netdev|file)
  101. _procd_add_array "$type" "$@"
  102. ;;
  103. nice)
  104. json_add_int "$type" "$1"
  105. ;;
  106. esac
  107. }
  108. _procd_append_param() {
  109. local type="$1"; shift
  110. json_select "$type"
  111. case "$type" in
  112. env|data)
  113. _procd_add_table_data "$@"
  114. ;;
  115. command|netdev|file)
  116. _procd_add_array_data "$@"
  117. ;;
  118. esac
  119. json_select ..
  120. }
  121. _procd_close_instance() {
  122. json_close_object
  123. }
  124. _procd_add_instance() {
  125. _procd_open_instance
  126. _procd_set_command "$@"
  127. _procd_close_instance
  128. }
  129. _procd_kill() {
  130. local service="$1"
  131. local instance="$2"
  132. json_init
  133. [ -n "$service" ] && json_add_string service "$service"
  134. [ -n "$instance" ] && json_add_string instance "$instance"
  135. _procd_ubus_call delete
  136. }
  137. _procd_wrapper \
  138. procd_open_service \
  139. procd_close_service \
  140. procd_add_instance \
  141. procd_open_instance \
  142. procd_close_instance \
  143. procd_set_param \
  144. procd_append_param \
  145. procd_kill