format("H:i:s") . PHP_EOL; include_once 'config.inc'; include_once "database.inc"; include_once 'helper.inc'; chdir(TMP); set_time_limit(0); $dbh = new db(); $base_name = basename($cmd['f']); $err = new Sagacity_Error($base_name); if (!file_exists($cmd['f'])) { $dbh->update_Running_Scan($base_name, array('name' => 'status', 'value' => 'ERROR')); $err->script_log("File not found", E_ERROR); } $dbh->update_Running_Scan($base_name, array('name' => 'pid', 'value' => getmypid())); $error = array(); $success = array(); $tgts = array(); $finding_count = array(); $sum = ''; $host_list = array(); $src = $dbh->get_Sources('eChecklist'); $handle = fopen($cmd['f'], "r"); // Get the headers (might be one extra line) $eol = true; $header_lines = 0; while ($data = fgetcsv($handle)) { $header_lines++; if (preg_match('/STIG[\_ ]ID/i', $data[0])) { $eol = false; break; } } if ($eol) { $err->script_log("Got to end of " . $cmd['f'] . " without finding 'STIG ID'", E_ERROR); } // add a new scan for this E-Checklist if (count($data) >= 9) { for ($x = echecklist::HOST_COL_START; $data[$x] != 'Notes'; $x++) { if (!preg_match("/^(\d{1,3}\.){3}(\d{1,3})$/", $data[$x])) { if ($pos = strpos($data[$x], '.')) { $data[$x] = substr($data[$x], 0, $pos); } } if ($id = $dbh->check_Target($conf['ste'], $data[$x])) { $tgt = $dbh->get_Target_Details($conf['ste'], $id)[0]; $tgts[] = $tgt; //print "Identified: ".$data[$x].PHP_EOL; } else { $tgt = new target($data[$x]); $tgt->set_STE_ID($conf['ste']); $tgt->set_Location("New Target"); $tgt->set_Notes("New Target"); //print "Added target: ".$data[$x].PHP_EOL; if (preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $data[$x])) { $int = new interfaces(null, $tgt_id, null, $data[$x], null, null, null, null); $tgt->interfaces[] = $int; } $tgt_id = $dbh->save_Target($tgt); $tgts[] = $tgt; } $host_list[$tgt->get_Name()] = array('target' => $tgt, 'count' => 0); } //$host_list = substr($host_list, 0, -1); $dt = new DateTime(); $existing_scan = $dbh->get_ScanData($conf['ste'], $cmd['f']); if (!count($existing_scan)) { $ste = $db->get_STE($conf['ste'])[0]; $scan = new scan(null, $src, $ste, 1, $base_name, $dt->format('Y-m-d')); // $scan->add_Target_Array_to_Host_List($host_list); if (!$scan_id = $dbh->save_Scan($scan)) { $err->script_log("Failure to add scan for " . $cmd['f'], E_ERROR); } else { $scan->set_ID($scan_id); } } else { $scan = $existing_scan[0]; } } else { fclose($handle); $err->script_log("There were less than 9 columns in " . $cmd['f'], E_ERROR); } $line = 0; $line_count = 0; while ($data = fgetcsv($handle)) { $line_count++; } // rewind after counting the lines rewind($handle); // skip the header lines for ($x = 0; $x < $header_lines; $x++) { $data = fgetcsv($handle); } // loop through all the findings and add a new finding item while ($data = fgetcsv($handle)) { if (empty($data[0])) { continue; } if (!$dbh->add_Finding($scan, $tgts, $data)) { $sum .= "Failure adding finding: $data[0]
"; $err->script_log("Error adding STIG ID: " . $data[0], E_WARNING); } else { $err->script_log("Added STIG ID: " . $data[0]); } $dbh->update_Running_Scan($base_name, array('name' => 'perc_comp', 'value' => ($line / $line_count) * 100)); $line++; } foreach ($tgts as $key => $tgt) { $host_list[$tgt->get_Name()]['count'] = $line; } $dbh->update_Scan_Host_List($scan, $host_list); $count = 0; while (is_resource($handle)) { if (fclose($handle)) { $err->script_log("File closed"); break; } $count++; if ($count == 3) { $err->script_log("File didn't close, forcing"); unset($handle); break; } sleep(1); } if (!isset($cmd['debug'])) { rename($cmd['f'], DOC_ROOT . "/tmp/echecklist/$base_name"); } $dbh->update_Running_Scan($base_name, array('name' => 'perc_comp', 'value' => 100, 'complete' => 1)); $end = new DateTime(); print "End Time: " . $end->format("H:i:s") . PHP_EOL; $diff = $end->diff($start); print "Total Time: " . $diff->format("%H:%I:%S") . PHP_EOL; function usage() { print <<