func()

in oracle/pkg/database/dbdaemon/dbdaemon_server.go [1332:1398]


func (s *Server) RunRMAN(ctx context.Context, req *dbdpb.RunRMANRequest) (*dbdpb.RunRMANResponse, error) {
	// Required for local connections (when no SID is specified on connect string).
	// Add lock to protect server state "databaseSid" and os env variable "ORACLE_SID".
	// Only add lock in top level API to avoid deadlock.
	if req.GetSuppress() {
		klog.InfoS("RunRMAN", "request", "suppressed")
	} else {
		klog.InfoS("RunRMAN", "request", req)
	}

	s.databaseSid.RLock()
	defer s.databaseSid.RUnlock()
	if err := os.Setenv("ORACLE_SID", s.databaseSid.val); err != nil {
		return nil, fmt.Errorf("failed to set env variable: %v", err)
	}

	if req.GetTnsAdmin() != "" {
		if err := os.Setenv("TNS_ADMIN", req.GetTnsAdmin()); err != nil {
			return nil, fmt.Errorf("failed to set env variable: %v", err)
		}
		defer func() {
			if err := os.Unsetenv("TNS_ADMIN"); err != nil {
				klog.Warningf("failed to unset env variable: %v", err)
			}
		}()
	}

	scripts := req.GetScripts()
	if len(scripts) < 1 {
		return nil, fmt.Errorf("RunRMAN requires at least 1 script to run, provided: %d", len(scripts))
	}
	var res []string
	for _, script := range scripts {
		var args []string
		target := "/"
		if req.GetTarget() != "" {
			target = req.GetTarget()
		}

		if !req.GetWithoutTarget() {
			args = append(args, fmt.Sprintf("target=%s", target))
		}

		if req.GetAuxiliary() != "" {
			args = append(args, fmt.Sprintf("auxiliary=%s", req.Auxiliary))
		}

		args = append(args, "@/dev/stdin")

		cmd := exec.Command(rman(s.databaseHome), args...)
		cmd.Stdin = strings.NewReader(script)
		out, err := cmd.CombinedOutput()
		if err != nil {
			return nil, fmt.Errorf("RunRMAN failed,\nscript: %q\nFailed with: %v\nErr: %v", script, string(out), err)
		}
		res = append(res, string(out))

		if req.GetGcsPath() != "" && req.GetGcsOp() == dbdpb.RunRMANRequest_UPLOAD {
			if err = s.uploadDirectoryContentsToGCS(ctx, consts.RMANStagingDir, req.GetGcsPath()); err != nil {
				klog.ErrorS(err, "GCS Upload error:")
				return nil, err
			}
		}
	}

	return &dbdpb.RunRMANResponse{Output: res}, nil
}