Completed find action check_md5

This commit is contained in:
Thomas Schmitt 2009-08-12 13:03:07 +00:00
parent 797a16be81
commit 447aaea8fd
5 changed files with 105 additions and 32 deletions

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Aug 10, 2009" .TH XORRISO 1 "Aug 12, 2009"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -67,6 +67,8 @@ Can issue commands to mount older sessions on Linux or FreeBSD.
.br .br
Can check media for damages and copy readable blocks to disk. Can check media for damages and copy readable blocks to disk.
.br .br
Can attach MD5 checksums to each data file and the whole session.
.br
Scans for optical drives, blanks re-useable optical media. Scans for optical drives, blanks re-useable optical media.
.br .br
Reads its instructions from command line arguments, dialog, and files. Reads its instructions from command line arguments, dialog, and files.
@ -756,7 +758,8 @@ each single data file. If enabled then MD5 checksums get loaded from the image
if there are any. At image generation time they are computed for each file if there are any. At image generation time they are computed for each file
which gets its data written into the new session. The checksums of files which which gets its data written into the new session. The checksums of files which
have their data in older sessions get copied into the new session. have their data in older sessions get copied into the new session.
For now checksums can be exploited only via find action get_md5. Checksums can be exploited via options -check_md5, -check_md5_r, and via find
actions get_md5, check_md5.
.TP .TP
\fB\-rom_toc_scan\fR "on"|"off"[:"emul_on"|"emul_off"] \fB\-rom_toc_scan\fR "on"|"off"[:"emul_on"|"emul_off"]
Read-only drives do not tell the actual media type but show any media as Read-only drives do not tell the actual media type but show any media as
@ -1315,6 +1318,9 @@ Matches files which have ACL or any xattr.
\fB\-has_any_xattr\fR : \fB\-has_any_xattr\fR :
Matches files which have any xattr other than ACL. Matches files which have any xattr other than ACL.
.br .br
\fB\-has_md5\fR :
Matches data files which have MD5 checksums.
.br
\fB\-has_filter\fR : \fB\-has_filter\fR :
Matches files which are filtered by -set_filter. Matches files which are filtered by -set_filter.
.br .br
@ -1432,6 +1438,11 @@ namespace "isofs".
.br .br
\fBget_md5\fR prints eventual recorded MD5 sum together with file path. \fBget_md5\fR prints eventual recorded MD5 sum together with file path.
.br .br
\fBcheck_md5\fR compares eventual recorded MD5 sum with the file content
and reports if mismatch.
.br
E.g.: -find / -not -pending_data -exec check_md5 FAILURE --
.br
\fBsetfattr\fR sets or deletes xattr name value pairs. \fBsetfattr\fR sets or deletes xattr name value pairs.
.br .br
E.g.: -find / -has_xattr -exec setfattr --remove-all '' -- E.g.: -find / -has_xattr -exec setfattr --remove-all '' --
@ -2621,6 +2632,21 @@ have an -indev and a loaded image. ":force" may be appended after the number.
"use=sector_map" does not read any media but loads the file given by option "use=sector_map" does not read any media but loads the file given by option
sector_map= and processes this virtual outcome. sector_map= and processes this virtual outcome.
.TP .TP
\fB\-check_md5\fR severity iso_rr_path [***]
Compare the data content of the given files in the loaded image with their
recorded MD5 checksums, if there are any. In case of any mismatch an event of
the given severity is issued. It may then be handled by appropriate settings of
options -abort_on or -return_with which both can cause non-zero exit values
of the program run. Severity ALL suppresses that event.
.br
This option reports match and mismatch of data files to the result channel.
Non-data files cause NOTE events. There will also be UPDATE events from
data reading.
.TP
\fB\-check_md5_r\fR severity iso_rr_path [***]
Like -check_md5 but checking all data files underneath the given paths.
Only mismatching data files will be reported.
.TP
.B osirrox restore options: .B osirrox restore options:
.PP .PP
Normally xorriso only writes to disk files which were given as stdio: Normally xorriso only writes to disk files which were given as stdio:
@ -3532,6 +3558,9 @@ ACL and xattr
.BR setfacl(1), .BR setfacl(1),
.BR getfattr(1), .BR getfattr(1),
.BR setfattr(1) .BR setfattr(1)
.TP
MD5 checksums
.BR md5sum(1)
.br .br
.SH AUTHOR .SH AUTHOR
Thomas Schmitt <scdbackup@gmx.net> Thomas Schmitt <scdbackup@gmx.net>

View File

@ -4829,7 +4829,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->start_time= 0.0; m->start_time= 0.0;
m->last_update_time= 0.0; m->last_update_time= 0.0;
m->find_compare_result= 1; m->find_compare_result= 1;
m->find_check_md5_result= 1; m->find_check_md5_result= 0;
m->node_counter= 0; m->node_counter= 0;
m->node_array_size= 0; m->node_array_size= 0;
@ -12470,6 +12470,35 @@ ex:;
} }
int Xorriso_report_m5_outcome(struct XorrisO *xorriso, char *severity,
int flag)
{
if((xorriso->find_check_md5_result & 3) == 0) {
sprintf(xorriso->result_line,
"File contents and their MD5 checksums match.\n");
} else if(xorriso->find_check_md5_result & 1) {
sprintf(xorriso->result_line,
"Mismatch detected between file contents and MD5 checksums.\n");
}
Xorriso_result(xorriso,0);
if(xorriso->find_check_md5_result & 2) {
sprintf(xorriso->result_line,
"Encountered other errors during MD5 checking.\n");
Xorriso_result(xorriso,0);
}
if(xorriso->find_check_md5_result & 4) {
sprintf(xorriso->result_line,
"There were data files which had no MD5 and thus could not be checked.\n");
Xorriso_result(xorriso,0);
}
if((xorriso->find_check_md5_result & 3) && strcmp(severity, "ALL") != 0) {
sprintf(xorriso->info_text, "Event triggered by MD5 comparison mismatch");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, severity, 0);
}
return(1);
}
/* ---------------------------- Options API ------------------------ */ /* ---------------------------- Options API ------------------------ */
@ -13352,7 +13381,7 @@ int Xorriso_option_check_md5(struct XorrisO *xorriso,
return(ret); return(ret);
} }
xorriso->find_check_md5_result= 1; xorriso->find_check_md5_result= 0;
for(i= 0; i < optc; i++) { for(i= 0; i < optc; i++) {
if(flag & 8) { if(flag & 8) {
ret= Findjob_new(&job, optv[i], 0); ret= Findjob_new(&job, optv[i], 0);
@ -13360,7 +13389,7 @@ int Xorriso_option_check_md5(struct XorrisO *xorriso,
Xorriso_no_findjob(xorriso, "-check_md5_r", 0); Xorriso_no_findjob(xorriso, "-check_md5_r", 0);
{ret= -1; goto ex;} {ret= -1; goto ex;}
} }
Findjob_set_action_target(job, 35, NULL, 0); Findjob_set_action_target(job, 35, severity, 0);
cpt= optv[i]; cpt= optv[i];
ret= Xorriso_findi_sorted(xorriso, job, (off_t) 0, 1, &cpt, 0); ret= Xorriso_findi_sorted(xorriso, job, (off_t) 0, 1, &cpt, 0);
Findjob_destroy(&job, 0); Findjob_destroy(&job, 0);
@ -13368,12 +13397,16 @@ int Xorriso_option_check_md5(struct XorrisO *xorriso,
ret= xorriso->find_compare_result; ret= xorriso->find_compare_result;
else { else {
ret= -1; ret= -1;
xorriso->find_check_md5_result= -1; xorriso->find_check_md5_result|= 2;
} }
} else { } else {
ret= Xorriso_check_md5(xorriso, NULL, optv[i], 4); ret= Xorriso_check_md5(xorriso, NULL, optv[i], 4);
if(ret < xorriso->find_check_md5_result) if(ret < 0)
xorriso->find_check_md5_result= ret; xorriso->find_check_md5_result|= 2;
else if(ret == 0)
xorriso->find_check_md5_result|= 1;
else if(ret == 2)
xorriso->find_check_md5_result|= 4;
} }
if(ret>0 && !xorriso->request_to_abort) if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */ continue; /* regular bottom of loop */
@ -13389,20 +13422,8 @@ int Xorriso_option_check_md5(struct XorrisO *xorriso,
Xorriso_pacifier_callback(xorriso, "content bytes read", Xorriso_pacifier_callback(xorriso, "content bytes read",
xorriso->pacifier_count, 0, "", 1); xorriso->pacifier_count, 0, "", 1);
report_outcome:; report_outcome:;
if(xorriso->find_check_md5_result > 0) { Xorriso_report_m5_outcome(xorriso, severity, 0);
sprintf(xorriso->result_line,
"File contents and their MD5 checksums match.\n");
} else if(xorriso->find_check_md5_result == 0) {
sprintf(xorriso->result_line,
"Differences detected between file contents and MD5 checksums.\n");
} else {
sprintf(xorriso->result_line, "MD5 checking failed due to error.\n");
}
Xorriso_result(xorriso,0);
if(xorriso->find_check_md5_result <= 0 && strcmp(severity, "ALL") != 0) {
sprintf(xorriso->info_text, "Event triggered by MD5 comparison mismatch");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, severity, 0);
}
ex:; ex:;
(*idx)= end_idx; (*idx)= end_idx;
Xorriso_opt_args(xorriso, "-getfacl", argc, argv, *idx, &end_idx, Xorriso_opt_args(xorriso, "-getfacl", argc, argv, *idx, &end_idx,
@ -13410,7 +13431,7 @@ ex:;
Findjob_destroy(&job, 0); Findjob_destroy(&job, 0);
if(ret <= 0) if(ret <= 0)
return(ret); return(ret);
return(xorriso->find_check_md5_result > 0); return((xorriso->find_check_md5_result & 3) == 0);
} }
@ -14993,6 +15014,12 @@ not_enough_exec_arguments:;
Findjob_set_action_target(job, 33, NULL, 0); Findjob_set_action_target(job, 33, NULL, 0);
} else if(strcmp(cpt, "get_md5")==0) { } else if(strcmp(cpt, "get_md5")==0) {
Findjob_set_action_target(job, 34, NULL, 0); Findjob_set_action_target(job, 34, NULL, 0);
} else if(strcmp(cpt, "check_md5")==0) {
if(i + 1 >= end_idx)
goto not_enough_exec_arguments;
i+= 1;
Findjob_set_action_target(job, 35, argv[i], 0);
flag|= 8;
} else { } else {
sprintf(xorriso->info_text, "-find -exec: unknown action %s", sprintf(xorriso->info_text, "-find -exec: unknown action %s",
Text_shellsafe(argv[i], sfe, 0)); Text_shellsafe(argv[i], sfe, 0));
@ -15011,7 +15038,7 @@ sorry_ex:;
0); 0);
else if(flag & 8) { else if(flag & 8) {
cpt= start_path; cpt= start_path;
ret= Xorriso_findi_sorted(xorriso, first_job, (off_t) 0, 1, &cpt, 0); ret= Xorriso_findi_sorted(xorriso, first_job, (off_t) 0, 1, &cpt, 8);
} else } else
ret= Xorriso_findi(xorriso, first_job, NULL, (off_t) 0, NULL, ret= Xorriso_findi(xorriso, first_job, NULL, (off_t) 0, NULL,
start_path, &dir_stbuf, 0, (flag&4)>>1); start_path, &dir_stbuf, 0, (flag&4)>>1);

View File

@ -395,7 +395,10 @@ struct XorrisO { /* the global context of xorriso */
void *pacifier_fifo; void *pacifier_fifo;
int find_compare_result; /* 1=everything matches , 0=mismatch , -1=error */ int find_compare_result; /* 1=everything matches , 0=mismatch , -1=error */
int find_check_md5_result; /* 1=everything matches , 0=mismatch , -1=error */ int find_check_md5_result; /* bit0= seen mismatch
bit1= seen error
bit2= seen data file without MD5
*/
/* Tree node collection and LBA sorting facility */ /* Tree node collection and LBA sorting facility */
int node_counter; int node_counter;
@ -672,6 +675,10 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
char *iso_adr, char *adr_common_tail, char *iso_adr, char *adr_common_tail,
int *result, int flag); int *result, int flag);
int Xorriso_report_m5_outcome(struct XorrisO *xorriso, char *severity,
int flag);
int Sfile_str(char target[SfileadrL], char *source, int flag); int Sfile_str(char target[SfileadrL], char *source, int flag);
double Sfile_microtime(int flag); double Sfile_microtime(int flag);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2009.08.11.194836" #define Xorriso_timestamP "2009.08.12.130401"

View File

@ -7602,8 +7602,12 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
ret= 1; ret= 1;
} else if(action == 35) { /* check_md5 */ } else if(action == 35) { /* check_md5 */
ret= Xorriso_check_md5(xorriso, (void *) node, show_path, 2); ret= Xorriso_check_md5(xorriso, (void *) node, show_path, 2);
if(ret < xorriso->find_check_md5_result) if(ret == 0)
xorriso->find_check_md5_result= ret; xorriso->find_check_md5_result|= 1;
else if(ret < 0)
xorriso->find_check_md5_result|= 2;
else if(ret == 2)
xorriso->find_check_md5_result|= 4;
if(ret >= 0) if(ret >= 0)
ret= 1; ret= 1;
} else { /* includes : 15 in_iso */ } else { /* includes : 15 in_iso */
@ -8158,6 +8162,7 @@ int Xorriso_path_from_lba(struct XorrisO *xorriso, IsoNode *node, int lba,
/* @param flag bit0= do not dive into trees /* @param flag bit0= do not dive into trees
bit1= do not perform job->action on resulting node array bit1= do not perform job->action on resulting node array
bit2= do not free node_array after all actions are done bit2= do not free node_array after all actions are done
bit3= eventually issue MD5 mismatch event
*/ */
int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job, int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
off_t boss_mem, int filec, char **filev, int flag) off_t boss_mem, int filec, char **filev, int flag)
@ -8171,6 +8176,8 @@ int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
array_job.start_path= NULL; array_job.start_path= NULL;
if((flag & 8) && job->action == 35)
xorriso->find_check_md5_result= 0;
if(job->action>=9 && job->action<=13) { /* actions which have own findjobs */ if(job->action>=9 && job->action<=13) { /* actions which have own findjobs */
/* array_job replaces the hindmost job in the chain */ /* array_job replaces the hindmost job in the chain */
for(hindmost= job; hindmost->subjob != NULL; hindmost= hindmost->subjob) for(hindmost= job; hindmost->subjob != NULL; hindmost= hindmost->subjob)
@ -8275,6 +8282,8 @@ int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
ret= 1; ret= 1;
ex:; ex:;
if((flag & 8) && job->action == 35)
Xorriso_report_m5_outcome(xorriso, job->target, 0);
if(!(flag & (2 | 4))) if(!(flag & (2 | 4)))
Xorriso_destroy_node_array(xorriso, 0); Xorriso_destroy_node_array(xorriso, 0);
if(hmboss != NULL) if(hmboss != NULL)
@ -12096,7 +12105,8 @@ ex:;
by return value by return value
bit1= silently ignore nodes without MD5 bit1= silently ignore nodes without MD5
bit2= do not only report mismatches but also matches bit2= do not only report mismatches but also matches
@return 2= no MD5 attached to node @return 3= not a data file
2= no MD5 attached to node
1= ok, MD5 compared and matching 1= ok, MD5 compared and matching
0= not ok, MD5 mismatch 0= not ok, MD5 mismatch
<0= other error <0= other error
@ -12116,21 +12126,21 @@ int Xorriso_check_md5(struct XorrisO *xorriso, void *in_node, char *path,
if(node == NULL) { if(node == NULL) {
ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0); ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0);
if(ret<=0) if(ret<=0)
goto ex; {ret= -1; goto ex;}
} }
if(!LIBISO_ISREG(node)) { if(!LIBISO_ISREG(node)) {
strcpy(xorriso->info_text, "-check_md5: Not a data file: "); strcpy(xorriso->info_text, "-check_md5: Not a data file: ");
Text_shellsafe(path, xorriso->info_text, 1); Text_shellsafe(path, xorriso->info_text, 1);
if(!(flag & 2)) if(!(flag & 2))
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= 2; goto ex; ret= 3; goto ex;
} }
file= (IsoFile *) node; file= (IsoFile *) node;
/* obtain MD5 */ /* obtain MD5 */
ret= Xorriso_get_volume(xorriso, &image, 0); ret= Xorriso_get_volume(xorriso, &image, 0);
if(ret <= 0) if(ret <= 0)
goto ex; {ret= -1; goto ex;}
ret= iso_file_get_md5(image, file, node_md5, 0); ret= iso_file_get_md5(image, file, node_md5, 0);
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
if(ret < 0) if(ret < 0)