ref: 9219ba76e68805b7cf2c79ffdc44e4e9b9a45c6e
parent: bbf775bb70004f56a036c4989c9d7eadefc57abf
parent: 8b62d5ea86a77e4f7d4102a2ea95297cc9f85d76
author: halfwit <michaelmisch1985@gmail.com>
date: Mon Oct 23 08:59:58 PDT 2023
Merge pull request #14 from halfwit/rework Fixes for monitor
--- a/libservice/svcquery.c
+++ b/libservice/svcquery.c
@@ -2,21 +2,21 @@
#include <libc.h>
#include "service.h"
-char *
-readFile(char *dir, char *name, int len)
+int
+readFile(char *dir, char *name, char *buf, int len)
{
int fd, n;
- char buf[MAXDESC+1], path[NAMELEN+25];
+ char path[NAMELEN+25];
sprint(path, "/mnt/services/%s/%s", dir, name);
if((fd = open(path, OREAD)) < 0)
- return nil;
+ return -1;
n = readn(fd, buf, len);
if(buf[n-1] == '\n' || buf[n-1] == RS)
- buf[n-1] = '\0';
+ n--;
buf[n] = '\0';
close(fd);
- return buf;
+ return n;
}
Service *
@@ -23,26 +23,27 @@
addService(Dir d)
{
Service *svc;
- char *desc, *addr, *auth, *stat, *up;
+ char data[MAXDESC];
+ int n;
svc = malloc(sizeof *svc);
+ memset(svc, '\0', sizeof(svc));
memmove(svc->name, d.name, NAMELEN);
- svc->name[strlen(d.name)] = '\0';
- desc = readFile(d.name, "description", MAXDESC);
- memmove(svc->description, desc, strlen(desc));
- auth = readFile(d.name, "authdom", MAXAUTH);
- memmove(svc->authdom, auth, strlen(auth));
- addr = readFile(d.name, "address", MAXADDR);
- memmove(svc->address, addr, strlen(addr));
+ memset(data, '\0', MAXDESC);
+ n = readFile(d.name, "description", data, MAXDESC);
+ memmove(svc->description, data, n);
+ n = readFile(d.name, "authdom", data, MAXAUTH);
+ memmove(svc->authdom, data, n);
+ n = readFile(d.name, "address", data, MAXADDR);
+ memmove(svc->address, data, n);
svc->status = Sreg;
- stat = readFile(d.name, "status", 12);
- if(strncmp(stat, "ok", 2) == 0)
+ readFile(d.name, "status", data, 12);
+ if(strncmp(data, "ok", 2) == 0)
svc->status = Sok;
- if(strncmp(stat, "down", 4) == 0)
+ if(strncmp(data, "down", 4) == 0)
svc->status = Sdown;
- up = readFile(d.name, "uptime", 64); /* Way huge */
- svc->uptime = strtoll(up, nil, 10);
-
+ readFile(d.name, "uptime", data, 64); /* Way huge */
+ svc->uptime = strtoll(data, nil, 10);
return svc;
}
@@ -72,8 +73,7 @@
{
Service *svc, *bsvc;
Dir *d;
- int dfd, i, n;
-
+ int dfd, i, n;
bsvc = nil;
/* Build out a tuple based on our search values */
@@ -82,6 +82,7 @@
if(mount(fd, -1, "/mnt/services", MREPL, "") < 0)
return nil;
dfd = open("/mnt/services", OREAD);
+ d = nil;
while((n = dirread(dfd, &d)) > 0){
for(i=0; i < n; i++){
if(argc == 2 && filter(d[i], argv[0], argv[1]) < 0)
@@ -94,6 +95,7 @@
}
free(d);
}
+ close(dfd);
unmount(0, "/mnt/services");
return bsvc;
}
--- a/monitor.c
+++ b/monitor.c
@@ -2,8 +2,9 @@
#include <libc.h>
#include "service.h"
-void monitor(char *,int, int, int);
+void monitor(char*, char*, int, int);
void publish(Service *, char *);
+void check(int, int);
static void
usage(void)
@@ -17,11 +18,11 @@
{
char *svcfs;
char *authdom;
- int style, fd, pollrate;
+ int style, pollrate;
svcfs = nil;
- authdom = nil;
style = 1;
+ authdom = "9front";
pollrate = 30;
ARGBEGIN{
@@ -44,66 +45,74 @@
if(argc > 0)
usage();
- if((fd = svcdial(svcfs, authdom)) < 0){
- fprint(2, "Unable to dial svcfs: %r\n");
- exits("error");
- }
- if(authdom != nil){
- monitor(authdom, fd, style, pollrate);
- exits(0);
- }
- monitor("9front", fd, style, pollrate);
+ monitor(svcfs, authdom, style, pollrate);
exits(0);
}
char *
-clean(char *addr)
+addr2hostname(char *addr)
{
- char *c;
if(strncmp(addr, "tcp!", 4) == 0)
- addr += 4;
- c = strchr(addr, '!');
- if(c != nil)
- *c='\0';
- return addr ;
+ return addr+4;
+ return addr;
}
void
-monitor(char *authdom, int fd, int style, int rate)
+check(int fd, int style)
{
- Service *svc, *s;
char srv[MAXADDR];
- int i;
+ char *host;
+ Service *svc, *s;
+ print("Checking for /srv updates\n");
+ svc = svcquery(fd, ".", nil, 0);
+ if(svc == nil){
+ fprint(2, "Error parsing service entries\n");
+ return;
+ }
+ for(s = svc; s; s = s->next){
+ host = addr2hostname(s->address);
+ switch(style){
+ case 1:
+ sprint(srv, "/srv/%s.%s.%s", s->name, host, s->authdom);
+ break;
+ case 2:
+ sprint(srv, "/srv/%s.%s.%s", s->authdom, host, s->name);
+ break;
+ }
+ switch(s->status){
+ case Sok:
+ publish(s, srv);
+ break;
+ case Sdown:
+ remove(srv);
+ break;
+ case Spersist:
+ case Sreg:
+ default:
+ //
+ break;
+ }
+ }
+ svcfree(svc);
+}
+
+void
+monitor(char *svcfs, char *authdom, int style, int rate)
+{
+ int i, fd;
+
for(;;){
+ if((fd = svcdial(svcfs, authdom)) < 0){
+ fprint(2, "Unable to dial svcfs: %r\n");
+ exits("error");
+ }
for(i=0; i < rate; i++)
sleep(1000);
- svc = svcquery(fd, ".", nil, 0);
- for(s = svc; s; s = s->next){
- switch(style){
- case 1:
- sprint(srv, "/srv/%s.%s.%s", s->name, clean(s->address), authdom);
- break;
- case 2:
- sprint(srv, "/srv/%s.%s.%s", authdom, clean(s->address), s->name);
- break;
- }
- switch(s->status){
- case Sok:
- publish(s, srv);
- break;
- case Sdown:
- remove(srv);
- break;
- case Spersist:
- case Sreg:
- // No-op
- break;
- }
- }
- svcfree(svc);
+ check(fd, style);
+ close(fd);
}
}
@@ -112,23 +121,29 @@
{
char buf[128];
int f, fd;
- char *dest;
/* stat first and bail before we double dial/create */
- if((f = open(srv, OREAD)) >= 0){
+ if((f = open(srv, OREAD)) > 0){
close(f);
return;
}
/* Dial */
- dest = netmkaddr(s->address, 0, "9fs");
- fd = dial(dest, 0, 0, 0);
+ fd = dial(s->address, 0, 0, 0);
if(fd < 0)
- return;
+ goto Error;
f = create(srv, OWRITE, 0666);
if(f < 0)
- return;
+ goto Error;
/* Publish fd from dial */
sprint(buf, "%d", fd);
write(f, buf, strlen(buf));
+ print("publish %s\n", srv);
close(f);
+ return;
+Error:
+ close(f);
+ if(fd >= 0)
+ close(fd);
+ fprint(2, "Unable to publish service: %r\n");
+
}