From dc9b23333ac60992feb5606399a987e0dab42637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 14:35:01 +0100 Subject: [PATCH 1/6] Better fzy --- .gitmodules | 3 + nvim/spell/ltex.dictionary.en-GB.txt | 1 + zsh/.zshrc | 96 ++++++++++++++++++++-------- zsh/powerlevel10k | 2 +- zsh/zsh-quiet-accept-line | 1 + zsh/zsh-vi-mode | 2 +- 6 files changed, 75 insertions(+), 30 deletions(-) create mode 160000 zsh/zsh-quiet-accept-line diff --git a/.gitmodules b/.gitmodules index 09e2591..b5ce4c1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "zsh/zsh-vi-mode"] path = zsh/zsh-vi-mode url = https://github.com/jeffreytse/zsh-vi-mode.git +[submodule "zsh/zsh-quiet-accept-line"] + path = zsh/zsh-quiet-accept-line + url = git@github.com:AdrieanKhisbe/zsh-quiet-accept-line.git diff --git a/nvim/spell/ltex.dictionary.en-GB.txt b/nvim/spell/ltex.dictionary.en-GB.txt index bcc22c4..1bf0d2c 100644 --- a/nvim/spell/ltex.dictionary.en-GB.txt +++ b/nvim/spell/ltex.dictionary.en-GB.txt @@ -6,3 +6,4 @@ Feywild closeby ECML theshold-based +distill diff --git a/zsh/.zshrc b/zsh/.zshrc index d702444..6f65304 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -87,36 +87,76 @@ function zvm_after_init() { source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh fi - # Use FZY instead of FZF for ctrl-t - function find_files() { - zle -I - PATHS="" - if [ -d ~/.dotfiles ]; then - PATHS="$PATHS\n$(fd . ~/.dotfiles -t d -d 1)" + source "$XDG_CONFIG_HOME/zsh/zsh-quiet-accept-line/quiet-accept-line.plugin.zsh" + function cd_to() { + setopt localoptions pipefail no_aliases 2> /dev/null + local dir=$1 + if [[ -z "$dir" ]]; then + zle redisplay + return 0 fi - if [ -d ~/Workspace ]; then - PATHS="$PATHS\n$(fd . ~/Workspace -t d -d 5)" - fi - if [ -d ~/Containers ]; then - PATHS="$PATHS\n$(fd . ~/Containers -t d -d 2)" - fi - if [ -d ~/Storage/Shared ]; then - PATHS="$PATHS\n~/Storage/Shared" - PATHS="$PATHS\n$(fd . ~/Storage/Shared -t d -d 2)" - fi - if [ -d ~/Storage/Thomas ]; then - PATHS="$PATHS\n~/Storage/Thomas" - PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 1)" - fi - BUFFER=cd "$(echo $PATHS | fzy -l 20)" - zle accept-line - clear + zle push-line # Clear buffer. Auto-restored on next prompt. + BUFFER="cd ${(q)dir}" + zle quiet-accept-line + local ret=$? + unset dir # ensure this doesn't end up appearing in prompt expansion + zle reset-prompt + return $ret } - zle -N find_files - bindkey "^T" find_files - bindkey -M emacs "^T" find_files - bindkey -M vicmd "^T" find_files - bindkey -M viins "^T" find_files + + # Use FZY instead of FZF for ctrl-t + function find_global_files() { + zle -I + FZY_CACHE=~/.cache/fzy_paths + if [ -f $FZY_CACHE ]; then + # Check if cache is older than 1 day + if [ $(($(date +%s) - $(date -r $FZY_CACHE +%s))) -gt 86400 ]; then + rm $FZY_CACHE + fi + fi + if [ ! -f $FZY_CACHE ]; then + PATHS="" + if [ -d ~/.dotfiles ]; then + PATHS="$PATHS\n$(fd . ~/.dotfiles -t d -d 2)" + fi + if [ -d ~/Workspace ]; then + PATHS="$PATHS\n$(fd . ~/Workspace -t d -d 8)" + fi + if [ -d ~/Containers ]; then + PATHS="$PATHS\n$(fd . ~/Containers -t d -d 2)" + fi + if [ -d ~/Storage/Shared ]; then + PATHS="$PATHS\n~/Storage/Shared" + PATHS="$PATHS\n$(fd . ~/Storage/Shared -t d -d 2)" + fi + if [ -d ~/Storage/Thomas ]; then + PATHS="$PATHS\n~/Storage/Thomas" + PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 1)" + fi + echo -e $PATHS > $FZY_CACHE + fi + cd_to "$(cat $FZY_CACHE | fzy -l 20)" + zle accept-line + } + + function find_local_files() { + zle -I + cd_to "$(fd . -t d | fzy -l 20)" + zle accept-line + } + + zle -N find_global_files + zle -N find_local_files + + bindkey "^T" find_global_files + bindkey -M emacs "^T" find_global_files + bindkey -M vicmd "^T" find_global_files + bindkey -M viins "^T" find_global_files + + bindkey "^Y" find_local_files + bindkey -M emacs "^Y" find_local_files + bindkey -M vicmd "^Y" find_local_files + bindkey -M viins "^Y" find_local_files } zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' diff --git a/zsh/powerlevel10k b/zsh/powerlevel10k index 307bce2..da9b037 160000 --- a/zsh/powerlevel10k +++ b/zsh/powerlevel10k @@ -1 +1 @@ -Subproject commit 307bce24d19fa09d971a0d33c39f3c9fda82924e +Subproject commit da9b03777c4f2390c7e3f5c720ee4689336f811b diff --git a/zsh/zsh-quiet-accept-line b/zsh/zsh-quiet-accept-line new file mode 160000 index 0000000..2081e8b --- /dev/null +++ b/zsh/zsh-quiet-accept-line @@ -0,0 +1 @@ +Subproject commit 2081e8b394a605d3b776c4318cf77b4f067dc4a8 diff --git a/zsh/zsh-vi-mode b/zsh/zsh-vi-mode index 1f28e18..7cf6fd1 160000 --- a/zsh/zsh-vi-mode +++ b/zsh/zsh-vi-mode @@ -1 +1 @@ -Subproject commit 1f28e1886dc8e49f41b817634d5c7695b6abb145 +Subproject commit 7cf6fd19cf2ab38ec5b116eced158377cb3c35f6 From 1ede5c79e0b533817967859eb9d853fd6886ec48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 14:38:07 +0100 Subject: [PATCH 2/6] Remove quiet accept line again --- .gitmodules | 3 --- zsh/.zshrc | 4 +--- zsh/zsh-quiet-accept-line | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) delete mode 160000 zsh/zsh-quiet-accept-line diff --git a/.gitmodules b/.gitmodules index b5ce4c1..09e2591 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,6 +13,3 @@ [submodule "zsh/zsh-vi-mode"] path = zsh/zsh-vi-mode url = https://github.com/jeffreytse/zsh-vi-mode.git -[submodule "zsh/zsh-quiet-accept-line"] - path = zsh/zsh-quiet-accept-line - url = git@github.com:AdrieanKhisbe/zsh-quiet-accept-line.git diff --git a/zsh/.zshrc b/zsh/.zshrc index 6f65304..eebd224 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -97,7 +97,7 @@ function zvm_after_init() { fi zle push-line # Clear buffer. Auto-restored on next prompt. BUFFER="cd ${(q)dir}" - zle quiet-accept-line + zle accept-line local ret=$? unset dir # ensure this doesn't end up appearing in prompt expansion zle reset-prompt @@ -136,13 +136,11 @@ function zvm_after_init() { echo -e $PATHS > $FZY_CACHE fi cd_to "$(cat $FZY_CACHE | fzy -l 20)" - zle accept-line } function find_local_files() { zle -I cd_to "$(fd . -t d | fzy -l 20)" - zle accept-line } zle -N find_global_files diff --git a/zsh/zsh-quiet-accept-line b/zsh/zsh-quiet-accept-line deleted file mode 160000 index 2081e8b..0000000 --- a/zsh/zsh-quiet-accept-line +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2081e8b394a605d3b776c4318cf77b4f067dc4a8 From 811f919fdcbb2f0310d529098ef6b7f4cf3db254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 14:45:33 +0100 Subject: [PATCH 3/6] Even better fzy --- zsh/.zshrc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/zsh/.zshrc b/zsh/.zshrc index eebd224..f527039 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -87,7 +87,6 @@ function zvm_after_init() { source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh fi - source "$XDG_CONFIG_HOME/zsh/zsh-quiet-accept-line/quiet-accept-line.plugin.zsh" function cd_to() { setopt localoptions pipefail no_aliases 2> /dev/null local dir=$1 @@ -96,12 +95,11 @@ function zvm_after_init() { return 0 fi zle push-line # Clear buffer. Auto-restored on next prompt. - BUFFER="cd ${(q)dir}" + cd $dir zle accept-line local ret=$? unset dir # ensure this doesn't end up appearing in prompt expansion zle reset-prompt - return $ret } # Use FZY instead of FZF for ctrl-t From d3c0b3d9f99515d9e13a386408027d883e059b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 14:54:33 +0100 Subject: [PATCH 4/6] Add secrets to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1ae03bd..2bc2328 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .zcompdump* mpv/watch_later .luarc.json +zsh/secrets.sh From d85180553475721a94676e48f39d5ae306b44d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 15:12:05 +0100 Subject: [PATCH 5/6] Add backup scripts --- scripts/backup.sh | 189 ++++++++++++++++++++++++++++++++++++++++++ scripts/sync_vault.sh | 21 +++++ zsh/.zshrc | 6 +- 3 files changed, 213 insertions(+), 3 deletions(-) create mode 100755 scripts/backup.sh create mode 100755 scripts/sync_vault.sh diff --git a/scripts/backup.sh b/scripts/backup.sh new file mode 100755 index 0000000..44cc526 --- /dev/null +++ b/scripts/backup.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +########################################## +# Tokens # +########################################## + +set -o pipefail +source "$XDG_CONFIG_HOME"/zsh/secrets.sh +export XDG_RUNTIME_DIR=/run/user/1000 + +########################################## +# Create sqlite3 backup for Vaultwarden # +########################################## + +rm /home/server/Containers/pw.thomasave.be/data/backup.sqlite3 /home/server/Containers/robbertave.com/data/backup.sqlite3 +sqlite3 /home/server/Containers/pw.thomasave.be/data/db.sqlite3 "VACUUM INTO '/home/server/Containers/pw.thomasave.be/data/backup.sqlite3'" +sqlite3 /home/server/Containers/robbertave.com/data/database.sqlite "VACUUM INTO '/home/server/Containers/robbertave.com/data/backup.sqlite3'" + +########################################## +# Unlock the Vault # +########################################## + +echo "$ZFS_PASSPHRASE" | ssh vault /home/server/Storage/Thomas/Scripts/Mount/borg_unlock.sh + +########################################## +# Run the backups # +########################################## + +echo -e '\n\n\n' +echo "Running Caddy Backups" +borg create -s --progress \ + --exclude /home/server/Containers/Caddy/Data\ + 10.4.0.1:Storage/Thomas/Borg/Containers/caddy::'{hostname}-{now}' \ + /home/server/Containers/Caddy\ + +echo -e '\n\n\n' +echo "Running git.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + 10.4.0.1:Storage/Thomas/Borg/Containers/git.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/git.thomasave.be + +echo -e '\n\n\n' +echo "Running pw.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + 10.4.0.1:Storage/Thomas/Borg/Containers/pw.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be + +echo -e '\n\n\n' +echo "Running stats.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/stats.thomasave.be/logs \ + 10.4.0.1:Storage/Thomas/Borg/Containers/stats.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/stats.thomasave.be + +echo -e '\n\n\n' +echo "Running robbertave.com Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/robbertave.com::'{hostname}-{now}' \ + /home/server/Containers/robbertave.com + +echo -e '\n\n\n' +echo "Running DNS Backups" +borg create -s --progress \ + --exclude /home/server/Containers/adguard.thomasave.be/work \ + 10.4.0.1:Storage/Thomas/Borg/Adguard::'{hostname}-{now}' \ + /home/server/Containers/adguard.thomasave.be + +echo -e '\n\n\n' +echo "Running Workspace Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Workspace::'{hostname}-{now}' \ + /home/server/Workspace/ +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Workspace +borg compact 10.4.0.1:Storage/Thomas/Borg/Workspace + +echo -e '\n\n\n' +echo "Running photos.thomasave.be Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/photos.thomasave.be +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be +borg compact 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be + + +echo -e '\n\n\n' +echo "Running Authentik Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/auth.thomasave.be::'{now:%Y-%m-%d}' \ + /home/server/Containers/auth.thomasave.be + + +echo -e '\n\n\n' +echo "Running Yolande Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Yolande::'{hostname}-{now}' \ + /home/server/Storage/Yolande +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Yolande +borg compact 10.4.0.1:Storage/Thomas/Borg/Yolande + + +echo -e '\n\n\n' +echo "Running Thomas Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Thomas::'{hostname}-{now}' \ + /home/server/Storage/Thomas/Documents \ + /home/server/Storage/Thomas/Pictures \ + /home/server/Storage/Thomas/Videos \ + /home/server/Storage/Thomas/Crypt +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Thomas +borg compact 10.4.0.1:Storage/Thomas/Borg/Thomas + + +echo -e '\n\n\n' +echo "Running Niels Backups" +borg create -s --progress \ + --exclude /home/server/Storage/Niels/Backups \ + 10.4.0.1:Storage/Thomas/Borg/Niels::'{now:%Y-%m-%d}' \ + /home/server/Storage/Niels/ +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --save-space 10.4.0.1:Storage/Thomas/Borg/Niels +borg compact 10.4.0.1:Storage/Thomas/Borg/Niels + + +# echo -e '\n\n\n' +# echo "Running Experiment Backups" +# borg create -s --progress \ +# 10.4.0.1:Storage/Thomas/Borg/Containers/exp.thomasave.be::'{hostname}-{now}' \ +# /home/server/Workspace/Experiments/Backend/data/ + +########################################## +# Perpare Cloud Backup # +########################################## + +echo -e '\n\n\n' +echo "Peparing cloud backup" + +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/Caddy/Data\ + 10.4.0.1:Storage/Thomas/Borg/Cloud::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be\ + /home/server/Containers/robbertave.com\ + /home/server/Containers/auth.thomasave.be\ + /home/server/Containers/git.thomasave.be\ + /home/server/Containers/Boaty \ + /home/server/Containers/Caddy \ + +borg prune -d 365 --save-space 10.4.0.1:Storage/Thomas/Borg/Cloud +borg compact 10.4.0.1:Storage/Thomas/Borg/Cloud +ssh vault /home/server/Storage/Thomas/Borg/Sync.sh + +########################################## +# Lock the Vault # +########################################## + +ssh vault /home/server/Storage/Thomas/Scripts/Mount/borg_lock.sh + +########################################## +# Backups to Oracle Cloud # +########################################## + +echo "Running Oracle Cloud Backup, containing Vaultwarden, robbertave.com, git.thomasave.be, Boaty, Stats, Caddy, and Niels." + +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/stats.thomasave.be/logs \ + --exclude /home/server/Containers/Caddy/Data\ + --exclude /home/server/Storage/Niels/Backups \ + ubuntu@10.0.0.6:~/Backups/Borg::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be\ + /home/server/Containers/robbertave.com\ + /home/server/Containers/git.thomasave.be\ + /home/server/Containers/auth.thomasave.be\ + /home/server/Containers/Boaty \ + /home/server/Containers/Caddy \ + /home/server/Containers/stats.thomasave.be \ + /home/server/Storage/Niels \ diff --git a/scripts/sync_vault.sh b/scripts/sync_vault.sh new file mode 100755 index 0000000..0d02061 --- /dev/null +++ b/scripts/sync_vault.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +source "$XDG_CONFIG_HOME"/zsh/secrets.sh + +for _ in {1..2}; do + OUTPUT=$(echo "$ZFS_PASSPHRASE" | ssh 10.4.0.1 zfs load-key Vault/Thomas/Encrypted 2>&1); + if [ "$OUTPUT" == "Key load error: Key already loaded for 'Vault/Thomas/Encrypted'." ]; then + echo "Key successfully loaded, starting syncoid" + syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Thomas/Workspace 10.4.0.1:Vault/Thomas/Encrypted/Storage/Workspace + syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Thomas 10.4.0.1:Vault/Thomas/Encrypted/Storage/T + syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Niels 10.4.0.1:Vault/Thomas/Encrypted/Storage/N + syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Yolande 10.4.0.1:Vault/Thomas/Encrypted/Storage/Y + syncoid --no-privilege-elevation --no-sync-snap tank/Containers 10.4.0.1:Vault/Thomas/Encrypted/Containers + ssh 10.4.0.1 zfs unload-key Vault/Thomas/Encrypted + exit 0 + fi +done + +echo "Found output instead: $OUTPUT" +echo "Failed to load key: $OUTPUT" | sendmail +exit 1 diff --git a/zsh/.zshrc b/zsh/.zshrc index f527039..e4d0ffa 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -124,12 +124,12 @@ function zvm_after_init() { PATHS="$PATHS\n$(fd . ~/Containers -t d -d 2)" fi if [ -d ~/Storage/Shared ]; then - PATHS="$PATHS\n~/Storage/Shared" + PATHS="$PATHS\n/home/server/Storage/Shared" PATHS="$PATHS\n$(fd . ~/Storage/Shared -t d -d 2)" fi if [ -d ~/Storage/Thomas ]; then - PATHS="$PATHS\n~/Storage/Thomas" - PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 1)" + PATHS="$PATHS\n/home/server/Storage/Thomas" + PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 5)" fi echo -e $PATHS > $FZY_CACHE fi From 39ed323d3b57c658127b6877acb5fe4526c80214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Av=C3=A9?= Date: Sat, 30 Mar 2024 14:14:20 +0000 Subject: [PATCH 6/6] Add sendmail scripts --- scripts/sendmail | 2 ++ scripts/sendmailtelegram | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100755 scripts/sendmail create mode 100755 scripts/sendmailtelegram diff --git a/scripts/sendmail b/scripts/sendmail new file mode 100755 index 0000000..cc83c6e --- /dev/null +++ b/scripts/sendmail @@ -0,0 +1,2 @@ +#!/bin/sh +tee -a /home/server/mail.log | /usr/sbin/sendmailtelegram diff --git a/scripts/sendmailtelegram b/scripts/sendmailtelegram new file mode 100755 index 0000000..4ea0236 --- /dev/null +++ b/scripts/sendmailtelegram @@ -0,0 +1,18 @@ +#!/usr/bin/python3 +import telegram +import fileinput +import asyncio + +async def run(): + text = "Vault Etienne:\n\n" + for line in fileinput.input(): + text += line + + bot = telegram.Bot(token="381718873:AAElFmI2BDjumCehhWicuksE0vutrPSkoGA") + chat_id = 125754925 + await bot.send_message(chat_id, text) + +if __name__ == "__main__": + loop = asyncio.get_event_loop() + loop.run_until_complete(asyncio.wait([loop.create_task(run())])) + loop.close()