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.
18 * v1.27, 2009-05-20, x86_64 version
20 * Written by Zlatko Calusic
21 * Linux port Zoran Dzelajlija
22 * Linux amd64 port Ivan Rako
24 * SRCE, University Computing Centre, Croatia
25 * CARNet, Croatian Academic and Research Network
35 char loginname[MAXLOGIN], group[MAXGROUP], username[MAXNAME], string[MAXSTR];
36 char directory[MAXDIR], command[MAXCOMMAND], message[MAXMESS];
41 char *authdir, *group_fallback_dir;
46 void logger(char *fmt, ...)
53 whenptr = ctime(&when);
54 if ((cptr = strchr(whenptr, '\n')))
56 fprintf(logfile, "%s ", whenptr);
60 while (*fmt && *fmt != '%')
61 fputc(*fmt++, logfile);
66 fprintf(logfile, "%s", va_arg(arg, char *));
69 fprintf(logfile, "%d", va_arg(arg, int));
93 retval = seteuid(saveduid);
97 fputs("\nInterna greska, izlazak iz programa!\n", stderr);
107 if (!system("/bin/sh /etc/lockpw"))
111 #elif defined(__osf__)
112 if (!mkdir("/etc/ptmp", 0700))
123 system("/bin/sh /etc/unlockpw");
124 #elif defined(__osf__)
132 fputs("\nProgram se moze pokrenuti samo s konzole.\nIzlazak iz programa!\n", stderr);
140 if (ch != EOF && ch != '\n')
147 #if defined(__SVR4) || defined(__osf__) || defined(__linux__)
148 system("/usr/bin/clear");
149 #elif defined(ultrix)
150 system("/usr/ucb/clear");
157 printf("\nPritisnite <RETURN> za nastavak...");
158 while (getch() != '\n');
162 void enter(char *var, int size)
166 fgets(var, size, stdin);
167 if ((ptr = strchr(var, '\n')))
173 void getuser(char *text)
175 printf("%s\n\nUnesite korisnicko ime (login) > ", text);
176 enter(loginname, MAXLOGIN);
180 void getgroup(char *text)
183 printf("%s\n\n", text);
184 printf("Unesite ime grupe > ");
185 enter(group, MAXGROUP);
193 printf("Unesite ime i prezime korisnika > ");
194 enter(username, MAXNAME);
197 if (!isalnum(username[count]) && username[count] != ' ' && username[count] != '.' && username[count] != '-')
199 fputs("Unijeli ste nedozvoljene znakove u imenu korisnika!\n", stderr);
204 while (username[count]);
211 printf("Unesite puni put do direktorija > ");
212 enter(directory, MAXDIR);
213 if (strchr(directory, '.') || strstr(directory, "//"))
215 fputs("Unijeli ste nedozvoljene znakove!\n", stderr);
218 len = strlen(directory);
219 if (strstr(directory, group_fallback_dir) != directory
220 || !strcmp(directory, group_fallback_dir))
222 fprintf(stderr, "Direktorij mora biti podredjen %s direktoriju.\n",
226 if (directory[len] == '/')
231 int getquota(int *soft, int *hard)
233 printf("Unesite donji limit (soft) u KB > ");
234 enter(string, MAXSTR);
235 *soft = atoi(string);
236 if (*soft < 0 || *soft > MAXQUOTA)
243 printf("Unesite gornji limit (hard) u KB > ");
244 enter(string, MAXSTR);
245 *hard = atoi(string);
246 if (*hard >= 0 && *hard <= MAXQUOTA)
249 fputs("Unijeli ste nedozvoljenu vrijednost!\n", stderr);
253 int testuser(int flag)
255 #if defined(__linux__)
256 char *forbidden[] = { "root", "daemon", "bin", "sys", "sync", "games", "man",
257 "lp", "mail", "news", "uucp", "proxy", "majordom",
258 "postgres",/* "www-data",*/ "backup", "msql", "operator",
259 "list", "irc", "gnats", "nobody", "snort", "ntop",
260 "mysql", "telnetd", "gdm", "freerad", "" };
261 #elif defined(__SVR4)
262 char *forbidden[] = { "root", "daemon", "bin", "sys", "adm", "lp",
263 "smtp", "uucp", "nuucp", "listen", "nobody", "noaccess", "ftp",
264 "gopher", "http", "" };
265 #elif defined(__osf__)
266 char *forbidden[] = { "root", "nobody", "nobodyV", "daemon", "bin",
267 "uucp", "uucpa", "auth", "cron", "lp", "tcb", "adm", "ris", "ftp",
268 "gopher", "http", "" };
269 #elif defined(ultrix)
270 char *forbidden[] = { "root", "field", "nobody", "operator", "ris",
271 "daemon", "sys", "bin", "uucp", "uucpa", "sso", "news", "sccs",
272 "ingres", "ftp", "gopher", "http", "" };
278 if ((int) strlen(loginname) > 8)
280 fputs("Maksimalna duzina korisnickog imena je 8 znakova!\n", stderr);
285 if (!islower(loginname[count]) && !isdigit(loginname[count]))
287 fputs("Unijeli ste nedozvoljene znakove u korisnickom imenu!\n", stderr);
292 while (loginname[count]);
294 if (flag == ALL && (!strcmp(loginname, "srce") || !strcmp(loginname, "admin")))
299 pwd = getpwnam(loginname);
300 if (pwd && pwd->pw_dir)
301 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir)
304 while (*forbidden[count])
306 if (!strcmp(forbidden[count], loginname))
309 fputs("Nemate ovlasti za unesenog korisnika!\n", stderr);
319 #if defined(__linux__)
320 char *forbidden[] = {"root", "daemon", "bin", "sys", "adm", "tty",
321 "disk", "lp", "mail", "news", "uucp", "proxy",
322 "kmem", "dialout", "fax", "voice", "cdrom", "tape",
323 "sudo", "audio", "dip", "majordom", "postgres",
324 "backup", "msql", "operator", "list", "irc",
325 "gnats", "shadow", "utmp", "video", "games",
326 "nogroup", "snort", "mysql", "telnetd", "gdm",
327 "freerad", "viruser", "" };
328 #elif defined(__SVR4)
329 char *forbidden[] = { "root", "other", "bin", "sys", "adm", "uucp",
330 "mail", "tty", "lp", "nuucp", "staff", "daemon", "sysadmin",
331 "nobody", "noaccess", "wheel", "viruser", "" };
332 #elif defined(__osf__)
333 char *forbidden[] = { "system", "daemon", "uucp", "mem", "kmem", "bin",
334 "sec", "mail", "terminal", "tty", "news", "opr", "auth", "lp", "lpr",
335 "backup", "cron", "sysadmin", "tape", "tcb", "adm", "operator",
336 "ris", "nobody", "nogroup", "wheel", "" };
337 #elif defined(ultrix)
338 char *forbidden[] = { "system", "daemon", "uucp", "rsrv3", "bin", "tty",
339 "kmem", "authread", "news", "rsrv9", "staff", "ris", "guest",
340 "operator", "admin", "nobody", "wheel", "" };
346 if ((int) strlen(group) > 8)
348 fputs("Maksimalna duzina imena grupe je 8 znakova!\n", stderr);
353 if (!islower(group[count]))
355 fputs("Unijeli ste nedozvoljene znakove u imenu grupe!\n", stderr);
360 while (group[count]);
362 while (*forbidden[count])
364 if (!strcmp(forbidden[count], group))
366 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
373 struct group *grp = getgrnam(group);
374 if (grp && grp->gr_mem)
377 for (; *grp->gr_mem; grp->gr_mem++)
379 pwd = getpwnam(*grp->gr_mem);
380 if (pwd && pwd->pw_dir)
382 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir)
384 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
396 int system_default_shell_check(void)
405 (void) stat("/etc/default/useradd", &statp);
407 if (! statp.st_mode) return 0;
408 if (S_ISREG(statp.st_mode))
410 /* XXX maybe check file contents */
424 getuser("Dodavanje korisnika:");
425 if (testuser(NOTALL) == OK && getname() == OK)
427 strncpy(fullhm, authdir ? authdir : HM, 199);
429 if (fullhm[l - 1] != '/')
432 fullhm[l + 1] = '\0';
434 strncat(fullhm, loginname, 199);
435 logger("USER ADD: user %s, fullname %s", loginname, username);
436 #if defined(__SVR4) || defined (__linux__)
437 if (!system_default_shell_check())
439 shellopt = "-s " DEFAULTSHELL;
441 sprintf(command, "/usr/sbin/useradd -m -d %s %s" \
442 " -c \"%s\" %s", fullhm, shellopt, username, loginname);
443 printf("%s\n", command);
445 if (!system(command))
448 #if defined (__linux__)
451 #endif /* __linux__ */
452 sprintf(command, "/usr/bin/passwd %s", loginname);
456 #elif defined(__osf__)
458 sprintf(command, "/usr/sbin/useradd -m -s " DEFAULTSHELL \
459 " -c \"%s\" %s", username, loginname);
461 if (!system(command))
463 struct pr_passwd *pr;
465 if (!(pr = getprpwnam(loginname)))
467 perror("getprpwnam");
470 pr->uflg.fg_lock = 1;
473 pr->uflg.fg_expire = 1;
474 pr->ufld.fd_expire = 0;
475 pr->uflg.fg_lifetime = 1;
476 pr->ufld.fd_lifetime = 0;
477 pr->uflg.fg_max_tries = 1;
478 pr->ufld.fd_max_tries = 0;
479 if (!putprpwnam(loginname, pr))
481 perror("putprpwnam");
484 sprintf(command, "/usr/bin/passwd %s", loginname);
488 sprintf(command, "/usr/sbin/sysadm.adduser %s \"%s\"", loginname, username);
492 #elif defined(ultrix)
493 sprintf(command, "/usr/etc/sysadm.adduser %s \"%s\"", loginname, username);
508 getuser("Brisanje korisnika:");
509 if (testuser(ALL) == OK)
511 logger("USER REMOVE: user %s", loginname);
512 #if defined(__SVR4) || defined(__linux__)
513 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
514 #elif defined(__osf__)
516 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
518 sprintf(command, "/usr/sbin/sysadm.removeuser %s", loginname);
520 #elif defined(ultrix)
521 sprintf(command, "/usr/etc/sysadm.removeuser %s", loginname);
533 getuser("Promjena korisnicke lozinke:");
534 if (testuser(NOTALL) == OK)
536 logger("PASSWD CHANGE: user %s", loginname);
537 sprintf(command, "/usr/bin/passwd %s", loginname);
554 #elif defined(ultrix)
557 #elif defined(__linux__)
558 #if defined(__i386__) || defined(__x86_64__)
559 struct if_dqblk qval; /* sys/quota.h is wrong for 2.4.23/i386 */
560 #elif defined(__sparc__)
561 struct dqblk qval; /* 2.4.23/sparc is different */
567 char devname[MAXDIR], mountpoint[MAXDIR], greska[MAXDIR];
572 getuser("Promjena korisnicke quote:");
573 if (testuser(ALL) != OK)
580 if (!(pwd = getpwnam(loginname)))
582 fputs("Ne postoji uneseni korisnik!\n", stderr);
587 #if defined(__linux__)
589 if (stat(pwd->pw_dir, &statbuf) < 0)
592 fputs("Korisnik nema maticni direktorij!\n", stderr);
599 dev = statbuf.st_dev;
603 if (!(fp = setmntent("/etc/mtab", "r")))
610 while (feof(fp) == 0)
612 mntp = getmntent(fp);
614 /* ignore special fs' like proc, devfs... */
615 if (strncmp(mntp->mnt_fsname, "/dev", 4))
617 if (stat(mntp->mnt_fsname, &statbuf) < 0)
625 if (statbuf.st_rdev == dev)
627 strncpy(devname, mntp->mnt_fsname, MAXDIR);
628 strncpy(mountpoint, mntp->mnt_dir, MAXDIR);
635 if(! strlen(devname))
637 fputs("Nije pronadjen device na kojem je korisnikov direktorij!\n", stderr);
643 /* get previous quota values and update times */
645 if (!quotactl(QCMD(Q_GETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval))
649 if (qval.dqb_bsoftlimit && (
650 #if defined(__i386__) || defined(__x86_64__)
652 #elif defined(__sparc__)
655 /1024) >= qval.dqb_bsoftlimit)
658 qval.dqb_btime = now + MAX_DQ_TIME;
662 if (qval.dqb_isoftlimit && qval.dqb_curinodes >= qval.dqb_isoftlimit)
665 qval.dqb_itime = now + MAX_DQ_TIME;
673 fputs("Ne mogu utvrditi trenutne vrijednosti quote!\n", stderr);
680 /* get previous quota values and update times */
682 if (!quotactl(QCMD(Q_GETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval))
686 if (qval.dqb_bsoftlimit && (
687 #if defined(__i386__) || defined(__x86_64__)
689 #elif defined(__sparc__)
692 /1024) >= qval.dqb_bsoftlimit)
695 qval.dqb_btime = now + MAX_DQ_TIME;
699 if (qval.dqb_isoftlimit && qval.dqb_curinodes >= qval.dqb_isoftlimit)
702 qval.dqb_itime = now + MAX_DQ_TIME;
710 fputs("Ne mogu utvrditi trenutne vrijednosti quote!\n", stderr);
717 if (getquota(&soft, &hard) == OK)
719 logger("QUOTA CHANGE: user %s, soft %d, hard %d", loginname, soft, hard);
724 fputs("Korisnik ce imati neogranicen pristup diskovnom prostoru!\n", stderr);
725 #if defined(__linux__)
726 #if defined(__i386__) || defined(__x86_64__)
727 /* Actually most of these are u_int64_t. */
728 qval.dqb_bsoftlimit = (u_int32_t) soft;
729 qval.dqb_bhardlimit = (u_int32_t) hard;
730 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int32_t) 0;
731 qval.dqb_btime = (time_t) now + MAX_DQ_TIME;
732 qval.dqb_itime = (time_t) now + MAX_IQ_TIME;
733 #if defined(__i386__) || defined(__x86_64__)
734 /* Set limits and times */
735 qval.dqb_valid = QIF_LIMITS | QIF_TIMES;
739 #if defined(__i386__) || defined(__x86_64__)
740 quotactl(QCMD(Q_SETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
741 #elif defined (__sparc__)
742 quotactl(QCMD(Q_SETQLIM, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
745 #elif defined (__sparc__)
746 sprintf(command, "/usr/sbin/setquota %s -T %d %d %s", \
747 loginname, MAX_DQ_TIME, MAX_IQ_TIME, mountpoint);
748 printf("%s\n", command);
750 if (!system(command))
753 /* fputs("Vremensko ogranicenje quote postavljeno.\n", stderr); */
758 fputs("Nije uspjelo postavljanje vremenskog ogranicenja quote!\n", stderr);
762 sprintf(command, "/usr/sbin/setquota %s %d %d %d %d %s", \
763 loginname, soft, hard, 0, 0, mountpoint);
764 printf("%s\n", command);
766 if (!system(command))
767 #endif /* __sparc__ */
770 fputs("Quota uspjesno promijenjena.\n", stderr);
777 sprintf(greska, "Quota nije ukljucena na filesystemu %s!\n", devname);
778 fputs(greska, stderr);
785 #elif defined(__SVR4)
786 qstr.uid = pwd->pw_uid;
787 for (count = 1; ; count++)
791 strcpy(string, pwd->pw_dir);
792 for (i = 0; i < count; i++)
794 ptr = strrchr(string, '/');
800 strcat(string, "/quotas");
802 if (!stat(string, &statbuf) && (fd = open(string, O_RDWR)) > 0)
807 fputs("Nema quote na ovom sistemu!\n", stderr);
812 qval.dqb_bsoftlimit = (u_long) soft << 1;
813 qval.dqb_bhardlimit = (u_long) hard << 1;
814 qval.dqb_fsoftlimit = qval.dqb_fhardlimit = (u_long) 0;
815 qval.dqb_btimelimit = (u_long) DQ_BTIMELIMIT;
816 qval.dqb_ftimelimit = (u_long) DQ_FTIMELIMIT;
817 qstr.addr = (caddr_t) &qval;
820 if (!ioctl(fd, Q_QUOTACTL, &qstr))
821 fputs("Quota uspjesno promijenjena.\n", stderr);
824 #elif defined(__osf__)
825 qval.dqb_bsoftlimit = (u_long) soft << 1;
826 qval.dqb_bhardlimit = (u_long) hard << 1;
827 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int) 0;
828 qval.dqb_btime = (time_t) MAX_DQ_TIME;
829 qval.dqb_itime = (time_t) MAX_IQ_TIME;
831 if (!quotactl(pwd->pw_dir, QCMD(Q_SETQUOTA, USRQUOTA), pwd->pw_uid, (char *) &qval))
832 fputs("Quota uspjesno promijenjena.\n", stderr);
835 #elif defined(ultrix)
837 if (stat(pwd->pw_dir, &statbuf) < 0)
840 fputs("Korisnik nema maticni direktorij!\n", stderr);
845 qval.dqb_bsoftlimit = (u_long) soft << 1;
846 qval.dqb_bhardlimit = (u_long) hard << 1;
847 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_short) 0;
848 qval.dqb_bwarn = (u_char) MAX_DQ_WARN;
849 qval.dqb_iwarn = (u_char) MAX_IQ_WARN;
850 qval.dqb_curblocks = (u_long) 0;
851 qval.dqb_curinodes = (u_short) 0;
853 if (!quota(Q_SETDLIM, pwd->pw_uid, statbuf.st_dev, (caddr_t) &qval))
854 fputs("Quota uspjesno promijenjena.\n", stderr);
873 puts("Operacije nad grupama korisnika:\n");
874 puts("1 -- Kreiranje nove grupe");
875 puts("2 -- Dodavanje korisnika u grupu");
876 puts("3 -- Brisanje korisnika iz grupe");
877 puts("4 -- Brisanje grupe");
878 puts("5 -- Kreiranje direktorija (u koji grupa moze pisati)");
879 puts("6 -- Brisanje direktorija\n");
880 puts("7 -- Povratak u osnovni izbornik\n");
881 printf("Unesite odabir > ");
887 getgroup("Kreiranje nove grupe:");
888 if (testgroup() == OK)
890 logger("GROUP CREATE: group %s", group);
891 #if defined(__SVR4) || defined(__linux__)
892 sprintf(command, "/usr/sbin/groupadd %s", group);
893 #elif defined(__osf__)
894 sprintf(command, "/usr/sbin/sysadm.addgroup %s", group);
895 #elif defined(ultrix)
896 sprintf(command, "/usr/etc/sysadm.addgroup %s", group);
905 getuser("Dodavanje korisnika u grupu:");
906 if (testuser(ALL) == OK)
908 if (getpwnam(loginname))
911 if (testgroup() == OK)
913 FILE *readfp, *writefp;
918 logger("ADD USER TO GROUP: user %s, group %s", loginname, group);
920 if (lockpw() == ERROR)
924 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
928 if (!(readfp = fopen(GROUPFILE, "rt")))
931 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
934 if (stat(GROUPFILE, &fl) == -1)
937 fputs("Ne mogu pogledati dozvole na /etc/group datoteci!\n", stderr);
940 unlink(GROUPTMPFILE);
941 if (!(writefp = fopen(GROUPTMPFILE, "wt")))
945 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
948 while (fgets(line, 2048, readfp))
950 if (strstr(line, group) == line && line[strlen(group)] == ':')
952 char *ptr, left, right;
954 if ((ptr = strstr(line + strlen(group) + 1, loginname)))
957 right = *(ptr + strlen(loginname));
958 if ((left == ':' || left == ',') &&
959 (right == ',' || right == '\n'))
963 unlink(GROUPTMPFILE);
965 fputs("Korisnik je vec u unesenoj grupi!\n", stderr);
969 if ((ptr = strrchr(line, '\n')))
975 unlink(GROUPTMPFILE);
977 fputs("Problem s datotekom /etc/group!\n", stderr);
980 if (*(ptr - 1) != ':')
982 strcat(line, loginname);
986 fputs(line, writefp);
991 unlink(GROUPTMPFILE);
993 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
1001 system("/bin/mv /tmp/group /etc/group");
1002 chmod(GROUPFILE, fl.st_mode);
1003 chown(GROUPFILE, fl.st_uid, fl.st_gid);
1005 fputs("Korisnik uspjesno dodan u grupu.\n", stderr);
1009 unlink(GROUPTMPFILE);
1011 fputs("Ne postoji unesena grupa!\n", stderr);
1016 fputs("Ne postoji uneseni korisnik!\n", stderr);
1025 getuser("Brisanje korisnika iz grupe:");
1026 if (testuser(ALL) == OK)
1028 if (getpwnam(loginname))
1031 if (testgroup() == OK)
1033 FILE *readfp, *writefp;
1035 int found = 0, empty = 0;
1038 logger("REMOVE USER FROM GROUP: user %s, group %s", loginname, group);
1040 if (lockpw() == ERROR)
1044 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
1048 if (!(readfp = fopen(GROUPFILE, "rt")))
1051 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
1054 if (stat(GROUPFILE, &fl) == -1)
1057 fputs("Ne mogu pogledati dozvole na /etc/group datoteci!\n", stderr);
1060 unlink(GROUPTMPFILE);
1061 if (!(writefp = fopen(GROUPTMPFILE, "wt")))
1065 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
1068 while (fgets(line, 2048, readfp))
1070 if (strstr(line, group) == line && line[strlen(group)] == ':')
1072 char *ptr, left, right;
1074 if ((ptr = strstr(line + strlen(group) + 1, loginname)))
1077 right = *(ptr + strlen(loginname));
1078 if ((left == ':' || left == ',') &&
1079 (right == ',' || right == '\n'))
1085 unlink(GROUPTMPFILE);
1087 fputs("Korisnik nije u unesenoj grupi!\n", stderr);
1091 strcpy(ptr, ptr + strlen(loginname) + 1);
1092 else if (left != ':')
1093 strcpy(ptr - 1, "\n");
1101 fputs(line, writefp);
1102 if (ferror(writefp))
1106 unlink(GROUPTMPFILE);
1108 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
1116 system("/bin/mv /tmp/group /etc/group");
1117 chmod(GROUPFILE, fl.st_mode);
1118 chown(GROUPFILE, fl.st_uid, fl.st_gid);
1120 fputs("Korisnik uspjesno obrisan iz grupe.\n", stderr);
1122 fputs("U grupi nema vise ni jednog korisnika.\n", stderr);
1126 unlink(GROUPTMPFILE);
1128 fputs("Ne postoji unesena grupa!\n", stderr);
1133 fputs("Ne postoji uneseni korisnik!\n", stderr);
1142 getgroup("Brisanje grupe:");
1143 if (testgroup() == OK)
1145 logger("GROUP REMOVE: group %s", group);
1146 #if defined(__SVR4) || defined(__linux__)
1147 sprintf(command, "/usr/sbin/groupdel %s", group);
1148 #elif defined(__osf__)
1149 sprintf(command, "/usr/sbin/sysadm.removegroup %s", group);
1150 #elif defined(ultrix)
1151 sprintf(command, "/usr/etc/sysadm.removegroup %s", group);
1160 oldumask = umask(002);
1163 getgroup("Grupa u cije vlasnistvo zelite staviti direktorij:");
1164 if (testgroup() == OK)
1166 struct group *grpptr;
1169 grpptr = getgrnam(group);
1172 fputs("Trazena grupa ne postoji!\n", stderr);
1175 logger("DIRECTORY CREATE: directory %s, group %s", directory, group);
1178 while (directory[i] && directory[i] != '/')
1184 status = mkdir(directory, 0755);
1185 if (status < 0 && errno != EEXIST)
1197 status = mkdir(directory, 0775);
1198 if (status < 0 && errno != EEXIST)
1204 if (chown(directory, (uid_t) -1, grpptr->gr_gid) < 0)
1207 fputs("Direktorij uspjesno kreiran.\n", stderr);
1221 logger("DIRECTORY REMOVE: directory %s", directory);
1223 if (rmdir(directory) < 0)
1226 fputs("Direktorij uspjesno obrisan.\n", stderr);
1245 printf("Unesite poruku za korisnike > ");
1246 enter(message, MAXMESS);
1249 if (!isalpha(message[count]) && !isspace(message[count]) && !isdigit(message[count]) && message[count] != '.' && message[count] != ',' && message[count] != '_' && message[count] != '-' && message[count] != '=')
1252 fputs("Unijeli ste nedozvoljene znakove u poruci!\n", stderr);
1258 while (message[count]);
1259 printf("\nUnesite vrijeme kroz koje ce se racunalo zaustaviti (1 - 60 min) > ");
1260 enter(string, MAXSTR);
1261 grace = atoi(string);
1262 if (grace < MINGRACE || grace > MAXGRACE)
1265 fprintf(stderr, "Unijeli ste vrijeme koje je nula, negativno ili preveliko!\n");
1272 puts("Pokrenuta je procedura za zaustavljanje racunala!\n");
1273 logger("SHUTDOWN!");
1275 sprintf(command, "/usr/sbin/shutdown -i0 -y -g%d \"%s\"", grace, message);
1276 #elif defined(__osf__) || defined (__linux__)
1277 sprintf(command, "/sbin/shutdown -h +%d %s", grace, message);
1278 #elif defined(ultrix)
1279 sprintf(command, "/bin/shutdown -h +%d %s", grace, message);
1297 logger("MANUAL READ");
1299 if (!(manual = fopen(MANFILE, "rt")))
1302 fputs("Uputstva nisu instalirana!\n", stderr);
1307 while (fgets(line, 256, manual))
1309 fputs(line, stdout);
1329 void console_check(char *name)
1333 struct stat statbuf;
1342 fprintf(stderr, "\nProblem s terminalom.\nIzlazak iz programa!\n");
1345 if (!cptr || strcmp(cptr, CONSOLE))
1347 if (stat(CONSOLE, &statbuf) < 0)
1349 fprintf(stderr, "\nNe mogu provjeriti vlasnistvo /dev/console.\nIzlazak iz programa!\n");
1352 if (statbuf.st_uid == saveduid)
1359 #if defined(__osf__) || defined(ultrix) || defined(__linux__)
1360 if (strstr(cptr, "/dev/") == cptr)
1361 strcpy(cptr, cptr + 5);
1362 fp = fopen(UTMP_FILE, "r");
1366 fprintf(stderr, "\nNe mogu otvoriti utmp datoteku.\nIzlazak iz programa!\n");
1369 while (fread(&entry, sizeof(entry), 1, fp))
1371 #if defined(__linux__)
1372 entry.ut_line[UT_LINESIZE-1] = 0;
1373 entry.ut_user[UT_NAMESIZE-1] = 0;
1374 entry.ut_host[UT_HOSTSIZE-1] = 0;
1376 entry.ut_line[8] = 0;
1377 entry.ut_name[8] = 0;
1378 entry.ut_host[16] = 0;
1380 #if defined (__linux__)
1381 if (entry.ut_type == DEAD_PROCESS)
1383 if (strncmp(entry.ut_line, cptr, UT_LINESIZE-1))
1385 if (!strncmp(entry.ut_line, "tty", 3) && \
1386 entry.ut_line[3] >= '0' && \
1387 entry.ut_line[3] <= '9' && \
1388 !strncmp(entry.ut_user, name, UT_NAMESIZE-1))
1393 else if (!strncmp(entry.ut_host, ":0", 2) && \
1394 !strncmp(entry.ut_user, name, UT_NAMESIZE-1))
1400 break; /* pravi tty, a nije na konzoli */
1402 if (strncmp(entry.ut_line, cptr, 8))
1404 if (!strncmp(entry.ut_line, ":0", 2) && !strncmp(entry.ut_name, name, 8))
1409 if (!strncmp(entry.ut_host, ":0.0", 8) || !strncmp(entry.ut_host, "local", 8))
1414 #endif /* __linux__ */
1425 int main(int argc, char **argv)
1431 struct passwd *acl = NULL;
1432 char adminlogin[64], adminfull[1024];
1436 set_auth_parameters(argc,argv);
1439 putenv("IFS=\" \"");
1440 signal(SIGINT, SIG_IGN);
1441 signal(SIGTSTP, SIG_IGN);
1442 signal(SIGQUIT, SIG_IGN);
1443 signal(SIGPIPE, SIG_IGN);
1444 saveduid = getuid();
1446 chmod(LOGFILE, 0600);
1447 chmod(ACLFILE, 0600);
1448 chown(LOGFILE, 0, -1);
1449 chown(ACLFILE, 0, -1);
1450 if (!(logfile = fopen(LOGFILE, "a")))
1454 fprintf(stderr, "\nNe mogu otvoriti log datoteku.\nIzlazak iz programa!\n");
1459 if (!(aclfile = fopen(ACLFILE, "r")))
1463 fprintf(stderr, "\nNe mogu otvoriti datoteku kontrole pristupa.\nIzlazak iz programa!\n");
1467 while (fgets(string, MAXSTR, aclfile))
1471 authdir = group_fallback_dir = NULL;
1472 for (p = string; *p && !isspace(*p); p++);
1474 if (*p && *p != '\n')
1479 while (*p && !isspace(*p))
1484 group_fallback_dir = p;
1485 while (*p && !isspace(*p))
1488 group_fallback_dir = strdup(group_fallback_dir);
1494 if ((acl = getpwnam(string)) && acl->pw_uid == saveduid)
1497 authdir = strdup(authdir);
1505 if (!group_fallback_dir)
1506 group_fallback_dir = authdir ? authdir : HM;
1510 fprintf(stderr, "\nNemate dozvolu za koristenje programa.\nIzlazak iz programa!\n");
1514 if (!(conffile = fopen(OPTFILE, "r")))
1518 fprintf(stderr, "Ne mogu otvoriti datoteku s konfiguracijskim opcijama.\n");
1525 while (fgets(string, MAXSTR, conffile))
1527 p = &string[strlen(string)-1];
1530 if (!strncmp(string, CONF_NOCONSOLE, MAXSTR-1))
1536 if (!authdir && conscheck)
1537 console_check(acl->pw_name);
1542 group_fallback_dir = HM;
1545 if (acl && acl->pw_name)
1546 strcpy(adminlogin, acl->pw_name);
1548 strcpy(adminlogin, "(none)");
1549 if (acl && acl->pw_gecos)
1550 strcpy(adminfull, acl->pw_gecos);
1552 strcpy(adminfull, "NULL");
1553 logger("ADMIN START: admin %s (%s)", adminlogin, adminfull);
1558 puts("1 -- Dodavanje korisnika");
1559 puts("2 -- Brisanje korisnika");
1560 puts("3 -- Promjena lozinke korisnika");
1561 puts("4 -- Promjena quote korisnika\n");
1562 puts("5 -- Operacije nad grupama korisnika\n");
1563 puts("6 -- Zaustavljanje i gasenje racunala\n");
1564 puts("7 -- Pomoc\n");
1565 puts("8 -- Izlazak iz administracijskog programa\n");
1566 printf("Unesite odabir > ");
1599 logger("ADMIN END: admin %s (%s)", adminlogin, adminfull);