mirror of https://bitbucket.org/ausocean/av.git
Fix various vidforward issues
This change fixes some bugs relating to the Makefile and the systemd watchdog notifier system. We have also removed the run.sh script which was the culprit of latter problem (not sure exactly how, but probably something to do with PIDs).
This commit is contained in:
parent
0f0deaa598
commit
683bb923cb
|
@ -3,7 +3,7 @@ USER := $(shell whoami)
|
||||||
PATH := /usr/local/go/bin:$(PATH)
|
PATH := /usr/local/go/bin:$(PATH)
|
||||||
BIN_NAME := vidforward
|
BIN_NAME := vidforward
|
||||||
BIN_DIR := /src/bitbucket.org/ausocean/av/cmd/$(BIN_NAME)
|
BIN_DIR := /src/bitbucket.org/ausocean/av/cmd/$(BIN_NAME)
|
||||||
RUN_SCRIPT_DIR := $(BIN_DIR)
|
RUN_SCRIPT_DIR := $(BIN_DIR)/run.sh
|
||||||
|
|
||||||
.SILENT:soft_copy_files
|
.SILENT:soft_copy_files
|
||||||
.SILENT:hard_copy_files
|
.SILENT:hard_copy_files
|
||||||
|
@ -11,12 +11,12 @@ RUN_SCRIPT_DIR := $(BIN_DIR)
|
||||||
|
|
||||||
rebuild:
|
rebuild:
|
||||||
chmod +x run.sh
|
chmod +x run.sh
|
||||||
cd ../cmd/$(BIN_NAME); go build
|
go build -tags nocv,debug
|
||||||
|
|
||||||
install: as_root soft_copy_files rebuild
|
install: as_root soft_copy_files rebuild
|
||||||
@echo "Install complete"
|
@echo "Install complete"
|
||||||
|
|
||||||
install_hard: as_root hard_copy_files set_mac rebuild
|
install_hard: as_root hard_copy_files rebuild
|
||||||
@echo "Hard install complete"
|
@echo "Hard install complete"
|
||||||
|
|
||||||
as_root:
|
as_root:
|
||||||
|
|
|
@ -15,6 +15,9 @@ run_script_dir=$1
|
||||||
# This corresponds to the binary dir. e.g. /src/bitbucket.org/ausocean/av/cmd/vidforward.
|
# This corresponds to the binary dir. e.g. /src/bitbucket.org/ausocean/av/cmd/vidforward.
|
||||||
bin_dir=$2
|
bin_dir=$2
|
||||||
|
|
||||||
|
# This is the IP we'll run the host on.
|
||||||
|
host=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
# Get the bin name (assuming this is at the end of the bin_dir).
|
# Get the bin name (assuming this is at the end of the bin_dir).
|
||||||
bin_name=$(basename $bin_dir)
|
bin_name=$(basename $bin_dir)
|
||||||
|
|
||||||
|
@ -27,6 +30,8 @@ gopath_user=${arr_in[1]}
|
||||||
# We can now form the gopath from the obtained user.
|
# We can now form the gopath from the obtained user.
|
||||||
gopath="/home/$gopath_user/go"
|
gopath="/home/$gopath_user/go"
|
||||||
|
|
||||||
|
echo "$gopath$run_script_dir $gopath_user $bin_dir $host"
|
||||||
|
|
||||||
# Here are the lines that will go into the rv.service file. We'll set the
|
# Here are the lines that will go into the rv.service file. We'll set the
|
||||||
# ExecStart field as the GOPATH we've obtained + the passed run script dir.
|
# ExecStart field as the GOPATH we've obtained + the passed run script dir.
|
||||||
service="
|
service="
|
||||||
|
@ -34,8 +39,8 @@ service="
|
||||||
Description=vidforward service for forwarding video to youtube
|
Description=vidforward service for forwarding video to youtube
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=notify
|
||||||
ExecStart=$gopath$run_script_dir $gopath_user $bin_dir
|
ExecStart=$gopath$bin_dir/vidforward -host $host
|
||||||
WatchdogSec=30s
|
WatchdogSec=30s
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ LICENSE
|
||||||
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -42,7 +41,7 @@ const (
|
||||||
testMAC = "78:90:AE:7B:2C:76"
|
testMAC = "78:90:AE:7B:2C:76"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init(){
|
func init() {
|
||||||
inTest = true
|
inTest = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,17 +202,17 @@ func broadcastManagersEqual(m1, m2 broadcastManager) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func broadcastMapsEqual(m1, m2 map[MAC]Broadcast) bool {
|
func broadcastMapsEqual(m1, m2 map[MAC]Broadcast) bool {
|
||||||
return mapsEqual(m1,m2,broadcastsEqual)
|
return mapsEqual(m1, m2, broadcastsEqual)
|
||||||
}
|
}
|
||||||
|
|
||||||
func slateExitSignalMapsEqual(m1, m2 map[MAC]chan struct{}) bool {
|
func slateExitSignalMapsEqual(m1, m2 map[MAC]chan struct{}) bool {
|
||||||
return mapsEqual(m1,m2,func(v1, v2 chan struct{}) bool {
|
return mapsEqual(m1, m2, func(v1, v2 chan struct{}) bool {
|
||||||
return ((v1 == nil || v2 == nil ) && v1 == v2) || (v1 != nil && v2 != nil)
|
return ((v1 == nil || v2 == nil) && v1 == v2) || (v1 != nil && v2 != nil)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func activeHandlersMapEqual(m1, m2 map[int]handlerInfo) bool {
|
func activeHandlersMapEqual(m1, m2 map[int]handlerInfo) bool {
|
||||||
return mapsEqual(m1,m2, func(v1, v2 handlerInfo) bool { return v1.name == v2.name })
|
return mapsEqual(m1, m2, func(v1, v2 handlerInfo) bool { return v1.name == v2.name })
|
||||||
}
|
}
|
||||||
|
|
||||||
// mapsEqual is a generic function to check that any two maps are equal based on
|
// mapsEqual is a generic function to check that any two maps are equal based on
|
||||||
|
@ -224,7 +223,7 @@ func mapsEqual[K comparable, V any](m1, m2 map[K]V, cmp func(v1, v2 V) bool) boo
|
||||||
}
|
}
|
||||||
for k, v1 := range m1 {
|
for k, v1 := range m1 {
|
||||||
v2, ok := m2[k]
|
v2, ok := m2[k]
|
||||||
if !ok || !cmp(v1,v2) {
|
if !ok || !cmp(v1, v2) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ type watchdogNotifier struct {
|
||||||
termCallback func()
|
termCallback func()
|
||||||
log logging.Logger
|
log logging.Logger
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
haveRun bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// handlerInfo keeps track of a handlers name (for any logging purposes) and
|
// handlerInfo keeps track of a handlers name (for any logging purposes) and
|
||||||
|
@ -65,18 +66,7 @@ type handlerInfo struct {
|
||||||
// and termination callback that is called if a SIGINT or SIGTERM signal is
|
// and termination callback that is called if a SIGINT or SIGTERM signal is
|
||||||
// received. Recommended use of this is an attempted state save.
|
// received. Recommended use of this is an attempted state save.
|
||||||
func newWatchdogNotifier(l logging.Logger, termCallback func()) (*watchdogNotifier, error) {
|
func newWatchdogNotifier(l logging.Logger, termCallback func()) (*watchdogNotifier, error) {
|
||||||
var (
|
interval := 1 * time.Minute
|
||||||
interval = 1 * time.Minute
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
|
|
||||||
if notifyWatchdog {
|
|
||||||
const clearEnvVars = false
|
|
||||||
interval, err = daemon.SdWatchdogEnabled(clearEnvVars)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &watchdogNotifier{
|
return &watchdogNotifier{
|
||||||
activeHandlers: make(map[int]handlerInfo),
|
activeHandlers: make(map[int]handlerInfo),
|
||||||
|
@ -93,7 +83,7 @@ func newWatchdogNotifier(l logging.Logger, termCallback func()) (*watchdogNotifi
|
||||||
// notify also starts a routine to monitor for any SIGINT or SIGTERM, upon which
|
// notify also starts a routine to monitor for any SIGINT or SIGTERM, upon which
|
||||||
// a callback that's provided at initialisation is called.
|
// a callback that's provided at initialisation is called.
|
||||||
func (n *watchdogNotifier) notify() {
|
func (n *watchdogNotifier) notify() {
|
||||||
notifyTicker := time.NewTicker(n.watchdogInterval / 2)
|
notifyTicker := time.NewTicker(n.watchdogInterval / 2.0)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
sigs := make(chan os.Signal, 1)
|
sigs := make(chan os.Signal, 1)
|
||||||
|
@ -116,6 +106,30 @@ func (n *watchdogNotifier) notify() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !n.haveRun {
|
||||||
|
n.haveRun = true
|
||||||
|
|
||||||
|
const clearEnvVars = false
|
||||||
|
ok, err := daemon.SdNotify(clearEnvVars, daemon.SdNotifyReady)
|
||||||
|
if err != nil {
|
||||||
|
n.log.Fatal("unexpected watchog notify read error", "error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
n.log.Fatal("watchdog notification not supported")
|
||||||
|
}
|
||||||
|
|
||||||
|
n.watchdogInterval, err = daemon.SdWatchdogEnabled(clearEnvVars)
|
||||||
|
if err != nil {
|
||||||
|
n.log.Fatal("unexpected watchdog error", "error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if n.watchdogInterval == 0 {
|
||||||
|
n.log.Fatal("Watchdog not enabled or this is the wrong PID")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// If this fails for any reason it indicates a systemd service configuration
|
// If this fails for any reason it indicates a systemd service configuration
|
||||||
// issue, and therefore programmer error, so do fatal log to cause crash.
|
// issue, and therefore programmer error, so do fatal log to cause crash.
|
||||||
supported, err := daemon.SdNotify(false, daemon.SdNotifyWatchdog)
|
supported, err := daemon.SdNotify(false, daemon.SdNotifyWatchdog)
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
#!/bin/bash -e
|
|
||||||
# This script launches vidforward. This is used by the service file.
|
|
||||||
|
|
||||||
# Check that we have the correct number of arguments passed.
|
|
||||||
if [ $# -ne 2 ]; then
|
|
||||||
echo "incorrect number of arguments, expected gopath user and binary directory"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# This is the user in the GOPATH e.g. for /home/foo/go the user is foo.
|
|
||||||
gopath_user=$1
|
|
||||||
|
|
||||||
# This is the dir of the binary from the GOPATH e.g. /src/bitbucket.org/ausocean/av/cmd/vidforward.
|
|
||||||
bin_dir=$2
|
|
||||||
|
|
||||||
# We'll get the bin name from the bin dir (assuming this is same as the bin dir name).
|
|
||||||
bin_name=$(basename $bin_dir)
|
|
||||||
|
|
||||||
# the following required directories _should_ already exist
|
|
||||||
if [ ! -d /var/log/vidforward ]; then
|
|
||||||
sudo mkdir /var/log/vidforward
|
|
||||||
chmod guo+rwx /var/log/vidforward
|
|
||||||
fi
|
|
||||||
|
|
||||||
# show IP addresses
|
|
||||||
echo Our IP addresses:
|
|
||||||
sudo ip addr show | grep inet
|
|
||||||
|
|
||||||
# capture stdout and stderr to a secondary log file (just in case)
|
|
||||||
exec 2> /var/log/vidforward/stream.log
|
|
||||||
exec 1>&2
|
|
||||||
|
|
||||||
# Now set all required variables.
|
|
||||||
HOME=/home/$gopath_user
|
|
||||||
GOPATH=$HOME/go
|
|
||||||
VIDFORWARD_PATH=$GOPATH$bin_dir
|
|
||||||
PATH=$PATH:/usr/local/go/bin:$VIDFORWARD_PATH
|
|
||||||
cd $VIDFORWARD_PATH
|
|
||||||
sudo -u $gopath_user HOME=$HOME GOPATH=$GOPATH PATH=$PATH ./$bin_name
|
|
||||||
if [ $? -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "Successfully exited vidforward"
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "vidforward exited with code: $?" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
Loading…
Reference in New Issue