partner-provision.sh 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #!/usr/bin/env sh
  2. # accepts: partner client ID and secret key, and some site info
  3. # executes wp-cli command to provision Jetpack site for given partner
  4. usage () {
  5. echo 'Usage: partner-provision.sh \
  6. --partner_id=partner_id \
  7. --partner_secret=partner_secret \
  8. --user=wp_user_id \
  9. [--wp-cli-path=/usr/local/bin/wp]
  10. [--plan=plan_name] \
  11. [--onboarding=1] \
  12. [--wpcom_user_id=1234] \
  13. [--wpcom_user_email=wpcom_user_email] \
  14. [--url=http://example.com] \
  15. [--force_connect=1] \
  16. [--force_register=1] \
  17. [--allow-root] \
  18. [--partner-tracking-id=1]'
  19. }
  20. # Note: this script should always be designed to keep wp-cli OPTIONAL
  21. # so that it can be run outside of the WordPress installation.
  22. WP_CLI_COMMAND="wp"
  23. WP_CLI_ARGS=""
  24. # Default API host that can be overridden.
  25. if [ -z "$JETPACK_START_API_HOST" ]; then
  26. JETPACK_START_API_HOST='public-api.wordpress.com'
  27. fi
  28. PROVISION_REQUEST_ARGS=""
  29. PROVISION_REQUEST_URL="https://$JETPACK_START_API_HOST/rest/v1.3/jpphp/provision"
  30. for i in "$@"; do
  31. case $i in
  32. -c=* | --partner_id=* )
  33. CLIENT_ID="${i#*=}"
  34. shift
  35. ;;
  36. -s=* | --partner_secret=* )
  37. CLIENT_SECRET="${i#*=}"
  38. shift
  39. ;;
  40. -i=* | --user_id=* | --user=* )
  41. WP_USER="${i#*=}"
  42. WP_CLI_ARGS="$WP_CLI_ARGS --user=${i#*=}"
  43. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form local_user=${i#*=}"
  44. shift
  45. ;;
  46. -w=* | --wpcom_user_id=* )
  47. WPCOM_USER_ID=${i#*=}
  48. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form wpcom_user_id=${i#*=}"
  49. shift
  50. ;;
  51. -e=* | --wpcom_user_email=* )
  52. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form wpcom_user_email=${i#*=}"
  53. shift
  54. ;;
  55. -p=* | --plan=* )
  56. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form plan=${i#*=}"
  57. shift
  58. ;;
  59. -o=* | --onboarding=* )
  60. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form onboarding=${i#*=}"
  61. shift
  62. ;;
  63. -u=* | --url=* )
  64. WP_CLI_ARGS="$WP_CLI_ARGS --url=${i#*=}"
  65. SITEURL="${i#*=}"
  66. shift
  67. ;;
  68. --force_register=* )
  69. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form force_register=${i#*=}"
  70. shift
  71. ;;
  72. --force_connect=* )
  73. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form force_connect=${i#*=}"
  74. shift
  75. ;;
  76. --partner-tracking-id=* )
  77. PROVISION_REQUEST_URL="$PROVISION_REQUEST_URL?partner-tracking-id=${i#*=}"
  78. shift
  79. ;;
  80. --allow-root )
  81. WP_CLI_ARGS="$WP_CLI_ARGS --allow-root"
  82. shift
  83. ;;
  84. --wp-cli-path=* )
  85. WP_CLI_COMMAND="${i#*=}"
  86. shift
  87. ;;
  88. -h | --help )
  89. usage
  90. exit
  91. ;;
  92. * )
  93. echo $(usage) >&2
  94. exit 1
  95. esac
  96. done
  97. WP_CLI_CHECK=$($WP_CLI_COMMAND --skip-plugins --skip-themes option get home 2>/dev/null)
  98. if [ -z "$WP_CLI_CHECK" ]; then
  99. WP_CLI_EXISTS=0
  100. else
  101. WP_CLI_EXISTS=1
  102. fi
  103. if [ "$WP_CLI_EXISTS" -eq "1" ]; then
  104. WP_CLI_ARGS="$WP_CLI_ARGS --skip-themes --skip-plugins=$($WP_CLI_COMMAND plugin list --field=name | grep -v ^jetpack$ | tr '\n' ',')"
  105. fi
  106. if [ "$CLIENT_ID" = "" ] || [ "$CLIENT_SECRET" = "" ] || [ "$WP_USER" = "" ]; then
  107. echo $(usage) >&2
  108. exit 1
  109. fi
  110. jetpack_shell_is_errored() {
  111. if [ -z "$1" ]; then
  112. exit 1
  113. fi
  114. JSON_ERROR=$( jetpack_echo_key_from_json "$1" error | xargs echo )
  115. if [ -z "$JSON_ERROR" ]; then
  116. return 1
  117. else
  118. return 0
  119. fi
  120. }
  121. jetpack_is_wp_cli_error() {
  122. if [ -z "$1" ]; then
  123. exit 1
  124. fi
  125. if [ ! -z $( echo "$1" | grep Error:) ] || [ -z "$1" ]; then
  126. return 0
  127. fi
  128. return 1
  129. }
  130. jetpack_echo_key_from_json() {
  131. if [ -z "$1" ]; then
  132. exit 1
  133. fi
  134. echo $1 | sed -n "s/.*\"$2\":\"\([^\"]*\)\".*/\1/p"
  135. }
  136. # Fetch an access token using our client ID/secret.
  137. ACCESS_TOKEN_JSON=$(
  138. curl \
  139. --silent \
  140. --request POST \
  141. --url https://$JETPACK_START_API_HOST/oauth2/token \
  142. --header 'cache-control: no-cache' \
  143. --header 'content-type: multipart/form-data;' \
  144. --header "Host: public-api.wordpress.com" \
  145. --form client_id="$CLIENT_ID" \
  146. --form client_secret="$CLIENT_SECRET" \
  147. --form grant_type=client_credentials \
  148. --form scope=jetpack-partner
  149. )
  150. if jetpack_shell_is_errored "$ACCESS_TOKEN_JSON"; then
  151. echo "$ACCESS_TOKEN_JSON" >&2
  152. exit 1
  153. fi
  154. ACCESS_TOKEN=$( jetpack_echo_key_from_json "$ACCESS_TOKEN_JSON" access_token | xargs echo )
  155. # If we don't have an access token, we can't go further.
  156. if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "" ]; then
  157. echo "$ACCESS_TOKEN_JSON" >&2
  158. exit 1
  159. fi
  160. # Silently ensure Jetpack is active
  161. # Intentionally not quoting $WP_CLI_ARGS so that words in the string are split
  162. if [ "$WP_CLI_EXISTS" -eq "1" ]; then
  163. $WP_CLI_COMMAND $WP_CLI_ARGS plugin activate jetpack >/dev/null 2>&1
  164. fi
  165. if [ -z "$SITEURL" ] && [ "$WP_CLI_EXISTS" -eq "1" ]; then
  166. SITEURL=$( $WP_CLI_COMMAND $WP_CLI_ARGS option get siteurl | xargs echo )
  167. fi
  168. PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form siteurl=$SITEURL"
  169. PROVISION_REQUEST=$(
  170. curl \
  171. --silent \
  172. --request POST \
  173. --url "$PROVISION_REQUEST_URL" \
  174. --header "authorization: Bearer $ACCESS_TOKEN" \
  175. --header "Host: public-api.wordpress.com" \
  176. --header 'cache-control: no-cache' \
  177. --header 'content-type: multipart/form-data;' \
  178. $PROVISION_REQUEST_ARGS
  179. )
  180. if [ -z "$PROVISION_REQUEST" ]; then
  181. echo "{\"success\":false,\"error_code\":\"unknown_error\",\"error_message\":\"Empty response from server\"}" >&2
  182. fi
  183. if jetpack_shell_is_errored "$PROVISION_REQUEST"; then
  184. echo "$PROVISION_REQUEST" >&2
  185. exit 1
  186. fi
  187. # Get the access token for the Jetpack connection.
  188. ACCESS_TOKEN=$( jetpack_echo_key_from_json "$PROVISION_REQUEST" access_token | xargs echo )
  189. # If we have an access token, set it and activate default modules!
  190. if [ ! -z "$ACCESS_TOKEN" ] && [ "$ACCESS_TOKEN" != "" ] && [ ! -z "$WPCOM_USER_ID" ] && [ "$WP_CLI_EXISTS" -eq "1" ]; then
  191. AUTHORIZE_RESULT=$( $WP_CLI_COMMAND $WP_CLI_ARGS jetpack authorize_user --token="$ACCESS_TOKEN" )
  192. if jetpack_is_wp_cli_error "$AUTHORIZE_RESULT"; then
  193. echo "{\"success\":false,\"error_code\":\"authorization_failure\",\"error_message\":\"$AUTHORIZE_RESULT\"}" >&2
  194. exit 1
  195. fi
  196. fi
  197. echo "$PROVISION_REQUEST"
  198. exit 0