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
}