Completed find action check_md5
This commit is contained in:
parent
797a16be81
commit
447aaea8fd
@ -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>
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2009.08.11.194836"
|
#define Xorriso_timestamP "2009.08.12.130401"
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user