link and flake cleanup

This commit is contained in:
2026-02-08 16:05:03 -05:00
parent 087a264e97
commit 5e6dfc75ad
24 changed files with 393 additions and 186 deletions
+50 -43
View File
@@ -7,10 +7,7 @@ import time
import socket
import os
import signal
import getopt
import string
import select
import errno
import traceback
from hashlib import md5
import shutil
@@ -37,13 +34,13 @@ helpflag = False
verbose = False
fdaemon = False
daemonized = False
optlist = []
msgboot = {}
home = os.environ["HOME"]
configfile = "%s/.hbrc" % home
cmdargs = []
iam = socket.gethostname()
def log(msg):
if fdaemon:
syslog.syslog(syslog.LOG_ERR, msg)
@@ -115,7 +112,7 @@ class Conn:
try:
self.lastack = msgDict["time"]
mul = 2
except:
except Exception:
self.lastack = now
mul = 1
rtt = (self.lastack - self.lastsend) * mul
@@ -140,7 +137,7 @@ def shortname(name):
def dicttos(ID, d):
s = []
for k in d:
if type(d[k]) == type(1.2):
if isinstance(d[k], float):
s.append("%s=%0.5f" % (k, d[k]))
else:
s.append("%s=%s" % (k, d[k]))
@@ -169,7 +166,7 @@ def stodict(msg):
v = vr[1].strip()
try:
v = eval(v)
except:
except Exception:
pass
d[k] = v
if verbose:
@@ -199,7 +196,7 @@ def XXstodict(msg):
try:
if v[0].isdigit():
v = eval(v)
except:
except Exception:
pass
d[k] = v
return d
@@ -208,8 +205,8 @@ def XXstodict(msg):
def syslogtrace(note):
logm = "%s hbc died: \n%s" % (note, traceback.format_exc())
log(logm)
for l in logm.split("\n"):
syslog.syslog(syslog.LOG_ERR, " tb: %s" % l)
for line in logm.split("\n"):
syslog.syslog(syslog.LOG_ERR, " tb: %s" % line)
if verbose:
print(logm)
@@ -314,7 +311,7 @@ def restart():
e = "fallthrough"
try:
os.execv(sys.argv[0], [sys.argv[0]] + cmdargs)
except Exception as e:
except Exception:
pass
print("should not be here:", str(e))
log("restart failed: %s" % e)
@@ -350,7 +347,7 @@ def process():
if running:
running = False
break
except:
except Exception:
if running:
syslogtrace("select")
running = False
@@ -374,12 +371,12 @@ def process():
"sock.recvfrom: %s (%s) %s"
% (addr, len(data), str(msgDict)[:80])
)
if msgDict == None:
if msgDict is None:
print("bad backet from %s (%s) %s" % (addr, len(data), data))
elif msgDict["ID"] == "ACK":
conns[conn].ack(msgDict, now)
elif msgDict["ID"] == "UPD":
if doupdate(conn, msgDict) == None:
if doupdate(conn, msgDict) is None:
if verbose:
print("process: restart after update")
dorestart = True
@@ -473,6 +470,7 @@ def daemonize(
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
#
# Main program
#
@@ -483,46 +481,55 @@ def build_parser():
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument("-b", "--boot", action="store_true", help="Send a boot message")
parser.add_argument("-c", "--config", dest="configfile", help="Config file path (YAML)")
parser.add_argument(
"-c", "--config", dest="configfile", help="Config file path (YAML)"
)
parser.add_argument("-m", "--message", dest="message", help="Send a message")
parser.add_argument("-n", "--name", dest="name", help="Name to use in heartbeat message")
parser.add_argument("-f", "--daemon", action="store_true", help="Run in daemon mode")
parser.add_argument(
"-n", "--name", dest="name", help="Name to use in heartbeat message"
)
parser.add_argument(
"-f", "--daemon", action="store_true", help="Run in daemon mode"
)
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
parser.add_argument("-x", "--debug", action="count", default=0, help="Increase debug level")
parser.add_argument(
"-x", "--debug", action="count", default=0, help="Increase debug level"
)
parser.add_argument("hosts", nargs="+", help="Heartbeat daemon hosts to send to")
return parser
def main(argv=None):
global msgonly, helpflag, verbose, fdaemon, daemonized, optlist, msgboot, home, configfile, cmdargs, iam, hb_port, conns, interval, hb_hosts
global msgonly, verbose, fdaemon, daemonized, cmdargs, iam, hb_port, conns, interval, hb_hosts
parser = build_parser()
args = parser.parse_args(argv)
args = parser.parse_args(argv)
config = load_config(args.configfile)
# Apply CLI overrides
if args.boot:
msgboot["boot"] = 1
msgboot["boot"] = 1
if args.message:
msgboot["service"] = "service"
msgboot["msg"] = args.message
msgonly = True
msgboot["service"] = "service"
msgboot["msg"] = args.message
msgonly = True
if args.name:
iam = args.name
iam = args.name
if args.daemon:
fdaemon = True
fdaemon = True
if args.verbose:
verbose = True
verbose = True
if args.debug:
config.setdefault("debug", 0)
config["debug"] += args.debug
config.setdefault("debug", 0)
config["debug"] += args.debug
cmdargs += argv
if verbose:
print("cmdargs for restart are %s" % cmdargs)
#
# set defaults
hb_hosts = args.hosts
hb_port = config.get("hb_port", PORT)
interval = config.get("interval", INTERVAL)
@@ -535,10 +542,10 @@ def main(argv=None):
print("notice: iam: %s" % iam)
print("notice: msgonly: %s" % msgonly)
print("notice: msgboot: %s" % msgboot)
if not msgonly:
msgboot["interval"] = interval
conns = {}
while True:
if verbose:
@@ -549,23 +556,23 @@ def main(argv=None):
if verbose:
log("no connections yet, sleep a bit")
time.sleep(2)
if verbose:
log("%s connections created" % (len(conns)))
if len(msgboot) > 0:
if verbose:
print("on boot")
msgboot["acks"] = 0
for conn in conns:
conns[conn].sendto(msgboot)
if msgonly:
if verbose:
print("msgboot done msgonly=%s" % msgonly)
closeall()
sys.exit(0)
#
syslog.openlog("hbc", syslog.LOG_PID, syslog.LOG_DAEMON)
if fdaemon:
@@ -573,21 +580,21 @@ def main(argv=None):
daemonize()
daemonized = True
syslog.syslog(syslog.LOG_ERR, "starting heartbeat to %s" % ",".join(hb_hosts))
signal.signal(signal.SIGTERM, handler)
running = True
try:
process()
except Exception as e:
syslogtrace("process")
if verbose:
print("err: process exit: %s" % e)
if verbose:
log("main: cleanup")
cleanup()
if dorestart:
restart()
if __name__ == "__main__":
main()
main()