connect_error) { die($conn->connect_error); } $conn->real_query("CREATE DATABASE IF NOT EXISTS `sagacity`"); $conn->real_query("CREATE DATABASE IF NOT EXISTS `rmf`"); $conn->select_db("sagacity"); $db = new db_helper($conn); // clean /tmp directory array_map('unlink', glob("tmp/*.*")); $add_table = []; $reload = (boolean) filter_input(INPUT_POST, 'reload', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); $json = json_decode(file_get_contents(DOC_ROOT . "/db_schema.json")); if ($reload) { foreach (array_reverse($json->tables) as $table) { $db->c->select_db($table->schema); $db->drop($table->schema, $table->name); } } $host = '%'; if (in_array(strtolower(DB_SERVER), ["localhost", "127.0.0.1"])) { $host = 'localhost'; } print "
";

    foreach ($json->tables as $table) {
        $db->c->select_db($table->schema);
        print "Checking {$table->schema}.{$table->name}" . PHP_EOL;

        if ($db->table_exists("sagacity", "settings")) {
            $db->select("settings", ['db_data'], [
                [
                    'field' => 'meta_key',
                    'op' => '=',
                    'value' => "{$table->schema}.{$table->name}"
                ]
            ]);
            $td = $db->execute();
            if (isset($td['db_data'])) {
                $jtable = json_decode($td['db_data']);
                if ($jtable == $table) {
                    continue;
                }
            }

            if ($db->table_exists($table->schema, $table->name)) {
                $fd = $db->field_data($table->schema, $table->name);
                foreach ($table->fields as $field) {
                    print "field: {$field->name}" . PHP_EOL;

                    if (!isset($fd[$field->name])) {
                        print "field doesn't exist" . PHP_EOL;
                        $db->alter_table($table->name, "add-column", $field);
                    } else {
                        $index = (isset($table->index) && is_array($table->index) && count($table->index) ? $table->index : null);
                        $sql = $db->field_check($fd[$field->name], $field, $table->primary_key, $index);

                        if (!is_null($sql)) {
                            $sql = "ALTER TABLE `{$table->schema}`.`{$table->name}` $sql";
                            $db->query_type = db_helper::ALTER_TABLE;
                            $db->execute(MYSQLI_BOTH, $sql);
                        }
                    }
                }

                if (isset($table->constraints) && is_array($table->constraints) && count($table->constraints)) {
                    foreach ($table->constraints as $con) {
                        if (!$db->is_constraint($con->id)) {
                            $sql .= "ALTER TABLE `{$table->schema}`.`{$table->name}`" .
                                " ADD CONSTRAINT `{$cont->id}` " .
                                "FOREIGN KEY (`{$con->local}`) " .
                                "REFERENCES `{$con->schema}`.`{$con->table}` (`{$con->field}`) " .
                                "ON DELETE " . (!is_null($con->delete) ? strtoupper($con->delete) : "NO ACTION") .
                                " ON UPDATE " . (!is_null($con->update) ? strtoupper($con->update) : "NO ACTION");

                            if (!$conn->real_query($sql)) {
                                die($conn->error);
                            }
                        }
                    }
                }

                $db->update("sagacity.settings", ['db_data' => json_encode($table)], [
                    [
                        'field' => 'meta_key',
                        'op' => '=',
                        'value' => "{$table->schema}.{$table->name}"
                    ]
                ]);
                $db->execute();
            } else {
                print "Creating {$table->schema}.{$table->name}" . PHP_EOL;
                $db->create_table_json($table);

                if (isset($table->triggers)) {
                    // see if the first entry is a drop statement, run it and remove for subsequent statements
                    if (substr($table->triggers[0], 0, 4) == 'DROP') {
                        $db->query($table->triggers[0]);
                        unset($table->triggers[0]);
                    }
                    // concatenate the trigger into one string
                    $trig = implode(" ", $table->triggers);
                    if (!$db->query(str_replace("{host}", $host, $trig))) {
                        print $trig . PHP_EOL;
                        die($db->error);
                    }
                }

                $db->insert("sagacity.settings", [
                    'meta_key' => "{$table->schema}.{$table->name}",
                    'db_data' => json_encode($table)
                ]);

                if (!$db->execute()) {
                    $help->debug(E_ERROR);
                }
            }
        } else {
            $db->create_table_json($table);
            $db->insert("sagacity.settings", [
                'meta_key' => "{$table->schema}.{$table->name}",
                'db_data' => json_encode($table)
            ]);

            $db->execute();
        }
    }

    /*
     * **********************************************************
     * Reload table data
     * ********************************************************** */
    if ($reload) {
        $defaults = <<open("Database_Baseline.zip");
        $zip->extractTo("Database_Baseline");
        chdir("Database_Baseline");
        $sql_files = glob("*.sql");
        $zip->close();

        $sample = (boolean) filter_input(INPUT_POST, 'sample_data', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

        if (!$sample) {
            if (($key = array_search('sample_data.sql', $sql_files)) !== false) {
                unset($sql_files[$key]);
                unlink('sample_data.sql');
            }
        }

        $routines = glob("*routines.sql");
        foreach ($routines as $file) {
            if (($key = array_search($file, $sql_files)) !== false) {
                unset($sql_files[$key]);
            }
        }

        if (count($sql_files)) {
            sort($sql_files);
            foreach ($sql_files as $file) {
                $cmd = realpath(DB_BIN) . " --defaults-file=\"" . realpath(TMP . "/defaults.tmp") . "\"" .
                    " --user={$uname}" .
                    " --host=" . DB_SERVER .
                    " --default-character-set=utf8 < \"$file\"";
                //print "$cmd".PHP_EOL;
                exec($cmd);
                unlink($file);
                print "Imported $file
"; flush(); } foreach ($routines as $file) { $cmd = realpath(DB_BIN) . " --defaults-file=\"" . realpath(TMP . "/defaults.tmp") . "\"" . " --user={$uname}" . " --host=" . DB_SERVER . " --default-character-set=utf8 < \"$file\""; exec($cmd); unlink($file); print "Imported $file
"; flush(); } } unlink(realpath(TMP . "/defaults.tmp")); if (ping("cyberperspectives.com")) { try { $script = realpath(PHP_BIN) . " -c " . realpath(PHP_CONF) . " -f update_db.php" . " -- --cpe --nvd --stig"; $process = new Cocur\BackgroundProcess\BackgroundProcess($script); $process->run(); } catch (Exception $e) { die(print_r($e, true)); } } } print "

Updated complete
"; if ($restart_apache) { print "Apache or PHP configuration files were updated, please restart Apache to enact changes
"; } if ($restart_mysql) { print "MySQL configuration file was updated, please restart MySQL service to enact changes
"; } print "Click here to resume"; exit(); } ?> Update Sagacity
MySQL User Name:
Password: