10 Commits
v0.2 ... master

Author SHA1 Message Date
18f503c3e0 add --buffer-size=192000 2021-02-17 12:52:12 +00:00
ac0f0a6fbb README.md 2021-02-17 11:47:16 +00:00
bfbb10ed52 docu 2021-02-06 12:00:18 +00:00
88519bc4ab docu 2021-02-06 11:57:39 +00:00
d910a3d93f arecord parameter 2021-02-06 09:41:20 +00:00
197b2890e8 -max-file-time + filename 2021-02-04 20:41:07 +00:00
48c84601c5 . 2021-02-03 19:08:42 +00:00
a39c5ffb46 ... 2021-02-02 15:45:11 +00:00
769bb239e0 .. 2021-02-01 17:24:10 +00:00
cc9de03d26 source beautifying 2021-02-01 17:12:39 +00:00
2 changed files with 126 additions and 65 deletions

View File

@@ -14,7 +14,7 @@
* Einrichtung ALSA * Einrichtung ALSA
* über welches Device kann das Mikro angesprochen werden? (hier: plughw:1,0) * über welches Device kann das Mikro angesprochen werden? (hier: plughw:1,0)
#### Entfernter Server (server) #### Voraussetzungen entfernter Server (server)
* sshd * sshd
* apt-get install rsync * apt-get install rsync
@@ -36,6 +36,7 @@ Auf dem Raspi folgendes ausführen:
``` ```
git clone https://git.hs42.de/hs/sumsel.git git clone https://git.hs42.de/hs/sumsel.git
cd /sumsel cd /sumsel
chmod a+x sumsel.sh
cp sumsel.conf.dist sumsel.conf cp sumsel.conf.dist sumsel.conf
``` ```
Anschliessend Variablen in ./sumsel.conf setzen: Anschliessend Variablen in ./sumsel.conf setzen:
@@ -49,7 +50,7 @@ Anschliessend Variablen in ./sumsel.conf setzen:
| UPL_DIR | optional | Ordner in dem die MP3 Dateien abgelegt werden | ./upqueue | | UPL_DIR | optional | Ordner in dem die MP3 Dateien abgelegt werden | ./upqueue |
| UPL_SUFFIX | optional | Ordner in dem die MP3 Dateien abgelegt werden | sumsi | | UPL_SUFFIX | optional | Ordner in dem die MP3 Dateien abgelegt werden | sumsi |
## Betrieb ## Skripte
| Kommando | Aktion | | Kommando | Aktion |
| ------------ | ------------------------ | | ------------ | ------------------------ |
@@ -57,6 +58,33 @@ Anschliessend Variablen in ./sumsel.conf setzen:
| sumsel.sh -r | Aufnehmen | | sumsel.sh -r | Aufnehmen |
| sumsel.sh -c | Konvertieren + Hochladen | | sumsel.sh -c | Konvertieren + Hochladen |
## Betrieb
Im Dauerbetrieb laufen zwei Jobs:
| Jobtyp | Bezeichnung | Kommando | Betriebsart |
| ------- |------------------------- | ------------------------------- | -------------- |
| record | Aufnahme der WAV Dateien | ./sumsel.sh -r -C ./sumsel.conf | endlos |
| convert | Konvertierung + Upload | ./sumsel.sh -c -C ./sumsel.conf | alle 5 Minuten |
Die Jobs können über cron gestartet werden. Das Skript setzt einen Lock und sorgt dafür, dass von
jeden Jobtyp nur eine Instanz laufen kann. Stellt das Script fest, dass bereits eine Instanz läuft,
wird die aktuelle Instanz mit der Meldung "LOCK error" beendet.
```
hs@raspi4:~/dev/stage/sumsel $ ./sumsel.sh -c -C ./sumsel.conf
LOCK error
```
Beispiel für crontab:
```
*/5 * * * * <path>/sumsel.sh -r -C <path>/sumsel.conf >> <path>/sumsel_r.log
1,10,11,21,31,41,51 * * * * <path>/sumsel.sh -c -C <path>/sumsel.conf >> <path>/sumsel_c.log
```
### GIT commands ### GIT commands
* git status * git status
* git add ... * git add ...

159
sumsel.sh
View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
VERSION="0.3"
LOCK_DIR=/var/lock LOCK_DIR=/var/lock
SIM_EXAMPLE_FILE=./res/test.wav SIM_EXAMPLE_FILE=./res/test.wav
@@ -25,17 +27,29 @@ UPL_SUFFIX=sumsi
usage() { usage() {
echo "Usage: $0 [-h] (-s|-r|-t) [-C <configfile>]" 1>&2; echo "Usage: $0 [-h] (-s|-r|-t) [-C <configfile>]" 1>&2;
echo -e '\t-h Usage' echo -e '\t-h Usage' 1>&2;
echo -e '\t-s Simulation' echo -e '\t-v Version' 1>&2;
echo -e '\t-r Aufnahme' echo -e '' 1>&2;
echo -e '\t-c Konvertierung' echo -e '\t-s Simulation' 1>&2;
echo -e '\t-C <configfile> ssss' echo -e '\t-r Aufnahme' 1>&2;
echo -e '\t-c Konvertierung' 1>&2;
echo -e '' 1>&2;
echo -e '\t-C <configfile> Konfiguration laden' 1>&2;
echo "" 1>&2;
echo "Doku: https://git.hs42.de/hs/sumsel" 1>&2;
exit 1; exit 1;
} }
while getopts ":hsrcC:" options; mode=''
lock_mode=''
while getopts ":hsrcC:v" options;
do do
case "${options}" in case "${options}" in
v)
echo "$0 version ${VERSION}" 1>&2;
exit 1
;;
h) h)
usage usage
;; ;;
@@ -47,7 +61,7 @@ do
if [ -f ${config} ]; then if [ -f ${config} ]; then
. ${config} . ${config}
else else
echo "file not found: ${config}" echo "config file not found: ${config}"
exit exit
fi fi
;; ;;
@@ -58,23 +72,17 @@ do
esac esac
done done
check_var_exists() {
local var_name=$1
if [[ ! -v ${var_name} ]]; then
echo "${var_name} not set"
exit 1
fi
}
set_lockfile() { set_lockfile() {
local BASENAME=$(basename "$0") local basename=$(basename "$0")
local LOCK_FILE="${LOCK_DIR}/${BASENAME}" if [ ! -z ${1+x} ]; then
local RANDOM_FILE=$(mktemp --tmpdir=${LOCK_DIR}) basename="${basename}_$1"
echo $$ > ${RANDOM_FILE} fi
mv -n ${RANDOM_FILE} ${LOCK_FILE} local lock_file="${LOCK_DIR}/${basename}"
local random_file=$(mktemp --tmpdir=${LOCK_DIR})
echo $$ > ${random_file}
mv -n ${random_file} ${lock_file}
if [ -e ${RANDOM_FILE} ] ; then if [ -e ${random_file} ]; then
false false
else else
true true
@@ -82,10 +90,32 @@ set_lockfile() {
} }
del_lockfile() { del_lockfile() {
local BASENAME=$(basename "$0") local basename=$(basename "$0")
local LOCK_FILE="${LOCK_DIR}/${BASENAME}" if [ ! -z ${1+x} ]; then
basename="${basename}_$1"
fi
local lock_file="${LOCK_DIR}/${basename}"
rm ${LOCK_FILE} rm ${lock_file}
}
cleanup() {
del_lockfile ${lock_mode}
exit 1
}
check_var_exists() {
local var_name=$1
if [[ ! -v ${var_name} ]]; then
echo "${var_name} not set"
cleanup
fi
}
ctrl_c() {
echo "** Trapped CTRL-C" 1>&2;
cleanup
} }
simulate() { simulate() {
@@ -93,18 +123,19 @@ simulate() {
check_var_exists "REC_PREFIX" check_var_exists "REC_PREFIX"
check_var_exists "SIM_EXAMPLE_FILE" check_var_exists "SIM_EXAMPLE_FILE"
local COUNTER=0 local counter=0
local dst_fn=""
mkdir -p ${REC_DIR} mkdir -p ${REC_DIR}
echo "Press [CTRL+C] to stop.." echo "Press [CTRL+C] to stop.." 1>&2;
trap ctrl_c INT
while : while :
do do
sleep 1 sleep ${REC_FILE_TIME}
COUNTER=$[$COUNTER +1] counter=$[$counter +1]
dst_fn="${REC_DIR}/${REC_PREFIX}-${COUNTER}.wav" dst_fn="${REC_DIR}/${REC_PREFIX}-${counter}.wav"
cp ${SIM_EXAMPLE_FILE} ${dst_fn} cp ${SIM_EXAMPLE_FILE} ${dst_fn}
done done
exit 0
} }
record() { record() {
@@ -114,8 +145,8 @@ record() {
check_var_exists "REC_DIR" check_var_exists "REC_DIR"
mkdir -p ${REC_DIR} mkdir -p ${REC_DIR}
arecord --format=cd --device=${REC_DEVICE} --max-file-time ${REC_FILE_TIME} ${REC_DIR}/${REC_PREFIX}.wav trap ctrl_c INT
exit 0 arecord --format=cd --device=${REC_DEVICE} --buffer-size=192000 --max-file-time=${REC_FILE_TIME} --use-strftime ${REC_DIR}/${REC_PREFIX}%Y%m%d%H%M%v.wav
} }
convert() { convert() {
@@ -124,46 +155,48 @@ convert() {
check_var_exists "UPL_SUFFIX" check_var_exists "UPL_SUFFIX"
check_var_exists "REMOTE_DIR" check_var_exists "REMOTE_DIR"
if set_lockfile; mkdir -p ${REC_DIR}
then mkdir -p ${UPL_DIR}
mkdir -p ${REC_DIR} #Alle WAV Files ausser das letzte File.
mkdir -p ${UPL_DIR} #Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet
local FILES=$(ls -tr ${REC_DIR} |head -n -1)
#Alle WAV Files ausser das letzte File. for F in ${FILES}
#Das letzte File wird gerade recorded und wird beim naechsten Durchlauf verarbeitet do
local FILES=$(ls -tr ${REC_DIR} |head -n -1) #Ermittle ctime des WAV Files
local CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
rm "${REC_DIR}/${F}"
done
for F in ${FILES} rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
do
#Ermittle ctime des WAV Files
local CTIME=$(date -r "${REC_DIR}/${F}" +"%Y%m%d%H%M%S")
ffmpeg -i "${REC_DIR}/${F}" -acodec mp3 "${UPL_DIR}/${CTIME}_${UPL_SUFFIX}.mp3"
rm "${REC_DIR}/${F}"
done
rsync -avzh --remove-source-files ${UPL_DIR} ${REMOTE_DIR}
del_lockfile
exit 0
else
echo "LOCK error"
exit 1
fi
} }
case ${mode} in case ${mode} in
s) #Simulation s) #Simulation
simulate lock_mode=record
exit func=simulate
;; ;;
r) #Aufnahme r) #Aufnahme
record lock_mode=record
func=record
;; ;;
c) #Konvertierung c) #Konvertierung
convert lock_mode=convert
func=convert
;; ;;
*) *)
echo "mode not set" echo "mode not set" 1>&2;
exit 1 exit 1
;; ;;
esac esac
if set_lockfile ${lock_mode}; then
${func}
del_lockfile ${lock_mode}
else
echo "LOCK error" 1>&2;
exit 1
fi