func()

in internal/oraclediscovery/oraclediscovery.go [343:389]


func (d DiscoveryService) createListener(ctx context.Context, username string, alias string, envVars map[string]string) (*odpb.Discovery_Listener, error) {
	if _, ok := envVars["ORACLE_HOME"]; !ok {
		return nil, errOracleHomeNotFound
	}

	var vars []string
	for key, value := range envVars {
		vars = append(vars, fmt.Sprintf("%s=%s", key, value))
	}
	params := commandlineexecutor.Params{
		Executable: fmt.Sprintf("%s/bin/lsnrctl", envVars["ORACLE_HOME"]),
		Args:       []string{"status", alias},
		Env:        vars,
		User:       username,
	}
	result := d.executeCommand(ctx, params)
	if result.Error != nil {
		log.CtxLogger(ctx).Errorw("Failed to execute command", "params", params, "result", result)
		return nil, fmt.Errorf("executing command to get listener information: %w", result.Error)
	}

	listener, err := parseLsnrctlStatusOutput(ctx, strings.NewReader(result.StdOut), envVars)
	if err != nil {
		log.CtxLogger(ctx).Errorw("Failed to parse output from 'lsnrctl status' command", "params", params, "result", result)
		return nil, fmt.Errorf("parsing output from 'lsnrctl status' command: %w", err)
	}

	params = commandlineexecutor.Params{
		Executable: fmt.Sprintf("%s/bin/lsnrctl", envVars["ORACLE_HOME"]),
		Args:       []string{"services", alias},
		Env:        vars,
		User:       username,
	}
	result = d.executeCommand(ctx, params)
	if result.Error != nil {
		log.CtxLogger(ctx).Errorw("Failed to execute command", "params", params, "result", result)
		return nil, fmt.Errorf("executing command to get listener information: %w", result.Error)
	}

	err = populateInstanceHandlers(ctx, strings.NewReader(result.StdOut), listener)
	if err != nil {
		log.CtxLogger(ctx).Errorw("Failed to parse output from 'lsnrctl services' command", "params", params, "result", result)
		return nil, fmt.Errorf("parsing output from 'lsnrctl services' command: %w", err)
	}

	return listener, nil
}