Prepare for disk watch thread

This commit is contained in:
Michiel Broek 2004-03-20 13:26:34 +00:00
parent b94cf4a837
commit a1345b8c84
10 changed files with 204 additions and 34 deletions

View File

@ -27,6 +27,7 @@ v0.51.2 06-Mar-2004
Moved the initial delay in the execute functions to the child Moved the initial delay in the execute functions to the child
process, that may be the trick to work around the lost child process, that may be the trick to work around the lost child
messages. messages.
Added enoughspace function to check diskspace.
mbcico: mbcico:
Updated file request function to new files database structure. Updated file request function to new files database structure.
@ -92,6 +93,12 @@ v0.51.2 06-Mar-2004
Added setup items in menu 1.5 for child priority and filesystem Added setup items in menu 1.5 for child priority and filesystem
sync calls. sync calls.
mbmon:
Switched to use new filesystems command.
mbtask:
Added communication commands for disk watch thread.
mbuseradd: mbuseradd:
Fixed removing of a OS created homedir. This may solve problems Fixed removing of a OS created homedir. This may solve problems
on RH and Fedora (under test). on RH and Fedora (under test).

View File

@ -14,7 +14,7 @@
</HEAD> </HEAD>
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<div align="right"><h5>Last update 06-Dec-2003</h5></div> <div align="right"><h5>Last update 20-Mar-2004</h5></div>
<div align="center"><H1>mbtask - MBSE BBS Taskmanager</H1></div> <div align="center"><H1>mbtask - MBSE BBS Taskmanager</H1></div>
<H3>Sysopsis.</H3> <H3>Sysopsis.</H3>
@ -186,6 +186,7 @@ Cat. Description
---- ------------------------------------------- ---- -------------------------------------------
Axxx Accounting, system monitor info etc. Axxx Accounting, system monitor info etc.
Cxxx Chatting Cxxx Chatting
Dxxx Disk watch
Gxxx Global commands. Gxxx Global commands.
Sxxx Status commands. Sxxx Status commands.
@ -234,7 +235,7 @@ Reply: 100:0; Ok.
200:1,Syntax Error; Error. 200:1,Syntax Error; Error.
Group C, Chatting (just some ideas). Group C, Chatting
Command: CIPM:1,pid; Is Personal Message present. Command: CIPM:1,pid; Is Personal Message present.
Reply: 100:2,fromname,message; Yes, from .. with message text. Reply: 100:2,fromname,message; Yes, from .. with message text.
@ -244,20 +245,55 @@ Command: CSPM:3,fromuser,touser,txt; Send personal message to user.
Reply: 100:1,n; n: 0=Ok, 1=Do not disturb, 2=Buffer full, 3=Error. Reply: 100:1,n; n: 0=Ok, 1=Do not disturb, 2=Buffer full, 3=Error.
100:0; Impossible. 100:0; Impossible.
The next commands are some ideas, they are not implemented. Command: CSYS:2,pid,1; Sysop available for chat (from mbmon).
Channel 0 will be for sysop chat only, other channels are CSYS:2,pid,0; Sysop goes away (from mbmon).
user channels. Reply: 100:0; Always Ok.
-CBPM:2,fromuser,txt; Broadcast message to all users. Command: CPAG:2,pid,reason; Page sysop for a chat.
-CJCH:2,pid,channel; Join Channel Reply: 100:1,n; 1=busy, 2=sysop not available, 3=error.
-CCCH:2,pid,channel; Close Channel 100:0; Ok
-CAML:2,channel,text; Add textline to channel
-CIML:1,channel; Is new textline present Command: CCAN:1,pid; Cancel sysop page.
-CSSP:1,user,reason; Send Sysop Page Reply: 100:0; Always Ok.
-CESP:1,user; Retract Sysop Page
-CRSP:1,user; Reject user Page Command: CCKP:0; Check sysop page (from mbmon).
-CFCH:2,channel,user; Force user in chatmode (for Sysop chat). Reply: 100:3,pid,1,reason; Page is active.
-CKCH:2,channel,user; Kill user chatmode (for Sysops and moderators). 100:3,pid,0,reason; Page is cancelled, user still online.
100:0; No page active.
Command: CISC:1,pid; Check sysop in chatmode.
Reply: 100:1,1; Yes and drop into chatmode.
100:1,0; No.
Command: CCON:3,pid,username,n; Connect to chatserver with username. n=1 user is sysop.
Reply: 100:1,error; Error with message.
100:0; Ok.
Command: CCLO:1,pid; Close chat session.
Reply: 100:1,error; Error.
100:0; Ok.
Command: CPUT:2,pid,message; Put message on chatserver.
Reply: 100:2,0,error; Error, not fatal and continue.
100:2,1,error; Error, fatal and disconnect chat.
100:0; Ok.
Command: CGET:1,pid; Get message from chatserver.
100:2,0,message; If message present.
100:2,1,error; Error and disconnect chat.
100:0; No new message.
Group D, Disk watch command.
Command: DRES:0; Reset and reread disk tables.
Reply: 100:0; Always Ok.
Command: DSPC:0; Enough free diskspace.
Reply: 100:1;n; 0=No, 1=Yes, 2=Unknown, 3=Error.
Command: DGFS:0; Get filesystem status (see note below).
100:n,data1, ..., data10; Maximum 10 filesystems datalines.
Group G, Global commands. Group G, Global commands.
@ -272,7 +308,7 @@ Command: GVER:0; Give server version.
Reply: 100:1,Version ....; Version reply. Reply: 100:1,Version ....; Version reply.
Command: GSTA:0; Get complete mbsed status record. (13 fields) Command: GSTA:0; Get complete mbsed status record. (13 fields)
Reply: 100:20,start,laststart,daily,startups,clients,tot_clients,tot_peak,syntax_errs, Reply: 100:19,start,laststart,daily,startups,clients,tot_clients,tot_peak,syntax_errs,
com_errs,today_clients,today_peak,today_syntax,today_comerr,bbsopen, com_errs,today_clients,today_peak,today_syntax,today_comerr,bbsopen,
is_zmh,do_inet,processing,system_load,sequence; is_zmh,do_inet,processing,system_load,sequence;
@ -280,7 +316,7 @@ Command: GMON:1,n; Get registration info line, 1=First, 0=N
Reply: 100:7,pid,tty,user,program,city,isdoing,starttime; Reply: 100:7,pid,tty,user,program,city,isdoing,starttime;
100:0; No more lines. 100:0; No more lines.
Command: GDST:0; Get filesystem status (see note below). Command: GDST:0; Get filesystem status. Obsolete, use DGFS instead.
100:n,data1, ..., data10; Maximum 10 filesystems datalines. 100:n,data1, ..., data10; Maximum 10 filesystems datalines.
Command: GSYS:0; Get bbs statistics. Command: GSYS:0; Get bbs statistics.
@ -326,13 +362,14 @@ Command: SERM:1,semafore; Remove semafore
Reply: 100:0; Ok (also if there was no semafore). Reply: 100:0; Ok (also if there was no semafore).
200:1,16; Semafore not known. 200:1,16; Semafore not known.
</pre> </pre>
Note: in reply of GDST the reply is 100:n,size free mountpoint fstype,..... Note: in reply of DGFS the reply is 100:n,size free mountpoint fstype,.....
where n = 1 for 1 filesystem, and 10 for a total of 10 filesystems. There where n = 1 for 1 filesystem, and 10 for a total of 10 filesystems. There
will never be a reply for more then 10 filesystems. The reported filesystems will never be a reply for more then 10 filesystems. The reported filesystems
are retrieved from /etc/mtab which is the actual mountstatus. On FreeBSD and are collected by a thread process of mbtask that only includes the filesystems
NetBSD a system call is used to get the information about the mounted actually used by mbse.
filesystem.
This is used by the <b>mbmon</b> program to get a "live" view of your filesystems. This is used by the <b>mbmon</b> program to get a "live" view of your filesystems.
The GSPC command is used by utilities to check if enough space is available to
continue to work safely.
<P>&nbsp;<P> <P>&nbsp;<P>
<A HREF="index.htm"><IMG SRC="../images/larrow.png" ALT="Index" Border="0">Back to index</A>&nbsp; <A HREF="index.htm"><IMG SRC="../images/larrow.png" ALT="Index" Border="0">Back to index</A>&nbsp;
@ -340,4 +377,3 @@ This is used by the <b>mbmon</b> program to get a "live" view of your filesystem
</BLOCKQUOTE> </BLOCKQUOTE>
</BODY> </BODY>
</HTML> </HTML>

View File

@ -465,6 +465,32 @@ unsigned long sequencer()
/*
* Check enough diskspace.
* return 0=No, 1=Yes, 2=Unknown, 3=Error
*/
int enoughspace(void)
{
char *buf, *res;
int rc = 3;
buf = calloc(SS_BUFSIZE, sizeof(char));
sprintf(buf, "DSPC:0;");
if (socket_send(buf) == 0) {
free(buf);
buf = socket_receive();
res = strtok(buf, ",");
res = strtok(NULL, ";");
rc = atoi(res);
}
Syslog('s', "enoughspace() rc=%d", rc);
return rc;
}
char *printable(char *s, int l) char *printable(char *s, int l)
{ {
int len; int len;

View File

@ -1992,6 +1992,7 @@ void UserCity(pid_t, char *, char *);
void DoNop(void); void DoNop(void);
void Nopper(void); void Nopper(void);
void Altime(int); void Altime(int);
int enoughspace(void);
unsigned long sequencer(void); unsigned long sequencer(void);
char *printable(char *, int); char *printable(char *, int);
char *printablec(char); char *printablec(char);

View File

@ -335,7 +335,7 @@ void disk_stat(void)
do { do {
show_date(LIGHTGRAY, BLACK, 0, 0); show_date(LIGHTGRAY, BLACK, 0, 0);
sprintf(buf, "GDST:1,%d;", getpid()); sprintf(buf, "DGFS:0;");
if (socket_send(buf) == 0) { if (socket_send(buf) == 0) {
strcpy(buf, socket_receive()); strcpy(buf, socket_receive());
set_color(LIGHTGRAY, BLACK); set_color(LIGHTGRAY, BLACK);

View File

@ -73,7 +73,7 @@ scanout.o: ../config.h ../lib/mbselib.h taskutil.h scanout.h
taskcomm.o: ../config.h ../lib/mbselib.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h taskcomm.o: ../config.h ../lib/mbselib.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h
taskinfo.o: ../config.h ../lib/mbselib.h taskinfo.h taskinfo.o: ../config.h ../lib/mbselib.h taskinfo.h
taskstat.o: ../config.h ../lib/mbselib.h taskstat.h callstat.h outstat.h taskutil.h taskstat.o: ../config.h ../lib/mbselib.h taskstat.h callstat.h outstat.h taskutil.h
mbtask.o: ../config.h ../lib/mbselib.h ../paths.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h taskchat.h mbtask.h mbtask.o: ../config.h ../lib/mbselib.h ../paths.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h taskdisk.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h taskchat.h mbtask.h
outstat.o: ../config.h ../lib/mbselib.h taskutil.h taskstat.h scanout.h ../lib/nodelist.h callstat.h ports.h outstat.h outstat.o: ../config.h ../lib/mbselib.h taskutil.h taskstat.h scanout.h ../lib/nodelist.h callstat.h ports.h outstat.h
signame.o: ../config.h signame.h signame.o: ../config.h signame.h
taskdisk.o: ../config.h ../lib/mbselib.h taskdisk.h taskutil.h taskdisk.o: ../config.h ../lib/mbselib.h taskdisk.h taskutil.h

View File

@ -36,6 +36,7 @@
#include "taskutil.h" #include "taskutil.h"
#include "taskregs.h" #include "taskregs.h"
#include "taskcomm.h" #include "taskcomm.h"
#include "taskdisk.h"
#include "callstat.h" #include "callstat.h"
#include "outstat.h" #include "outstat.h"
#include "../lib/nodelist.h" #include "../lib/nodelist.h"
@ -46,7 +47,7 @@
#include "mbtask.h" #include "mbtask.h"
#define NUM_THREADS 3 /* Max. nr of threads */ #define NUM_THREADS 4 /* Max. nr of threads */
/* /*
@ -113,6 +114,7 @@ int nodaemon = FALSE; /* Run in foreground */
extern int cmd_run; /* Cmd running */ extern int cmd_run; /* Cmd running */
extern int ping_run; /* Ping running */ extern int ping_run; /* Ping running */
int sched_run = FALSE; /* Scheduler running */ int sched_run = FALSE; /* Scheduler running */
extern int disk_run; /* Disk watch running */
@ -707,7 +709,7 @@ void die(int onsig)
* build to stop within a second. * build to stop within a second.
*/ */
now = time(NULL) + 2; now = time(NULL) + 2;
while ((cmd_run || ping_run || sched_run) && (time(NULL) < now)) { while ((cmd_run || ping_run || sched_run || disk_run) && (time(NULL) < now)) {
sleep(1); sleep(1);
} }
Syslog('+', "All threads stopped"); Syslog('+', "All threads stopped");
@ -978,7 +980,10 @@ void start_scheduler(void)
} else if ((rc = pthread_create(&p_thread[1], NULL, (void (*))cmd_thread, NULL))) { } else if ((rc = pthread_create(&p_thread[1], NULL, (void (*))cmd_thread, NULL))) {
WriteError("$pthread_create cmd_thread rc=%d", rc); WriteError("$pthread_create cmd_thread rc=%d", rc);
die(SIGTERM); die(SIGTERM);
} else if ((rc = pthread_create(&p_thread[2], NULL, (void (*))scheduler, NULL))) { } else if ((rc = pthread_create(&p_thread[2], NULL, (void (*))disk_thread, NULL))) {
WriteError("$pthread_create disk_thread rc=%d", rc);
die(SIGTERM);
} else if ((rc = pthread_create(&p_thread[3], NULL, (void (*))scheduler, NULL))) {
WriteError("$pthread_create scheduler rc=%d", rc); WriteError("$pthread_create scheduler rc=%d", rc);
die(SIGTERM); die(SIGTERM);
} else { } else {

View File

@ -364,6 +364,36 @@ char *exe_cmd(char *in)
return chat_get(token); return chat_get(token);
} }
/*
* The D(isk) commands.
*/
/*
* DRES:0; Reset and reread disk tables.
* 100:0; Always Ok.
*/
if (strncmp(cmd, "DRES", 4) == 0) {
return disk_reset();
}
/*
* DSPC:0; Enough free diskspace.
* 100:1,0; No
* 100:1,1; Yes
* 100:1,2; Unknown
* 100:1,3; Error
*/
if (strncmp(cmd, "DSPC", 4) == 0) {
return disk_free();
}
/*
* DGFS:0; Get filesystem status.
* 100:n,data1,..,data10;
*/
if (strncmp(cmd, "DGFS", 4) == 0) {
return disk_getfs();
}
/* /*
* The G(lobal) commands. * The G(lobal) commands.
@ -416,11 +446,11 @@ char *exe_cmd(char *in)
} }
/* /*
* GDST:0; * GDST:0; Obsolete!
* 100:n,data1,..,data10; * 100:n,data1,..,data10;
*/ */
if (strncmp(cmd, "GDST", 4) == 0) { if (strncmp(cmd, "GDST", 4) == 0) {
return get_diskstat(); return disk_getfs();
} }
/* /*

View File

@ -34,12 +34,44 @@
#include "taskutil.h" #include "taskutil.h"
int disk_reread = FALSE; /* Reread tables */
extern int T_Shutdown; /* Program shutdown */
int disk_run = FALSE; /* Thread running */
/*
* This function signals the diskwatcher to reread the tables.
*/
char *disk_reset(void)
{
static char buf[10];
disk_reread = TRUE;
sprintf(buf, "100:0;");
return buf;
}
/*
* This function checks if enough diskspace is available. (0=No, 1=Yes, 2=Unknown, 3=Error).
*/
char *disk_free(void)
{
static char buf[20];
sprintf(buf, "100:1,2;");
return buf;
}
/* /*
* This function returns the information of all mounted filesystems, * This function returns the information of all mounted filesystems,
* but no more then 10 filesystems. * but no more then 10 filesystems.
*/ */
char *get_diskstat() char *disk_getfs()
{ {
static char buf[SS_BUFSIZE]; static char buf[SS_BUFSIZE];
char *tmp = NULL; char *tmp = NULL;
@ -143,3 +175,36 @@ char *get_diskstat()
void add_path(char *path)
{
Syslog('d', "add_path(%s)", path);
}
/*
* Diskwatch thread
*/
void *disk_thread(void)
{
Syslog('+', "Start disk thread");
disk_run = TRUE;
disk_reread = TRUE;
while (! T_Shutdown) {
if (disk_reread) {
disk_reread = FALSE;
Syslog('+', "Reread disk filesystems");
add_path(CFG.bbs_menus);
}
sleep(1);
}
disk_run = FALSE;
Syslog('+', "Disk thread stopped");
pthread_exit(NULL);
}

View File

@ -3,9 +3,9 @@
/* $Id$ */ /* $Id$ */
char *disk_reset(void); /* Reset disk tables */
char *get_diskstat(void); /* Get disk status */ char *disk_free(void); /* Enough free space */
char *disk_getfs(void); /* Get disk status */
void *disk_thread(void); /* Disk watch thread */
#endif #endif