Bash/Shell Scripting
Bash scripts can be used for various purposes such as executing specific commands, automating tasks, provisioning, etc; including the ability to consume apx- system tools.
This is useful when you want to automate things such as scanning and pairing nearby bt speakerphones, or authorize a particular network, perform a health check on the device, and more.
Bash script
To write a bash script you can create a new file using vi
or nano
.
$ nano bash_example.sh
and enter the following contents
#!/bin/bash
echo "my first bash script"
then change the script to be executable with the
$ chmod +x bash_example.sh
Execute the script with ./bash_example.sh
Now change the echo for a system tool command such as activating output 1
#!/bin/bash
sudo apx-io set OUT1 true
$ ./bash_example.sh
and if you do a sudo apx-io get out1
you'll see it returns "true"
Crontab
Crontab is a tool that is used for running specific tasks on a regular interval.
It can be useful to run tasks periodically like resetting the wifi or activating an output.
To start using crontab you can use the crontab -e
command
$ crontab -e
This will pull up an editor with a list of all the currently running crons.
The format for cron is as follow:
* * * * * /path/to/script.sh
│ │ │ │ └───> Day of Week (0-7) (0 & 7 are "Sunday")
│ │ │ └─────> Month of Year (1-12)
│ │ └───────> Day of Month (1-31)
│ └─────────> Hour (0-23)
└───────────> Minute (0-59)
For example, if we want to reset the wifi every 1hr, we can accomplish this with a bash script like:
wifi_reset.sh
#!/bin/bash
sudo apx-wifi reset
and execute it with crontab:
*/10 * * * * /data/users/syrus4g/wifi_reset.sh
Another example could be to start the hotspot on every system reboot, to accomplish this we could create a script like this
start_hotspot.sh
#!/bin/bash
sudo apx-hotspot ssid Syrus4G
sudo apx-hotspot pass 123456
and execute it with crontab
@reboot /data/users/syrus4g/start_hotspot.sh
LFTP
lftp
is a file transfer program that which allows us to manage files and upload them to remove servers via ftp and other protocols.
To get started we recommend creating subdirectories on a remote server using the device IMEI, followed by a subfolder for the type of media you want to upload:
# remote ftp server
root/
├── 867698041101234/
│ ├── images/
│ │ ├── 1616442180-photo.jpeg
│ ├── videos/
│ │ ├── 1616442284-driver_cam_hard_braking.mp4
├── 867698041105678/
│ ├── images/
│ ├── videos/
│ ├── logs/
With the above in place you can upload media like this
# upload a photo
lftp -u username,password -p 4455 -e 'put /data/users/syrus4g/fatigue_sensor/1620415933-fatigue_remind.jpeg -o 867698041101234/images/1620415933-fatigue_remind.jpeg; bye' ftp://ftp.mysite.com
# upload a video
lftp -u username,password -p 4455 -e 'put /data/users/syrus4g/video/1624969585_hard_braking_driver_cam.mp4 -o 867698041101234/videos/1624969585_hard_braking_driver_cam.mp4; bye' ftp://ftp.mysite.com
lftp includes a command for mirroring the contents of a source folder with the remote server, make sure to add a -c
option to continue
the file transfer in case there's an interruption. Also you can use the --reverse
flag to put all files from the Syrsu to the remote server, including subdirectories and their contents.
# reverse mirror images to destination server
lftp -u username,password -p 4455 -e 'mirror -c --reverse /data/users/syrus4g/fatigue_sensor/ 867698041101234/images/; bye' ftp://ftp.mysite.com
# reverse mirror videos to destination server
lftp -u username,password -p 4455 -e 'mirror -c --reverse /data/users/syrus4g/video/ 867698041101234/videos/; bye' ftp://ftp.mysite.com
once mirrored you can use the -n
option to upload only newer files
# upload new images only
lftp -u username,password -p 4455 -e 'mirror -n --reverse /data/users/syrus4g/fatigue_sensor/ 867698041101234/images/; bye' ftp://ftp.mysite.com
# upload new videos only
lftp -u username,password -p 4455 -e 'mirror -n --reverse /data/users/syrus4g/video/ 867698041101234/videos/; bye' ftp://ftp.mysite.com
another useful option is to force ssl, which refuses to send the password in clear when the remote server does not support ssl
# force ssl connection to remote server
lftp -u username,password -p 4455 -e 'set ftp:ssl-force=true put /data/users/syrus4g/fatigue_sensor/1616442180-photo.jpeg 867698041101234/images/1616442180-photo.jpeg; bye' ftp://ftp.mysite.com
Updated over 2 years ago