Compare commits

...

3 Commits

Author SHA1 Message Date
6c546ebb6f v3.1.0
=====================================================================

--- Changes ------------------------------

- improved capability of py/discord/post-message to include username
  flag, and defaults for each value in env config
2023-06-24 07:40:31 -06:00
9783119a7d v3.0.2
=====================================================================

--- Bug fixes ----------------------------

- interactive scripts work again

- color works on zx again
2023-06-22 17:58:55 -06:00
a94d6bc197 v3.0.1
=====================================================================

--- Bug fixes ----------------------------

- fixed variable reference in media-sync

- fixed bug with multi-line list environment variables sometimes gets
  appended to a previous variable line
2023-06-22 15:48:57 -06:00
8 changed files with 64 additions and 32 deletions

View File

@ -3,18 +3,22 @@ export AWS_ACCOUNT=
export AWS_PROFILE= export AWS_PROFILE=
export AWS_REGION= export AWS_REGION=
export AWS__EFS__LOCAL_MOUNT_POINT= export AWS__EFS__LOCAL_MOUNT_POINT=
export AWS__S3__MEDIA_BUCKET=
export AWS__S3__MEDIA_TARGETS=
export DIRECTUS__API_TOKEN= export DIRECTUS__API_TOKEN=
export DIRECTUS__BASE_URL= export DIRECTUS__BASE_URL=
export DISCORD__BOT_TOKEN= export DISCORD__BOT_TOKEN=
export DISCORD__CONTENT_FOOTER=
export DISCORD__CONTENT_HEADER=
export DISCORD__DEFAULT_AVATAR_URL= export DISCORD__DEFAULT_AVATAR_URL=
export DISCORD__DEFAULT_CHANNEL_ID= export DISCORD__DEFAULT_CHANNEL_ID=
export DISCORD__DEFAULT_USERNAME=
export DISCORD__DEFAULT_WEBHOOK=
export I3__BORDER_PIXEL_SIZE= export I3__BORDER_PIXEL_SIZE=
export I3__DMENU_FONT_SIZE= export I3__DMENU_FONT_SIZE=
export I3__GLOBAL_FONT_SIZE= export I3__GLOBAL_FONT_SIZE=
export I3__MODEL_CONFIG= export I3__MODEL_CONFIG=
export LINEAR__API_TOKEN= export LINEAR__API_TOKEN=
export MEDIA_SYNC__S3_BUCKET
export MEDIA_SYNC__TARGETS
export REDIS_AUTH= export REDIS_AUTH=
export REDIS_HOST= export REDIS_HOST=
export REDIS_PORT= export REDIS_PORT=

View File

@ -4,15 +4,16 @@ AWS_REGION |
AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive
AWS__S3__MEDIA_BUCKET | s3 bucket name and filesystem targets for media backups
AWS__S3__MEDIA_TARGETS |
DIRECTUS__API_TOKEN | details for a directus instance DIRECTUS__API_TOKEN | details for a directus instance
DIRECTUS__BASE_URL | DIRECTUS__BASE_URL |
DISCORD__BOT_TOKEN | details for discord bot DISCORD__BOT_TOKEN | details for discord bot
DISCORD__CONTENT_HEADER |
DISCORD__CONTENT_FOOTER |
DISCORD__DEFAULT_AVATAR_URL | DISCORD__DEFAULT_AVATAR_URL |
DISCORD__DEFAULT_CHANNEL_ID | DISCORD__DEFAULT_CHANNEL_ID |
DISCORD__DEFAULT_USERNAME |
DISCORD__DEFAULT_WEBHOOK |
I3__BORDER_PIXEL_SIZE | custom i3 configuration settings I3__BORDER_PIXEL_SIZE | custom i3 configuration settings
I3__DMENU_FONT_SIZE | I3__DMENU_FONT_SIZE |
@ -21,6 +22,9 @@ I3__MODEL_CONFIG |
LINEAR__API_TOKEN | linear.app project management configuration LINEAR__API_TOKEN | linear.app project management configuration
MEDIA_SYNC__S3_BUCKET | s3 bucket name and filesystem targets for media backups
MEDIA_SYNC__TARGETS |
REDIS_AUTH | redis connection credentials REDIS_AUTH | redis connection credentials
REDIS_HOST | REDIS_HOST |
REDIS_PORT | REDIS_PORT |

View File

@ -13,19 +13,14 @@ if __name__ != '__main__':
##################################################################### #####################################################################
def main(args, stream): def main(args, stream):
if args.body is None: if args.content is None:
print(f'reading input from {stream.input.name}', file=stderr) print(f'reading input from {stream.input.name}', file=stderr)
args.body = ''.join(stream.readlines()).strip() args.content = ''.join(stream.readlines()).strip()
if len(args.body) == 0: if len(args.content) == 0:
args.body = 'PING' args.content = 'PING'
response = discord.send_message( response = discord.send_message(**vars(args))
content = args.body,
channel_id = args.channel_id,
webhook = args.webhook,
avatar_url = args.avatar_url,
)
stream.writeline(dumps({ stream.writeline(dumps({
**(response.json() if response.text != '' else {'message': 'OK'}), **(response.json() if response.text != '' else {'message': 'OK'}),
@ -38,23 +33,28 @@ execute(main,
description = 'post a message to the indicated discord channel', description = 'post a message to the indicated discord channel',
parse_args = [ parse_args = [
( ['-b', '--body'], { ( ['-b', '--body'], {
'dest' : 'body', 'dest' : 'content',
'help' : 'message body', 'help' : 'message body',
'required' : False, 'required' : False,
}), }),
( ['-c', '--channel-id'], { ( ['-c', '--channel-id'], {
'dest' : 'channel_id', 'dest' : 'channel_id',
'help' : 'target channel id', 'help' : 'override default target channel id',
'required' : False, 'required' : False,
}), }),
( ['-w', '--webhook'], { ( ['-w', '--webhook'], {
'dest' : 'webhook', 'dest' : 'webhook',
'help' : 'target webhook (takes precedence over -c)', 'help' : 'override default target webhook (takes precedence over -c)',
'required' : False, 'required' : False,
}), }),
( ['--avatar-url'], { ( ['--avatar-url'], {
'dest' : 'avatar_url', 'dest' : 'avatar_url',
'help' : 'replace default avatar_url', 'help' : 'override default avatar_url',
'required' : False,
}),
( ['--username'], {
'dest' : 'username',
'help' : 'override default username',
'required' : False, 'required' : False,
}), }),
] ]

View File

@ -1,9 +1,9 @@
from py.lib.scwrypts import getenv from py.lib.scwrypts import getenv
from py.lib.http.discord import request from py.lib.http.discord import request
def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwargs): def send_message(content, channel_id=None, webhook=None, username=None, avatar_url=None, **kwargs):
if channel_id is None: if username is None:
channel_id = getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False) username = getenv('DISCORD__DEFAULT_USERNAME', required=False)
if avatar_url is None: if avatar_url is None:
avatar_url = getenv('DISCORD__DEFAULT_AVATAR_URL', required=False) avatar_url = getenv('DISCORD__DEFAULT_AVATAR_URL', required=False)
@ -12,11 +12,25 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
if webhook is not None: if webhook is not None:
endpoint = f'webhooks/{webhook}' endpoint = f'webhooks/{webhook}'
elif channel_id is not None: elif channel_id is not None:
endpoint = f'channels/{channel_id}/messages' endpoint = f'channels/{channel_id}/messages'
elif (webhook := getenv('DISCORD__DEFAULT_WEBHOOK', required=False)) is not None:
endpoint = f'webhooks/{webhook}'
elif (channel_id := getenv('DISCORD__DEFAULT_CHANNEL_ID', required=False)) is not None:
endpoint = f'channels/{channel_id}/messages'
else: else:
raise ValueError('must provide target channel_id or webhook') raise ValueError('must provide target channel_id or webhook')
if (header := getenv('DISCORD__CONTENT_HEADER', required=False)) is not None:
content = f'{header}{content}'
if (footer := getenv('DISCORD__CONTENT_FOOTER', required=False)) is not None:
content = f'{content}{footer}'
return request( return request(
method = 'POST', method = 'POST',
@ -25,7 +39,7 @@ def send_message(content, channel_id=None, webhook=None, avatar_url=None, **kwar
key: value key: value
for key, value in { for key, value in {
'content': content, 'content': content,
'username': 'wrobot', 'username': username,
'avatar_url': avatar_url, 'avatar_url': avatar_url,
**kwargs, **kwargs,
}.items() }.items()

15
run
View File

@ -217,6 +217,11 @@ __RUN() {
export ENV_NAME export ENV_NAME
} }
for f in $(eval 'echo $SCWRYPTS_STATIC_CONFIG__'$SCWRYPT_GROUP)
do
source "$f" || FAIL 5 "invalid static config '$f'"
done
########################################## ##########################################
[ ! $SUBSCWRYPT ] \ [ ! $SUBSCWRYPT ] \
@ -230,7 +235,7 @@ __RUN() {
########################################## ##########################################
local LOGFILE=$(__GET_LOGFILE $SCRIPT) local LOGFILE=$(__GET_LOGFILE)
local HEADER=$( local HEADER=$(
[ $SUBSCWRYPT ] && return 0 [ $SUBSCWRYPT ] && return 0
@ -303,13 +308,13 @@ __VALIDATE_UPSTREAM_TIMELINE() {
} }
__GET_LOGFILE() { __GET_LOGFILE() {
local SCRIPT="$1"
[ $SUBSCWRYPT ] \ [ $SUBSCWRYPT ] \
|| [[ $SCRIPT =~ scwrypts/logs ]] \ || [[ $SCWRYPT_NAME =~ scwrypts/logs ]] \
|| [[ $SCRIPT =~ interactive ]] \ || [[ $SCWRYPT_NAME =~ interactive ]] \
&& return 0 && return 0
echo 'gets a logfile' >&2
echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log" echo "$SCWRYPTS_LOG_PATH/$(echo $GROUP/$TYPE/$NAME | sed 's/^\.\///; s/\//\%/g').log"
} }

View File

@ -116,5 +116,5 @@ SCWRYPTS__GET_RUNSTRING__py() {
SCWRYPTS__GET_RUNSTRING__zx() { SCWRYPTS__GET_RUNSTRING__zx() {
__CHECK_DEPENDENCY zx || return 1 __CHECK_DEPENDENCY zx || return 1
echo "FORCE_COLOR=3; cd $GROUP_PATH; ./$TYPE/$NAME.js" echo "export FORCE_COLOR=3; cd $GROUP_PATH; ./$TYPE/$NAME.js"
} }

View File

@ -49,7 +49,7 @@ UPDATE_VIRTUALENV() {
cd $SCWRYPTS_ROOT cd $SCWRYPTS_ROOT
local UPDATE_CODE=0 local UPDATE_CODE=0
case $TYPE in case $TYPE in
py ) cd py; pip install -r requirements.txt; UPDATE_CODE=$? ;; py ) cd py; pip install --no-cache-dir -r requirements.txt; UPDATE_CODE=$? ;;
zx ) cd zx; npm install ;; zx ) cd zx; npm install ;;
esac esac
UPDATE_CODE=$? UPDATE_CODE=$?
@ -83,7 +83,11 @@ DELETE_VIRTUALENV() {
GET_VIRTUALENV_PATH() { GET_VIRTUALENV_PATH() {
local GROUP="$1" local GROUP="$1"
local TYPE="$2" local TYPE="$2"
eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP/$TYPE
local ENV_PATH="$(eval echo '$SCWRYPTS_VIRTUALENV_PATH__'$GROUP 2>/dev/null)"
[ ! $ENV_PATH ] && ENV_PATH="$SCWRYPTS_VIRTUALENV_PATH__scwrypts"
echo $ENV_PATH/$TYPE
} }
##################################################################### #####################################################################

View File

@ -119,7 +119,7 @@ ADD_LINES() {
do do
VARIABLE=$(echo $LINE | sed 's/=.*$//') VARIABLE=$(echo $LINE | sed 's/=.*$//')
echo $CONTENT | grep -qi "^$VARIABLE" || { echo $CONTENT | grep -qi "^$VARIABLE" || {
echo $LINE | grep -qi '__[a-z_]\+=' || { echo $LINE | grep -q '__[a-z_]\+=' || {
WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//') WARNING "skipping variable $(echo $LINE | sed 's/^export //; s/=.*//')
(must be included in a template before it can be added)" (must be included in a template before it can be added)"
continue continue
@ -142,6 +142,7 @@ READ_POPULATED_VARIABLES() {
| awk '/^[^=]+$/{printf "%s_____",$0;next}7' \ | awk '/^[^=]+$/{printf "%s_____",$0;next}7' \
| sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \ | sed 's/\(_____\)\(export\)/\1\n\2/; s/\(_____\)$/\1\n/' \
| sed 's/^.*_____.*$/_____&/' \ | sed 's/^.*_____.*$/_____&/' \
| sed 's/^_____export/export/' \
| sed -z 's/[\n | sed -z 's/[\n
] *_____/_____/g' \ ] *_____/_____/g' \
| grep -v '^$' \ | grep -v '^$' \