in internal/oraclediscovery/oraclediscovery.go [203:229]
func (d DiscoveryService) discoverDatabases(ctx context.Context, allProcesses []servicecommunication.ProcessWrapper) ([]*odpb.Discovery_DatabaseRoot, error) {
var dbroots []*odpb.Discovery_DatabaseRoot
procs, err := d.findProcessesByName(ctx, oraProcessPrefixes, allProcesses)
if err != nil {
return nil, err
}
log.CtxLogger(ctx).Infof("found %d Oracle processes: %+v", len(procs), procs)
for _, p := range procs {
environFilePath := fmt.Sprintf("/proc/%d/environ", p.Pid())
envVars, err := d.extractOracleEnvVars(environFilePath, "ORACLE_HOME", "ORACLE_SID")
if err != nil || len(envVars) != 2 {
log.CtxLogger(ctx).Warnw("Failed to extract ORACLE_HOME and ORACLE_SID environment variables", "error", err, "process_id", p.Pid(), "environment_file", environFilePath)
continue
}
username, err := p.Username()
if err != nil {
log.CtxLogger(ctx).Warnw("Unable to extract username", "error", err, "process_id", p.Pid(), "SID", envVars["ORACLE_SID"])
continue
}
db, err := d.executeSQLQuery(ctx, username, envVars)
if err != nil {
return nil, fmt.Errorf("fetching database information: %w", err)
}
dbroots = append(dbroots, createDBRoot(db, envVars))
}
return dbroots, nil
}