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);
203 } while (username[count]);
210 printf("Unesite puni put do direktorija > ");
211 enter(directory, MAXDIR);
212 if (strchr(directory, '.') || strstr(directory, "//"))
214 fputs("Unijeli ste nedozvoljene znakove!\n", stderr);
217 len = strlen(directory);
218 if (strstr(directory, group_fallback_dir) != directory
219 || !strcmp(directory, group_fallback_dir))
221 fprintf(stderr, "Direktorij mora biti podredjen %s direktoriju.\n",
225 if (directory[len] == '/')
230 int getquota(int *soft, int *hard)
232 printf("Unesite donji limit (soft) u KB > ");
233 enter(string, MAXSTR);
234 *soft = atoi(string);
235 if (*soft < 0 || *soft > MAXQUOTA)
242 printf("Unesite gornji limit (hard) u KB > ");
243 enter(string, MAXSTR);
244 *hard = atoi(string);
245 if (*hard >= 0 && *hard <= MAXQUOTA)
248 fputs("Unijeli ste nedozvoljenu vrijednost!\n", stderr);
252 int testuser(int flag) {
253 #if defined(__linux__)
254 char *forbidden[] = { "root", "daemon", "bin", "sys", "sync", "games", "man",
255 "lp", "mail", "news", "uucp", "proxy", "majordom",
256 "postgres",/* "www-data",*/ "backup", "msql", "operator",
257 "list", "irc", "gnats", "nobody", "snort", "ntop",
258 "mysql", "telnetd", "gdm", "freerad", "" };
259 #elif defined(__SVR4)
260 char *forbidden[] = { "root", "daemon", "bin", "sys", "adm", "lp",
261 "smtp", "uucp", "nuucp", "listen", "nobody", "noaccess", "ftp",
262 "gopher", "http", "" };
263 #elif defined(__osf__)
264 char *forbidden[] = { "root", "nobody", "nobodyV", "daemon", "bin",
265 "uucp", "uucpa", "auth", "cron", "lp", "tcb", "adm", "ris", "ftp",
266 "gopher", "http", "" };
267 #elif defined(ultrix)
268 char *forbidden[] = { "root", "field", "nobody", "operator", "ris",
269 "daemon", "sys", "bin", "uucp", "uucpa", "sso", "news", "sccs",
270 "ingres", "ftp", "gopher", "http", "" };
276 if ((int) strlen(loginname) > 8) {
277 fputs("Maksimalna duzina korisnickog imena je 8 znakova!\n", stderr);
281 if (!islower(loginname[count]) && !isdigit(loginname[count])) {
282 fputs("Unijeli ste nedozvoljene znakove u korisnickom imenu!\n", stderr);
286 } while (loginname[count]);
288 if (flag == ALL && (!strcmp(loginname, "srce") || !strcmp(loginname, "admin")))
292 pwd = getpwnam(loginname);
293 if (pwd && pwd->pw_dir)
294 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir)
297 while (*forbidden[count]) {
298 if (!strcmp(forbidden[count], loginname)) {
300 fputs("Nemate ovlasti za unesenog korisnika!\n", stderr);
310 #if defined(__linux__)
311 char *forbidden[] = {"root", "daemon", "bin", "sys", "adm", "tty",
312 "disk", "lp", "mail", "news", "uucp", "proxy",
313 "kmem", "dialout", "fax", "voice", "cdrom", "tape",
314 "sudo", "audio", "dip", "majordom", "postgres",
315 "backup", "msql", "operator", "list", "irc",
316 "gnats", "shadow", "utmp", "video", "games",
317 "nogroup", "snort", "mysql", "telnetd", "gdm",
318 "freerad", "viruser", "" };
319 #elif defined(__SVR4)
320 char *forbidden[] = { "root", "other", "bin", "sys", "adm", "uucp",
321 "mail", "tty", "lp", "nuucp", "staff", "daemon", "sysadmin",
322 "nobody", "noaccess", "wheel", "viruser", "" };
323 #elif defined(__osf__)
324 char *forbidden[] = { "system", "daemon", "uucp", "mem", "kmem", "bin",
325 "sec", "mail", "terminal", "tty", "news", "opr", "auth", "lp", "lpr",
326 "backup", "cron", "sysadmin", "tape", "tcb", "adm", "operator",
327 "ris", "nobody", "nogroup", "wheel", "" };
328 #elif defined(ultrix)
329 char *forbidden[] = { "system", "daemon", "uucp", "rsrv3", "bin", "tty",
330 "kmem", "authread", "news", "rsrv9", "staff", "ris", "guest",
331 "operator", "admin", "nobody", "wheel", "" };
337 if ((int) strlen(group) > 8) {
338 fputs("Maksimalna duzina imena grupe je 8 znakova!\n", stderr);
341 if (!islower(group[count])) {
342 fputs("Unijeli ste nedozvoljene znakove u imenu grupe!\n", stderr);
346 } while (group[count]);
348 while (*forbidden[count]) {
349 if (!strcmp(forbidden[count], group)) {
350 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
356 struct group *grp = getgrnam(group);
357 if (grp && grp->gr_mem) {
359 for (; *grp->gr_mem; grp->gr_mem++) {
360 pwd = getpwnam(*grp->gr_mem);
361 if (pwd && pwd->pw_dir) {
362 if (strstr(pwd->pw_dir, authdir) != pwd->pw_dir) {
363 fputs("Nemate ovlasti za unesenu grupu!\n", stderr);
374 int system_default_shell_check(void)
383 (void) stat("/etc/default/useradd", &statp);
385 if (! statp.st_mode) return 0;
386 if (S_ISREG(statp.st_mode)) {
387 /* XXX maybe check file contents */
399 getuser("Dodavanje korisnika:");
400 if (testuser(NOTALL) == OK && getname() == OK) {
401 strncpy(fullhm, authdir ? authdir : HM, 199);
403 if (fullhm[l - 1] != '/') {
405 fullhm[l + 1] = '\0';
407 strncat(fullhm, loginname, 199);
408 logger("USER ADD: user %s, fullname %s", loginname, username);
409 #if defined(__SVR4) || defined (__linux__)
410 if (!system_default_shell_check()) {
411 shellopt = "-s " DEFAULTSHELL;
413 sprintf(command, "/usr/sbin/useradd -m -d %s %s" \
414 " -c \"%s\" %s", fullhm, shellopt, username, loginname);
415 printf("%s\n", command);
417 if (!system(command)) {
419 #if defined (__linux__)
422 #endif /* __linux__ */
423 sprintf(command, "/usr/bin/passwd %s", loginname);
427 #elif defined(__osf__)
429 sprintf(command, "/usr/sbin/useradd -m -s " DEFAULTSHELL \
430 " -c \"%s\" %s", username, loginname);
432 if (!system(command)) {
433 struct pr_passwd *pr;
435 if (!(pr = getprpwnam(loginname))) {
436 perror("getprpwnam");
439 pr->uflg.fg_lock = 1;
442 pr->uflg.fg_expire = 1;
443 pr->ufld.fd_expire = 0;
444 pr->uflg.fg_lifetime = 1;
445 pr->ufld.fd_lifetime = 0;
446 pr->uflg.fg_max_tries = 1;
447 pr->ufld.fd_max_tries = 0;
448 if (!putprpwnam(loginname, pr)) {
449 perror("putprpwnam");
452 sprintf(command, "/usr/bin/passwd %s", loginname);
456 sprintf(command, "/usr/sbin/sysadm.adduser %s \"%s\"", loginname, username);
460 #elif defined(ultrix)
461 sprintf(command, "/usr/etc/sysadm.adduser %s \"%s\"", loginname, username);
476 getuser("Brisanje korisnika:");
477 if (testuser(ALL) == OK) {
478 logger("USER REMOVE: user %s", loginname);
479 #if defined(__SVR4) || defined(__linux__)
480 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
481 #elif defined(__osf__)
483 sprintf(command, "/usr/sbin/userdel -r %s", loginname);
485 sprintf(command, "/usr/sbin/sysadm.removeuser %s", loginname);
487 #elif defined(ultrix)
488 sprintf(command, "/usr/etc/sysadm.removeuser %s", loginname);
500 getuser("Promjena korisnicke lozinke:");
501 if (testuser(NOTALL) == OK) {
502 logger("PASSWD CHANGE: user %s", loginname);
503 sprintf(command, "/usr/bin/passwd %s", loginname);
520 #elif defined(ultrix)
523 #elif defined(__linux__)
524 #if defined(__i386__) || defined(__x86_64__)
525 struct if_dqblk qval; /* sys/quota.h is wrong for 2.4.23/i386 */
526 #elif defined(__sparc__)
527 struct dqblk qval; /* 2.4.23/sparc is different */
533 char devname[MAXDIR], mountpoint[MAXDIR], greska[MAXDIR];
538 getuser("Promjena korisnicke quote:");
539 if (testuser(ALL) != OK) {
545 if (!(pwd = getpwnam(loginname))) {
546 fputs("Ne postoji uneseni korisnik!\n", stderr);
551 #if defined(__linux__)
553 if (stat(pwd->pw_dir, &statbuf) < 0) {
555 fputs("Korisnik nema maticni direktorij!\n", stderr);
560 dev = statbuf.st_dev;
564 if (!(fp = setmntent("/etc/mtab", "r"))) {
570 while (feof(fp) == 0) {
571 mntp = getmntent(fp);
573 /* ignore special fs' like proc, devfs... */
574 if (strncmp(mntp->mnt_fsname, "/dev", 4))
576 if (stat(mntp->mnt_fsname, &statbuf) < 0) {
583 if (statbuf.st_rdev == dev) {
584 strncpy(devname, mntp->mnt_fsname, MAXDIR);
585 strncpy(mountpoint, mntp->mnt_dir, MAXDIR);
592 if(! strlen(devname))
594 fputs("Nije pronadjen device na kojem je korisnikov direktorij!\n", stderr);
600 /* get previous quota values and update times */
602 if (!quotactl(QCMD(Q_GETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)) {
605 if (qval.dqb_bsoftlimit && (
606 #if defined(__i386__) || defined(__x86_64__)
608 #elif defined(__sparc__)
611 /1024) >= qval.dqb_bsoftlimit) {
613 qval.dqb_btime = now + MAX_DQ_TIME;
617 if (qval.dqb_isoftlimit && qval.dqb_curinodes >= qval.dqb_isoftlimit) {
619 qval.dqb_itime = now + MAX_DQ_TIME;
625 fputs("Ne mogu utvrditi trenutne vrijednosti quote!\n", stderr);
632 /* get previous quota values and update times */
634 if (!quotactl(QCMD(Q_GETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)) {
637 if (qval.dqb_bsoftlimit && (
638 #if defined(__i386__) || defined(__x86_64__)
640 #elif defined(__sparc__)
643 /1024) >= qval.dqb_bsoftlimit) {
645 qval.dqb_btime = now + MAX_DQ_TIME;
649 if (qval.dqb_isoftlimit && qval.dqb_curinodes >= qval.dqb_isoftlimit) {
651 qval.dqb_itime = now + MAX_DQ_TIME;
657 fputs("Ne mogu utvrditi trenutne vrijednosti quote!\n", stderr);
664 if (getquota(&soft, &hard) == OK) {
665 logger("QUOTA CHANGE: user %s, soft %d, hard %d", loginname, soft, hard);
670 fputs("Korisnik ce imati neogranicen pristup diskovnom prostoru!\n", stderr);
671 #if defined(__linux__)
672 #if defined(__i386__) || defined(__x86_64__)
673 /* Actually most of these are u_int64_t. */
674 qval.dqb_bsoftlimit = (u_int32_t) soft;
675 qval.dqb_bhardlimit = (u_int32_t) hard;
676 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int32_t) 0;
677 qval.dqb_btime = (time_t) now + MAX_DQ_TIME;
678 qval.dqb_itime = (time_t) now + MAX_IQ_TIME;
679 #if defined(__i386__) || defined(__x86_64__)
680 /* Set limits and times */
681 qval.dqb_valid = QIF_LIMITS | QIF_TIMES;
685 #if defined(__i386__) || defined(__x86_64__)
686 quotactl(QCMD(Q_SETQUOTA, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
687 #elif defined (__sparc__)
688 quotactl(QCMD(Q_SETQLIM, USRQUOTA), devname, pwd->pw_uid, (caddr_t) &qval)
691 #elif defined (__sparc__)
692 sprintf(command, "/usr/sbin/setquota %s -T %d %d %s", \
693 loginname, MAX_DQ_TIME, MAX_IQ_TIME, mountpoint);
694 printf("%s\n", command);
696 if (!system(command)) {
698 /* fputs("Vremensko ogranicenje quote postavljeno.\n", stderr); */
702 fputs("Nije uspjelo postavljanje vremenskog ogranicenja quote!\n", stderr);
706 sprintf(command, "/usr/sbin/setquota %s %d %d %d %d %s", \
707 loginname, soft, hard, 0, 0, mountpoint);
708 printf("%s\n", command);
710 if (!system(command))
711 #endif /* __sparc__ */
714 fputs("Quota uspjesno promijenjena.\n", stderr);
719 sprintf(greska, "Quota nije ukljucena na filesystemu %s!\n", devname);
720 fputs(greska, stderr);
725 #elif defined(__SVR4)
726 qstr.uid = pwd->pw_uid;
727 for (count = 1; ; count++)
731 strcpy(string, pwd->pw_dir);
732 for (i = 0; i < count; i++)
734 ptr = strrchr(string, '/');
740 strcat(string, "/quotas");
742 if (!stat(string, &statbuf) && (fd = open(string, O_RDWR)) > 0)
747 fputs("Nema quote na ovom sistemu!\n", stderr);
752 qval.dqb_bsoftlimit = (u_long) soft << 1;
753 qval.dqb_bhardlimit = (u_long) hard << 1;
754 qval.dqb_fsoftlimit = qval.dqb_fhardlimit = (u_long) 0;
755 qval.dqb_btimelimit = (u_long) DQ_BTIMELIMIT;
756 qval.dqb_ftimelimit = (u_long) DQ_FTIMELIMIT;
757 qstr.addr = (caddr_t) &qval;
760 if (!ioctl(fd, Q_QUOTACTL, &qstr))
761 fputs("Quota uspjesno promijenjena.\n", stderr);
764 #elif defined(__osf__)
765 qval.dqb_bsoftlimit = (u_long) soft << 1;
766 qval.dqb_bhardlimit = (u_long) hard << 1;
767 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_int) 0;
768 qval.dqb_btime = (time_t) MAX_DQ_TIME;
769 qval.dqb_itime = (time_t) MAX_IQ_TIME;
771 if (!quotactl(pwd->pw_dir, QCMD(Q_SETQUOTA, USRQUOTA), pwd->pw_uid, (char *) &qval))
772 fputs("Quota uspjesno promijenjena.\n", stderr);
775 #elif defined(ultrix)
777 if (stat(pwd->pw_dir, &statbuf) < 0)
780 fputs("Korisnik nema maticni direktorij!\n", stderr);
785 qval.dqb_bsoftlimit = (u_long) soft << 1;
786 qval.dqb_bhardlimit = (u_long) hard << 1;
787 qval.dqb_isoftlimit = qval.dqb_ihardlimit = (u_short) 0;
788 qval.dqb_bwarn = (u_char) MAX_DQ_WARN;
789 qval.dqb_iwarn = (u_char) MAX_IQ_WARN;
790 qval.dqb_curblocks = (u_long) 0;
791 qval.dqb_curinodes = (u_short) 0;
793 if (!quota(Q_SETDLIM, pwd->pw_uid, statbuf.st_dev, (caddr_t) &qval))
794 fputs("Quota uspjesno promijenjena.\n", stderr);
813 puts("Operacije nad grupama korisnika:\n");
814 puts("1 -- Kreiranje nove grupe");
815 puts("2 -- Dodavanje korisnika u grupu");
816 puts("3 -- Brisanje korisnika iz grupe");
817 puts("4 -- Brisanje grupe");
818 puts("5 -- Kreiranje direktorija (u koji grupa moze pisati)");
819 puts("6 -- Brisanje direktorija\n");
820 puts("7 -- Povratak u osnovni izbornik\n");
821 printf("Unesite odabir > ");
827 getgroup("Kreiranje nove grupe:");
828 if (testgroup() == OK)
830 logger("GROUP CREATE: group %s", group);
831 #if defined(__SVR4) || defined(__linux__)
832 sprintf(command, "/usr/sbin/groupadd %s", group);
833 #elif defined(__osf__)
834 sprintf(command, "/usr/sbin/sysadm.addgroup %s", group);
835 #elif defined(ultrix)
836 sprintf(command, "/usr/etc/sysadm.addgroup %s", group);
845 getuser("Dodavanje korisnika u grupu:");
846 if (testuser(ALL) == OK)
848 if (getpwnam(loginname))
851 if (testgroup() == OK)
853 FILE *readfp, *writefp;
857 logger("ADD USER TO GROUP: user %s, group %s", loginname, group);
859 if (lockpw() == ERROR)
863 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
867 if (!(readfp = fopen("/etc/group", "rt")))
870 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
873 unlink("/tmp/group");
874 if (!(writefp = fopen("/tmp/group", "wt")))
878 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
881 while (fgets(line, 2048, readfp))
883 if (strstr(line, group) == line && line[strlen(group)] == ':')
885 char *ptr, left, right;
887 if ((ptr = strstr(line, loginname)))
891 right = *(ptr + strlen(loginname));
892 if ((left == ':' || left == ',') &&
893 (right == ',' || right == '\n'))
897 unlink("/tmp/group");
899 fputs("Korisnik je vec u unesenoj grupi!\n", stderr);
903 if ((ptr = strrchr(line, '\n')))
909 unlink("/tmp/group");
911 fputs("Problem s datotekom /etc/group!\n", stderr);
914 if (*(ptr - 1) != ':')
916 strcat(line, loginname);
920 fputs(line, writefp);
925 unlink("/tmp/group");
927 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
935 system("/bin/mv /tmp/group /etc/group");
937 fputs("Korisnik uspjesno dodan u grupu.\n", stderr);
941 unlink("/tmp/group");
943 fputs("Ne postoji unesena grupa!\n", stderr);
948 fputs("Ne postoji uneseni korisnik!\n", stderr);
957 getuser("Brisanje korisnika iz grupe:");
958 if (testuser(ALL) == OK)
960 if (getpwnam(loginname))
963 if (testgroup() == OK)
965 FILE *readfp, *writefp;
967 int found = 0, empty = 0;
969 logger("REMOVE USER FROM GROUP: user %s, group %s", loginname, group);
971 if (lockpw() == ERROR)
975 fputs("Probajte malo kasnije, /etc/group je u upotrebi!\n", stderr);
979 if (!(readfp = fopen("/etc/group", "rt")))
982 fputs("Ne mogu otvoriti /etc/group datoteku!\n", stderr);
985 unlink("/tmp/group");
986 if (!(writefp = fopen("/tmp/group", "wt")))
990 fputs("Ne mogu otvoriti privremenu datoteku!\n", stderr);
993 while (fgets(line, 2048, readfp))
995 if (strstr(line, group) == line && line[strlen(group)] == ':')
997 char *ptr, left, right;
999 if ((ptr = strstr(line, loginname)))
1002 right = *(ptr + strlen(loginname));
1003 if ((left == ':' || left == ',') &&
1004 (right == ',' || right == '\n'))
1010 unlink("/tmp/group");
1012 fputs("Korisnik nije u unesenoj grupi!\n", stderr);
1016 strcpy(ptr, ptr + strlen(loginname) + 1);
1017 else if (left != ':')
1018 strcpy(ptr - 1, "\n");
1026 fputs(line, writefp);
1027 if (ferror(writefp))
1031 unlink("/tmp/group");
1033 fputs("Problem prilikom pisanja privremene datoteke!\n", stderr);
1041 system("/bin/mv /tmp/group /etc/group"); /* JUNK */
1043 fputs("Korisnik uspjesno obrisan iz grupe.\n", stderr);
1045 fputs("U grupi nema vise ni jednog korisnika.\n", stderr);
1049 unlink("/tmp/group");
1051 fputs("Ne postoji unesena grupa!\n", stderr);
1056 fputs("Ne postoji uneseni korisnik!\n", stderr);
1065 getgroup("Brisanje grupe:");
1066 if (testgroup() == OK)
1068 logger("GROUP REMOVE: group %s", group);
1069 #if defined(__SVR4) || defined(__linux__)
1070 sprintf(command, "/usr/sbin/groupdel %s", group);
1071 #elif defined(__osf__)
1072 sprintf(command, "/usr/sbin/sysadm.removegroup %s", group);
1073 #elif defined(ultrix)
1074 sprintf(command, "/usr/etc/sysadm.removegroup %s", group);
1083 oldumask = umask(002);
1086 getgroup("Grupa u cije vlasnistvo zelite staviti direktorij:");
1087 if (testgroup() == OK)
1089 struct group *grpptr;
1092 grpptr = getgrnam(group);
1095 fputs("Trazena grupa ne postoji!\n", stderr);
1098 logger("DIRECTORY CREATE: directory %s, group %s", directory, group);
1101 while (directory[i] && directory[i] != '/')
1107 status = mkdir(directory, 0755);
1108 if (status < 0 && errno != EEXIST)
1120 status = mkdir(directory, 0775);
1121 if (status < 0 && errno != EEXIST)
1127 if (chown(directory, (uid_t) -1, grpptr->gr_gid) < 0)
1130 fputs("Direktorij uspjesno kreiran.\n", stderr);
1144 logger("DIRECTORY REMOVE: directory %s", directory);
1146 if (rmdir(directory) < 0)
1149 fputs("Direktorij uspjesno obrisan.\n", stderr);
1168 printf("Unesite poruku za korisnike > ");
1169 enter(message, MAXMESS);
1172 if (!isalpha(message[count]) && !isspace(message[count]) && !isdigit(message[count]) && message[count] != '.' && message[count] != ',' && message[count] != '_' && message[count] != '-' && message[count] != '=')
1175 fputs("Unijeli ste nedozvoljene znakove u poruci!\n", stderr);
1180 } while (message[count]);
1181 printf("\nUnesite vrijeme kroz koje ce se racunalo zaustaviti (1 - 60 min) > ");
1182 enter(string, MAXSTR);
1183 grace = atoi(string);
1184 if (grace < MINGRACE || grace > MAXGRACE)
1187 fprintf(stderr, "Unijeli ste vrijeme koje je nula, negativno ili preveliko!\n");
1194 puts("Pokrenuta je procedura za zaustavljanje racunala!\n");
1195 logger("SHUTDOWN!");
1197 sprintf(command, "/usr/sbin/shutdown -i0 -y -g%d \"%s\"", grace, message);
1198 #elif defined(__osf__) || defined (__linux__)
1199 sprintf(command, "/sbin/shutdown -h +%d %s", grace, message);
1200 #elif defined(ultrix)
1201 sprintf(command, "/bin/shutdown -h +%d %s", grace, message);
1219 logger("MANUAL READ");
1221 if (!(manual = fopen(MANFILE, "rt")))
1224 fputs("Uputstva nisu instalirana!\n", stderr);
1229 while (fgets(line, 256, manual))
1231 fputs(line, stdout);
1251 void console_check(char *name)
1255 struct stat statbuf;
1264 fprintf(stderr, "\nProblem s terminalom.\nIzlazak iz programa!\n");
1267 if (!cptr || strcmp(cptr, CONSOLE))
1269 if (stat(CONSOLE, &statbuf) < 0)
1271 fprintf(stderr, "\nNe mogu provjeriti vlasnistvo /dev/console.\nIzlazak iz programa!\n");
1274 if (statbuf.st_uid == saveduid)
1281 #if defined(__osf__) || defined(ultrix) || defined(__linux__)
1282 if (strstr(cptr, "/dev/") == cptr)
1283 strcpy(cptr, cptr + 5);
1284 fp = fopen(UTMP_FILE, "r");
1288 fprintf(stderr, "\nNe mogu otvoriti utmp datoteku.\nIzlazak iz programa!\n");
1291 while (fread(&entry, sizeof(entry), 1, fp))
1293 #if defined(__linux__)
1294 entry.ut_line[UT_LINESIZE-1] = 0;
1295 entry.ut_user[UT_NAMESIZE-1] = 0;
1296 entry.ut_host[UT_HOSTSIZE-1] = 0;
1298 entry.ut_line[8] = 0;
1299 entry.ut_name[8] = 0;
1300 entry.ut_host[16] = 0;
1302 #if defined (__linux__)
1303 if (entry.ut_type == DEAD_PROCESS)
1305 if (strncmp(entry.ut_line, cptr, UT_LINESIZE-1))
1307 if (!strncmp(entry.ut_line, "tty", 3) && \
1308 entry.ut_line[3] >= '0' && \
1309 entry.ut_line[3] <= '9' && \
1310 !strncmp(entry.ut_user, name, UT_NAMESIZE-1)) {
1314 else if (!strncmp(entry.ut_host, ":0", 2) && \
1315 !strncmp(entry.ut_user, name, UT_NAMESIZE-1)) {
1320 break; /* pravi tty, a nije na konzoli */
1322 if (strncmp(entry.ut_line, cptr, 8))
1324 if (!strncmp(entry.ut_line, ":0", 2) && !strncmp(entry.ut_name, name, 8))
1329 if (!strncmp(entry.ut_host, ":0.0", 8) || !strncmp(entry.ut_host, "local", 8)) {
1333 #endif /* __linux__ */
1344 int main(int argc, char **argv)
1350 struct passwd *acl = NULL;
1351 char adminlogin[64], adminfull[1024];
1355 set_auth_parameters(argc,argv);
1358 putenv("IFS=\" \"");
1359 signal(SIGINT, SIG_IGN);
1360 signal(SIGTSTP, SIG_IGN);
1361 signal(SIGQUIT, SIG_IGN);
1362 signal(SIGPIPE, SIG_IGN);
1363 saveduid = getuid();
1365 chmod(LOGFILE, 0600);
1366 chmod(ACLFILE, 0600);
1367 chown(LOGFILE, 0, -1);
1368 chown(ACLFILE, 0, -1);
1369 if (!(logfile = fopen(LOGFILE, "a")))
1373 fprintf(stderr, "\nNe mogu otvoriti log datoteku.\nIzlazak iz programa!\n");
1378 if (!(aclfile = fopen(ACLFILE, "r")))
1382 fprintf(stderr, "\nNe mogu otvoriti datoteku kontrole pristupa.\nIzlazak iz programa!\n");
1386 while (fgets(string, MAXSTR, aclfile))
1390 authdir = group_fallback_dir = NULL;
1391 for (p = string; *p && !isspace(*p); p++);
1393 if (*p && *p != '\n')
1398 while (*p && !isspace(*p))
1403 group_fallback_dir = p;
1404 while (*p && !isspace(*p))
1407 group_fallback_dir = strdup(group_fallback_dir);
1413 if ((acl = getpwnam(string)) && acl->pw_uid == saveduid)
1416 authdir = strdup(authdir);
1424 if (!group_fallback_dir)
1425 group_fallback_dir = authdir ? authdir : HM;
1429 fprintf(stderr, "\nNemate dozvolu za koristenje programa.\nIzlazak iz programa!\n");
1433 if (!(conffile = fopen(OPTFILE, "r"))) {
1436 fprintf(stderr, "Ne mogu otvoriti datoteku s konfiguracijskim opcijama.\n");
1441 while (fgets(string, MAXSTR, conffile)) {
1442 p = &string[strlen(string)-1];
1445 if (!strncmp(string, CONF_NOCONSOLE, MAXSTR-1))
1451 if (!authdir && conscheck)
1452 console_check(acl->pw_name);
1457 group_fallback_dir = HM;
1460 if (acl && acl->pw_name)
1461 strcpy(adminlogin, acl->pw_name);
1463 strcpy(adminlogin, "(none)");
1464 if (acl && acl->pw_gecos)
1465 strcpy(adminfull, acl->pw_gecos);
1467 strcpy(adminfull, "NULL");
1468 logger("ADMIN START: admin %s (%s)", adminlogin, adminfull);
1473 puts("1 -- Dodavanje korisnika");
1474 puts("2 -- Brisanje korisnika");
1475 puts("3 -- Promjena lozinke korisnika");
1476 puts("4 -- Promjena quote korisnika\n");
1477 puts("5 -- Operacije nad grupama korisnika\n");
1478 puts("6 -- Zaustavljanje i gasenje racunala\n");
1479 puts("7 -- Pomoc\n");
1480 puts("8 -- Izlazak iz administracijskog programa\n");
1481 printf("Unesite odabir > ");
1514 logger("ADMIN END: admin %s (%s)", adminlogin, adminfull);