s+ow: update files
This commit is contained in:
parent
44907e3462
commit
40d318bef7
|
@ -1,284 +1,13 @@
|
||||||
# surplus on wheels
|
# surplus on wheels
|
||||||
|
|
||||||
surplus on wheels (s+ow) is a pure shell script to get your location using
|
surplus on wheels (s+ow) is a pure shell script to get your location using
|
||||||
`termux-location`, process it through [surplus](https://github.com/markjoshwel/surplus),
|
[termux-location](https://wiki.termux.com/wiki/Termux-location), process it through surplus, and
|
||||||
and send it to messaging service or wherever using [bridges](#bridges).
|
send it to messaging service or wherever using “bridges”
|
||||||
|
|
||||||
surplus was made to emulate sending your location through the iOS Shortcuts app, and
|
surplus was made to emulate sending your location through the iOS Shortcuts app, and surplus on
|
||||||
surplus on wheels complements it by running surplus automatically using a cron job.
|
wheels complements it by running surplus automatically using a cron job.
|
||||||
(but using it manually also works!)
|
(but using it manually also works!)
|
||||||
|
|
||||||
- [installing](#installing)
|
see <https://surplus.joshwel.co/onwheels/>
|
||||||
- [as a standalone script](#as-a-standalone-script)
|
or [/docs/onwheels/index.md](../../docs/onwheels/index.md)
|
||||||
- [as a cron job](#as-a-cron-job)
|
for more information and documentation
|
||||||
- [using installation scripts](#using-installation-scripts)
|
|
||||||
- [usage](#usage)
|
|
||||||
- [environment variables](#environment-variables)
|
|
||||||
- [faking locations](#faking-locations)
|
|
||||||
- [bridges](#bridges)
|
|
||||||
- [bring your own bridge](#bring-your-own-bridge)
|
|
||||||
- [licence](#licence)
|
|
||||||
|
|
||||||
## installing
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> s+ow is a Termux-first script, and will not work anywhere else unless you have
|
|
||||||
> a utility that emulates [termux-location](https://wiki.termux.com/wiki/termux-location)
|
|
||||||
> on `$PATH` alongside bridges that supports your platform.
|
|
||||||
|
|
||||||
there are two notable ways to install s+ow:
|
|
||||||
|
|
||||||
1. [as a standalone script](#as-a-standalone-script)
|
|
||||||
2. or, [as a cron job](#as-a-cron-job).
|
|
||||||
|
|
||||||
there is also an [installation script](#using-installation-scripts) for quickly getting
|
|
||||||
started from a _fresh_ termux installation.
|
|
||||||
|
|
||||||
### as a standalone script
|
|
||||||
|
|
||||||
1. firstly install python and termux-api if you haven't already:
|
|
||||||
|
|
||||||
```text
|
|
||||||
pkg install python termux-api
|
|
||||||
```
|
|
||||||
|
|
||||||
also install the accompanying the Termux:API app from [F-Froid](https://f-droid.org/en/packages/com.termux.api/).
|
|
||||||
|
|
||||||
2. install pipx
|
|
||||||
|
|
||||||
```text
|
|
||||||
pip install pipx
|
|
||||||
```
|
|
||||||
|
|
||||||
3. install surplus:
|
|
||||||
|
|
||||||
```text
|
|
||||||
pip install https://github.com/markjoshwel/surplus/releases/latest/download/surplus-latest-py3-none-any.whl
|
|
||||||
```
|
|
||||||
|
|
||||||
4. install surplus on wheels:
|
|
||||||
|
|
||||||
```text
|
|
||||||
mkdir -p ~/.local/bin/
|
|
||||||
curl https://raw.githubusercontent.com/markjoshwel/surplus-on-wheels/main/s+ow > ~/.local/bin/s+ow
|
|
||||||
chmod +x ~/.local/bin/s+ow
|
|
||||||
```
|
|
||||||
|
|
||||||
if `~/.local/bin` is not in your `$PATH`, add the following to your shell's rc file:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
export PATH="$HOME/.local/bin:$PATH"
|
|
||||||
```
|
|
||||||
|
|
||||||
et voilà! s+ow is now setup. to actually send the message to a messaging platform,
|
|
||||||
[install an appropriate bridge](#bridges).
|
|
||||||
|
|
||||||
### as a cron job
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> these instructions rely on following the [previous instructions](#as-a-standalone-script).
|
|
||||||
|
|
||||||
1. install necessary packages to run cron jobs:
|
|
||||||
|
|
||||||
```text
|
|
||||||
pkg install cronie termux-services
|
|
||||||
```
|
|
||||||
|
|
||||||
2. restart termux and start the cron service:
|
|
||||||
|
|
||||||
```text
|
|
||||||
sv-enable cron
|
|
||||||
```
|
|
||||||
|
|
||||||
3. set up the cron job:
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> minimally fill in the `SPOW_TARGETS` variable before running s+ow.
|
|
||||||
> [(see usage for more info)](#usage)
|
|
||||||
|
|
||||||
run the following command:
|
|
||||||
|
|
||||||
```text
|
|
||||||
crontab -e
|
|
||||||
```
|
|
||||||
|
|
||||||
and add the following text:
|
|
||||||
|
|
||||||
```text
|
|
||||||
59 * * * * bash -l -c "SPOW_TARGETS="" SPOW_CRON=y s+ow"
|
|
||||||
```
|
|
||||||
|
|
||||||
this will run s+ow every hour, a minute before the hour.
|
|
||||||
|
|
||||||
modify the variables as per your needs.
|
|
||||||
see [usage](#usage) for more information.
|
|
||||||
|
|
||||||
et voilà! s+ow will now send a message every hour. feel free to experiment with the cron
|
|
||||||
job to your liking. see [crontab.guru](https://crontab.guru/) if you’re new to cron jobs.
|
|
||||||
|
|
||||||
if you haven’t already, [install an appropriate bridge](#bridges) to actually send a
|
|
||||||
message to a messaging platform.
|
|
||||||
|
|
||||||
### using installation scripts
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> these scripts assume you're starting from a fresh base installation of Termux.
|
|
||||||
> if you have already cron jobs, then manually carry out the instructiions in
|
|
||||||
> [as a cron job](#as-a-cron-job).
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> if not installed already, install [Termux:API](https://f-droid.org/en/packages/com.termux.api/)
|
|
||||||
> from F-Droid.
|
|
||||||
|
|
||||||
1. setup s+ow:
|
|
||||||
|
|
||||||
```text
|
|
||||||
curl https://raw.githubusercontent.com/markjoshwel/surplus-on-wheels/main/termux-s+ow-setup | sh
|
|
||||||
```
|
|
||||||
|
|
||||||
2. restart termux!
|
|
||||||
|
|
||||||
3. setup cron job:
|
|
||||||
|
|
||||||
```text
|
|
||||||
curl https://raw.githubusercontent.com/markjoshwel/surplus-on-wheels/main/termux-s+ow-setup-cron | sh
|
|
||||||
```
|
|
||||||
|
|
||||||
the script will run `crontab -e`, and you can then edit the variables as per your
|
|
||||||
needs. minimally fill in the `SPOW_TARGETS` variable before running s+ow.
|
|
||||||
see [usage](#usage) for more information.
|
|
||||||
|
|
||||||
et voilà! s+ow is now setup. to actually send the message to a messaging platform,
|
|
||||||
[install an appropriate bridge](#bridges).
|
|
||||||
|
|
||||||
## usage
|
|
||||||
|
|
||||||
### environment variables
|
|
||||||
|
|
||||||
s+ow uses three environment variables, two of which are optional:
|
|
||||||
|
|
||||||
1. `SPOW_TARGETS`
|
|
||||||
a single line of comma-deliminated chat IDs with bridge prefixes.
|
|
||||||
|
|
||||||
```text
|
|
||||||
wa:000000000000000000@g.us,tg:-0000000000000000000,...
|
|
||||||
```
|
|
||||||
|
|
||||||
in the example above, the WhatsApp chat ID is `wa:`-prefixed as recognised by the
|
|
||||||
[spow-whatsapp-bridge](https://github.com/markjoshwel/spow-whatsapp-bridge), and the
|
|
||||||
Telegram chat ID is `tg:`-prefixed as recognised by the
|
|
||||||
[spow-telegram-bridge](https://github.com/markjoshwel/spow-telegram-bridge).
|
|
||||||
|
|
||||||
2. `SPOW_CRON` (optional)
|
|
||||||
set as non-empty to declare that s+ow is being run as a cron job.
|
|
||||||
if running as a cron job, start s+ow one minute earlier than intended to account for
|
|
||||||
the time it takes to run `termux-location` and `surplus`.
|
|
||||||
s+ow will delay itself appropriately.
|
|
||||||
|
|
||||||
setting it to `n` will also be treated as empty.
|
|
||||||
|
|
||||||
3. `LOCATION_PRIORITISE_NETWORK` (optional)
|
|
||||||
set as non-empty to declare that s+ow can just use network location instead of GPS
|
|
||||||
if GPS is taking too long.
|
|
||||||
you should only turn this on if punctuality means that much to you, or you’re in a
|
|
||||||
country with cell towers close by or everywhere, like Singapore.
|
|
||||||
|
|
||||||
setting it to `n` will also be treated as empty.
|
|
||||||
|
|
||||||
the JIDs can be obtained by sending a message to the user/group, while running
|
|
||||||
`s+ow mdtest`, and examining the output for your message. JIDs are email address-like
|
|
||||||
strings.
|
|
||||||
|
|
||||||
4. `LOCATION_TIMEOUT` (optional)
|
|
||||||
set as a number to override the default first location timeout of `50`.
|
|
||||||
|
|
||||||
### faking locations
|
|
||||||
|
|
||||||
> sometimes you gotta do what you gotta do
|
|
||||||
|
|
||||||
you can fake your s+ow messages by either:
|
|
||||||
|
|
||||||
1. setting a dummy `last` file in s+ow cache
|
|
||||||
|
|
||||||
`$HOME/.cache/s+ow/last` is used as the fallback response when a part of s+ow (either
|
|
||||||
`termux-location` or `surplus` errors out). you can set this file to whatever you want
|
|
||||||
and just turn off location on your device.
|
|
||||||
|
|
||||||
2. setting a `fake` file in s+ow cache
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> s+ow uses the `read` command to read the file. as such, it is possible for s+ow to
|
|
||||||
> prematurely stop reading the file if the file does not contain a trailing newline.
|
|
||||||
|
|
||||||
you can also write text to `$HOME/.cache/s+ow/fake` to fake upcoming messages. the file
|
|
||||||
is delimited by empty lines. as such, arrange the file like so:
|
|
||||||
|
|
||||||
```text
|
|
||||||
The Clementi Mall
|
|
||||||
3155 Commonwealth Avenue West
|
|
||||||
Westpeak Terrace
|
|
||||||
129588
|
|
||||||
Southwest, Singapore
|
|
||||||
|
|
||||||
Westgate
|
|
||||||
3 Gateway Drive
|
|
||||||
Jurong East
|
|
||||||
608532
|
|
||||||
Southwest, Singapore
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
on every run of s+ow, the first group of lines will be consumed, and the file will be
|
|
||||||
updated with the remaining lines. if the file is empty, it will be deleted.
|
|
||||||
|
|
||||||
## bridges
|
|
||||||
|
|
||||||
there are two “official” bridges for s+ow:
|
|
||||||
|
|
||||||
- [spow-whatsapp-bridge](https://github.com/markjoshwel/spow-whatsapp-bridge)
|
|
||||||
- [spow-telegram-bridge](https://github.com/markjoshwel/spow-telegram-bridge)
|
|
||||||
|
|
||||||
bridges can be located anywhere, as long as they are reachable by the shell s+ow is
|
|
||||||
running in.
|
|
||||||
|
|
||||||
s+ow will run the bridges through definitions in in `$HOME/.s+ow-bridges`.
|
|
||||||
each line of `$HOME/.s+ow-bridges` is evaluated as a shell command, and is piped
|
|
||||||
`SPOW_TARGETS`.
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> s+ow uses the `read` command to read the file. as such, it is possible for s+ow to
|
|
||||||
> prematurely stop reading the file if the file does not contain a trailing newline.
|
|
||||||
|
|
||||||
### bring your own bridge
|
|
||||||
|
|
||||||
custom bridges are relatively easy as they are:
|
|
||||||
|
|
||||||
1. an executable or script
|
|
||||||
|
|
||||||
2. that reads `SPOW_TARGETS` (see [usage](#usage)) from stdin
|
|
||||||
|
|
||||||
- bridges should account for the possibility of comma and space (`, ` instead of just
|
|
||||||
`,`) delimited targets, and strip each target of preceding and trailing whitespace.
|
|
||||||
|
|
||||||
- bridges should recognise a platform based on a prefix
|
|
||||||
(e.g. `wa:` for WhatsApp, `tg:` for Telegram, etc.)
|
|
||||||
|
|
||||||
- bridges do not need to account for the possibility of multiple lines sent to stdin.
|
|
||||||
|
|
||||||
3. reads `SPOW_MESSAGE` (`~/.cache/spow/message`) for the message content
|
|
||||||
|
|
||||||
notes:
|
|
||||||
|
|
||||||
1. stderr and stdout are redirected to s+ow’s error and output logs respectively.
|
|
||||||
2. any errors encountered by the bridge should always result in a non-zero return.
|
|
||||||
error logs will show the exact error code, so feel free to use other numbers than 1.
|
|
||||||
3. persistent data such as credentials and session data storage are to be handled by the
|
|
||||||
bridge itself.
|
|
||||||
consider storing them in `$HOME/.local/share/<bridge-name>/`, or similar.
|
|
||||||
|
|
||||||
## licence
|
|
||||||
|
|
||||||
surplus on wheels is free and unencumbered software released into the public domain.
|
|
||||||
for more information, please refer to [UNLICENCE](/UNLICENCE) or <http://unlicense.org/>.
|
|
||||||
|
|
37
src/surplus-on-wheels/install.sh
Normal file
37
src/surplus-on-wheels/install.sh
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# surplus on wheels: termux installation script
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# get packages
|
||||||
|
yes | pkg upgrade
|
||||||
|
yes | pkg install python cronie termux-api termux-services wget
|
||||||
|
|
||||||
|
# install pipx and surplus
|
||||||
|
pip install pipx
|
||||||
|
pipx install surplus
|
||||||
|
|
||||||
|
# install s+ow
|
||||||
|
mkdir -p ~/.local/bin/
|
||||||
|
if ping -c 1 surplus.joshwel.co ; then
|
||||||
|
wget -O ~/.local/bin/s+ow https://surplus.joshwel.co/spow.sh
|
||||||
|
else
|
||||||
|
wget -O ~/.local/bin/s+ow https://raw.githubusercontent.com/markjoshwel/surplus/main/src/surplus-on-wheels/s+ow
|
||||||
|
fi
|
||||||
|
chmod +x ~/.local/bin/s+ow
|
||||||
|
|
||||||
|
# setup path
|
||||||
|
echo "export PATH=\$PATH:\$HOME/.local/bin/" >> ~/.profile
|
||||||
|
|
||||||
|
printf "
|
||||||
|
----- done! -----
|
||||||
|
|
||||||
|
if you're going to set a cron job up:
|
||||||
|
|
||||||
|
1. restart termux
|
||||||
|
2. run crontab -e
|
||||||
|
3. add \"59 * * * * bash -l -c \"(SPOW_TARGETS="" SPOW_CRON=y s+ow)\"\"
|
||||||
|
(remember to minimally fill in the SPOW_TARGETS variable)
|
||||||
|
|
||||||
|
else, surplus on wheels has been set up!
|
||||||
|
|
||||||
|
"
|
|
@ -2,10 +2,38 @@
|
||||||
|
|
||||||
# surplus on wheels (s+ow) - a pure shell script to run surplus with mdtest using the termux-api
|
# surplus on wheels (s+ow) - a pure shell script to run surplus with mdtest using the termux-api
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# public domain, unlicence
|
# This is free and unencumbered software released into the public domain.
|
||||||
|
#
|
||||||
|
# Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
# distribute this software, either in source code form or as a compiled
|
||||||
|
# binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
# means.
|
||||||
|
#
|
||||||
|
# In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
# of this software dedicate any and all copyright interest in the
|
||||||
|
# software to the public domain. We make this dedication for the benefit
|
||||||
|
# of the public at large and to the detriment of our heirs and
|
||||||
|
# successors. We intend this dedication to be an overt act of
|
||||||
|
# relinquishment in perpetuity of all present and future rights to this
|
||||||
|
# software under copyright law.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
# OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
|
SURPLUS_CMD_DEFAULT="surplus -td"
|
||||||
|
SURPLUS_CMD=${SURPLUS_CMD:-$SURPLUS_CMD_DEFAULT}
|
||||||
|
LOCATION_CMD_DEFAULT="termux-location"
|
||||||
|
LOCATION_CMD=${LOCATION_CMD:-$LOCATION_CMD_DEFAULT}
|
||||||
|
|
||||||
# shellcheck disable=SC2059
|
# shellcheck disable=SC2059
|
||||||
LOCATION_FALLBACK="%d%d%d\nSingapore?"
|
LOCATION_FALLBACK=${LOCATION_FALLBACK:-"%d%d%d\nSingapore?"}
|
||||||
# shellcheck disable=SC2269
|
# shellcheck disable=SC2269
|
||||||
LOCATION_PRIORITISE_NETWORK="$LOCATION_PRIORITISE_NETWORK"
|
LOCATION_PRIORITISE_NETWORK="$LOCATION_PRIORITISE_NETWORK"
|
||||||
LOCATION_TIMEOUT=${LOCATION_TIMEOUT:-50}
|
LOCATION_TIMEOUT=${LOCATION_TIMEOUT:-50}
|
||||||
|
@ -15,17 +43,18 @@ SPOW_TARGETS="$SPOW_TARGETS"
|
||||||
SPOW_CACHE_DIR="$HOME/.cache/s+ow"
|
SPOW_CACHE_DIR="$HOME/.cache/s+ow"
|
||||||
SPOW_BRIDGES="$HOME/.s+ow-bridges"
|
SPOW_BRIDGES="$HOME/.s+ow-bridges"
|
||||||
SPOW_CRON=${SPOW_CRON:-n}
|
SPOW_CRON=${SPOW_CRON:-n}
|
||||||
|
SPOW_PRIVATE=${SPOW_PRIVATE:-n}
|
||||||
|
|
||||||
# per-tool session logs
|
# per-tool session logs
|
||||||
SPOW_NETLC_OUT="$SPOW_CACHE_DIR/location.net.json"
|
SPOW_NETLC_OUT="$SPOW_CACHE_DIR/location.net.json" # honours SPOW_PRIVATE (cleared after use)
|
||||||
SPOW_GPSLC_OUT="$SPOW_CACHE_DIR/location.gps.json"
|
SPOW_GPSLC_OUT="$SPOW_CACHE_DIR/location.gps.json" # honours SPOW_PRIVATE (cleared after use)
|
||||||
SPOW_LOCTN_OUT="$SPOW_CACHE_DIR/location.json"
|
SPOW_LOCTN_OUT="$SPOW_CACHE_DIR/location.json" # honours SPOW_PRIVATE (cleared after use)
|
||||||
SPOW_SPLUS_OUT="$SPOW_CACHE_DIR/surplus.out.log"
|
SPOW_SPLUS_OUT="$SPOW_CACHE_DIR/surplus.out.log" # honours SPOW_PRIVATE (cleared after use)
|
||||||
SPOW_SPLUS_ERR="$SPOW_CACHE_DIR/surplus.err.log"
|
SPOW_SPLUS_ERR="$SPOW_CACHE_DIR/surplus.err.log" # honours SPOW_PRIVATE (set to /dev/null + cleared after use)
|
||||||
|
|
||||||
# per-session collated logs
|
# per-session collated logs
|
||||||
SPOW_SESH_OUT="$SPOW_CACHE_DIR/out.log"
|
SPOW_SESH_OUT="$SPOW_CACHE_DIR/out.log" # honours SPOW_PRIVATE (set to /dev/null)
|
||||||
SPOW_SESH_ERR="$SPOW_CACHE_DIR/err.log"
|
SPOW_SESH_ERR="$SPOW_CACHE_DIR/err.log" # honours SPOW_PRIVATE (set to /dev/null)
|
||||||
|
|
||||||
# per-week collated logs
|
# per-week collated logs
|
||||||
SPOW_WEEK_PRE="$SPOW_CACHE_DIR/$(date +%Y)W$(date +"%V")"
|
SPOW_WEEK_PRE="$SPOW_CACHE_DIR/$(date +%Y)W$(date +"%V")"
|
||||||
|
@ -36,7 +65,7 @@ SPOW_WEEK_ERR="$SPOW_WEEK_PRE.err.log"
|
||||||
SPOW_LAST_OUT="$SPOW_CACHE_DIR/last"
|
SPOW_LAST_OUT="$SPOW_CACHE_DIR/last"
|
||||||
|
|
||||||
# message to be sent
|
# message to be sent
|
||||||
SPOW_MESSAGE="$SPOW_CACHE_DIR/message"
|
SPOW_MESSAGE="$SPOW_CACHE_DIR/message" # honours SPOW_PRIVATE (cleared after use)
|
||||||
|
|
||||||
# list of fakes
|
# list of fakes
|
||||||
SPOW_FAKE_OUT="$SPOW_CACHE_DIR/fake"
|
SPOW_FAKE_OUT="$SPOW_CACHE_DIR/fake"
|
||||||
|
@ -51,14 +80,31 @@ if [ "$SPOW_CRON" = "n" ]; then
|
||||||
SPOW_CRON=""
|
SPOW_CRON=""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ensure commands exist
|
# check if running in 'private' mode
|
||||||
if ! command -v termux-location >/dev/null 2>&1; then
|
if [ "$SPOW_PRIVATE" = "n" ]; then
|
||||||
printf "s+ow: error: termux-location is not installed.\ninstall it with 'pkg install termux-api' and with installing the termux:api app from the play store or f-droid.\n"
|
SPOW_PRIVATE=""
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v surplus >/dev/null 2>&1; then
|
# extract command names for checking
|
||||||
printf "s+ow: error: surplus is not installed.\ninstall it with 'pip install https://github.com/markjoshwel/surplus/releases/latest/download/surplus-latest-py3-none-any.whl'\n"
|
TERMUX_EXE=$(echo "$TERMUX_CMD" | awk '{print $1}')
|
||||||
|
SURPLUS_EXE=$(echo "$SURPLUS_CMD" | awk '{print $1}')
|
||||||
|
|
||||||
|
# ensure commands exist
|
||||||
|
if ! command -v "$SURPLUS_EXE" >/dev/null 2>&1; then
|
||||||
|
if [ "$SURPLUS_EXE" = "surplus" ]; then
|
||||||
|
printf "s+ow: error: surplus is not installed.\ninstall it with 'pip install surplus'. see <https://surplus.joshwel.co> for more information.\n"
|
||||||
|
else
|
||||||
|
printf "s+ow: error: custom surplus command '%s' is not accessible" "$SURPLUS_EXE"
|
||||||
|
fi
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v "$TERMUX_EXE" >/dev/null 2>&1; then
|
||||||
|
if [ "$TERMUX_EXE" = $LOCATION_CMD_DEFAULT ]; then
|
||||||
|
printf "s+ow: error: termux-location is not installed.\ninstall it with 'pkg install termux-api' and with installing the termux:api app from the play store or f-droid.\n"
|
||||||
|
else
|
||||||
|
printf "s+ow: error: custom location command '%s' is not accessible" "$TERMUX_EXE"
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -74,6 +120,13 @@ touch "$SPOW_NETLC_OUT" "$SPOW_GPSLC_OUT" "$SPOW_LOCTN_OUT" \
|
||||||
"$SPOW_WEEK_OUT" "$SPOW_WEEK_ERR" \
|
"$SPOW_WEEK_OUT" "$SPOW_WEEK_ERR" \
|
||||||
"$SPOW_BRIDGES" "$SPOW_FAKE_OUT"
|
"$SPOW_BRIDGES" "$SPOW_FAKE_OUT"
|
||||||
|
|
||||||
|
# disable logs if private
|
||||||
|
if [ -n "$SPOW_PRIVATE" ]; then
|
||||||
|
SPOW_SESH_OUT="/dev/null"
|
||||||
|
SPOW_SESH_ERR="/dev/null"
|
||||||
|
SPOW_SPLUS_ERR="/dev/null"
|
||||||
|
fi
|
||||||
|
|
||||||
# 0 is nominal
|
# 0 is nominal
|
||||||
# 1 is an termux-location error
|
# 1 is an termux-location error
|
||||||
# 2 is a surplus error
|
# 2 is a surplus error
|
||||||
|
@ -86,7 +139,7 @@ bridge_returns=""
|
||||||
locate() {
|
locate() {
|
||||||
# spawn termux-location processes
|
# spawn termux-location processes
|
||||||
(
|
(
|
||||||
termux-location -p "network" >"$SPOW_NETLC_OUT"
|
$LOCATION_CMD -p "network" >"$SPOW_NETLC_OUT"
|
||||||
if [ -s "$SPOW_NETLC_OUT" ]; then
|
if [ -s "$SPOW_NETLC_OUT" ]; then
|
||||||
printf "net" | tee -a "$SPOW_SESH_ERR"
|
printf "net" | tee -a "$SPOW_SESH_ERR"
|
||||||
else
|
else
|
||||||
|
@ -97,7 +150,7 @@ locate() {
|
||||||
tl_net_pid="$!"
|
tl_net_pid="$!"
|
||||||
sleep 1
|
sleep 1
|
||||||
(
|
(
|
||||||
termux-location -p "gps" >"$SPOW_GPSLC_OUT"
|
$LOCATION_CMD -p "gps" >"$SPOW_GPSLC_OUT"
|
||||||
if [ -s "$SPOW_GPSLC_OUT" ]; then
|
if [ -s "$SPOW_GPSLC_OUT" ]; then
|
||||||
printf "gps" | tee -a "$SPOW_SESH_ERR"
|
printf "gps" | tee -a "$SPOW_SESH_ERR"
|
||||||
else
|
else
|
||||||
|
@ -108,7 +161,7 @@ locate() {
|
||||||
tl_gps_pid="$!"
|
tl_gps_pid="$!"
|
||||||
|
|
||||||
# wait until timeout or both finished
|
# wait until timeout or both finished
|
||||||
printf "running termux-location" | tee -a "$SPOW_SESH_ERR"
|
printf "running '%s'" "$LOCATION_CMD" | tee -a "$SPOW_SESH_ERR"
|
||||||
while [ "$LOCATION_TIMEOUT" -gt 0 ]; do
|
while [ "$LOCATION_TIMEOUT" -gt 0 ]; do
|
||||||
# get process statuses
|
# get process statuses
|
||||||
kill -0 "$tl_net_pid" >/dev/null 2>&1
|
kill -0 "$tl_net_pid" >/dev/null 2>&1
|
||||||
|
@ -121,7 +174,7 @@ locate() {
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# exception: if network is proritised: just use that
|
# exception: if network is prioritised: just use that
|
||||||
if [ "$tl_net_status" -eq 1 ] && [ -n "$LOCATION_PRIORITISE_NETWORK" ]; then
|
if [ "$tl_net_status" -eq 1 ] && [ -n "$LOCATION_PRIORITISE_NETWORK" ]; then
|
||||||
# break only if theres an actual response
|
# break only if theres an actual response
|
||||||
if [ -s "$SPOW_NETLC_OUT" ]; then
|
if [ -s "$SPOW_NETLC_OUT" ]; then
|
||||||
|
@ -179,7 +232,7 @@ locate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
gensharetext() {
|
gensharetext() {
|
||||||
surplus -td "$1" >"$SPOW_SPLUS_OUT" 2>"$SPOW_SPLUS_ERR"
|
$SURPLUS_CMD "$1" >"$SPOW_SPLUS_OUT" 2>"$SPOW_SPLUS_ERR"
|
||||||
ret="$?"
|
ret="$?"
|
||||||
cat "$SPOW_SPLUS_OUT" >>"$SPOW_SESH_OUT"
|
cat "$SPOW_SPLUS_OUT" >>"$SPOW_SESH_OUT"
|
||||||
cat "$SPOW_SPLUS_ERR" >>"$SPOW_SESH_ERR"
|
cat "$SPOW_SPLUS_ERR" >>"$SPOW_SESH_ERR"
|
||||||
|
@ -237,7 +290,7 @@ send() {
|
||||||
done <"$SPOW_FAKE_OUT"
|
done <"$SPOW_FAKE_OUT"
|
||||||
|
|
||||||
if [ -n "$fake_first" ]; then
|
if [ -n "$fake_first" ]; then
|
||||||
printf "$fake_rest\n" >"$SPOW_FAKE_OUT"
|
printf "%s\n" "$fake_rest" >"$SPOW_FAKE_OUT"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -283,7 +336,7 @@ send() {
|
||||||
fi
|
fi
|
||||||
done <"$SPOW_BRIDGES"
|
done <"$SPOW_BRIDGES"
|
||||||
else
|
else
|
||||||
printf "s+ow: warning: no '$SPOW_BRIDGES' file; message is not sent.\n"
|
printf "s+ow: warning: no '%s' file; message is not sent.\n" "$SPOW_BRIDGES"
|
||||||
termux-notification \
|
termux-notification \
|
||||||
--priority "default" \
|
--priority "default" \
|
||||||
--title "surplus on wheels: No bridges" \
|
--title "surplus on wheels: No bridges" \
|
||||||
|
@ -341,7 +394,7 @@ run() {
|
||||||
notify "Waiting for the 30th second to pass..."
|
notify "Waiting for the 30th second to pass..."
|
||||||
printf "waiting for the 30th second to pass...\n"
|
printf "waiting for the 30th second to pass...\n"
|
||||||
while [ "$(date +'%S')" -lt 30 ]; do
|
while [ "$(date +'%S')" -lt 30 ]; do
|
||||||
printf " $(date)\n"
|
printf " %s\n" "$(date)"
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
printf "proceeding\n"
|
printf "proceeding\n"
|
||||||
|
@ -352,7 +405,7 @@ run() {
|
||||||
# termux-location
|
# termux-location
|
||||||
location=""
|
location=""
|
||||||
for locate_run in 1 2 3; do # run three times in case :p
|
for locate_run in 1 2 3; do # run three times in case :p
|
||||||
notify "Running termux-location" "$locate_run"
|
notify "Running '%s'" "$LOCATION_CMD" "$locate_run"
|
||||||
|
|
||||||
if [ "$locate_run" -gt "1" ]; then
|
if [ "$locate_run" -gt "1" ]; then
|
||||||
LOCATION_TIMEOUT=75 locate
|
LOCATION_TIMEOUT=75 locate
|
||||||
|
@ -371,14 +424,20 @@ run() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ -n "$SPOW_PRIVATE" ]; then
|
||||||
|
cat /dev/null >"$SPOW_GPSLC_OUT"
|
||||||
|
cat /dev/null >"$SPOW_NETLC_OUT"
|
||||||
|
cat /dev/null >"$SPOW_LOCTN_OUT"
|
||||||
|
fi
|
||||||
|
|
||||||
time_locate_end="$(date +%s)"
|
time_locate_end="$(date +%s)"
|
||||||
time_locate=$((time_locate_end - time_locate_start))
|
time_locate=$((time_locate_end - time_locate_start))
|
||||||
|
|
||||||
time_surplus_start="$(date +%s)"
|
time_surplus_start="$(date +%s)"
|
||||||
|
|
||||||
# surplus
|
# surplus
|
||||||
printf "running surplus... "
|
printf "running '%s'... " "$SURPLUS_CMD"
|
||||||
notify "Running surplus -td $location"
|
notify "Running $SURPLUS_CMD $location"
|
||||||
if [ "$status" -eq 0 ]; then
|
if [ "$status" -eq 0 ]; then
|
||||||
if gensharetext "$location"; then
|
if gensharetext "$location"; then
|
||||||
# surplus ran nominally
|
# surplus ran nominally
|
||||||
|
@ -402,7 +461,7 @@ run() {
|
||||||
notify "Waiting for the new hour..."
|
notify "Waiting for the new hour..."
|
||||||
printf "waiting until the new hour...\n"
|
printf "waiting until the new hour...\n"
|
||||||
while [ "$(date +'%M')" -eq 59 ]; do
|
while [ "$(date +'%M')" -eq 59 ]; do
|
||||||
printf " $(date)\n"
|
printf " %s\n" "$(date)"
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
printf "proceeding\n"
|
printf "proceeding\n"
|
||||||
|
@ -410,12 +469,13 @@ run() {
|
||||||
|
|
||||||
time_sendmsg_start="$(date +%s)"
|
time_sendmsg_start="$(date +%s)"
|
||||||
|
|
||||||
# mdtest/send message
|
# send message
|
||||||
printf "sending message(s)... "
|
printf "sending message(s)... "
|
||||||
notify "Sending message(s)"
|
notify "Sending message(s)"
|
||||||
sent_type=0 # 0 for freshly made sharetext
|
# 0 for freshly made sharetext
|
||||||
# 1 for recycling a last location
|
# 1 for recycling a last location
|
||||||
# 2 for using fallback template
|
# 2 for using fallback template
|
||||||
|
sent_type=0
|
||||||
bridge_failures=0
|
bridge_failures=0
|
||||||
sharetext=""
|
sharetext=""
|
||||||
send_error_notif=false
|
send_error_notif=false
|
||||||
|
@ -436,9 +496,9 @@ run() {
|
||||||
|
|
||||||
else
|
else
|
||||||
# no last location, use fallback
|
# no last location, use fallback
|
||||||
|
sent_type=2
|
||||||
# shellcheck disable=SC2059
|
# shellcheck disable=SC2059
|
||||||
sharetext="$(printf "$LOCATION_FALLBACK" "$status" "$locate_run" "$sent_type")"
|
sharetext="$(printf "$LOCATION_FALLBACK" "$status" "$locate_run" "$sent_type")"
|
||||||
sent_type=2
|
|
||||||
printf "using fallback... \n"
|
printf "using fallback... \n"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
@ -451,6 +511,13 @@ run() {
|
||||||
send_error_notif=true
|
send_error_notif=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# delete s+ logs
|
||||||
|
if [ -n "$SPOW_PRIVATE" ]; then
|
||||||
|
cat /dev/null >"$SPOW_SPLUS_OUT"
|
||||||
|
cat /dev/null >"$SPOW_SPLUS_ERR"
|
||||||
|
cat /dev/null >"$SPOW_MESSAGE"
|
||||||
|
fi
|
||||||
|
|
||||||
time_sendmsg_end="$(date +%s)"
|
time_sendmsg_end="$(date +%s)"
|
||||||
time_sendmsg=$((time_sendmsg_end - time_sendmsg_start))
|
time_sendmsg=$((time_sendmsg_end - time_sendmsg_start))
|
||||||
|
|
||||||
|
@ -475,7 +542,7 @@ run() {
|
||||||
|
|
||||||
if [ -z "$SPOW_TARGETS" ]; then
|
if [ -z "$SPOW_TARGETS" ]; then
|
||||||
echo "s+ow: error: SPOW_TARGETS are not set"
|
echo "s+ow: error: SPOW_TARGETS are not set"
|
||||||
exit 1
|
exit 3
|
||||||
fi
|
fi
|
||||||
run
|
run
|
||||||
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# get packages
|
|
||||||
yes | pkg upgrade
|
|
||||||
yes | pkg install python cronie termux-api termux-services wget
|
|
||||||
|
|
||||||
# install pipx
|
|
||||||
pip install pipx
|
|
||||||
|
|
||||||
# install surplus
|
|
||||||
pipx install https://github.com/markjoshwel/surplus/releases/latest/download/surplus-latest-py3-none-any.whl
|
|
||||||
|
|
||||||
# install s+ow
|
|
||||||
mkdir -p ~/.local/bin/
|
|
||||||
curl https://raw.githubusercontent.com/markjoshwel/surplus-on-wheels/main/s+ow > ~/.local/bin/s+ow
|
|
||||||
chmod +x ~/.local/bin/s+ow
|
|
||||||
|
|
||||||
# setup path
|
|
||||||
echo "export PATH=\$PATH:\$HOME/.local/bin/" >> ~/.profile
|
|
||||||
|
|
||||||
printf "\ndone\n"
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# enable cron service and add to crontab
|
|
||||||
sv-enable crond
|
|
||||||
printf "59 * * * *\tSPOW_TARGETS=\"\" SPOW_CRON=y ~/.local/bin/s+ow\n" > s+ow.cron
|
|
||||||
crontab s+ow.cron
|
|
||||||
rm s+ow.cron
|
|
||||||
|
|
||||||
# open editor
|
|
||||||
crontab -e
|
|
||||||
|
|
||||||
printf "\ndone\n"
|
|
26
src/surplus-on-wheels/test.sh
Normal file
26
src/surplus-on-wheels/test.sh
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
SURPLUS_CMD_DEFAULT="surplus --debugp -tp"
|
||||||
|
SURPLUS_CMD=${SURPLUS_CMD:-$SURPLUS_CMD_DEFAULT}
|
||||||
|
|
||||||
|
# parse SURPLUS_CMD to see if "-p" or "--private" is in the args
|
||||||
|
set -f
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
set -- $SURPLUS_CMD
|
||||||
|
for arg; do
|
||||||
|
case "$arg" in
|
||||||
|
--private)
|
||||||
|
echo YAY
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
--*)
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
if echo "$arg" | grep -q "p"; then
|
||||||
|
echo YAY
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
set +f
|
Loading…
Reference in a new issue