https://tailscale.com/kb/1017/install
I manually installed on fatdog from a decompressed linux package. I had already setup on my android using my github login. Just copying the two binaries into path without systemd service confs still worked fine. Start the daemon first then tailscale login ... (thereafter tailscale up), accept on your android or other pc, and your virtual private network is up. To use internet in another country you would need a device there on your tailscale network set as an exit node. ... tailscale doesn't seem to provide remote web browsing internet access per se. Just sharing.
TailScale - VPN
Moderators: kirk, jamesbond, p310don, JakeSFR, step, Forum moderators
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
TailScale - VPN
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
There are addons (paid) for other services. I paid $5/month for Mullvad VPN, to use as an exit node with selection of 46 countries each which cities and servers to choose from. Mullvad add-on is in beta, works on my android and windows laptop, but not fully working on linux! On linux cli "tailscale up --exit-node="au-wg-syd-002.mullvad.ts.net" that is mullvad exit node city name (which I got from windows). I got a blisteringly fast connection.
There is also taildrop, which lets you send files to other devices on your network using cli, for Android right click file and select share > tailscale .... in alpha, and works: I selected my fatdog laptop as the target, the files first upload to tailscale servers then in linux cli "tailscale file get /root/Downloads" then all the uploaded files are retrieved. To send from linux cli "tailscale file cp /root/somefile 100.10.111.97 ... the ip would be the target device which will be listed in your admin console. On android files are auto received to Downloads.
I requested a feature which is shared clipboard.
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
I have written a script for a tailscale chat app using taildrop file send and receive. Espeak function of cursor selected text. Persistent chat log. Translation of pre-sent text.... pre-alpha. Single click selects device, double click adds device for multiple send targets. Refresh devices re-initiates device list.
Updated 2024/10/09
Code: Select all
#!/bin/sh
# by stemsee
# Copyright (C) 2024 Marcos M Contant
#
META="$RANDOM"
mkdir -p /tmp/ts-chat-$META
track=/tmp/ts-chat-"$META"
export track
touch "$track"/device
touch "$track"/devices
export camino="$HOME"/.config/ts_chat
for dir in "$camino"/{chats,icons}
do
[[ ! -d "$dir" ]] && mkdir -p "$dir" 2>/dev/null
done
export iconpath="$camino/icons/"
export trans_cmnd='@bash -c "translatefn %1 %3"'
export send_cmnd='@bash -c "sendfn %2 %3"'
fkey=$(($RANDOM * $$))
export lpipe="$track/ts_chat.$RANDOM"
mkfifo "$lpipe"
export fpipe="$track/ts-chat.$RANDOM"
mkfifo "$fpipe"
exec 5<> ${lpipe}
exec 6<> ${fpipe}
# determine COPY/PASTE command
function x_clipfn {
if [ ! -z $(type -p xsel) ]; then
export CLIP="xsel -o -b "
elif [ ! -z $(type -p xclip) ]; then
export CLIP="xclip -o -p "
elif [ ! -z $(type -p clipit) ]; then
export CLIP="clipit -p "
fi
export OUT_CLIP=$(echo $CLIP | cut -f1 -d' ')
}; export -f x_clipfn
x_clipfn
function hashtext {
echo "$1"
}; export -f hashtext
export LANGUAGES="$TL!$(hashtext 'Afrikaans') - af!$(hashtext 'Albanian') - sq!$(hashtext 'Amharic') - am!$(hashtext 'Arabic') - ar!$(hashtext 'Armenian') - hy!$(hashtext 'Azerbaijani') - az!$(hashtext 'Basque') - eu!$(hashtext 'Belarusian') - be!$(hashtext 'Bengali') - bn!$(hashtext 'Bosnian') - bs!$(hashtext 'Bulgarian') - bg!$(hashtext 'Cantonese') - yue!$(hashtext 'Catalan') - ca!$(hashtext 'Cebuano') - ceb!$(hashtext 'Chichewa') - ny!$(hashtext 'Chinese(Simple)') - zh-CN!$(hashtext 'Chinese(Trad)') - zh-TW!$(hashtext 'Corsican') - co!$(hashtext 'Croatian') - hr!$(hashtext 'Czech') - cs!$(hashtext 'Danish') - da!$(hashtext 'Dutch') - nl!$(hashtext 'English') - en!$(hashtext 'Esperanto') - eo!$(hashtext 'Estonian') - et!$(hashtext 'Fijian') - fj!$(hashtext 'Filipino') - tl!$(hashtext 'Finnish') - fi!$(hashtext 'French') - fr!$(hashtext 'Frisian') - fy!$(hashtext 'Galician') - gl!$(hashtext 'Georgian') - ka!$(hashtext 'German') - de!$(hashtext 'Greek') - el!$(hashtext 'Gujarati') - gu!$(hashtext 'Haitian-Creole') - ht!$(hashtext 'Hausa') - ha!$(hashtext 'Hawaiian') - haw!$(hashtext 'Hebrew') - he!$(hashtext 'Hindi') - hi!$(hashtext 'Hmong') - hmn!$(hashtext 'Hmong-Daw') - mww!$(hashtext 'Hungarian') - hu!$(hashtext 'Icelandic') - is!$(hashtext 'Igbo') - ig!$(hashtext 'Indonesian') - id!$(hashtext 'Irish') - ga!$(hashtext 'Italian') - it!$(hashtext 'Japanese') - ja!$(hashtext 'Javanese') - jv!$(hashtext 'Kannada') - kn!$(hashtext 'Kazakh') - kk!$(hashtext 'Khmer') - km!$(hashtext 'Klingon') - tlh!$(hashtext 'Korean') - ko!$(hashtext 'Kurdish') - ku!$(hashtext 'Kyrgyz') - ky!$(hashtext 'Lao') - lo!$(hashtext 'Latin') - la!$(hashtext 'Latvian') - lv!$(hashtext 'Lithuanian') - lt!$(hashtext 'Luxembourgish') - lb!$(hashtext 'Macedonian') - mk!$(hashtext 'Malagasy') - mg!$(hashtext 'Malay') - ms!$(hashtext 'Malayalam') - ml!$(hashtext 'Maltese') - mt!$(hashtext 'Maori') - mi!$(hashtext 'Marathi') - mr!$(hashtext 'Mongolian') - mn!$(hashtext 'Myanmar') - my!$(hashtext 'Nepali') - ne!$(hashtext 'Norwegian') - no!$(hashtext 'Pashto') - ps!$(hashtext 'Persian') - fa!$(hashtext 'Polish') - pl!$(hashtext 'Portuguese') - pt!$(hashtext 'Punjabi') - pa!$(hashtext 'Queretaro-Otomi') - otq!$(hashtext 'Roman') - rm!$(hashtext 'Romanian') - ro!$(hashtext 'Russian') - ru!$(hashtext 'Samoan') - sm!$(hashtext 'Scots-Gaelic') - gd!$(hashtext 'Serbian(Cyr)') - sr-Cyrl!$(hashtext 'Serbian(Latin)') - sr-Latn!$(hashtext 'Sesotho') - st!$(hashtext 'Shona') - sn!$(hashtext 'Sindhi') - sd!$(hashtext 'Sinhala') - si!$(hashtext 'Slovak') - sk!$(hashtext 'Slovenian') - sl!$(hashtext 'Somali') - so!$(hashtext 'Spanish') - es!$(hashtext 'Sundanese') - su!$(hashtext 'Swahili') - sw!$(hashtext 'Swedish') - sv!$(hashtext 'Tahitian') - ty!$(hashtext 'Tajik') - tg!$(hashtext 'Tamil') - ta!$(hashtext 'Tatar') - tt!$(hashtext 'Telugu') - te!$(hashtext 'Thai') - th!$(hashtext 'Tongan') - to!$(hashtext 'Turkish') - tr!$(hashtext 'Udmurt') - udm!$(hashtext 'Ukrainian') - uk!$(hashtext 'Urdu') - ur!$(hashtext 'Uzbek') - uz!$(hashtext 'Vietnamese') - vi!$(hashtext 'Welsh') - cy!$(hashtext 'Xhosa') - xh!$(hashtext 'Yiddish') - yi!$(hashtext 'Yoruba') - yo!$(hashtext 'Yucatec-Maya') - yua!$(hashtext 'Zulu') - zu"
export ESPKLANG="$ETL!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!Language!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!Language!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!"
function translatefn { # sends text for translation
export TL=$(echo "$1" | awk '{print $NF}')
ENGINE="bing"
[[ ! -z "$2" ]] && export TTEXT="$2" || exit
T_TEXT=$(echo -e "$TTEXT" | trans -e "$ENGINE" -b -tl "$TL" --show-languages --no-ansi -brief)
T_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< "$T_TEXT")
[[ -f "$track"/espk ]] && espeak -a 50 -s 160 -p 50 -v "$TL" "$T_TEXT" &
[[ ! -z "$T_TEXT" ]] && printf "%s\n%s\n%s\n%s\n%s\n" "" "" "$T_TEXT" "" "" > "$fpipe"
}; export -f translatefn
function espeakfn {
if [[ ! -z $(type -p espeak) ]]; then
killall espeak 2>/dev/null
espeak -a 50 -s 160 -p 50 -v en-us "$($OUT_CLIP)" &
xsel<<<' '
fi
};export -f espeakfn
function devlstfn {
export DEVLST="$(tailscale status | grep -v -e mullvad -e '#')"
echo -e "$DEVLST" > "$track"/devices
echo -e '\f' > $lpipe
cat "$track"/devices | while read line
do
IP=$(echo "$line" | awk '{print $1}')
NICKNAME=$(echo "$line" | awk '{print $2}')
USER=$(echo "$line" | awk '{print $3}')
OS=$(echo "$line" | awk '{print $4}')
STATUS=$(echo "$line" | awk '{print $5}')
printf "%s\n%s\n%s\n%s\n%s\n%s" "$IP" "$NICKNAME" "$USER" "$OS" "$STATUS" >$lpipe
done
}; export -f devlstfn
devlstfn
export SELF="$(echo $DEVLST | head -n1 | cut -f1 -d' ')"
function receivefn {
tailscale file get /root/Downloads/tailscale
for i in $(ls /root/Downloads/tailscale/*_ts-chat.txt)
do
[[ -f "$i" ]] && cat "$i" >> "$camino"/chats/tschat.txt
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//" | tail -n40))
printf "%s\n%s\n%s\n%s\n%s\n" "" "$A_TEXT" "" "" "" > "$fpipe"
rm -f "$i" 2>/dev/null
done
}; export -f receivefn
function sendfn {
device="$(cat $track/device | cut -f1 -d' ')"
NM=$(grep "$device" "$track"/devices | awk '{print $2}')
echo -e "$SELF to $device $NM:\n$2" > "$camino"/chats/ts-chat.txt
echo -e "$SELF to $device $NM:\n$2" >> "$camino"/chats/tschat.txt
CHAT="$(cat $camino/chats/tschat.txt | tail -n40)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "" "$send_cmnd" "$trans_cmnd" > "$fpipe"
sleep 2 && xdotool key --repeat 22 Page_Down
while read line
do
dev="$(echo $line | cut -f1 -d' ')"
[ "$dev" != "$SELF" ] && tailscale file cp "$camino"/chats/"$SELF"_ts-chat.txt "$device":
done <"$track"/device
sleep 2
rm -f "$camino"/chats/"$SELF"_ts-chat.txt
}; export -f sendfn
function devicefn {
device=$(grep $1 "$track"/devices)
[[ $(echo "$1" | cut -f1 -d' ') != "$SELF" ]] && [[ -z $(grep "$1" "$track"/device) ]] && echo -e "$device" >> "$track"/device
};export -f devicefn
function doubleclickfn {
[[ $(echo "$1" | cut -f1 -d' ' | cut -f1 -d']') != "$SELF" ]] && [[ -z $(grep "$1" "$track"/device) ]] && echo -e "$1" >> "$track"/device
};export -f doubleclickfn
function load_chat {
[[ -f "$camino"/chats/tschat.txt ]] && CHAT="$(cat $camino/chats/tschat.txt)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "type here" "$send_cmnd" "${trans_cmnd}" > "$fpipe"
};export -f load_chat
echo -e '\f' >&5
echo -e '\f' >&6
[ -f "$camino"/chats/tschat.txt ] && CHAT="$(cat $camino/chats/tschat.txt | tail -n40)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "type here" "$send_cmnd" "${trans_cmnd}" > "$fpipe"
yad --plug="$fkey" --title="list" --select-action="bash -c \"devicefn "%s" \" " --search-column=1 --print-column=1 --columns=5 --tabnum=1 --listen --fontname="$FONTNAME" --list --column="$SELF":TXT --column=Nickname:TXT --column=User:TXT --column=OS:TXT --column=Status:TXT --dclick-action="bash -c \"doubleclickfn "%s" \" " <&5 &
yad --plug="$fkey" --title="form" --tail --tabnum=2 --listen --fontname="$FONTNAME" --focus-field=2 --enable-spell --homogenous --form --cycle-read --field="TL":CBE --field="<b>Chat Log:</b> $(hashtext 'Input / Paste')":TXT --field="<b>Input:</b> $(hashtext 'Input')":TXT --field="$(hashtext 'Send')!gtk-refresh!$(hashtext 'send to chat')":fbtn --field="$(hashtext 'Translate')!gtk-save!$(hashtext 'translate Chat')":fbtn <&6 &
yadu --key="$fkey" --title="$(hashtext 'tailscale chat')" --splitter=670 --window-icon="$iconpath/transtray.png" --image-on-top --geometry=1046x528+780+661 --image="$iconpath/tailscale.png" --width=1000 --height=400 --paned --tab=AB --tab=BA --orient=hori --buttons-layout=center --button="$(hashtext 'Receive Chats')!gtk-refresh!$(hashtext 'update chats'):bash -c 'receivefn'" --button="$(hashtext 'Load Entire Chat Log')!gtk-refresh!$(hashtext 'Load full Chat'):bash -c 'load_chat'" --button="$(hashtext 'Refresh Devices'):bash -c 'devlstfn'" --button="eSpeak Selected:bash -c 'espeakfn $CLIP'" --button="Exit:bash -c 'eval exec /tmp/close_$META'" &
devlstfn
echo -e "#!/bin/sh
sleep 0.3
echo 'quit' > $fpipe
echo 'quit' > $lpipe
rm -rf $track &
kill $loopid
rm -f /tmp/close_$META &
" > /tmp/close_"$META"
chmod 755 /tmp/close_"$META"
- Attachments
-
- xscreenshot-20241007T234959.png (107.11 KiB) Viewed 243 times
-
- xscreenshot-20241007T165255.png (154.92 KiB) Viewed 243 times
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
I am using Reader Era app on Android to read the text and then it has the function to make a note and share the note to tailscale. ... which acts as a reply.
Improved the script and added the facility to send a file just by dragging it to the input field (directories not supported), and sending as path and file.
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
There are a large number of apps on android suitable for viewing text messages ... I am now using Simple Text Editor, because I can save as, and rename files.
Between two linux machines the chats will be hopefully potentially less disjointed.
taildrop seems to have a minimum file size for transport, so i changed the script to send 20 or 40 lines of chat. Also added the reply header '$other to $self:' for ease of editing. $other and $self are now nicknames instead of ip addresses, just easier to remember.
Added save button for when editing the viewable chat. This backsup chat then recreates a chat with the edits in chat viewer.
Translate now works for input text or selected text.
Simple Text Editor defaults to saving text as newfile.txt - so script will look for that file name when receiving chats.
script update
Code: Select all
#!/bin/sh
# by stemsee
# Copyright (C) 2024 Marcos M Contant
#
version=0.3
META="$RANDOM"
mkdir -p /tmp/ts-chat-$META
track=/tmp/ts-chat-"$META"
export track
touch "$track"/device
touch "$track"/devices
export camino="$HOME"/.config/ts_chat
for dir in "$camino"/{chats,icons}
do
[[ ! -d "$dir" ]] && mkdir -p "$dir" 2>/dev/null
done
export iconpath="$camino/icons/"
export trans_cmnd='@bash -c "translatefn %1 %3"'
export send_cmnd='@bash -c "sendfn %2 %3"'
export save_cmnd='@bash -c "savefn %2"'
fkey=$(($RANDOM * $$))
export lpipe="$track/ts_chat.$RANDOM"
mkfifo "$lpipe"
export fpipe="$track/ts-chat.$RANDOM"
mkfifo "$fpipe"
exec 5<> ${lpipe}
exec 6<> ${fpipe}
# determine COPY/PASTE command
function x_clipfn {
if [ ! -z $(type -p xsel) ]; then
export CLIP="xsel -o -b "
elif [ ! -z $(type -p xclip) ]; then
export CLIP="xclip -o -p "
elif [ ! -z $(type -p clipit) ]; then
export CLIP="clipit -p "
fi
export OUT_CLIP=$(echo $CLIP | cut -f1 -d' ')
}; export -f x_clipfn
x_clipfn
function hashtext {
echo "$1"
}; export -f hashtext
export LANGUAGES="$TL!$(hashtext 'Afrikaans') - af!$(hashtext 'Albanian') - sq!$(hashtext 'Amharic') - am!$(hashtext 'Arabic') - ar!$(hashtext 'Armenian') - hy!$(hashtext 'Azerbaijani') - az!$(hashtext 'Basque') - eu!$(hashtext 'Belarusian') - be!$(hashtext 'Bengali') - bn!$(hashtext 'Bosnian') - bs!$(hashtext 'Bulgarian') - bg!$(hashtext 'Cantonese') - yue!$(hashtext 'Catalan') - ca!$(hashtext 'Cebuano') - ceb!$(hashtext 'Chichewa') - ny!$(hashtext 'Chinese(Simple)') - zh-CN!$(hashtext 'Chinese(Trad)') - zh-TW!$(hashtext 'Corsican') - co!$(hashtext 'Croatian') - hr!$(hashtext 'Czech') - cs!$(hashtext 'Danish') - da!$(hashtext 'Dutch') - nl!$(hashtext 'English') - en!$(hashtext 'Esperanto') - eo!$(hashtext 'Estonian') - et!$(hashtext 'Fijian') - fj!$(hashtext 'Filipino') - tl!$(hashtext 'Finnish') - fi!$(hashtext 'French') - fr!$(hashtext 'Frisian') - fy!$(hashtext 'Galician') - gl!$(hashtext 'Georgian') - ka!$(hashtext 'German') - de!$(hashtext 'Greek') - el!$(hashtext 'Gujarati') - gu!$(hashtext 'Haitian-Creole') - ht!$(hashtext 'Hausa') - ha!$(hashtext 'Hawaiian') - haw!$(hashtext 'Hebrew') - he!$(hashtext 'Hindi') - hi!$(hashtext 'Hmong') - hmn!$(hashtext 'Hmong-Daw') - mww!$(hashtext 'Hungarian') - hu!$(hashtext 'Icelandic') - is!$(hashtext 'Igbo') - ig!$(hashtext 'Indonesian') - id!$(hashtext 'Irish') - ga!$(hashtext 'Italian') - it!$(hashtext 'Japanese') - ja!$(hashtext 'Javanese') - jv!$(hashtext 'Kannada') - kn!$(hashtext 'Kazakh') - kk!$(hashtext 'Khmer') - km!$(hashtext 'Klingon') - tlh!$(hashtext 'Korean') - ko!$(hashtext 'Kurdish') - ku!$(hashtext 'Kyrgyz') - ky!$(hashtext 'Lao') - lo!$(hashtext 'Latin') - la!$(hashtext 'Latvian') - lv!$(hashtext 'Lithuanian') - lt!$(hashtext 'Luxembourgish') - lb!$(hashtext 'Macedonian') - mk!$(hashtext 'Malagasy') - mg!$(hashtext 'Malay') - ms!$(hashtext 'Malayalam') - ml!$(hashtext 'Maltese') - mt!$(hashtext 'Maori') - mi!$(hashtext 'Marathi') - mr!$(hashtext 'Mongolian') - mn!$(hashtext 'Myanmar') - my!$(hashtext 'Nepali') - ne!$(hashtext 'Norwegian') - no!$(hashtext 'Pashto') - ps!$(hashtext 'Persian') - fa!$(hashtext 'Polish') - pl!$(hashtext 'Portuguese') - pt!$(hashtext 'Punjabi') - pa!$(hashtext 'Queretaro-Otomi') - otq!$(hashtext 'Roman') - rm!$(hashtext 'Romanian') - ro!$(hashtext 'Russian') - ru!$(hashtext 'Samoan') - sm!$(hashtext 'Scots-Gaelic') - gd!$(hashtext 'Serbian(Cyr)') - sr-Cyrl!$(hashtext 'Serbian(Latin)') - sr-Latn!$(hashtext 'Sesotho') - st!$(hashtext 'Shona') - sn!$(hashtext 'Sindhi') - sd!$(hashtext 'Sinhala') - si!$(hashtext 'Slovak') - sk!$(hashtext 'Slovenian') - sl!$(hashtext 'Somali') - so!$(hashtext 'Spanish') - es!$(hashtext 'Sundanese') - su!$(hashtext 'Swahili') - sw!$(hashtext 'Swedish') - sv!$(hashtext 'Tahitian') - ty!$(hashtext 'Tajik') - tg!$(hashtext 'Tamil') - ta!$(hashtext 'Tatar') - tt!$(hashtext 'Telugu') - te!$(hashtext 'Thai') - th!$(hashtext 'Tongan') - to!$(hashtext 'Turkish') - tr!$(hashtext 'Udmurt') - udm!$(hashtext 'Ukrainian') - uk!$(hashtext 'Urdu') - ur!$(hashtext 'Uzbek') - uz!$(hashtext 'Vietnamese') - vi!$(hashtext 'Welsh') - cy!$(hashtext 'Xhosa') - xh!$(hashtext 'Yiddish') - yi!$(hashtext 'Yoruba') - yo!$(hashtext 'Yucatec-Maya') - yua!$(hashtext 'Zulu') - zu"
export ESPKLANG="$ETL!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!Language!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!Language!af!am!an!ar!as!az!ba!be!bg!bn!bpy!bs!ca!chr-US-Qaaa-x-west!cmn!cmn-latn-pinyin!cs!cv!cy!da!de!el!en-029!en-gb!en-gb-scotland!en-gb-x-gbclan!en-gb-x-gbcwmd!en-gb-x-rp!en-us!en-us-nyc!eo!es!es-419!et!eu!fa!fa-latn!fi!fr-be!fr-ch!fr-fr!ga!gd!gn!grc!gu!hak!haw!he!hi!hr!ht!hu!hy!hyw!ia!id!io!is!it!ja!jbo!ka!kk!kl!kn!ko!kok!ku!ky!la!lb!lfn!lt!ltg!lv!mi!mk!ml!mr!ms!mt!mto!my!nb!nci!ne!nl!nog!om!or!pa!pap!piqd!pl!pt!pt-br!py!qdb!qu!quc!qya!ro!ru!ru-cl!ru-lv!sd!shn!si!sjn!sk!sl!smj!sq!sr!sv!sw!ta!te!th!tk!tn!tr!tt!ug!uk!ur!uz!vi!vi-vn-x-central!vi-vn-x-south!yue!yue!"
function savefn {
[[ -f "$camino"/chats/"$(cat $track/device)"/tschat.txt ]] && mv -f "$camino"/chats/"$(cat $track/device)"/tschat.txt "$camino"/chats/"$(cat $track/device)"/tschat.txt-$(date +%Y%m%d%H%M%S)
echo -e "$1" > "$camino"/chats/"$(cat $track/device)"/tschat.txt
[[ -f "$camino"/chats/"$(cat $track/device)"/tschat.txt ]] && CHAT="$(cat $camino/chats/$(cat $track/device)/tschat.txt | tail -n40)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "type here" "$send_cmnd" "${trans_cmnd}" "${save_cmnd}" > "$fpipe"
sleep 4 && xdotool key --repeat 22 Page_Down
};export -f savefn
function translatefn { # sends text for translation
export TL=$(echo "$1" | awk '{print $NF}')
ENGINE="bing"
[[ ! -z "$2" ]] && export TTEXT="$2" || export TTEXT="$($OUT_CLIP)"
[[ -z "$TTEXT" ]] && exit
T_TEXT=$(echo -e "$TTEXT" | trans -e "$ENGINE" -b -tl "$TL")
T_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< "$2\n$T_TEXT")
[[ ! -z "$T_TEXT" ]] && printf "%s\n%s\n%s\n%s\n%s\n%s\n" "" "" "$T_TEXT" "" "" "" > "$fpipe" || exit
}; export -f translatefn
function espeakfn {
if [[ ! -z $(type -p espeak) ]]; then
killall espeak 2>/dev/null
espeak -a 50 -s 160 -p 50 -v en-us "$($OUT_CLIP)" &
xsel<<<' '
fi
};export -f espeakfn
function devlstfn {
export DEVLST="$(tailscale status | grep -v -e mullvad -e '#')"
echo -e "$DEVLST" > "$track"/devices
echo -e '\f' > $lpipe
cat "$track"/devices | while read line
do
IP=$(echo "$line" | awk '{print $1}')
NICKNAME=$(echo "$line" | awk '{print $2}')
USER=$(echo "$line" | awk '{print $3}')
OS=$(echo "$line" | awk '{print $4}')
STATUS=$(echo "$line" | awk '{print $5}')
printf "%s\n%s\n%s\n%s\n%s\n%s" "$IP" "$NICKNAME" "$USER" "$OS" "$STATUS" >$lpipe
[[ ! -d "$camino"/chats/"$NICKNAME" ]] && mkdir -p "$camino"/chats/"$NICKNAME"
done
}; export -f devlstfn
devlstfn
export SELF="$(echo $DEVLST | head -n1 | cut -f2 -d' ')"
function receivefn {
tailscale file get /root/Downloads/tailscale &
sleep 7
dev="$(cat "$track"/device | cut -f2 -d' ')"
[[ -f /root/Downloads/tailscale/aaa_tschat_"$dev".txt ]] && cat /root/Downloads/tailscale/aaa_tschat_"$dev".txt >> "$camino"/chats/"$dev"/tschat.txt
[[ -f /root/Downloads/tailscale/newfile.txt ]] && cat /root/Downloads/tailscale/newfile.txt >> "$camino"/chats/$dev/tschat.txt
if [[ -f "$camino"/chats/"$dev"/tschat.txt ]]; then
CHAT=$(cat "$camino"/chats/"$dev"/tschat.txt | tail -n 40)
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//" | tail -n40))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "" "$A_TEXT" "" "" "" "" > "$fpipe"
sleep 2 && xdotool key --repeat 22 Page_Down
rm -f "/root/Downloads/tailscale/aaa_tschat_$dev.txt" 2>/dev/null
rm -f "/root/Downloads/tailscale/newfile.txt" 2>/dev/null
fi
}; export -f receivefn
function sendfn {
while read line
do
device="$(echo "$line" | cut -f2 -d' ')"
if [[ "$device" != "$SELF" ]]; then
echo -e "$SELF to $device:\n$2" >> "$camino"/chats/"$device"/tschat.txt
CHAT="$(cat $camino/chats/$device/tschat.txt | tail -n40)"
echo -e "${CHAT}\n$device to $SELF:\n" > "$camino"/chats/"$device"/aaa_tschat_"$SELF".txt
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "$TL!$LANGUAGES" "$A_TEXT" "" "$send_cmnd" "$trans_cmnd" "${save_cmnd}" > "$fpipe"
sleep 2 && xdotool key --repeat 22 Page_Down
[[ "$device" != "$SELF" ]] && tailscale file cp "$camino"/chats/"$device"/aaa_tschat_"$SELF".txt "$device":
sleep 2
rm -f "$camino"/chats/"$device"/aaa__tschat_"$SELF".txt
fi
done <"$track"/device
}; export -f sendfn
function devicefn {
device=$(grep $1 "$track"/devices | awk '{print $2}')
[[ "$device" != "$SELF" ]] && echo -e "$device" > "$track"/device
[[ ! -d "$camino"/chats/"$device" ]] && mkdir -p "$camino"/chats/"$device"
[[ -f "$camino"/chats/"$(cat $track/device)"/tschat.txt ]] && CHAT="$(cat $camino/chats/$(cat $track/device)/tschat.txt | tail -n40)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "" "$send_cmnd" "${trans_cmnd}" "${save_cmnd}" > "$fpipe"
sleep 4 && xdotool key --repeat 22 Page_Down
};export -f devicefn
function doubleclickfn {
[[ $(echo "$1" | cut -f2 -d' ' | cut -f1 -d']') != "$SELF" ]] && [[ -z $(grep "$1" "$track"/device) ]] && echo -e "$1" >> "$track"/device
};export -f doubleclickfn
function load_chat {
[[ -f "$camino"/chats/"$(cat $track/device)"/tschat.txt ]] && CHAT="$(cat $camino/chats/$(cat $track/device)/tschat.txt)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "type here" "$send_cmnd" "${trans_cmnd}" "${save_cmnd}" > "$fpipe"
sleep 4 && xdotool key --repeat 22 Page_Down
};export -f load_chat
echo -e '\f' >&5
echo -e '\f' >&6
yad --plug="$fkey" --title="list" --select-action="bash -c \"devicefn "%s" \" " --search-column=1 --print-column=1 --columns=5 --tabnum=1 --listen --fontname="$FONTNAME" --list --column="$SELF":TXT --column=Nickname:TXT --column=User:TXT --column=OS:TXT --column=Status:TXT --dclick-action="bash -c \"doubleclickfn "%s" \" " <&5 &
yad --plug="$fkey" --title="form" --tabnum=2 --listen --fontname="$FONTNAME" --focus-field=2 --enable-spell --homogenous --form --cycle-read --field="TL":CBE --tail --field="<b>Chat Log:</b> $(hashtext 'Editable')":TXT --tail --field="<b>Input:</b> $(hashtext 'Input')":TXT --field="$(hashtext 'Send')!gtk-refresh!$(hashtext 'send to chat')":fbtn --field="$(hashtext 'Translate')!gtk-refresh!$(hashtext 'translate input text or cursor selected text')":fbtn --field="$(hashtext 'SAVE CHAT')!gtk-save!$(hashtext 'Edit Chat and Save with backup')":fbtn <&6 &
yad --key="$fkey" --title="$(hashtext 'tailscale chat')" --splitter=670 --window-icon="$iconpath/transtray.png" --image-on-top --geometry=1046x528+780+661 --image="$iconpath/tailscale.png" --width=1000 --height=400 --paned --tab=AB --tab=BA --orient=hori --buttons-layout=center --button="$(hashtext 'Receive Chats')!gtk-refresh!$(hashtext 'update chats'):bash -c 'receivefn'" --button="$(hashtext 'Load Entire Chat Log')!gtk-refresh!$(hashtext 'Load full Chat'):bash -c 'load_chat'" --button="$(hashtext 'Refresh Devices'):bash -c 'devlstfn'" --button="eSpeak Selected:bash -c 'espeakfn $CLIP'" --button="Exit:bash -c 'eval exec /tmp/close_$META'" &
devlstfn
echo -e "#!/bin/sh
sleep 0.3
echo 'quit' > $fpipe
echo 'quit' > $lpipe
rm -rf $track &
kill $loopid
rm -f /tmp/close_$META &
" > /tmp/close_"$META"
chmod 755 /tmp/close_"$META"
while [[ -z "$(cat $track/device)" ]];
do
sleep 1
done
[ -f "$camino"/chats/"$(cat $track/device)"/tschat.txt ] && CHAT="$(cat $camino/chats/$(cat $track/device)/tschat.txt | tail -n40)"
A_TEXT=$(while read -r line; do printf "%s" "$line\n"; done <<< $(printf "%q" "${CHAT}" | sed -e "s/'$//" -e "s/^$'//"))
printf "%s\n%s\n%s\n%s\n%s\n%s\n" "$TL\n$LANGUAGES" "$A_TEXT" "type here" "$send_cmnd" "${trans_cmnd}" "${save_cmnd}" > "$fpipe"
sleep 4 && xdotool key --repeat 22 Page_Down
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
VKl Text Editor, is the most compatible txt editor for ts-chat on android, that i have so far found.
1) save as overwrite
2) save as new file
3) save note
4) insert date time
5) share as message to chat apps
6) search and replace
7) choose line feed, encoding etc
- stemsee
- Posts: 739
- Joined: Sun Jul 26, 2020 8:11 am
- Location: lattitude 8
- Has thanked: 179 times
- Been thanked: 120 times
Re: TailScale - VPN
I hacked together this initd service starrt, stop, restart script /etc/initd/55-tailscaled
Code: Select all
#!/bin/dash
# tailscaled VPN service
Restart=on-failure
PORT="41641"
FLAGS="-tun tailscale0"
RuntimeDirectory=/var/run/tailscale
RuntimeDirectoryMode=0755
StateDirectory=/var/lib/tailscale
StateDirectoryMode=0700
CacheDirectory=/var/cache/tailscale
CacheDirectoryMode=0750
Type=notify
start_tailscaled() {
/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS &
}
stop_tailscaled() {
/usr/sbin/tailscaled --cleanup
while pidof tailscaled > /dev/null; do killall tailscaled 2>/dev/null; done
}
is_up_tailscaled() {
pidof tailscaled > /dev/null
}
case "$1" in
start)
start_tailscaled
sleep 1
stop_tailscaled
sleep 1
start_tailscaled
;;
stop)
stop_tailscaled
;;
restart)
stop_tailscaled
sleep 1
start_tailscaled
;;
status)
is_up_tailscaled && echo "tailscaled is running." || echo "tailscaled is stopped."
;;
esac