func()

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
}