Package: timeoutd Version: 1.5-10moh Severity: wishlist Tags: patch
-- System Information: Debian Release: 3.1 APT prefers testing APT policy: (400, 'testing'), (300, 'unstable') Architecture: i386 (i686) Kernel: Linux 2.6.13 Locale: LANG=en_GB, LC_CTYPE=iso_8859_1 (charmap=ISO-8859-1) (ignored: LC_ALL set to en_GB) Versions of packages timeoutd depends on: ii libc6 2.3.5-6 GNU C Library: Shared libraries an ii libx11-6 4.3.0.dfsg.1-14sarge1 X Window System protocol client li ii libxext6 4.3.0.dfsg.1-14sarge1 X Window System miscellaneous exte ii libxss1 6.8.2.dfsg.1-11 X Screen Saver client-side library ii xlibs 6.8.2.dfsg.1-7 X Window System client libraries m -- no debconf information I have added a new lockout feature to timeoutd optionally to prevent immediate login after a full session. The length of the rest period is configurable from the configfile. Also I have completed the custom messages implementation. Messages can be read from the configfile or from a file specified there. So that custom message files could stored together in, say, /etc/timeoutd/messages I have moved /etc/timeouts to /etc/timeoutd/timeouts. Is this is controversial? New preinst script to copy existing conffile attached. There are no custom messages for the warnings at preset. Would that be useful? The xmessage popups now have a default button which allows them to be cancelled by keystroke. Fixed compilation without -DTIMEOUTDX11 if anyone wants to do it. I have been running this for a month and it works well for me. Hope it is useful. Mark
diff -ur ./debian/changelog /usr/src/timeoutd-1.5/debian/changelog --- ./debian/changelog 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/debian/changelog 2006-03-03 09:53:52.000000000 +0000 @@ -1,3 +1,17 @@ +timeoutd (1.5-10moh) unstable; urgency=low + + * Added optional lockout to prevent immediate login after full session + * Finish custom messages implementation + - Can either be read from timeouts or read from another file + - Moved timeouts to /etc/timeoutd/ so messages files + can also be placed there and not clutter /etc + * timeouts.5: document custom messages and lockout + * Under X, make button on popup the default so window can be cleared + by pressing <RETURN> + * Fix #ifdefs for compilation without -DTIMEOUTDX11 + + -- Mark Hindley <[EMAIL PROTECTED]> Thu, 23 Feb 2006 11:56:45 +0000 + timeoutd (1.5-10) unstable; urgency=low * Updating build depencies due to xlibs-dev: Closes: #346924 Only in /usr/src/timeoutd-1.5/debian: changelog.orig diff -ur ./debian/control /usr/src/timeoutd-1.5/debian/control --- ./debian/control 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/debian/control 2006-02-25 12:23:18.000000000 +0000 @@ -12,8 +12,8 @@ Description: Flexible user timeout daemon with X11 support timeoutd enforces the time restrictions specified for each or all users. . - timeoutd scans /var/run/utmp every minute and checks /etc/timeouts for - an entry which matches a restricted user, based on: + timeoutd scans /var/run/utmp every minute and checks /etc/timeoutd/timeouts + for an entry which matches a restricted user, based on: . - The current day and time - The tty that the user is currently logged in on Only in /usr/src/timeoutd-1.5/debian: files Only in /usr/src/timeoutd-1.5/debian: timeoutd diff -ur ./debian/timeoutd.install /usr/src/timeoutd-1.5/debian/timeoutd.install --- ./debian/timeoutd.install 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/debian/timeoutd.install 2006-02-25 12:23:18.000000000 +0000 @@ -1,2 +1,2 @@ timeoutd usr/sbin -timeouts etc +timeouts etc/timeoutd Only in /usr/src/timeoutd-1.5/debian: timeoutd.postinst.debhelper Only in /usr/src/timeoutd-1.5/debian: timeoutd.postrm.debhelper Only in /usr/src/timeoutd-1.5/debian: timeoutd.prerm.debhelper Only in /usr/src/timeoutd-1.5/debian: timeoutd.substvars Only in /usr/src/timeoutd-1.5: .gdbinit Only in /usr/src/timeoutd-1.5: timeoutd diff -ur ./timeoutd.8 /usr/src/timeoutd-1.5/timeoutd.8 --- ./timeoutd.8 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/timeoutd.8 2006-02-25 12:23:18.000000000 +0000 @@ -6,9 +6,9 @@ .SH DESCRIPTION .B timeoutd enforces the time restrictions specified in -.IR /etc/timeouts . +.IR /etc/timeoutd/timeouts . When invoked in daemon mode (without any parameters) timeoutd backgrounds -itself, then scans \fB/var/run/utmp\fR every minute and checks \fB/etc/timeouts\fR +itself, then scans \fB/var/run/utmp\fR every minute and checks \fB/etc/timeoutd/timeouts\fR for an entry which matches that user, based on: .IP "\- The current day and time" .IP "\- The tty that the user is currently logged in on" @@ -28,7 +28,7 @@ .B timeoutd will send a warning to the user every minute for 5 minutes (or other time specified in -.IR /etc/timeouts ) +.IR /etc/timeoutd/timeouts ) before logging them out. Warnings are not sent for exceeded idle limits, as this would count as activity on the terminal. .PP @@ -62,7 +62,7 @@ .IP "20 User not permitted to login at this time on this tty .IP "30 Internal error checking user name (probably invalid user name) .SH FILES -.IP "/etc/timeouts \- lists valid login times and idle/session time restrictions +.IP "/etc/timeoutd/timeouts \- lists valid login times and idle/session time restrictions .IP "/var/run/utmp \- current login sessions .IP "/var/log/wtmp \- for calculating total logged in time for current day .SH BUGS @@ -75,5 +75,5 @@ .SH "SEE ALSO" .BR timeouts "(5) .SH "WRITTEN BY" -Orginally written by Shane Alderton <[EMAIL PROTECTED]>, updated by +Originally written by Shane Alderton <[EMAIL PROTECTED]>, updated by Dennis Stampfer <[EMAIL PROTECTED]>. diff -ur ./timeoutd.c /usr/src/timeoutd-1.5/timeoutd.c --- ./timeoutd.c 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/timeoutd.c 2006-03-03 09:57:52.000000000 +0000 @@ -109,7 +109,7 @@ #endif #ifndef CONFIG -#define CONFIG "/etc/timeouts" +#define CONFIG "/etc/timeoutd/timeouts" #endif #define MAXLINES 512 @@ -120,11 +120,13 @@ #define SESSMAX 3 #define DAYMAX 4 #define NOLOGIN 5 -/*#define XSESSION 6*/ +#define LOCKOUT 6 +/*#define XSESSION 7*/ #define IDLEMSG 0 #define SESSMSG 1 #define DAYMSG 2 -#define NOLOGINMSG 3 +#define LOCKOUTMSG 3 +#define NOLOGINMSG 4 #define KWAIT 5 /* Time to wait after sending a kill signal */ @@ -148,8 +150,8 @@ void logoff_msg(); void killit(); int getdisc(); -int chk_xsession(); /* seppy: is it a X-Session? */ -void killit_xsession(); /* seppy: kill the X-Session*/ +void get_day_time(char*); +int get_rest_time(char*,int); int chk_ssh(pid_t pid); /* seppy: check if user is logged in via ssh (we have to handle that different... ;( */ char *getusr(pid_t pid); /*seppy: get the owner of a running process */ @@ -159,6 +161,8 @@ #ifdef TIMEOUTDX11 Time get_xidle(); /* seppy: how long is user idle? (user,display)*/ +int chk_xsession(); /* seppy: is it a X-Session? */ +void killit_xsession(); /* seppy: kill the X-Session*/ #endif @@ -186,7 +190,8 @@ int sessmax; int daymax; int warntime; - char *messages[10]; + int lockout; + char *messages[NOLOGINMSG + 1]; }; struct config_ent *config[MAXLINES + 1]; @@ -331,6 +336,15 @@ */ logoff_msg(1); exit(20); + case LOCKOUT: + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_NOTICE, + "User %s has not had a long enough rest to login on %s at this time. Login check failed.", + argv[1], argv[2]); + closelog(); + logoff_msg(1); + exit(20); + case ACTIVE: #ifdef DEBUG openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); @@ -625,9 +639,11 @@ config[i]->sessmax = -1; config[i]->daymax = -1; config[i]->warntime = 5; + config[i]->lockout = -1; config[i]->messages[IDLEMSG] = NULL; config[i]->messages[SESSMSG] = NULL; config[i]->messages[DAYMSG] = NULL; + config[i]->messages[LOCKOUTMSG] = NULL; config[i]->messages[NOLOGINMSG] = NULL; if ((tok = strsep(&lstart, ":")) != NULL) store_times(&config[i]->times, tok); if ((tok = strsep(&lstart, ":")) != NULL) alloc_cp(&config[i]->ttys, tok); @@ -663,6 +679,11 @@ { config[i]->warntime = atoi(tok); } + if ((tok = strsep(&lstart, ":")) != NULL) + { + config[i]->lockout = atoi(tok); + if ((p = strchr(tok, ';')) != NULL) alloc_cp(&config[i]->messages[LOCKOUTMSG], p+1); + } } if (!config[i]->times || !config[i]->ttys || !config[i]->users || !config[i]->groups) @@ -691,7 +712,7 @@ printf("%d(%d-%d):", config[i]->times[j].days, config[i]->times[j].starttime, config[i]->times[j].endtime),j++; - printf("%s:%s:%s:%s:%d;%s:%d;%s:%d;%s:%d\n", + printf("%s:%s:%s:%s:%d;%s:%d;%s:%d;%s:%d:%d;%s\n", config[i]->ttys, config[i]->users, config[i]->groups, @@ -702,7 +723,9 @@ config[i]->messages[SESSMSG] == NULL?"builtin":config[i]->messages[SESSMSG], config[i]->daymax, config[i]->messages[DAYMSG] == NULL?"builtin":config[i]->messages[DAYMSG], - config[i]->warntime + config[i]->warntime, + config[i]->lockout, + config[i]->messages[LOCKOUTMSG] == NULL?"builtin":config[i]->messages[LOCKOUTMSG] ),i++; } printf("End debug output.\n"); @@ -839,6 +862,66 @@ return; } +/* Return the number of minutes since user has logged out of a session of length min + * on any of the ttys specified in config[configline] during the current day. + */ + +int get_rest_time(user,min) +char *user; +int min; +{ + struct ut_list *login_p = NULL; + struct ut_list *logout_p = NULL; + struct ut_list *prev_p = NULL; + struct ut_list *test_login_p, *test_logout_p; + + test_login_p = wtmplist; + while (test_login_p) + { + /* Find most recent login on a matching tty */ + if ( +#ifndef SUNOS + test_login_p->elem.ut_type == USER_PROCESS && +#endif + !strncmp(test_login_p->elem.ut_user, user, 8) && + chkmatch(test_login_p->elem.ut_line, config[configline]->ttys) && + (login_p == NULL || test_login_p->elem.ut_time >= login_p->elem.ut_time)) + { + prev_p = test_login_p; + test_logout_p=test_login_p->next; + /* Search from next to find the matching logout */ + while (test_logout_p) + { + /* Ignore sessions that are less than the given length.*/ + if ( (test_logout_p->elem.ut_time - test_login_p->elem.ut_time)/60 < min) + break; +#ifndef SUNOS + if (test_logout_p->elem.ut_type == BOOT_TIME) + { + logout_p = prev_p; + break; + } +#endif + if (/*test_logout_p->elem.ut_type == DEAD_PROCESS &&*/ + !strcmp(test_login_p->elem.ut_line, test_logout_p->elem.ut_line)) /* match */ + { + login_p = test_login_p; + logout_p = test_logout_p; + break; + } else { /* no match */ + prev_p = test_logout_p; + test_logout_p = test_logout_p->next; + } + } + } + test_login_p = test_login_p->next; + } + if (logout_p) + return (time_now - logout_p->elem.ut_time)/60; + else + return -1; +} + void warnpending(tty, time_remaining, user, host) char *tty; int time_remaining; @@ -847,7 +930,9 @@ { int fd; FILE *ttyf; +#ifdef TIMEOUTDX11 char cmdbuf[1024]; +#endif #ifdef DEBUG openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); @@ -855,7 +940,7 @@ user, host, tty, time_remaining); closelog(); #endif - +#ifdef TIMEOUTDX11 if(chk_xsession(tty, host)) { openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); syslog(SYSLOG_DEBUG, "Warning %s running X on %s for pending logout! (%d min%s left)", user, tty, time_remaining, time_remaining==1?"":"s"); @@ -863,17 +948,17 @@ /* then send the message using xmessage */ /* well, this is not really clean: */ - sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center 'WARNING: You will be logged out in %d minute%s when your %s limit expires.'&\"", user, tty, time_remaining, time_remaining==1?"":"s", limit_names[limit_type]); - system(cmdbuf); - /*#ifdef DEBUG*/ - openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); - syslog(LOG_DEBUG, "cmdbuf=%s", cmdbuf); - closelog(); - /*#endif*/ + sprintf(cmdbuf, "su %s -c \"xmessage -default okay -display %s -center 'WARNING: You will be logged out in %d minute%s when your %s limit expires.'&\"", user, tty, time_remaining, time_remaining==1?"":"s", limit_names[limit_type]); + system(cmdbuf); +#ifdef DEBUG + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_DEBUG, "cmdbuf=%s", cmdbuf); + closelog(); +#endif sleep(KWAIT); /* and give the user some time to read the message ;) */ return; } - +#endif if ((fd = open(tty, O_WRONLY|O_NOCTTY|O_NONBLOCK)) < 0 || (ttyf = fdopen(fd, "w")) == NULL) { @@ -985,6 +1070,18 @@ if (config[configline]->daymax > 0 && daytime >= config[configline]->daymax) return DAYMAX; + limit_type = LOCKOUTMSG; + if (config[configline]->lockout > 0 && config[configline]->sessmax > 0) + { + /* Treat sessions that logout during the warntime period as full length. + * This might be a bit tough, but it picks up people who logout just before the + * session expires in the hope they can login immediately + */ + int rested = get_rest_time(user,config[configline]->sessmax - config[configline]->warntime); + if (rested > -1 && rested < config[configline]->lockout) + return LOCKOUT; + } + /* If none of those have been exceeded, then warn users of upcoming logouts */ limit_type = DAYMSG; if (config[configline]->daymax > 0 && daytime >= config[configline]->daymax - config[configline]->warntime) @@ -1047,8 +1144,11 @@ host[sizeof(host) - 1] = '\0'; strncpy(dev, utmpp->ut_line, sizeof(dev) - 1); /* get device name */ dev[sizeof(dev) - 1] = '\0'; - if (stat(dev, pstat) && !chk_xsession(dev, host) == TIMEOUTD_XSESSION_LOCAL) /* if can't get status for - port && if it's not a local Xsession*/ + if (stat(dev, pstat) /* if can't get status for port */ +#ifdef TIMEOUTDX11 + && !chk_xsession(dev, host) == TIMEOUTD_XSESSION_LOCAL /* && if it's not a local Xsession */ +#endif + ) { sprintf(errmsg, "Can't get status of user %s's terminal (%s)\n", user, dev); @@ -1115,6 +1215,16 @@ closelog(); killit(utmpp->ut_pid, user, dev, host); break; + case LOCKOUT: + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + #ifdef DEBUG + syslog(LOG_NOTICE, "User [EMAIL PROTECTED] logged in during LOCKOUT period. (pid %d)", user, host, utmpp->ut_pid); + #else + syslog(LOG_NOTICE, "User %s logged in from %s during LOCKOUT period.", user, host); + #endif + closelog(); + killit(utmpp->ut_pid, user, dev, host); + break; default: openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); syslog(LOG_ERR, "Internal error - unexpected return from chk_timeout"); @@ -1158,22 +1268,31 @@ int cnt; if (config[configline]->messages[limit_type]) + { msgfile = fopen(config[configline]->messages[limit_type], "r"); - - if (msgfile) - { - while ((cnt = read(tty, msgbuf, 1024)) > 0) - write(tty, msgbuf, cnt); - fclose(msgfile); - } - else - { - if (limit_type == NOLOGINMSG) - sprintf(msgbuf, "\r\n\r\nLogins not allowed at this time. Please try again later.\r\n"); - else - sprintf(msgbuf, "\r\n\r\nYou have exceeded your %s time limit. Logging you off now.\r\n\r\n", limit_names[limit_type]); - write(tty, msgbuf, strlen(msgbuf)); + if (msgfile) + { + while ((cnt = read(fileno(msgfile), msgbuf, sizeof(msgbuf))) > 0) + write(tty, msgbuf, cnt); + fclose(msgfile); + return; + } else { + snprintf(msgbuf, sizeof(msgbuf), "\r\n%s\r\n", config[configline]->messages[limit_type]); + } + } else { + switch (limit_type) + { + case NOLOGINMSG: + sprintf(msgbuf, "\r\n\r\nLogins not allowed at this time. Please try again later.\r\n"); + break; + case LOCKOUTMSG: + sprintf(msgbuf, "\r\n\r\nYou have logged in during your lockout time. Logging you off now.\r\n\r\n"); + break; + default: + sprintf(msgbuf, "\r\n\r\nYou have exceeded your %s time limit. Logging you off now.\r\n\r\n", limit_names[limit_type]); + } } + write(tty, msgbuf, strlen(msgbuf)); } /* terminate process using SIGHUP, then SIGKILL */ @@ -1188,11 +1307,12 @@ #ifdef SUNOS struct passwd *pw; #endif - +#ifdef TIMEOUTDX11 if(chk_xsession(dev, host) && !chk_xterm(dev, host)) { killit_xsession(utmpp->ut_pid, user, dev); return; } +#endif /* Tell user which limit they have exceeded and that they will be logged off */ if ((tty = open(dev, O_WRONLY|O_NOCTTY|O_NONBLOCK)) < 0) { @@ -1293,6 +1413,7 @@ if (config[i]->messages[IDLEMSG]) free(config[i]->messages[IDLEMSG]); if (config[i]->messages[DAYMSG]) free(config[i]->messages[DAYMSG]); if (config[i]->messages[SESSMSG]) free(config[i]->messages[SESSMSG]); + if (config[i]->messages[LOCKOUTMSG]) free(config[i]->messages[LOCKOUTMSG]); if (config[i]->messages[NOLOGINMSG]) free(config[i]->messages[NOLOGINMSG]); free(config[i]); i++; @@ -1319,7 +1440,11 @@ int disc; #ifdef linux - if(chk_xsession(d, host) || chk_xterm(d, host)) + if( +#ifdef TIMEOUTDX11 + chk_xsession(d, host) || +#endif + chk_xterm(d, host)) return N_TTY; if ((fd = open(d, O_RDONLY|O_NONBLOCK|O_NOCTTY)) < 0) @@ -1353,6 +1478,7 @@ #endif } +#ifdef TIMEOUTDX11 int chk_xsession(dev, host) /* returns TIMEOUTD_XSESSION_{REMOTE,LOCAL,NONE} when dev and host seem to be a xSession. */ char *dev,*host; { @@ -1401,6 +1527,7 @@ return TIMEOUTD_XSESSION_NONE; } } +#endif /* We have to handle Xterms(pts/?) and Xsessions (:0) different: - Check Xsession for idle, but not a XTERM @@ -1423,29 +1550,48 @@ return 0; } /* chk_xterm(dev,host) */ - +#ifdef TIMEOUTDX11 void killit_xsession(pid, user, dev) /* returns 1 when dev and host seem to be a xSession. */ int pid; char *dev, *user; { + FILE *msgfile = NULL; char msgbuf[1024], cmdbuf[1024]; /* first, get the message into msgbuf */ - if (limit_type == NOLOGINMSG) { - sprintf(msgbuf, "Logins not allowed at this time. Please try again later."); - } else { - sprintf(msgbuf, "You have exceeded your %s time limit. Logging you off now.", limit_names[limit_type]); - } - - /* then send the message using xmessage */ - /* well, this is not really clean: */ - sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center '%s'&\"", user, dev, msgbuf); - system(cmdbuf); - #ifdef DEBUG - openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); - syslog(LOG_DEBUG, "cmdbuf=%s", cmdbuf); - closelog(); - #endif - sleep(KWAIT); /* and give the user some time to read the message ;) */ + if (config[configline]->messages[limit_type]) + { + msgfile = fopen(config[configline]->messages[limit_type], "r"); + if (msgfile) + { + fclose(msgfile); + snprintf(msgbuf, sizeof(msgbuf), "-file '%s'", config[configline]->messages[limit_type]); + } + else + snprintf(msgbuf, sizeof(msgbuf), "'%s'", config[configline]->messages[limit_type]); + } + else { + switch (limit_type) + { + case NOLOGINMSG: + sprintf(msgbuf, "'Logins not allowed at this time. Please try again later.'"); + break; + case LOCKOUTMSG: + sprintf(msgbuf, "'You have logged in during your lockout time. Logging you off now.'"); + break; + default: + sprintf(msgbuf, "'You have exceeded your %s time limit. Logging you off now.'", limit_names[limit_type]); + } + } + /* then send the message using xmessage */ + /* well, this is not really clean: */ + snprintf(cmdbuf, sizeof(cmdbuf), "su %s -c \"xmessage -default okay -display %s -center %s&\"", user, dev, msgbuf); + system(cmdbuf); + #ifdef DEBUG + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_DEBUG, "cmdbuf=%s", cmdbuf); + closelog(); + #endif + sleep(KWAIT); /* and give the user some time to read the message ;) */ #ifndef DEBUG @@ -1468,7 +1614,7 @@ closelog(); #endif } - +#endif int chk_ssh(pid)/* seppy; returns true if pid is sshd, otherwise it returns false */ @@ -1532,7 +1678,7 @@ #ifdef DEBUG openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); - syslog(LOG_DEBUG, "su-ing to %s(%d) and connecting to X", user, pwEntry->pw_uid); + syslog(LOG_DEBUG, "Changing to user %s(%d) and connecting to X", user, pwEntry->pw_uid); closelog(); #endif @@ -1613,3 +1759,47 @@ return 0; /* no child found */ } /* getchild(ppid) */ + +#ifdef TESTING +int system_user(user, cmd) +char *user; +char *cmd; +{ + uid_t oldeuid; + char homedir[50]; + char oldhomedir[50]; + struct passwd *pwEntry; + int retval; + + /* save to restore */ + oldeuid=getuid(); + sprintf(oldhomedir, "HOME=%s", getenv("HOME")); + /*become user*/ + pwEntry = getpwnam(user); + if(!pwEntry) { + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_ERR, "Could not get passwd-entry for user %s", user); + closelog(); + } + if(seteuid(pwEntry->pw_uid) == -1) { + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_ERR, "Could not seteuid(%d).", pwEntry->pw_uid); + closelog(); + } + sprintf(homedir, "HOME=%s", pwEntry->pw_dir); + putenv(homedir); + + retval = system(cmd); + + putenv(oldhomedir); + setuid(oldeuid); + +#ifdef DEBUG + openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); + syslog(LOG_DEBUG, "cmd=%s", cmd); + closelog(); +#endif + + return retval; +} +#endif Only in /usr/src/timeoutd-1.5: timeoutd.o diff -ur ./timeouts /usr/src/timeoutd-1.5/timeouts --- ./timeouts 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/timeouts 2006-02-26 14:03:50.000000000 +0000 @@ -1,19 +1,19 @@ -# /etc/timeouts: user login/idle/session time limits. See timeouts(5). +# /etc/timeoutd/timeouts: user login/idle/session time limits. See timeouts(5). # -# Format: TIMES:TTYS:USERS:GROUPS:MAXIDLE:MAXSESS:MAXDAY:WARN -# or: TIMES:TTYS:USERS:GROUPS:LOGINSTATUS +# Format: TIMES:TTYS:USERS:GROUPS:MAXIDLE[;MESSAGE]:MAXSESS[;MESSAGE]:MAXDAY[;MESSAGE]:WARN:LOCKOUT[;MESSAGE] +# or: TIMES:TTYS:USERS:GROUPS:LOGINSTATUS[;MESSAGE] # # Some examples: # -# dopey is not allowed to login -#Al:*:dopey:*:NOLOGIN +# dopey is not allowed to login. Custom message read from a file +#Al:*:dopey:*:NOLOGIN;/etc/timeoutd/messages/nologin # # cas gets unlimited use #Al:*:cas:*:0:0:0:0 # -# fred is allowed 20 minutes idle, 240 mins per session, and 480 mins per day +# fred is allowed 20 minutes idle, 240 mins per session, and 480 mins per day and must rest for 20 minutes after a full session # on ttyS3 -#Al:ttyS3:fred:*:20:240:480:10 +#Al:ttyS3:fred:*:20:240:480:10:20 # # everyone else is allowed only 120min/session, 240/day #Al:ttyS3:*:*:20:120:240:5 diff -ur ./timeouts.5 /usr/src/timeoutd-1.5/timeouts.5 --- ./timeouts.5 2006-02-23 11:40:37.000000000 +0000 +++ /usr/src/timeoutd-1.5/timeouts.5 2006-02-26 14:03:05.000000000 +0000 @@ -12,11 +12,11 @@ the first non blank character is a hash (#) will be ignored. All other lines should be of the format: .PP -TIMES:TTYS:USERS:GROUPS:MAXIDLE:MAXSESS:MAXDAY:WARN +TIMES:TTYS:USERS:GROUPS:MAXIDLE[;MESSAGE]:MAXSESS[;MESSAGE]:MAXDAY[;MESSAGE]:WARN:LOCKOUT[;MESSAGE] .PP OR .PP -TIMES:TTYS:USERS:GROUPS:LOGINSTATUS +TIMES:TTYS:USERS:GROUPS:LOGINSTATUS[;MESSAGE] .PP \fBTIMES\fR is a comma separated list of times for which the entry is valid. The entry will be ignored completely outside these times. @@ -32,7 +32,7 @@ \fBTTYS\fR is a comma separated list of ttys (without the leading /dev/) for which the entry is valid. A trailing asterisk (*) will result in any tty which matches up to the asterisk being accepted. An asterisk -by itself matches all tttys. +by itself matches all ttys. .PP \fBUSERS\fR is a comma separated list of users, with pattern matching as for TTYS. @@ -56,6 +56,9 @@ measured in minutes with a default value of 5. The user will receive a warning every minute for WARN minutes before being logged off. .PP +\fBLOCKOUT\fR is the number of minutes that must elapse after a +(MAXSESS - WARN) length session before a user can login again. +.PP \fBLOGINSTATUS\fR is one of either LOGIN or NOLOGIN and is used to limit the times during which certain people or groups of people can use specific terminals. @@ -68,11 +71,21 @@ on in the given day, timeoutd will consider logged in time on all ttys covered by the TTYS field for the matching entry. .PP +.SH MESSAGES +The MAXIDLE, MAXSESSION, MAXDAY, LOCKOUT and NOLOGIN fields can +optionally be follwed by semicolon and a string which provides a +custom message to be used in the event of that limit being +exceeded. The string can be either the message itself or a fully +qualified path to a file containing the text required. +.BR +If these are not specified, built-in defaults are used. +.PP .SH EXAMPLES -.IP Al:*:*:*:10 -Would match all all users in any group regardless of which tty they are -logged in on and allow an idle time of 10 minutes, with no daily or -session time limits. +.IP Al:*:*:*:10;/etc/timeoutd/messages/idle +Would match all all users in any group regardless of which tty they +are logged in on and allow an idle time of 10 minutes, with no daily +or session time limits. A custom message would be used from the file +specified to inform the user what is happening. .IP SaSu:ttyS*:*:subs:5:90:180:3 Would match all users in group subs logged on to any dialin line (assuming all serial lines are dialins) over the weekend and allow them 5 minutes @@ -89,7 +102,7 @@ Would match all dialled in users (if all ttyS lines were modems) and prevent them logging in before 7am or after 8pm on weekdays. .SH FILES -/etc/timeouts +/etc/timeoutd/timeouts .SH BUGS See timeoutd(8) .SH "SEE ALSO" --- /dev/null 2005-08-30 22:06:24.000000000 +0100 +++ /usr/src/timeoutd-1.5/debian/timeoutd.preinst 2006-03-03 10:42:21.000000000 +0000 @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# If upgrading from < 1.5-10 copy existing configfile from /etc to /etc/timeoutd +if [ "$1" = "upgrade" ] && dpkg --compare-versions "$2" lt-nl "1.5-10"; then + if [ -e /etc/timeouts -a ! -e /etc/timeoutd/timeouts ]; then + mkdir -p /etc/timeoutd/timeouts + cp /etc/timeouts /etc/timeoutd +echo "$THIS_PACKAGE $THIS_SCRIPT: Copying existing configfile /etc/timeouts to /etc/timeoutd/timeouts" + fi +fi
timeoutd.preinst
Description: application/shellscript