{"id":356,"date":"2018-12-10T19:32:34","date_gmt":"2018-12-10T16:32:34","guid":{"rendered":"https:\/\/artem.services\/?p=356"},"modified":"2018-12-23T14:54:55","modified_gmt":"2018-12-23T11:54:55","slug":"slack-notify-from-bash","status":"publish","type":"post","link":"https:\/\/artem.services\/?p=356","title":{"rendered":"Slack &#8212; Notify from BASH"},"content":{"rendered":"<p><img loading=\"lazy\" class=\"size-full wp-image-219 aligncenter\" src=\"https:\/\/artem.services\/wp-content\/uploads\/2018\/11\/Config-Examples-Logo.png\" alt=\"\" width=\"937\" height=\"145\" srcset=\"https:\/\/artem.services\/wp-content\/uploads\/2018\/11\/Config-Examples-Logo.png 937w, https:\/\/artem.services\/wp-content\/uploads\/2018\/11\/Config-Examples-Logo-300x46.png 300w, https:\/\/artem.services\/wp-content\/uploads\/2018\/11\/Config-Examples-Logo-768x119.png 768w\" sizes=\"(max-width: 937px) 100vw, 937px\" \/><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442\u0443 <strong>webhook<\/strong>&#39;\u0438, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435:<\/p>\n<pre>https:\/\/YOU_ORGANIZATION_NAME.slack.com\/services\/new\/incoming-webhook<\/pre>\n<p>\u0413\u0434\u0435 &quot;<strong>YOU_ORGANIZATION_NAME<\/strong>&quot; \u0438\u043c\u044f \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 <strong>Slack<\/strong>&#39;\u0435<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre>curl -s https:\/\/gist.githubusercontent.com\/andkirby\/67a774513215d7ba06384186dd441d9e\/raw --output \/usr\/bin\/slack<\/pre>\n<p>\u0410\u0432\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430: <a href=\"https:\/\/gist.github.com\/andkirby\" target=\"_blank\" rel=\"noopener\">andkirby<\/a><\/p>\n<p><!--more--><\/p>\n<p>\u0418\u043b\u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u043e\u043c\u0443:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/usr\/bin\/env bash\r\n####################################################################################\r\n# Slack Bash console script for sending messages.\r\n####################################################################################\r\n# Installation\r\n#    $ curl -s https:\/\/gist.githubusercontent.com\/andkirby\/67a774513215d7ba06384186dd441d9e\/raw --output \/usr\/bin\/slack\r\n#    $ chmod +x \/usr\/bin\/slack\r\n####################################################################################\r\n# USAGE\r\n# Send message to slack channel\/user\r\n#   Send a message to the channel #ch-01\r\n#     $ slack '#ch-01' 'Some message here.'\r\n#\r\n#   Send a message to the channel #ch-01 and user @me.\r\n#     $ slack '#ch-01,@me' MESSAGE\r\n#\r\n#   Send a message to the default channel (it must be declared in APP_SLACK_CHANNEL).\r\n#     $ slack  MESSAGE\r\n#\r\n# VARIABLES\r\n#\r\n# Please declare environment variables:\r\n#   - APP_SLACK_WEBHOOK\r\n#   - APP_SLACK_CHANNEL (optional)\r\n#   - APP_SLACK_USERNAME (optional)\r\n#   - APP_SLACK_ICON_EMOJI (optional)\r\n# You may also declare them in ~\/.slackrc file.\r\n####################################################################################\r\n\r\nset -o pipefail\r\nset -o errexit\r\nset -o nounset\r\n#set -o xtrace\r\n\r\ninit_params() {\r\n  # you may declare ENV vars in \/etc\/profile.d\/slack.sh\r\n  if [ -z &quot;${APP_SLACK_WEBHOOK:-}&quot; ]; then\r\n    echo 'error: Please configure Slack environment variable: ' &gt; \/dev\/stderr\r\n    echo '  APP_SLACK_WEBHOOK' &gt; \/dev\/stderr\r\n    exit 2\r\n  fi\r\n\r\n  APP_SLACK_USERNAME=${APP_SLACK_USERNAME:-$(hostname | cut --delimiter=. --fields=1)}\r\n  APP_SLACK_ICON_EMOJI=${APP_SLACK_ICON_EMOJI:-:slack:}\r\n  if [ -z &quot;${1:-}&quot; ]; then\r\n    echo 'error: Missed required arguments.' &gt; \/dev\/stderr\r\n    echo 'note: Please follow this example:' &gt; \/dev\/stderr\r\n    echo '  $ slack.sh &quot;#CHANNEL1,CHANNEL2&quot; Some message here. ' &gt; \/dev\/stderr\r\n    exit 3\r\n  fi\r\n\r\n  slack_channels=(${APP_SLACK_CHANNEL:-})\r\n  if [ &quot;${1::1}&quot; == '#' ] || [ &quot;${1::1}&quot; == '@' ]; then\r\n    # explode by comma\r\n    IFS=',' read -r -a slack_channels &lt;&lt;&lt; &quot;${1}&quot;\r\n    shift\r\n  fi\r\n  slack_message=${@}\r\n}\r\n\r\n\r\nsend_message() {\r\n  local channel=${1}\r\n  echo 'Sending to '${channel}'...'\r\n  curl --silent --data-urlencode \\\r\n    &quot;$(printf 'payload={&quot;text&quot;: &quot;%s&quot;, &quot;channel&quot;: &quot;%s&quot;, &quot;username&quot;: &quot;%s&quot;, &quot;as_user&quot;: &quot;true&quot;, &quot;link_names&quot;: &quot;true&quot;, &quot;icon_emoji&quot;: &quot;%s&quot; }' \\\r\n        &quot;${slack_message}&quot; \\\r\n        &quot;${channel}&quot; \\\r\n        &quot;${APP_SLACK_USERNAME}&quot; \\\r\n        &quot;${APP_SLACK_ICON_EMOJI}&quot; \\\r\n    )&quot; \\\r\n    ${APP_SLACK_WEBHOOK} || true\r\n  echo\r\n}\r\n\r\nsend_message_to_channels() {\r\n  for channel in &quot;${slack_channels[@]:-}&quot;; do\r\n    send_message &quot;${channel}&quot;\r\n  done\r\n}\r\n\r\nslack() {\r\n  # Set magic variables for current file &amp; dir\r\n  __dir=&quot;$(cd &quot;$(dirname &quot;${BASH_SOURCE[0]}&quot;)&quot; &amp;&amp; pwd)&quot;\r\n  __file=&quot;${__dir}\/$(basename &quot;${BASH_SOURCE[0]}&quot;)&quot;\r\n  readonly __dir __file\r\n\r\n  cd ${__dir}\r\n\r\n  if [ -f $(cd; pwd)\/.slackrc ]; then\r\n    . $(cd; pwd)\/.slackrc\r\n  fi\r\n\r\n  declare -a slack_channels\r\n\r\n  init_params ${@}\r\n  send_message_to_channels\r\n}\r\n\r\nif [ &quot;${BASH_SOURCE[0]:-}&quot; != &quot;${0}&quot; ]; then\r\n  export -f slack\r\nelse\r\n  slack ${@}\r\n  exit $?\r\nfi\r\n<\/pre>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 <strong>WordPress<\/strong> &quot;\u0441\u044a\u0435\u043b&quot; \u043a\u0430\u0432\u044b\u0447\u043a\u0438, \u0432\u043e\u0442 <a href=\"https:\/\/artem.services\/wp-content\/uploads\/2018\/12\/slack.zip\">ZIP \u0430\u0440\u0445\u0438\u0432<\/a>.<\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvim ~\/.slackrc\r\n<\/pre>\n<p>\u0418 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nAPP_SLACK_WEBHOOK=https:\/\/hooks.slack.com\/services\/AAAAAAAAA\/BBBBBBBBB\/CCCCCCCCCCCCCCCCCCCCCCCC\r\nAPP_SLACK_USERNAME=$(hostname)\r\n<\/pre>\n<blockquote><p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <strong>webhook<\/strong>&#39;\u0443 \u043d\u0430 \u0441\u0432\u043e\u044e<\/p><\/blockquote>\n<p>&quot;<strong>APP_SLACK_USERNAME<\/strong>&quot; &#8212; \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nslack Hello!\r\nSending to ...\r\nok\r\n<\/pre>\n<p>\u0418 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 <strong>Slack<\/strong>&#39;\u0435:<\/p>\n<p><img loading=\"lazy\" class=\"size-full wp-image-357 aligncenter\" src=\"https:\/\/artem.services\/wp-content\/uploads\/2018\/12\/slack-notify-screenshot.png\" alt=\"\" width=\"751\" height=\"139\" srcset=\"https:\/\/artem.services\/wp-content\/uploads\/2018\/12\/slack-notify-screenshot.png 751w, https:\/\/artem.services\/wp-content\/uploads\/2018\/12\/slack-notify-screenshot-300x56.png 300w\" sizes=\"(max-width: 751px) 100vw, 751px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442\u0443 webhook&#39;\u0438, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: https:\/\/YOU_ORGANIZATION_NAME.slack.com\/services\/new\/incoming-webhook \u0413\u0434\u0435 &quot;YOU_ORGANIZATION_NAME&quot; \u0438\u043c\u044f \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Slack&#39;\u0435 \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442: curl -s https:\/\/gist.githubusercontent.com\/andkirby\/67a774513215d7ba06384186dd441d9e\/raw &#8212;output \/usr\/bin\/slack \u0410\u0432\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430: andkirby<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[89,103,66],"_links":{"self":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/356"}],"collection":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=356"}],"version-history":[{"count":4,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/356\/revisions"}],"predecessor-version":[{"id":411,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/356\/revisions\/411"}],"wp:attachment":[{"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=356"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}