From: Gilles E. <ges...@us...> - 2006-05-29 21:07:34
|
Update of /cvsroot/ipcop/ipcop/src/misc-progs In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv22717/src/misc-progs Modified Files: Tag: IPCOP_v1_4_0 ipcopbackup.c Makefile Log Message: Go back to previous 1.4.10 ipcopbackup code as there no sense to change floppy code for web backup related changes Changes are only: - removal of unnecessary grp.h include - shorter lines of code Later I will commit functions shifted to ipcopbkcfg Index: ipcopbackup.c =================================================================== RCS file: /cvsroot/ipcop/ipcop/src/misc-progs/ipcopbackup.c,v retrieving revision 1.8.2.8 retrieving revision 1.8.2.9 diff -C2 -d -r1.8.2.8 -r1.8.2.9 *** ipcopbackup.c 27 Apr 2006 14:08:24 -0000 1.8.2.8 --- ipcopbackup.c 29 May 2006 21:07:25 -0000 1.8.2.9 *************** *** 27,256 **** #include <unistd.h> #include <sys/types.h> - #include <sys/stat.h> #include <fcntl.h> - #include <pwd.h> - #include <shadow.h> - #include <crypt.h> - #include <glob.h> #include "setuid.h" ! // want a bigger buffer to concatenate a possibly long string ! #define COMMAND_SIZE 4000 ! //Append lines contained in 'inputfile' to 'string' ! int catlist(char* inputfile, char* string ) { ! struct stat s; // input file stats ! char buffer[STRING_SIZE]; // read buffer ! ! if (stat(inputfile,&s) != 0) return 1; ! if (s.st_size+strlen(string)>COMMAND_SIZE) return 1; // too big! ! int f = open(inputfile, O_RDONLY); ! // cannot open file ! if (!f) return 1; ! ! int count; ! while ((count = read(f, buffer, STRING_SIZE - 1))) { ! int j; ! //replace newlines with spaces ! for (j=0; j<count; j++) { ! if (buffer[j] == '\n') buffer[j] = ' '; ! } ! buffer[j] = '\0'; ! strcat (string,buffer); // append to string ! } ! close (f); ! return 0; //success ! } ! // make a raw backup to floppy_dev (no partitioning) ! int savecfg_floppy(char* floppy_dev) ! { ! char command[COMMAND_SIZE]; // because copy each filename here - // want special output... if (close(0)) { fprintf(stderr, "Couldn't close 0\n"); exit(1); } ! if (open("/dev/zero", O_RDONLY) != 0) {fprintf(stderr, "Couldn't reopen stdin from /dev/zero\n"); exit(1); } if (close(2)) { fprintf(stderr, "Couldn't close 2\n"); exit(1); } ! if (! dup(1)) { fprintf(stderr, "Couldnt redirect stderr to stdout\n"); exit(1); } ! ! /* Make sure floppy device name is up to date */ ! safe_system ("/usr/sbin/updfstab"); ! ! /* Darren Critchley - check for floppy disk in disk drive before continuing */ ! snprintf (command, STRING_SIZE-1, "dd if=%s of=/dev/null bs=1k count=1 2> /dev/null", floppy_dev); ! if (safe_system(command)) { ! perror( "Error: No floppy in drive or bad floppy in drive" ); exit(1); } ! /* Clearing disk */ ! snprintf (command, STRING_SIZE-1, "/bin/dd if=/dev/zero of=%s bs=1k 2> /dev/null", floppy_dev); ! safe_system (command); ! /* Start tarring files to floppy */ ! snprintf (command, COMMAND_SIZE-1, "/bin/tar -X " CONFIG_ROOT"/backup/exclude.system " ! "-X " CONFIG_ROOT"/backup/exclude.user " ! "-C / -cvzf %s " ! "-T " CONFIG_ROOT"/backup/include.user ", ! floppy_dev); ! /* add include.system file content to 'command' */ ! if (catlist(CONFIG_ROOT "/backup/include.system", command)) { fprintf(stderr, "Couldn't open backup system include file\n"); exit (1); } - safe_system (command); - - /* Now check it */ - snprintf (command, STRING_SIZE-1,"/bin/echo '<b>Checking</b>'; /bin/tar -tzf %s" , floppy_dev); - safe_system (command); ! exit(0); ! } ! ! ! // Just verify that root password is ok ! int checkrootpass (char* passwd) ! { ! struct passwd *pw; ! struct spwd *spwd; ! ! if ((pw = getpwnam("root")) == NULL) { ! return (0); // root unknown....! } ! // get shadowed password ! spwd = getspnam("root"); ! ! //and use it in right place ! if (spwd) ! pw->pw_passwd = spwd->sp_pwdp; ! //encrypt cleartext and compare to encrypted version and return true or false ! return (strcmp ( crypt(passwd, pw->pw_passwd), pw->pw_passwd) == 0 ) ? 1 : 0; ! } ! ! ! int main (int argc, char *argv[]) { ! char command[STRING_SIZE]; ! ! if (argc < 3) { // at least two args always needed, avoid some testing. ! fprintf (stderr, "Err %s: used from cgi only !\n", argv[0]); exit (1); } ! if (!initsetuid()){ ! fprintf (stderr, "Err %s: cannot setuid !\n", argv[0]); ! exit (1); } ! // save on normal floppy for use during reinstall ONLY ! if ( (strcmp(argv[1],"-savecfg" ) == 0) && ! (strcmp(argv[2],"floppy") == 0) ) ! savecfg_floppy("/dev/floppy"); // to do: mount usb floppy... ! // issue cat /proc/partitions ! if ( (strcmp(argv[1],"-proc" ) == 0) && (strcmp(argv[2],"partitions") == 0) ) { ! int fi; ! if ( (fi = open("/proc/partitions", O_RDONLY))==-1) exit (1); // cannot open file ! char string[STRING_SIZE]; ! int count; ! while ((count = read(fi, string, STRING_SIZE))) { ! write (1, string, count); ! } ! close (fi); ! exit (0); } ! // output result of 'glob' function ! if ( (strcmp(argv[1],"-glob" ) == 0)) { ! glob_t g; ! if (glob (argv[2],0,NULL,&g) == 0) { ! char** pstr = g.gl_pathv; // base array ! while (*pstr) { // while not NULL ! printf ("%s\n", *pstr); // pstr is a pointer to array of char* ! pstr++; // next pointer ! } ! globfree (&g); ! } ! exit (0); ! } ! // tell if the backup.key is present ! if ( (strcmp(argv[1],"-key" ) == 0) && (strcmp(argv[2],"exist") == 0) ) { ! if ( !(file_exists(BACKUP_KEY)) ) { ! fprintf (stderr, "Err %s: backup key "BACKUP_KEY" does not exist !\n", argv[0]); ! exit (ERR_KEY); ! } ! exit (0); ! } ! // cat the backup.key, for saving it ! if ( strcmp(argv[1],"-keycat" ) == 0) { ! if (! checkrootpass (argv[2])) exit (1); // but only if root pw provided ! int fi; ! if ( (fi = open(BACKUP_KEY, O_RDONLY))==-1) exit (1); // cannot open file ! char string[STRING_SIZE]; ! int count; ! while ((count = read(fi, string, STRING_SIZE))) { ! write (1, string, count); ! } ! close (fi); ! exit (0); ! } ! ! // generate a new backup.key ONLY if inexistant ! if ( (strcmp(argv[1],"-key" ) == 0) && (strcmp(argv[2],"new") == 0) ) { ! if ( (file_exists(BACKUP_KEY)) ) { ! fprintf (stderr, "Err %s: backup key "BACKUP_KEY" already exists !\n", argv[0]); ! exit (ERR_KEY); ! } ! //ok we can generate it ! if (safe_system ("/usr/sbin/ipsec ranbits 256 > " BACKUP_KEY)) { ! fprintf (stderr, "Err %s: couldn't create key !\n", argv[0]); ! exit (ERR_KEY); ! } ! chmod(BACKUP_KEY, S_IRUSR); // protect it ! exit (0); ! } ! ! // disk functions like mount umount,... ! if ((strspn(argv[2], LETTERS_NUMBERS ) == strlen(argv[2])) && ! (strlen(argv[2]) >2) && (strlen(argv[2]) <6)) { ! // check that device is not our main disk ! char rootdev [50] = {0}; ! int len = readlink ("/dev/root", rootdev, sizeof rootdev); ! if (len>0) { ! //remove partition number sda4=>sda ! rootdev[--len] = 0; ! //glue /dev/ to passed arg ! char dev [15] = "/dev/"; ! strcat (dev, argv[2]); ! //if rootdev is in or equal to dev, stops ! if (!strncmp( rootdev, dev, len)) { ! fprintf (stderr, "Cannot mount or umount IPCop main disk !\n"); ! exit (1); ! } ! } else { ! fprintf (stderr, "Cannot read /root/dev symlink !\n"); ! exit (1); ! } ! // -M sda1 => mount /dev/sda1 /mountpoint ! if (strcmp(argv[1],"-M") == 0) { ! snprintf(command, STRING_SIZE - 1,"/bin/mount -t vfat -o,uid=99,gid=99 /dev/%s "MOUNTPOINT, argv[2]); ! safe_system(command); ! } else ! // -U sda1 => umount /dev/sda1 ! if (strcmp(argv[1],"-U") == 0) { ! snprintf(command, STRING_SIZE - 1,"/bin/umount /dev/%s", argv[2]); ! safe_system(command); ! safe_system("/bin/sync"); ! } else { ! fprintf (stderr, "Err %s: bad command !\n", argv[0]); ! exit (1); ! } ! exit (0); ! } else { ! fprintf (stderr, "Err %s: bad arg !\n", argv[0]); ! exit (1); ! } ! return 0; } --- 27,119 ---- #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include "setuid.h" ! int main(void) { ! int count, systeminclude, userinclude, tempfile; ! char buffer[STRING_SIZE]; ! char command[STRING_SIZE]; ! char tempfilename[STRING_SIZE]; ! if (!(initsetuid())) ! exit(1); if (close(0)) { fprintf(stderr, "Couldn't close 0\n"); exit(1); } ! if (open("/dev/zero", O_RDONLY) != 0) { ! fprintf(stderr, "Couldn't reopen stdin from /dev/zero\n"); ! exit(1); ! } if (close(2)) { fprintf(stderr, "Couldn't close 2\n"); exit(1); } ! if (! dup(1)) { ! fprintf(stderr, "Couldnt redirect stderr to stdout\n"); exit(1); } ! /* Open temporary file for copying the inclusion files */ ! strcpy (tempfilename, "/tmp/backup-inclusion.XXXXXX"); ! if (! (tempfile = mkstemp (tempfilename)) > 0) { ! fprintf(stderr, "Couldn't create temporary file.\n"); ! exit(1); ! } ! /* Duplicate system include to temporary inclusion file */ ! if (!(systeminclude = open(CONFIG_ROOT "/backup/include.system", O_RDONLY))) { fprintf(stderr, "Couldn't open backup system include file\n"); exit (1); } ! while ((count = read(systeminclude, buffer, STRING_SIZE))) { ! if( write (tempfile, buffer, count) < 0 ) { ! perror( "temp file write failed" ); ! exit(1); ! } } + close (systeminclude); ! /* Duplicate user include to temporary inclusion file */ ! if (!(userinclude = open(CONFIG_ROOT "/backup/include.user", O_RDONLY))) { ! fprintf(stderr, "Couldn't open backup user include file\n"); exit (1); } ! while ((count = read(userinclude, buffer, STRING_SIZE))) { ! if( write (tempfile, buffer, count) < 0 ) { ! perror( "temp file write failed" ); ! exit(1); ! } } + close (userinclude); + close (tempfile); ! /* Make sure floppy device name is up to date */ ! safe_system ("/usr/sbin/updfstab"); ! /* Darren Critchley - check for floppy disk in disk drive before continuing */ ! snprintf (command, STRING_SIZE-1, ! "dd if=/dev/floppy of=/dev/null bs=1k count=1 2> /dev/null"); ! if (safe_system(command)) { ! perror( "Error: No floppy in drive or bad floppy in drive" ); ! exit(1); } + + /* Clearing disk */ + safe_system ("/bin/dd if=/dev/zero of=/dev/floppy bs=1k 2> /dev/null"); ! /* Start tarring files to floppy */ ! snprintf (command, STRING_SIZE-1, ! "/bin/tar -T " CONFIG_ROOT ! " -X " CONFIG_ROOT "/backup/exclude.system" ! " -X " CONFIG_ROOT "/backup/exclude.user" ! " -C / -cvzf /dev/floppy", ! tempfilename); ! safe_system (command); ! /* Now check it */ ! safe_system ("/bin/echo '<b>Checking</b>'"); ! safe_system ("/bin/tar -tzf /dev/floppy"); ! unlink (tempfilename); ! ! exit(0); } Index: Makefile =================================================================== RCS file: /cvsroot/ipcop/ipcop/src/misc-progs/Makefile,v retrieving revision 1.5.2.8 retrieving revision 1.5.2.9 diff -C2 -d -r1.5.2.8 -r1.5.2.9 *** Makefile 22 Feb 2006 23:03:02 -0000 1.5.2.8 --- Makefile 29 May 2006 21:07:25 -0000 1.5.2.9 *************** *** 78,81 **** $(COMPILE) -I../install+setup/libsmooth/ ipsecctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@ ! ipcopbackup: ipcopbackup.c setuid.o ! $(COMPILE) -lcrypt ipcopbackup.c setuid.o -o $@ --- 78,81 ---- $(COMPILE) -I../install+setup/libsmooth/ ipsecctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@ ! ipcopbkcfg: ipcopbkcfg.c setuid.o ! $(COMPILE) -lcrypt ipcopbkcfg.c setuid.o -o $@ |