mirror of
https://github.com/martijnvanbrummelen/nwipe.git
synced 2026-02-20 13:42:14 +00:00
PDFGen15 - further work on PDF certificate
1. Added page 2 of the report which includes all smart data as displayed by smartctl -a /dev/sdx 2. Did some more work on the logic, i.e. when certain data on the certificate should be green and when it should be red. 3. Made some changes to nwipe's log in regards to the way it displays disc info right at the beginning of the log. Separated the drive information by a blank line to make each drive stand out from the rest. 4. Moved a string function from device.c to miscellaneous.c more code to follow ..
This commit is contained in:
206
src/create_pdf.c
206
src/create_pdf.c
@@ -18,6 +18,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DEFAULT_SOURCE
|
||||
#define _DEFAULT_SOURCE
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include "stdarg.h"
|
||||
#include "stdio.h"
|
||||
@@ -40,6 +44,8 @@
|
||||
|
||||
#define text_size_data 10
|
||||
|
||||
struct pdf_doc* pdf;
|
||||
|
||||
int create_pdf( nwipe_context_t* ptr )
|
||||
{
|
||||
extern nwipe_prng_t nwipe_twister;
|
||||
@@ -60,7 +66,6 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
char start_time_text[50] = "";
|
||||
char end_time_text[50] = "";
|
||||
char bytes_erased[50] = "";
|
||||
char HPA_pre_erase[50] = "";
|
||||
char HPA_status_text[50] = "";
|
||||
char HPA_size_text[50] = "";
|
||||
char errors[50] = "";
|
||||
@@ -83,8 +88,8 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
/* Initialise Various */
|
||||
|
||||
// nwipe_log( NWIPE_LOG_NOTICE, "Create the PDF disk erasure certificate" );
|
||||
struct pdf_doc* pdf = pdf_create( PDF_A4_WIDTH, PDF_A4_HEIGHT, &info );
|
||||
|
||||
// struct pdf_doc* pdf = pdf_create( PDF_A4_WIDTH, PDF_A4_HEIGHT, &info );
|
||||
pdf = pdf_create( PDF_A4_WIDTH, PDF_A4_HEIGHT, &info );
|
||||
/* Create footer text string and append the version */
|
||||
snprintf( pdf_footer, sizeof( pdf_footer ), "Disc Erasure by NWIPE version %s", version_string );
|
||||
|
||||
@@ -94,21 +99,25 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
/* Obtain page page_width */
|
||||
page_width = pdf_page_width( page_1 );
|
||||
|
||||
/* ---------------------------------------------------------- */
|
||||
/* Create header and footer, with the exception of the green */
|
||||
/* tick/red icon which is set from the 'status' section below */
|
||||
/*********************************************************************
|
||||
* Create header and footer on page 1, with the exception of the green
|
||||
* tick/red icon which is set from the 'status' section below
|
||||
*/
|
||||
pdf_add_text_wrap( pdf, NULL, pdf_footer, 12, 0, 30, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_add_line( pdf, NULL, 50, 50, 550, 50, 3, PDF_BLACK );
|
||||
pdf_add_line( pdf, NULL, 50, 650, 550, 650, 3, PDF_BLACK );
|
||||
pdf_add_image_data( pdf, NULL, 45, 665, 100, 100, bin2c_shred_db_jpg, 27063 );
|
||||
pdf_set_font( pdf, "Helvetica-Bold" );
|
||||
snprintf( model_header, sizeof( model_header ), " %s: %s ", "Model", c->device_model );
|
||||
pdf_add_text( pdf, NULL, model_header, 14, 195, 755, PDF_BLACK );
|
||||
pdf_add_text_wrap( pdf, NULL, model_header, 14, 0, 755, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
snprintf( serial_header, sizeof( serial_header ), " %s: %s ", "S/N", c->device_serial_no );
|
||||
pdf_add_text( pdf, NULL, serial_header, 14, 215, 735, PDF_BLACK );
|
||||
pdf_add_text_wrap( pdf, NULL, serial_header, 14, 0, 735, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_set_font( pdf, "Helvetica" );
|
||||
pdf_add_text( pdf, NULL, "Disk Erasure Report", 24, 190, 690, PDF_BLACK );
|
||||
|
||||
pdf_add_text_wrap( pdf, NULL, "Disk Erasure Report", 24, 0, 695, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
snprintf( barcode, sizeof( barcode ), "%s:%s", c->device_model, c->device_serial_no );
|
||||
pdf_add_text_wrap(
|
||||
pdf, NULL, "Page 1 of 2 - Erasure Status", 14, 0, 670, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_add_barcode( pdf, NULL, PDF_BARCODE_128A, 100, 790, 400, 25, barcode, PDF_BLACK );
|
||||
|
||||
/* ------------------------ */
|
||||
@@ -175,7 +184,7 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
}
|
||||
else
|
||||
{
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 145, 390, PDF_BLACK );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 145, 390, PDF_RED );
|
||||
}
|
||||
pdf_set_font( pdf, "Helvetica" );
|
||||
|
||||
@@ -191,20 +200,33 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
{
|
||||
if( c->HPA_status == HPA_ENABLED )
|
||||
{
|
||||
/* displays the real max size of the disc from the DCO therefore displayed in green */
|
||||
/* displays the real max size of the disc from the DCO displayed in red as enabled */
|
||||
snprintf( device_size,
|
||||
sizeof( device_size ),
|
||||
"%s, %lli bytes",
|
||||
c->DCO_reported_real_max_size_text,
|
||||
c->DCO_reported_real_max_size );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 125, 370, PDF_DARK_GREEN );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 125, 370, PDF_RED );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( c->HPA_status == HPA_UNKNOWN )
|
||||
if( c->HPA_status == HPA_DISABLED )
|
||||
{
|
||||
snprintf( device_size, sizeof( device_size ), "Unknown" );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 125, 370, PDF_RED );
|
||||
/* displays the real max size of the disc from the DCO displayed in green as disabled */
|
||||
snprintf( device_size,
|
||||
sizeof( device_size ),
|
||||
"%s, %lli bytes",
|
||||
c->DCO_reported_real_max_size_text,
|
||||
c->DCO_reported_real_max_size );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 125, 370, PDF_DARK_GREEN );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( c->HPA_status == HPA_UNKNOWN )
|
||||
{
|
||||
snprintf( device_size, sizeof( device_size ), "Unknown" );
|
||||
pdf_add_text( pdf, NULL, device_size, text_size_data, 125, 370, PDF_RED );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -577,6 +599,38 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
pdf_add_text( pdf, NULL, "Signature:", 12, 300, 100, PDF_BLUE );
|
||||
pdf_add_line( pdf, NULL, 360, 65, 550, 66, 1, PDF_GRAY );
|
||||
|
||||
/***************************************************************
|
||||
* Create Page 2 of the report. This shows the drives smart data
|
||||
*/
|
||||
|
||||
struct pdf_object* page_2 = pdf_append_page( pdf );
|
||||
|
||||
/*********************************************************************
|
||||
* Create header and footer on page 1, with the exception of the green
|
||||
* tick/red icon which is set from the 'status' section below
|
||||
*/
|
||||
pdf_add_text_wrap( pdf, NULL, pdf_footer, 12, 0, 30, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_add_line( pdf, NULL, 50, 50, 550, 50, 3, PDF_BLACK );
|
||||
pdf_add_line( pdf, NULL, 50, 650, 550, 650, 3, PDF_BLACK );
|
||||
pdf_add_image_data( pdf, NULL, 45, 665, 100, 100, bin2c_shred_db_jpg, 27063 );
|
||||
pdf_set_font( pdf, "Helvetica-Bold" );
|
||||
snprintf( model_header, sizeof( model_header ), " %s: %s ", "Model", c->device_model );
|
||||
pdf_add_text_wrap( pdf, NULL, model_header, 14, 0, 755, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
snprintf( serial_header, sizeof( serial_header ), " %s: %s ", "S/N", c->device_serial_no );
|
||||
pdf_add_text_wrap( pdf, NULL, serial_header, 14, 0, 735, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_set_font( pdf, "Helvetica" );
|
||||
|
||||
pdf_add_text_wrap( pdf, NULL, "Disk Erasure Report", 24, 0, 695, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
snprintf( barcode, sizeof( barcode ), "%s:%s", c->device_model, c->device_serial_no );
|
||||
pdf_add_text_wrap(
|
||||
pdf, NULL, "Page 2 of 2 - Smart Data", 14, 0, 670, PDF_BLACK, page_width, PDF_ALIGN_CENTER, &height );
|
||||
pdf_add_barcode( pdf, NULL, PDF_BARCODE_128A, 100, 790, 400, 25, barcode, PDF_BLACK );
|
||||
|
||||
/*********************************
|
||||
* Populate page 2 with smart data
|
||||
*/
|
||||
nwipe_get_smart_data( c->device_name );
|
||||
|
||||
/*****************************
|
||||
* Create the reports filename
|
||||
*
|
||||
@@ -597,3 +651,125 @@ int create_pdf( nwipe_context_t* ptr )
|
||||
pdf_destroy( pdf );
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nwipe_get_smart_data( char* device )
|
||||
{
|
||||
FILE* fp;
|
||||
|
||||
char* pdata;
|
||||
|
||||
char smartctl_command[] = "smartctl -a %s";
|
||||
char smartctl_command2[] = "/sbin/smartctl -a %s";
|
||||
char smartctl_command3[] = "/usr/bin/smartctl -a %s";
|
||||
char final_cmd_smartctl[sizeof( smartctl_command3 ) + 256];
|
||||
char result[512];
|
||||
char smartctl_labels_to_anonymize[][18] = {
|
||||
"serial number:", "lu wwn device id:", "logical unit id:", "" /* Don't remove this empty string !, important */
|
||||
};
|
||||
|
||||
int idx, idx2, idx3;
|
||||
int x, y;
|
||||
int set_return_value;
|
||||
|
||||
final_cmd_smartctl[0] = 0;
|
||||
|
||||
/* Determine whether we can access smartctl, required if the PATH environment is not setup ! (Debian sid 'su' as
|
||||
* opposed to 'su -' */
|
||||
if( system( "which smartctl > /dev/null 2>&1" ) )
|
||||
{
|
||||
if( system( "which /sbin/smartctl > /dev/null 2>&1" ) )
|
||||
{
|
||||
if( system( "which /usr/bin/smartctl > /dev/null 2>&1" ) )
|
||||
{
|
||||
nwipe_log( NWIPE_LOG_WARNING, "Command not found. Install smartmontools !" );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( final_cmd_smartctl, smartctl_command3, device );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( final_cmd_smartctl, smartctl_command2, device );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( final_cmd_smartctl, smartctl_command, device );
|
||||
}
|
||||
|
||||
if( final_cmd_smartctl[0] != 0 )
|
||||
{
|
||||
fp = popen( final_cmd_smartctl, "r" );
|
||||
|
||||
if( fp == NULL )
|
||||
{
|
||||
nwipe_log( NWIPE_LOG_WARNING, "nwipe_get_smart_data(): Failed to create stream to %s", smartctl_command );
|
||||
|
||||
set_return_value = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = 50;
|
||||
y = 630;
|
||||
/* Read the output a line at a time - output it. */
|
||||
while( fgets( result, sizeof( result ) - 1, fp ) != NULL )
|
||||
{
|
||||
/* Convert the label, i.e everything before the ':' to lower case, it's required to
|
||||
* convert to lower case as smartctl seems to use inconsistent case when labeling
|
||||
* for serial number, i.e mostly it produces labels "Serial Number:" but occasionally
|
||||
* it produces a label "Serial number:" */
|
||||
|
||||
idx = 0;
|
||||
|
||||
while( result[idx] != 0 && result[idx] != ':' )
|
||||
{
|
||||
/* If upper case alpha character, change to lower case */
|
||||
if( result[idx] >= 'A' && result[idx] <= 'Z' )
|
||||
{
|
||||
result[idx] += 32;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
if( !strncmp( "smart attributes", result, 16 ) )
|
||||
{
|
||||
// move to right column on page, starting at top
|
||||
x = 270;
|
||||
y = 630;
|
||||
}
|
||||
|
||||
if( nwipe_options.quiet == 1 )
|
||||
{
|
||||
for( idx2 = 0; idx2 < 3; idx2++ )
|
||||
{
|
||||
if( strstr( result, &smartctl_labels_to_anonymize[idx2][0] ) )
|
||||
{
|
||||
if( ( pdata = strstr( result, ":" ) ) )
|
||||
{
|
||||
idx3 = 1;
|
||||
while( pdata[idx3] != 0 )
|
||||
{
|
||||
if( pdata[idx3] != ' ' )
|
||||
{
|
||||
pdata[idx3] = 'X';
|
||||
}
|
||||
idx3++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pdf_add_text( pdf, NULL, result, 6, x, y, PDF_BLACK );
|
||||
y -= 9;
|
||||
}
|
||||
set_return_value = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
set_return_value = 1;
|
||||
}
|
||||
return set_return_value;
|
||||
}
|
||||
|
||||
@@ -38,4 +38,6 @@
|
||||
*/
|
||||
int create_pdf( nwipe_context_t* ptr );
|
||||
|
||||
int nwipe_get_smart_data( char* );
|
||||
|
||||
#endif /* CREATE_PDF_H_ */
|
||||
|
||||
32
src/device.c
32
src/device.c
@@ -342,10 +342,6 @@ int check_device( nwipe_context_t*** c, PedDevice* dev, int dcount )
|
||||
check_HPA = 1;
|
||||
break;
|
||||
}
|
||||
if( check_HPA == 1 )
|
||||
{
|
||||
hpa_dco_status( next_device );
|
||||
}
|
||||
|
||||
if( strlen( (const char*) next_device->device_serial_no ) )
|
||||
{
|
||||
@@ -377,6 +373,17 @@ int check_device( nwipe_context_t*** c, PedDevice* dev, int dcount )
|
||||
next_device->device_size_text,
|
||||
next_device->device_serial_no );
|
||||
|
||||
/******************************
|
||||
* Check for hidden sector_size
|
||||
*/
|
||||
if( check_HPA == 1 )
|
||||
{
|
||||
hpa_dco_status( next_device );
|
||||
}
|
||||
|
||||
/* print an empty line to separate the drives in the log */
|
||||
nwipe_log( NWIPE_LOG_INFO, " " );
|
||||
|
||||
( *c )[dcount] = next_device;
|
||||
return 1;
|
||||
}
|
||||
@@ -736,7 +743,7 @@ int nwipe_get_device_bus_type_and_serialno( char* device, nwipe_device_t* bus, c
|
||||
}
|
||||
}
|
||||
|
||||
nwipe_log( NWIPE_LOG_DEBUG, "smartctl: %s", result );
|
||||
nwipe_log( NWIPE_LOG_INFO, "smartctl: %s", result );
|
||||
}
|
||||
|
||||
if( strstr( result, "serial number:" ) != 0 )
|
||||
@@ -813,21 +820,6 @@ int nwipe_get_device_bus_type_and_serialno( char* device, nwipe_device_t* bus, c
|
||||
return set_return_value;
|
||||
}
|
||||
|
||||
void strip_CR_LF( char* str )
|
||||
{
|
||||
/* In the specified string, replace any CR or LF with a space */
|
||||
int idx = 0;
|
||||
int len = strlen( str );
|
||||
while( idx < len )
|
||||
{
|
||||
if( str[idx] == 0x0A || str[idx] == 0x0D )
|
||||
{
|
||||
str[idx] = ' ';
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
void remove_ATA_prefix( char* str )
|
||||
{
|
||||
/* Remove "ATA" prefix if present in the model no. string, left justifing string */
|
||||
|
||||
@@ -365,6 +365,13 @@ int hpa_dco_status( nwipe_context_t* ptr )
|
||||
* produced wildly inaccurate values, often negative.
|
||||
*/
|
||||
if( c->DCO_reported_real_max_sectors > 0 && c->DCO_reported_real_max_sectors < 429496729600 )
|
||||
{
|
||||
nwipe_log( NWIPE_LOG_INFO,
|
||||
"NWipe: DCO Real max sectors reported as %lli on %s",
|
||||
c->DCO_reported_real_max_sectors,
|
||||
c->device_name );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call nwipe's own low level function to retrieve the drive configuration
|
||||
* overlay and retrieve the real max sectors. We may remove reliance on hdparm
|
||||
@@ -376,7 +383,7 @@ int hpa_dco_status( nwipe_context_t* ptr )
|
||||
if( c->DCO_reported_real_max_sectors > 0 && c->DCO_reported_real_max_sectors < 429496729600 )
|
||||
{
|
||||
nwipe_log( NWIPE_LOG_INFO,
|
||||
"NWipe:DCO Real max sectors reported as %lli on %s",
|
||||
"NWipe: DCO Real max sectors reported as %lli on %s",
|
||||
c->DCO_reported_real_max_sectors,
|
||||
c->device_name );
|
||||
}
|
||||
|
||||
@@ -59,6 +59,21 @@ void strlower( char* str )
|
||||
}
|
||||
}
|
||||
|
||||
void strip_CR_LF( char* str )
|
||||
{
|
||||
/* In the specified string, replace any CR or LF with a space */
|
||||
int idx = 0;
|
||||
int len = strlen( str );
|
||||
while( idx < len )
|
||||
{
|
||||
if( str[idx] == 0x0A || str[idx] == 0x0D )
|
||||
{
|
||||
str[idx] = ' ';
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Search a string for a positive number, convert the first
|
||||
* number found to binary and return the binary number.
|
||||
* returns the number or -1 if number too large or -2 if
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* used by configure to dynamically assign those values
|
||||
* to documentation files.
|
||||
*/
|
||||
const char* version_string = "0.34.3 Development code, not for production use!";
|
||||
const char* version_string = "0.34.4 Development code, not for production use!";
|
||||
const char* program_name = "nwipe";
|
||||
const char* author_name = "Martijn van Brummelen";
|
||||
const char* email_address = "git@brumit.nl";
|
||||
@@ -14,4 +14,4 @@ Modifications to original dwipe Copyright Andy Beverley <andy@andybev.com>\n\
|
||||
This is free software; see the source for copying conditions.\n\
|
||||
There is NO warranty; not even for MERCHANTABILITY or FITNESS\n\
|
||||
FOR A PARTICULAR PURPOSE.\n";
|
||||
const char* banner = "nwipe 0.34.3 Development code, not for production use!";
|
||||
const char* banner = "nwipe 0.34.4 Development code, not for production use!";
|
||||
|
||||
Reference in New Issue
Block a user