3 * CARNet System Admin Utility v1.26, 2003-12-05
5 * v1.00, 24 Jun 1996, first release
6 * v1.10, 17 Oct 1996, directories with ownership of specific group can be created and
7 * deleted, accounts 'srce' & 'admin' can be added (only)
8 * v1.15, 30 Oct 1996, admin program is now setuid!!! it gives off privileges
10 * v1.20, 30 Nov 1996, name changed, logging incorporated, access list, tty checking
11 * v1.21, 17 Dec 1996, shutdown asks for message and grace period, fixed all
12 * relative paths (security!), main menu slightly rearranged
13 * v1.22, 25 Feb 1997, Digital Unix 4.0 only: use user{add,del}(), fix checking for console
14 * v1.23, 10 Mar 1997, Again problems with OSF/DU and console checking
15 * v1.24, 12 Mar 1997, Rewritten code for console checking (I *hate* bloody Digital!!!)
16 * v1.25, 2002-04-28, Initial port to Debian GNU/Linux, limited functionality
17 * v1.26, 2003-12-05, quota for Linux. Only new style quotactl() on i386.
19 * Written by Zlatko Calusic
20 * Linux port Zoran Dzelajlija
22 * SRCE, University Computing Centre, Croatia
23 * CARNet, Croatian Academic and Research Network
33 char loginname[MAXLOGIN], group[MAXGROUP], username[MAXNAME], string[MAXSTR];
34 char directory[MAXDIR], command[MAXCOMMAND], message[MAXMESS];
39 char *authdir, *group_fallback_dir;
44 void logger(char *fmt, ...)
51 whenptr = ctime(&when);
52 if ((cptr = strchr(whenptr, '\n')))
54 fprintf(logfile, "%s ", whenptr);
58 while (*fmt && *fmt != '%')
59 fputc(*fmt++, logfile);
64 fprintf(logfile, "%s", va_arg(arg, char *));
67 fprintf(logfile, "%d", va_arg(arg, int));
91 retval = seteuid(saveduid);
95 fputs("\nInterna greska, izlazak iz programa!\n", stderr);
105 if (!system("/bin/sh /etc/lockpw"))
109 #elif defined(__osf__)
110 if (!mkdir("/etc/ptmp", 0700))
121 system("/bin/sh /etc/unlockpw");
122 #elif defined(__osf__)
130 fputs("\nProgram se moze pokrenuti samo s konzole.\nIzlazak iz programa!\n", stderr);
138 if (ch != EOF && ch != '\n')
145 #if defined(__SVR4) || defined(__osf__) || defined(__linux__)
146 system("/usr/bin/clear");
147 #elif defined(ultrix)
148 system("/usr/ucb/clear");
155 printf("\nPritisnite <RETURN> za nastavak...");
156 while (getch() != '\n');
160 void enter(char *var, int size)
164 fgets(var, size, stdin);
165 if ((ptr = strchr(var, '\n')))
171 void getuser(char *text)
173 printf("%s\n\nUnesite korisnicko ime (login) > ", text);
174 enter(loginname, MAXLOGIN);
178 void getgroup(char *text)
181 printf("%s\n\n", text);
182 printf("Unesite ime grupe > ");
183 enter(group, MAXGROUP);
191 printf("Unesite ime i prezime korisnika > ");
192 enter(username, MAXNAME);
195 if (!isalnum(username[count]) && username[count] != ' ' && username[count] != '.' && username[count] != '-')
197 fputs("Unijeli ste nedozvoljene znakove u imenu korisnika!\n", stderr);
201 } while (username[count]);
208 printf("Unesite puni put do direktorija > ");
209 enter(directory, MAXDIR);
210 if (strchr(directory, '.') || strstr(directory, "//"))
212 fputs("Unijeli ste nedozvoljene znakove!\n", stderr);
215 len = strlen(directory);
216 if (strstr(directory, group_fallback_dir) != directory
217 || !strcmp(directory, group_fallback_dir))
219 fprintf(stderr, "Direktorij mora biti podredjen %s direktoriju.\n",
223 if (directory[len] == '/')
228 int getquota(int *soft, int *hard)
230 printf("Unesite donji limit (soft) u KB > ");
231 enter(string, MAXSTR);
232 *soft = atoi(string);
233 if (*soft < 0 || *soft > MAXQUOTA)
240 printf("Unesite gornji limit (hard) u KB > ");
241 enter(string, MAXSTR);
242 *hard = atoi(string);
243 if (*hard >= 0 && *hard <= MAXQUOTA)
246 fputs("Unijeli ste nedozvoljenu vrijednost!\n", stderr);
250 int testuser(int flag) {
251 #if defined(__linux__)
252 char *forbidden[] = { "root", "daemon", "bin", "sys", "sync", "games", "man",
253 "lp", "mail", "news", "uucp", "proxy", "majordom",
254 "postgres",/* "www-data",*/ "backup", "msql", "operator",
255 "list", "irc", "gnats", "nobody", "snort", "ntop",
256 "mysql", "telnetd", "gdm", "freerad", "" };
257 #elif defined(__SVR4)
258 char *forbidden[] = { "root", "daemon", "bin", "sys", "adm", "lp",
259 "smtp", "uucp", "nuucp", "listen", "nobody", "noaccess", "ftp",
260 "gopher", "http", "" };
261 #elif defined(__osf__)
262 char *forbidden[] = { "root", "nobody", "nobodyV", "daemon", "bin",
263 "uucp", "uucpa", "auth", "cron", "lp", "tcb", "adm", "ris", "ftp",
264 "gopher", "http", "" };
265 #elif defined(ultrix)
266 char *forbidden[] = { "root", "field", "nobody", "operator", "ris",
267 "daemon", "sys", "bin", "uucp", "uucpa", "sso", "news", "sccs",
268 "ingres", "ftp", "gopher", "http", "" };
274 if ((int) strlen(loginname) > 8) {
275 fputs("Maksimalna duzina korisnickog imena je 8 znakova!\n", stderr);
279 if (!islower(loginname[count]) && !isdigit(loginname[count])) {
280 fputs("Unijeli ste nedozvoljene znakove u korisnickom imenu!\n", stderr);
284 } while (loginname[count]);
286 if (flag == ALL && (!strcmp(loginname, "srce") || !strcmp(loginname, "admin")))
290 pwd = getpwnam(loginname);
291 if (pwd && pwd->pw_dir)
292 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir)
295 while (*forbidden[count]) {
296 if (!strcmp(forbidden[count], loginname)) {
298 fputs("Nemate ovlasti za unesenog korisnika!\n", stderr);
308 #if defined(__linux__)
309 char *forbidden[] = {"root", "daemon", "bin", "sys", "adm", "tty",
310 "disk", "lp", "mail", "news", "uucp", "proxy",
311 "kmem", "dialout", "fax", "voice", "cdrom", "tape",
312 "sudo", "audio", "dip", "majordom", "postgres",
313 "backup", "msql", "operator", "list", "irc",
314 "gnats", "shadow", "utmp", "video", "games",
315 "nogroup", "snort", "mysql", "telnetd", "gdm",
316 "freerad", "viruser", "" };
317 #elif defined(__SVR4)
318 char *forbidden[] = { "root", "other", "bin", "sys", "adm", "uucp",
319 "mail", "tty", "lp", "nuucp", "staff", "daemon", "sysadmin",
320 "nobody", "noaccess", "wheel", "viruser", "" };
321 #elif defined(__osf__)
322 char *forbidden[] = { "system", "daemon", "uucp", "mem", "kmem", "bin",
323 "sec", "mail", "terminal", "tty", "news", "opr", "auth", "lp", "lpr",
324 "backup", "cron", "sysadmin", "tape", "tcb", "adm", "operator",
325 "ris", "nobody", "nogroup", "wheel", "" };
326 #elif defined(ultrix)
327 char *forbidden[] = { "system", "daemon", "uucp", "rsrv3", "bin", "tty",
328 "kmem", "authread", "news", "rsrv9", "staff", "ris", "guest",
329 "operator", "admin", "nobody", "wheel", "" };
335 if ((int) strlen(group) > 8) {
336 fputs("Maksimalna duzina imena grupe je 8 znakova!\n", stderr);
339 if (!islower(group[count])) {
340 fputs("Unijeli ste nedozvoljene znakove u imenu grupe!\n", stderr);
344 } while (group[count]);
346 while (*forbidden[count]) {
347 if (!strcmp(forbidden[count], group)) {
348 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
354 struct group *grp = getgrnam(group);
355 if (grp && grp->gr_mem) {
357 for (; *grp->gr_mem; grp->gr_mem++) {
358 pwd = getpwnam(*grp->gr_mem);
359 if (pwd && pwd->pw_dir) {
360 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir) {
361 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
372 int system_default_shell_check(void)
381 (void) stat("/etc/default/useradd", &statp);
383 if (! statp.st_mode) return 0;
384 if (S_ISREG(statp.st_mode)) {
385 /* XXX maybe check file contents */
397 getuser("Dodavanje korisnika:");
398 if (testuser(NOTALL) == OK && getname() == OK) {
399 strncpy(fullhm, authdir ? authdir : HM, 199);
401 if (fullhm[l - 1] != '/') {
403 fullhm[l + 1] = '\0';
405 strncat(fullhm, loginname, 199);
406 logger("USER ADD: user %s, fullname %s", loginname, username);
407 #if defined(__SVR4) || defined (__linux__)
408 if (!system_default_shell_check()) {
409 shellopt = "-s " DEFAULTSHELL;
411 sprintf(command, "/usr/sbin/useradd -m -d %s %s" \
412 " -c \"%s\" %s", fullhm, shellopt, username, loginname);
413 printf("%s\n", command);
415 if (!system(command)) {
417 #if defined (__linux__)
420 #endif /* __linux__ */
421 sprintf(command, "/usr/bin/passwd %s", loginname);
425 #elif defined(__osf__)
427 sprintf(command, "/usr/sbin/useradd -m -s " DEFAULTSHELL \
428 " -c \"%s\" %s", username, loginname);
430 if (!system(command)) {
431 struct pr_passwd *pr;
433 if (!(pr = getprpwnam(loginname))) {
434 perror("getprpwnam");
437 pr->uflg.fg_lock = 1;
440 pr->uflg.fg_expire = 1;
441 pr->ufld.fd_expire = 0;
442 pr->uflg.fg_lifetime = 1;
443 pr->ufld.fd_lifetime = 0;
444 pr->uflg.fg_max_tries = 1;
445 pr->ufld.fd_max_tries = 0;
446 if (!putprpwnam(loginname, pr)) {
447 perror("putprpwnam");
450 sprintf(command, "/usr/bin/passwd %s", loginname);
454 sprintf(command, "/usr/sbin/sysadm.adduser %s \"%s\"", loginname, username);
458 #elif defined(ultrix)
459 sprintf(command, "/usr/etc/sysadm.adduser %s \"%s\"", loginname, username);
474 getuser("Brisanje korisnika:");
475 if (testuser(ALL) == OK) {
476 logger("USER REMOVE: user %s", loginname);
477 #if defined(__SVR4) || defined(__linux__)
478 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
479 #elif defined(__osf__)
481 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
483 sprintf(command, "/usr/sbin/sysadm.removeuser %s", loginname);
485 #elif defined(ultrix)
486 sprintf(command, "/usr/etc/sysadm.removeuser %s", loginname);
498 getuser("Promjena korisnicke lozinke:");
499 if (testuser(NOTALL) == OK) {
500 logger("PASSWD CHANGE: user %s", loginname);
501 sprintf(command, "/usr/bin/passwd %s", loginname);
518 #elif defined(ultrix)
521 #elif defined(__linux__)
522 #if defined(__i386__)
523 struct if_dqblk qval; /* sys/quota.h is wrong for 2.4.23/i386 */
524 #elif defined(__sparc__)
525 struct dqblk qval; /* 2.4.23/sparc is different */
531 char devname[MAXDIR], mountpoint[MAXDIR], greska[MAXDIR];
536 getuser("Promjena korisnicke quote:");
537 if (testuser(ALL) != OK) {
543 if (!(pwd = getpwnam(loginname))) {
544 fputs("Ne postoji uneseni korisnik!\n", stderr);
549 #if defined(__linux__)
551 if (stat(pwd->pw_dir, &statbuf) < 0) {
553 fputs("Korisnik nema maticni direktorij!\n", stderr);
558 dev = statbuf.st_dev;
562 if (!(fp = setmntent("/etc/mtab", "r"))) {
568 while (feof(fp) == 0) {
569 mntp = getmntent(fp);
571 /* ignore special fs' like proc, devfs... */
572 if (strncmp(mntp->mnt_fsname, "/dev", 4))
574 if (stat(mntp->mnt_fsname, &statbuf) < 0) {
581 if (statbuf.st_rdev == dev) {
582 strncpy(devname, mntp->mnt_fsname, MAXDIR);
583 strncpy(mountpoint, mntp->mnt_dir, MAXDIR);
590 if(! strlen(devname))
592 fputs("Nije pronadjen device na kojem je korisnikov direktorij!\n", stderr);
598 /* get previous quota values and update times */
600 if (!quotactl(QCMD(Q_GETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)) {
603 if (qval.dqb_bsoftlimit && (
604 #if defined (__i386__)
606 #elif defined (__sparc__)
609 /1024) >= qval.dqb_bsoftlimit) {
611 qval.dqb_btime = now + MAX_DQ_TIME;
615 if (qval.dqb_isoftlimit && qval.dqb_curinodes >= qval.dqb_isoftlimit) {
617 qval.dqb_itime = now + MAX_DQ_TIME;
623 fputs("Ne mogu utvrditi trenutne vrijednosti quote!\n", stderr);
630 if (getquota(&soft, &hard) == OK) {
631 logger("QUOTA CHANGE: user %s, soft %d, hard %d", loginname, soft, hard);
636 fputs("Korisnik ce imati neogranicen pristup diskovnom prostoru!\n", stderr);
637 #if defined(__linux__)
638 #if defined(__i386__)
639 /* Actually most of these are u_int64_t. */
640 qval.dqb_bsoftlimit = (u_int32_t) soft;
641 qval.dqb_bhardlimit = (u_int32_t) hard;
642 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int32_t) 0;
643 qval.dqb_btime = (time_t) now + MAX_DQ_TIME;
644 qval.dqb_itime = (time_t) now + MAX_IQ_TIME;
645 #if defined(__i386__)
646 /* Set limits and times */
647 qval.dqb_valid = QIF_LIMITS | QIF_TIMES;
651 #if defined (__i386__)
652 quotactl(QCMD(Q_SETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
653 #elif defined (__sparc__)
654 quotactl(QCMD(Q_SETQLIM, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
657 #elif defined (__sparc__)
658 sprintf(command, "/usr/sbin/setquota %s -T %d %d %s", \
659 loginname, MAX_DQ_TIME, MAX_IQ_TIME, mountpoint);
660 printf("%s\n", command);
662 if (!system(command)) {
664 /* fputs("Vremensko ogranicenje quote postavljeno.\n", stderr); */
668 fputs("Nije uspjelo postavljanje vremenskog ogranicenja quote!\n", stderr);
672 sprintf(command, "/usr/sbin/setquota %s %d %d %d %d %s", \
673 loginname, soft, hard, 0, 0, mountpoint);
674 printf("%s\n", command);
676 if (!system(command))
677 #endif /* __sparc__ */
680 fputs("Quota uspjesno promijenjena.\n", stderr);
685 sprintf(greska, "Quota nije ukljucena na filesystemu %s!\n", devname);
686 fputs(greska, stderr);
691 #elif defined(__SVR4)
692 qstr.uid = pwd->pw_uid;
693 for (count = 1; ; count++)
697 strcpy(string, pwd->pw_dir);
698 for (i = 0; i < count; i++)
700 ptr = strrchr(string, '/');
706 strcat(string, "/quotas");
708 if (!stat(string, &statbuf) && (fd = open(string, O_RDWR)) > 0)
713 fputs("Nema quote na ovom sistemu!\n", stderr);
718 qval.dqb_bsoftlimit = (u_long) soft << 1;
719 qval.dqb_bhardlimit = (u_long) hard << 1;
720 qval.dqb_fsoftlimit = qval.dqb_fhardlimit = (u_long) 0;
721 qval.dqb_btimelimit = (u_long) DQ_BTIMELIMIT;
722 qval.dqb_ftimelimit = (u_long) DQ_FTIMELIMIT;
723 qstr.addr = (caddr_t) &qval;
726 if (!ioctl(fd, Q_QUOTACTL, &qstr))
727 fputs("Quota uspjesno promijenjena.\n", stderr);
730 #elif defined(__osf__)
731 qval.dqb_bsoftlimit = (u_long) soft << 1;
732 qval.dqb_bhardlimit = (u_long) hard << 1;
733 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int) 0;
734 qval.dqb_btime = (time_t) MAX_DQ_TIME;
735 qval.dqb_itime = (time_t) MAX_IQ_TIME;
737 if (!quotactl(pwd->pw_dir, QCMD(Q_SETQUOTA, USRQUOTA), pwd->pw_uid, (char *) &qval))
738 fputs("Quota uspjesno promijenjena.\n", stderr);
741 #elif defined(ultrix)
743 if (stat(pwd->pw_dir, &statbuf) < 0)
746 fputs("Korisnik nema maticni direktorij!\n", stderr);
751 qval.dqb_bsoftlimit = (u_long) soft << 1;
752 qval.dqb_bhardlimit = (u_long) hard << 1;
753 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_short) 0;
754 qval.dqb_bwarn = (u_char) MAX_DQ_WARN;
755 qval.dqb_iwarn = (u_char) MAX_IQ_WARN;
756 qval.dqb_curblocks = (u_long) 0;
757 qval.dqb_curinodes = (u_short) 0;
759 if (!quota(Q_SETDLIM, pwd->pw_uid, statbuf.st_dev, (caddr_t) &qval))
760 fputs("Quota uspjesno promijenjena.\n", stderr);
779 puts("Operacije nad grupama korisnika:\n");
780 puts("1 -- Kreiranje nove grupe");
781 puts("2 -- Dodavanje korisnika u grupu");
782 puts("3 -- Brisanje korisnika iz grupe");
783 puts("4 -- Brisanje grupe");
784 puts("5 -- Kreiranje direktorija (u koji grupa moze pisati)");
785 puts("6 -- Brisanje direktorija\n");
786 puts("7 -- Povratak u osnovni izbornik\n");
787 printf("Unesite odabir > ");
793 getgroup("Kreiranje nove grupe:");
794 if (testgroup() == OK)
796 logger("GROUP CREATE: group %s", group);
797 #if defined(__SVR4) || defined(__linux__)
798 sprintf(command, "/usr/sbin/groupadd %s", group);
799 #elif defined(__osf__)
800 sprintf(command, "/usr/sbin/sysadm.addgroup %s", group);
801 #elif defined(ultrix)
802 sprintf(command, "/usr/etc/sysadm.addgroup %s", group);
811 getuser("Dodavanje korisnika u grupu:");
812 if (testuser(ALL) == OK)
814 if (getpwnam(loginname))
817 if (testgroup() == OK)
819 FILE *readfp, *writefp;
823 logger("ADD USER TO GROUP: user %s, group %s", loginname, group);
825 if (lockpw() == ERROR)
829 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
833 if (!(readfp = fopen("/etc/group", "rt")))
836 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
839 unlink("/tmp/group");
840 if (!(writefp = fopen("/tmp/group", "wt")))
844 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
847 while (fgets(line, 2048, readfp))
849 if (strstr(line, group) == line && line[strlen(group)] == ':')
851 char *ptr, left, right;
853 if ((ptr = strstr(line, loginname)))
857 right = *(ptr + strlen(loginname));
858 if ((left == ':' || left == ',') &&
859 (right == ',' || right == '\n'))
863 unlink("/tmp/group");
865 fputs("Korisnik je vec u unesenoj grupi!\n", stderr);
869 if ((ptr = strrchr(line, '\n')))
875 unlink("/tmp/group");
877 fputs("Problem s datotekom /etc/group!\n", stderr);
880 if (*(ptr - 1) != ':')
882 strcat(line, loginname);
886 fputs(line, writefp);
891 unlink("/tmp/group");
893 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
901 system("/bin/mv /tmp/group /etc/group");
903 fputs("Korisnik uspjesno dodan u grupu.\n", stderr);
907 unlink("/tmp/group");
909 fputs("Ne postoji unesena grupa!\n", stderr);
914 fputs("Ne postoji uneseni korisnik!\n", stderr);
923 getuser("Brisanje korisnika iz grupe:");
924 if (testuser(ALL) == OK)
926 if (getpwnam(loginname))
929 if (testgroup() == OK)
931 FILE *readfp, *writefp;
933 int found = 0, empty = 0;
935 logger("REMOVE USER FROM GROUP: user %s, group %s", loginname, group);
937 if (lockpw() == ERROR)
941 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
945 if (!(readfp = fopen("/etc/group", "rt")))
948 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
951 unlink("/tmp/group");
952 if (!(writefp = fopen("/tmp/group", "wt")))
956 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
959 while (fgets(line, 2048, readfp))
961 if (strstr(line, group) == line && line[strlen(group)] == ':')
963 char *ptr, left, right;
965 if ((ptr = strstr(line, loginname)))
968 right = *(ptr + strlen(loginname));
969 if ((left == ':' || left == ',') &&
970 (right == ',' || right == '\n'))
976 unlink("/tmp/group");
978 fputs("Korisnik nije u unesenoj grupi!\n", stderr);
982 strcpy(ptr, ptr + strlen(loginname) + 1);
983 else if (left != ':')
984 strcpy(ptr - 1, "\n");
992 fputs(line, writefp);
997 unlink("/tmp/group");
999 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
1007 system("/bin/mv /tmp/group /etc/group"); /* JUNK */
1009 fputs("Korisnik uspjesno obrisan iz grupe.\n", stderr);
1011 fputs("U grupi nema vise ni jednog korisnika.\n", stderr);
1015 unlink("/tmp/group");
1017 fputs("Ne postoji unesena grupa!\n", stderr);
1022 fputs("Ne postoji uneseni korisnik!\n", stderr);
1031 getgroup("Brisanje grupe:");
1032 if (testgroup() == OK)
1034 logger("GROUP REMOVE: group %s", group);
1035 #if defined(__SVR4) || defined(__linux__)
1036 sprintf(command, "/usr/sbin/groupdel %s", group);
1037 #elif defined(__osf__)
1038 sprintf(command, "/usr/sbin/sysadm.removegroup %s", group);
1039 #elif defined(ultrix)
1040 sprintf(command, "/usr/etc/sysadm.removegroup %s", group);
1049 oldumask = umask(002);
1052 getgroup("Grupa u cije vlasnistvo zelite staviti direktorij:");
1053 if (testgroup() == OK)
1055 struct group *grpptr;
1058 grpptr = getgrnam(group);
1061 fputs("Trazena grupa ne postoji!\n", stderr);
1064 logger("DIRECTORY CREATE: directory %s, group %s", directory, group);
1067 while (directory[i] && directory[i] != '/')
1073 status = mkdir(directory, 0755);
1074 if (status < 0 && errno != EEXIST)
1086 status = mkdir(directory, 0775);
1087 if (status < 0 && errno != EEXIST)
1093 if (chown(directory, (uid_t) -1, grpptr->gr_gid) < 0)
1096 fputs("Direktorij uspjesno kreiran.\n", stderr);
1110 logger("DIRECTORY REMOVE: directory %s", directory);
1112 if (rmdir(directory) < 0)
1115 fputs("Direktorij uspjesno obrisan.\n", stderr);
1134 printf("Unesite poruku za korisnike > ");
1135 enter(message, MAXMESS);
1138 if (!isalpha(message[count]) && !isspace(message[count]) && !isdigit(message[count]) && message[count] != '.' && message[count] != ',' && message[count] != '_' && message[count] != '-' && message[count] != '=')
1141 fputs("Unijeli ste nedozvoljene znakove u poruci!\n", stderr);
1146 } while (message[count]);
1147 printf("\nUnesite vrijeme kroz koje ce se racunalo zaustaviti (1 - 60 min) > ");
1148 enter(string, MAXSTR);
1149 grace = atoi(string);
1150 if (grace < MINGRACE || grace > MAXGRACE)
1153 fprintf(stderr, "Unijeli ste vrijeme koje je nula, negativno ili preveliko!\n");
1160 puts("Pokrenuta je procedura za zaustavljanje racunala!\n");
1161 logger("SHUTDOWN!");
1163 sprintf(command, "/usr/sbin/shutdown -i0 -y -g%d \"%s\"", grace, message);
1164 #elif defined(__osf__) || defined (__linux__)
1165 sprintf(command, "/sbin/shutdown -h +%d %s", grace, message);
1166 #elif defined(ultrix)
1167 sprintf(command, "/bin/shutdown -h +%d %s", grace, message);
1185 logger("MANUAL READ");
1187 if (!(manual = fopen(MANFILE, "rt")))
1190 fputs("Uputstva nisu instalirana!\n", stderr);
1195 while (fgets(line, 256, manual))
1197 fputs(line, stdout);
1217 void console_check(char *name)
1221 struct stat statbuf;
1230 fprintf(stderr, "\nProblem s terminalom.\nIzlazak iz programa!\n");
1233 if (!cptr || strcmp(cptr, CONSOLE))
1235 if (stat(CONSOLE, &statbuf) < 0)
1237 fprintf(stderr, "\nNe mogu provjeriti vlasnistvo /dev/console.\nIzlazak iz programa!\n");
1240 if (statbuf.st_uid == saveduid)
1247 #if defined(__osf__) || defined(ultrix) || defined(__linux__)
1248 if (strstr(cptr, "/dev/") == cptr)
1249 strcpy(cptr, cptr + 5);
1250 fp = fopen(UTMP_FILE, "r");
1254 fprintf(stderr, "\nNe mogu otvoriti utmp datoteku.\nIzlazak iz programa!\n");
1257 while (fread(&entry, sizeof(entry), 1, fp))
1259 #if defined(__linux__)
1260 entry.ut_line[UT_LINESIZE-1] = 0;
1261 entry.ut_user[UT_NAMESIZE-1] = 0;
1262 entry.ut_host[UT_HOSTSIZE-1] = 0;
1264 entry.ut_line[8] = 0;
1265 entry.ut_name[8] = 0;
1266 entry.ut_host[16] = 0;
1268 #if defined (__linux__)
1269 if (entry.ut_type == DEAD_PROCESS)
1271 if (strncmp(entry.ut_line, cptr, UT_LINESIZE-1))
1273 if (!strncmp(entry.ut_line, "tty", 3) && \
1274 entry.ut_line[3] >= '0' && \
1275 entry.ut_line[3] <= '9' && \
1276 !strncmp(entry.ut_user, name, UT_NAMESIZE-1)) {
1280 else if (!strncmp(entry.ut_host, ":0", 2) && \
1281 !strncmp(entry.ut_user, name, UT_NAMESIZE-1)) {
1286 break; /* pravi tty, a nije na konzoli */
1288 if (strncmp(entry.ut_line, cptr, 8))
1290 if (!strncmp(entry.ut_line, ":0", 2) && !strncmp(entry.ut_name, name, 8))
1295 if (!strncmp(entry.ut_host, ":0.0", 8) || !strncmp(entry.ut_host, "local", 8)) {
1299 #endif /* __linux__ */
1310 int main(int argc, char **argv)
1316 struct passwd *acl = NULL;
1317 char adminlogin[64], adminfull[1024];
1321 set_auth_parameters(argc,argv);
1324 putenv("IFS=\" \"");
1325 signal(SIGINT, SIG_IGN);
1326 signal(SIGTSTP, SIG_IGN);
1327 signal(SIGQUIT, SIG_IGN);
1328 signal(SIGPIPE, SIG_IGN);
1329 saveduid = getuid();
1331 chmod(LOGFILE, 0600);
1332 chmod(ACLFILE, 0600);
1333 chown(LOGFILE, 0, -1);
1334 chown(ACLFILE, 0, -1);
1335 if (!(logfile = fopen(LOGFILE, "a")))
1339 fprintf(stderr, "\nNe mogu otvoriti log datoteku.\nIzlazak iz programa!\n");
1344 if (!(aclfile = fopen(ACLFILE, "r")))
1348 fprintf(stderr, "\nNe mogu otvoriti datoteku kontrole pristupa.\nIzlazak iz programa!\n");
1352 while (fgets(string, MAXSTR, aclfile))
1356 authdir = group_fallback_dir = NULL;
1357 for (p = string; *p && !isspace(*p); p++);
1359 if (*p && *p != '\n')
1364 while (*p && !isspace(*p))
1369 group_fallback_dir = p;
1370 while (*p && !isspace(*p))
1373 group_fallback_dir = strdup(group_fallback_dir);
1379 if ((acl = getpwnam(string)) && acl->pw_uid == saveduid)
1382 authdir = strdup(authdir);
1390 if (!group_fallback_dir)
1391 group_fallback_dir = authdir ? authdir : HM;
1395 fprintf(stderr, "\nNemate dozvolu za koristenje programa.\nIzlazak iz programa!\n");
1399 if (!(conffile = fopen(OPTFILE, "r"))) {
1402 fprintf(stderr, "Ne mogu otvoriti datoteku s konfiguracijskim opcijama.\n");
1407 while (fgets(string, MAXSTR, conffile)) {
1408 p = &string[strlen(string)-1];
1411 if (!strncmp(string, CONF_NOCONSOLE, MAXSTR-1))
1417 if (!authdir && conscheck)
1418 console_check(acl->pw_name);
1423 group_fallback_dir = HM;
1426 if (acl && acl->pw_name)
1427 strcpy(adminlogin, acl->pw_name);
1429 strcpy(adminlogin, "(none)");
1430 if (acl && acl->pw_gecos)
1431 strcpy(adminfull, acl->pw_gecos);
1433 strcpy(adminfull, "NULL");
1434 logger("ADMIN START: admin %s (%s)", adminlogin, adminfull);
1439 puts("1 -- Dodavanje korisnika");
1440 puts("2 -- Brisanje korisnika");
1441 puts("3 -- Promjena lozinke korisnika");
1442 puts("4 -- Promjena quote korisnika\n");
1443 puts("5 -- Operacije nad grupama korisnika\n");
1444 puts("6 -- Zaustavljanje i gasenje racunala\n");
1445 puts("7 -- Pomoc\n");
1446 puts("8 -- Izlazak iz administracijskog programa\n");
1447 printf("Unesite odabir > ");
1480 logger("ADMIN END: admin %s (%s)", adminlogin, adminfull);