Minor changes to error handling in main loop + changes to boot script and config

This commit is contained in:
Mattia Giambirtone 2022-03-13 13:04:40 +01:00
parent 5f965826ea
commit 38698ec72a
4 changed files with 50 additions and 41 deletions

View File

@ -7,7 +7,7 @@ restartDelay = 10
sigtermDelay = 90 sigtermDelay = 90
[Logging] [Logging]
level = info level = debug
logFile = /var/log/nimd logFile = /var/log/nimd
[Filesystem] [Filesystem]

View File

@ -112,4 +112,4 @@ if ! [[ $memory -eq "" ]]
qemumem="-m ${memory}" qemumem="-m ${memory}"
fi fi
qemu-system-x86_64 -net nic,model=virtio,netdev=user.0 -netdev user,id=user.0 -drive file=vm.qcow2,if=virtio -enable-kvm -kernel ${kernel} -initrd ${initrd} ${qemumem} -append 'root=/dev/vda1 rw quiet modules=ext4 console=ttyS0,9600 console=ttyS0 init=/bin/nimd' qemu-system-x86_64 -net nic,model=virtio,netdev=user.0 -netdev user,id=user.0 -drive file=vm.qcow2,if=virtio -enable-kvm -kernel ${kernel} -initrd ${initrd} ${qemumem} -append 'root=/dev/vda1 rw quiet modules=ext4 console=ttyS0 init=/bin/nimd'

View File

@ -40,44 +40,49 @@ proc mainLoop*(logger: Logger, config: NimDConfig, startServices: bool = true) =
logger.switchToFile() logger.switchToFile()
logger.debug("Entering accept() loop") logger.debug("Entering accept() loop")
while true: while true:
serverSocket.accept(clientSocket) try:
logger.debug(&"Received connection on control socket") serverSocket.accept(clientSocket)
if clientSocket.recv(opType, size=1) == 0: logger.debug(&"Received connection on control socket")
logger.debug(&"Client has disconnected, waiting for new connections") if clientSocket.recv(opType, size=1) == 0:
continue logger.debug(&"Client has disconnected, waiting for new connections")
logger.debug(&"Received operation type '{opType}' via control socket") continue
# The operation type is a single byte: logger.debug(&"Received operation type '{opType}' via control socket")
# - 'p' -> poweroff # The operation type is a single byte:
# - 'r' -> reboot # - 'p' -> poweroff
# - 'h' -> halt # - 'r' -> reboot
# - 's' -> Services-related operations (start, stop, get status, etc.) # - 'h' -> halt
# - 'l' -> Reload in-memory configuration # - 's' -> Services-related operations (start, stop, get status, etc.)
# - 'c' -> Check NimD status (returns "1" if up) # - 'l' -> Reload in-memory configuration
case opType: # - 'c' -> Check NimD status (returns "1" if up)
of "p": case opType:
logger.info("Received shutdown request") of "p":
shutdown(logger) logger.info("Received shutdown request")
of "r": shutdown(logger)
logger.info("Received reboot request") of "r":
reboot(logger) logger.info("Received reboot request")
of "h": reboot(logger)
logger.info("Received halt request") of "h":
halt(logger) logger.info("Received halt request")
of "s": halt(logger)
logger.info("Received service-related request") of "s":
# TODO: Operate on services logger.info("Received service-related request")
of "l": # TODO: Operate on services
logger.info("Received reload request") of "l":
mainLoop(logger, parseConfig(logger, "/etc/nimd/nimd.conf"), startServices=false) logger.info("Received reload request")
of "c": mainLoop(logger, parseConfig(logger, "/etc/nimd/nimd.conf"), startServices=false)
logger.info("Received check request, responding") of "c":
clientSocket.send("1") logger.info("Received check request, responding")
else: clientSocket.send("1")
logger.warning(&"Received unknown operation type '{opType}' via control socket, ignoring it") else:
discard logger.warning(&"Received unknown operation type '{opType}' via control socket, ignoring it")
clientSocket.close() discard
except:
logger.error(&"An error occurred while idling on control socket: {getCurrentExceptionMsg()}")
finally:
clientSocket.close()
clientSocket = newSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
except: except:
logger.critical(&"A critical error has occurred while running, restarting the mainloop in {config.restartDelay} seconds! Error -> {getCurrentExceptionMsg()}") logger.critical(&"A critical error has occurred while running, restarting the main loop in {config.restartDelay} seconds! Error -> {getCurrentExceptionMsg()}")
sleepSeconds(config.restartDelay) sleepSeconds(config.restartDelay)
# We *absolutely* cannot die # We *absolutely* cannot die
mainLoop(logger, config, startServices=false) mainLoop(logger, config, startServices=false)

View File

@ -59,7 +59,7 @@ proc addStuff =
depends=(@[newDependency(Other, errorer)]), provides=(@[]), depends=(@[newDependency(Other, errorer)]), provides=(@[]),
stdin="/dev/null", stderr="", stdout="") stdin="/dev/null", stderr="", stdout="")
var shell = newService(name="login", description="A simple login shell", kind=Simple, var shell = newService(name="login", description="A simple login shell", kind=Simple,
workDir=getCurrentDir(), runlevel=Boot, exec="/bin/login -f root", workDir=getCurrentDir(), runlevel=Default, exec="/bin/login -f root",
supervised=true, restart=Always, restartDelay=0, depends=(@[]), provides=(@[]), supervised=true, restart=Always, restartDelay=0, depends=(@[]), provides=(@[]),
useParentStreams=true, stdin="/dev/null", stderr="/proc/self/fd/2", stdout="/proc/self/fd/1" useParentStreams=true, stdin="/dev/null", stderr="/proc/self/fd/2", stdout="/proc/self/fd/1"
) )
@ -74,8 +74,12 @@ proc checkControlSocket(logger: Logger, config: NimDConfig): bool =
## socket ## socket
result = true result = true
var stat_result: Stat var stat_result: Stat
if posix.stat(cstring(config.sock), stat_result) == -1: if posix.stat(cstring(config.sock), stat_result) == -1 and posix.errno != 2:
logger.warning(&"Could not stat() {config.sock}, assuming NimD instance isn't running") logger.warning(&"Could not stat() {config.sock}, assuming NimD instance isn't running")
elif posix.errno == 2:
logger.debug(&"Control socket path is clear, starting up")
posix.errno = 0
# 2 is ENOENT, which means the file does not exist
# I stole this from /usr/lib/python3.10/stat.py # I stole this from /usr/lib/python3.10/stat.py
elif (int(stat_result.st_mode) and 0o170000) != 0o140000: elif (int(stat_result.st_mode) and 0o170000) != 0o140000:
logger.fatal(&"{config.sock} exists and is not a socket") logger.fatal(&"{config.sock} exists and is not a socket")