| camsutil | ||
| cronutil | ||
| .gitignore | ||
| confutil.py | ||
| ffmpeger.py | ||
| LICENSE | ||
| procutil.py | ||
| README.md | ||
| sendmail.py | ||
| simplewc.py | ||
utils
Small tools needed to solve immediate tasks independently or as part of a project
camsutil
Description: Creation of a request to the camera API based on the prepared template
Dependencies: Python 3 (tested version 3.9.5)
| PARAMETERS | DESCRIPTION | DEFAULT |
|---|---|---|
| --host | hostname or ip address | REQUIRED |
| --user | valid user | REQUIRED |
| --password | valid password | REQUIRED |
| --template | the name of an existing template | REQUIRED |
| [-h] | print help and exit | |
| [--protocol] | http, https, etc. | http |
| [--port] | port number | 80 |
| [--channel] | ptz channel number | 101 |
| [--vid] | video channel id | 1 |
| [--x] | horizontal positioning: azimuth, pan | 0 |
| [--y] | vertical positioning: elevation, tilt | 0 |
| [--z] | zoom direction, absolute zoom | 0 |
| [--speed] | positioning speed: from 1 to 7 | 1 |
| [--time] | momentary duration, max 100000ms | 100000 |
| [--text] | overlay text content | None |
| [--enabled] | enabled (true) or disabled (false) overlay text | true |
Example usage in terminal with Python:
python3 ./ptz.py --host HOST --user USER --password PASS --template Hikvision_GetCapabilities.html
Example usage in terminal with make the script executable:
chmod u+x ./ptz.py
ptz.py --host HOST --user USER --password PASS --template Hikvision_PtzPreset.html --vid 2 --speed 5
Example usage in Python:
from camsutil import ptz
data = ptz.API(host='HOST', user='USER', password='PASS', template='Hikvision_GetJPEG.html', x=1920, y=1080).call()
with open('img.jpg', 'wb') as output:
output.write(data)
cronutil
Description: Control wrapper for the schedule package
Dependencies: Python 3 (tested version 3.9.5)
Scheduler works only on a weekly scale. This is due to the use of the schedule package .
Target format: wD:HH:MM:SS, where:
wD - day of week unit: '1', '2', ... , '6', '7', '*'
HH - hour unit in 24-hours format: '00', '01', ... , '22', '23', '**'
MM - minute unit: '00', '01', ... , '58', '59', '**'
SS - second unit: '00', '01', ... , '58', '59', '**'
Units can be listed separated by commas.
Examples:
'*:**:**:**' - every second of every minute of every hour of every day
'*:**:**:*5' - every 05,15,25,35,45,55 seconds of every minute of every hour of every day
'*:2*:**:**' - every second of every minute of every 20,21,22,23 hours of every day
'*:2*:**:*5' - every 05,15,25,35,45,55 seconds of every minute of every 20,21,22,23 hours of every day
'3,5:2*:**:*5' - every 05,15,25,35,45,55 seconds every minute every 20,21,22,23 hours of Wednesday, Friday
'1,7:12:00:**' - every second 00 minutes 12 hours of Monday, Sunday
'1:07:00:00' - every 00 seconds 00 minutes 07 hours Monday
Example usage in Python:
from time import strftime
from cronutil import Scheduler
def now():
print(strftime('%Y.%m.%d %H:%M:%S'))
cron = Scheduler()
cron.add('2,4:**:*0:00,15,30,45', now)
cron.start()
cron.add('2,4:**:59:59', cron.stop)
confutil.py
Description: Parser of configs, arguments, parameters
Dependencies: Python 3 (tested version 3.9.5)
Example config to parse:
[main]
# This block contains basic parameters
[httpd]
# This block contains parameters for the http server
# Address to which to bind listening
#address=0.0.0.0;
# Port to which to bind listening. Port below 1024 requires root privileges.
port=8800;
# Working directory (available to everyone)
directory=www;
Example usage in Python:
from os import path
from confutil import Parse
conf = path.splitext(__file__)[0] + '.conf'
if path.exists(conf):
print(Parse(parameters=conf, block='httpd'))
ffmpeger.py
Description: FFmpeg management from Python
Dependencies: Python 3 (tested version 3.9.5), installed or downloaded ffmpeg, procutil.py in the same directory
| PARAMETERS | DESCRIPTION | DEFAULT |
|---|---|---|
| -s, --src | sources urls | REQUIRED |
| [-h] | print help and exit | |
| [--preset] | 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p | None |
| [--fps] | frame per second encoding output | None |
| [--dst] | destination url | None |
| [--ffpath] | alternative path to bin | None |
| [--watchdog] | detect ffmpeg freeze and terminate | |
| [--sec] | seconds to wait before the watchdog terminates | 15 |
| [--mono] | detect ffmpeg running copy and terminate |
Example usage in cron with Python:
# at every minute
* * * * * /usr/bin/python3 ~/ffmpeger.py -s rtsp://user:pass@host:554/Streaming/Channels/101 --dst rtmp://a.rtmp.youtube.com/live2/YOUKEY --mono --watchdog --sec 30 >> /dev/null 2>&1
Example usage in terminal with make the script executable:
chmod u+x ./ffmpeger.py
ffmpeger.py -s rtsp://user:pass@host:554/Streaming/Channels/101 --dst rtp://239.0.0.1:5554
Example usage in Python:
from ffmpeger import FFmpeg
FFmpeg.run(src='null, anull', preset='240p', fps=10)
procutil.py
Description: Find a running process from Python
Dependencies: Python 3 (tested version 3.9.5)
| PARAMETERS | DESCRIPTION | DEFAULT |
|---|---|---|
| [-h] | print help and exit | |
| [--find] | find process pid, name or arguments | |
| [--exclude] | exclude process pid, name or arguments | None |
| [--self] | find a clones of self | True |
| [--kill] | kill the process with pid |
Example usage in terminal with Python for find all running processes:
python3 ./procutil.py
Example usage in terminal with make the script executable for find all specified processes:
chmod u+x ./procutil.py
./procutil.py --find ssh --exclude sftp
Example usage in Python for find a clones of self:
from os import getpid
from sys import argv
from procutil import Proc
processes = Proc.search(' '.join(argv), str(getpid()))
if processes:
for process in processes:
print(process)
sendmail.py
Description: Sending email from Python
Dependencies: Python 3 (tested version 3.9.5)
| PARAMETERS | DESCRIPTION | DEFAULT |
|---|---|---|
| -u, --user | smtp valid user | REQUIRED |
| -p, --pass | smtp valid password | REQUIRED |
| -d, --dest | destination addresses | REQUIRED |
| [-h] | print help and exit | |
| [--smtp] | smtp hostname or ip address | smtp.gmail.com |
| [--port] | smtp port number | 587 |
| [--stls] | smtp required TLS | True |
| [--from] | mail from alias | --user value |
| [--subj] | mail subject | 'no subject' |
| [--text] | mail body text | 'no text' |
| [--type] | mail body type: plain, html | plain |
| [--file] | mail attachment files | None |
| [--time] | minutes of attempts to send | 3 |
Example usage in terminal with Python:
python3 ./sendmail.py -u user@gmail.com -p pass -d addr1@gmail.com,addr2@gmail.com
Example usage in terminal with make the script executable:
chmod u+x ./sendmail.py
./sendmail.py -u user@gmail.com -p pass -d addr1@gmail.com,addr2@gmail.com
Example usage in Python:
from sendmail import Mail
msg = Mail(smtp_user='user@gmail.com', smtp_pass='pass', mail_dest='addr1@gmail.com,addr2@gmail.com')
log = msg.send()
print(log)
simplewc.py
Description: Update Let's Encrypt wildcard certificate with DNS-01 challenge
Dependencies: Python 3 (tested version 3.9.5),
installed or downloaded acme.sh,
installed dnspython package,
dns is supported to dynamic update
| PARAMETERS | DESCRIPTION | DEFAULT |
|---|---|---|
| --domain | domain for which the wildcard certificate is issued | REQUIRED |
| --server | master server containing the domain zone | REQUIRED |
| --keyname | name of the key to update the zone | REQUIRED |
| --keydata | content of the key to update the zone | REQUIRED |
| [-h] | print help and exit | |
| [--acmepath] | alternative path to bin (example: ~/.acme.sh/acme.sh) | None |
| [--force] | "force" argument for the acme.sh | False |
| [--test] | "test" argument for the acme.sh | False |
Example usage in cron with Python:
# at 00:00 on Monday
0 0 * * 1 /usr/bin/python3 ~/simplewc.py --domain EXAMPLE.COM --server 8.8.8.8 --keyname KEY --keydata YOU_KEY_CONTENT > /dev/null
# 00:00 on day-of-month 1 and 15
0 0 1,15 * * /usr/bin/python3 ~/simplewc.py --domain EXAMPLE.COM --server dyn.dns.he.net --keyname - --keydata YOU_DDNSKEY > /dev/null
Example usage in terminal with make the script executable:
chmod u+x ./simplewc.py
./simplewc.py --domain EXAMPLE.COM --server 8.8.8.8 --keyname KEY --keydata YOU_KEY_CONTENT --test --force
./simplewc.py --domain EXAMPLE.COM --server dyn.dns.he.net --keyname - --keydata YOU_DDNSKEY --test --force