To find a good replacement, the most important to know is a reason, why you need this information in the browser?

The first sample looks like you are looking for a default printer in the system.

And the second one, looking for a specific disk drive, with the letter U, and it should be network drive.

How are you going to use this information after that? Maybe the best way will be to completely change the way how you doing it or just forget about it.

Anyway, this happens due to a wish from browsers vendors, to increase a security level, so, they completely declined to use NPAPI and ActiveX. And as a side-effect of it, it's now impossible to use Java applets as well. And usually, to fix it, the simplest way was to create own simple application, which has to be installed on the users machine, and web-application application was able to connect to locally installed application through WebSockets or simple rest API in that application. 

ps. I can help you with development if you need any help.

menu.mac

ROUTINE menu
menu(routine) {
  Set rtn = ##class(%RoutineMgr).%OpenId(routine_".mac")
  Quit:'$IsObject(rtn)
  Set menu = ""
  While 'rtn.Code.AtEnd {
    Set line = rtn.Code.ReadLine()
    Continue:$Char(9,32,35)[$Extract(line)
    Continue:line'[" ; "
    Set label = $Piece($Piece(line, " "), "(")
    Set title = $Piece(line, " ; ", 2, *)
    Set menu = menu _ $Listbuild($Listbuild(label, title))
  }
  Quit menu
}
asLine(menu, pos) public {
  Set menuItem = $Listget(menu, pos)
  Quit:menuItem="" """"""
  Set $Listbuild(label,title) = menuItem
  Quit "$Char(13,10)_""" _ $Justify(pos, 4) _ ". " _ title_ """"
}

menu.inc

ROUTINE menu [Type=INC]

#Execute Set menu = $$^menu(rtname)

  Write !,"--------Menu---------"
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))

  Write !!
  do {
    Write $Char(13),"Option? ",*27,"[0K"
    Read menuOption
    Quit:menuOption=""
    Quit:"qQ"[$Extract(menuOption)
    Quit:$Listget(menu,+menuOption)'=""
  } while 1
  Write !
  if (+menuOption) {
    Set label = $Listget($Listget(menu, menuOption))
    Do @label
  }
  Quit 

And some routine which will have to have menu

ROUTINE test
#; just include menu, at the place where you need it
#Include menu
  quit

task1 ; Task 1
  Write !,"Some work 1"
  quit
task2 ; Task 2
  Write !,"Some work 2"
  quit
task3 ; Task 3
  Write !,"Some work 3"
  quit
task4 ; Task 4
  Write !,"Some work 4"
  quit
task5 ; Task 5
  Write !,"Some work 5"
  quit
task6 ; Task 6
  Write !,"Some work 6"
  quit
task7 ; Task 7
  Write !,"Some work 7"
  quit
task8 ; Task 8
  Write !,"Some work 8"
  quit
task9 ; Task 9
  Write !,"Some work 9"
  quit
task10 ; Task 10
  Write !,"Some work 10"
  quit

and call it

USER>d ^test

--------Menu---------
   1. Task 1
   2. Task 2
   3. Task 3
   4. Task 4
   5. Task 5
   6. Task 6
   7. Task 7
   8. Task 8
   9. Task 9
  10. Task 10

Option? 1

Some work 1

Menu list changed after compile, but routine should be saved as MAC.
The final INT code contains the generated menu.

I have a configuration with Caché 2018.1 as an ECP Data server and a few ECP Application servers on Ensemble 2012.2. The code is compiled and deployed for 2012, only, but stored on 2018.1. The data server even does not have a namespace for an application. It only mounts databases, and code databases just like any other data, which used by application servers. Ensemble Production works on a separate application server. And ECP Data server uses mirroring, so, my ensemble production and integrations does not care about IP migration at all, they work in the same place all the time.

In case of when ECP Application server may work on different versions, I would recommend storing all the versions of code in one place anyway on ECP Data Server. Just mount a specific code version on different platforms.

what do you mean by integrating with IS? Is it just Integrating with application working on IS? Years ago, I've implemented some of the video services into our application. So, I have some experience. But this time it could be even less complex, or completely different. And anyway depends on how exactly you would like to see it. I can help you with it, please contact me directly dmitry@caretdev.com, I co-founder of a company, where we can help you to implement this or anything else.

Muni, 

First of all, you have to copy all of your journals, you currently have, so, they will not be purged by schedule.

Next, it depends, on how that data was deleted. If it happened in the transaction, so, you are lucky. It will be possible to restore that data, if not, again depends on how it was killed. Just Kill ^Global,  outside of the transaction, just kills it, with no useful information for restore.

I think you can actually do what you with ^ZJRNFILT. But I prefer direct access to journals through their API, in %SYS.Journal classes.

This is explorer view, supposed to be only to view the source of code on the server and read-only. There are two ways

  • Preferable, store any code locally, and when you save it, it will upload to server and compile it there. If you already have some of your code on server, you can export it from the explorer view.
  • Use virtual filesystem named isfs, in this case, all of your code stored only on server. Documentation

You can find some useful videos on youtube on Developer Community channel, for instance

As Kai, already mentioned, this icon, will appear only if you have any folder opened. Such a folder is a kind of project in VSCode. And, while Server Explorer view, which can be opened available by this icon, is supposed to be as just a server explorer, without editing. So, there are no reasons to make it available until any project will be opened.

InterSystems itself does not have to support access via ssh, it's just a task for OS.

Could you have a look at Theia-IDE? This is a web-based alternative for VSCode, and there you already should be able to install extension VSCode-ObjectScript. This can be installed on the server, and you will have access through the web as you trying to do with WebTerminal. Would it work for you, your customers? It may not work so well as it works in VSCode, but, I think we are going to dive into it. VSCode itself developed by Microsoft, and they already offer it online as well, but on their Azure platform.  

With VSCode right now you can access your servers remotely via the web, where you can use SSL. If your server 2016.2+

First of all, you should not think, that using docker is the same as you would install it natively. You have to build your own per-project environment with docker. 

Where to find information

In addition, you would need a code editor, and you can use cross-platform VSCode with extension VSCode-ObjectScript. Brief info about how to install and configure it on Learning.

In the context of complex docker images, one more feature worth to be mentioned. It is multi-stage builds. It makes sense when you have to do some build something in your project, but you don't need any immediate files, for instance, source code, or any temporary files. Or some part of your app written in the compilable language, like go, and you can't compile it let's say it on IRIS image. You can first run go image, build it, and then build your final image base on IRIS where you just copy the result from the first stage.

In case of IRIS, you can build this way, deployable code. Just build your application from source code, deploy, and copy the result to the fresh image, and it will keep you from the error of letting your source code go with the final image.

There is no such way as merging two images. If you need only one image, the only way is to make a new one, which would combine the main from both images. So, you should choose which one is going to be as a base image, I would suggest it supposed to be IRIS. Then you can create install inside nodejs, and your node application. The issue is here you may face is that you will have only one init process after that. While I suppose you have to have started IRIS and NodeJS application at the moment. You can add a script which will run in a background nodejs application, and pass it to iris-main through CMD directive in conjunction with '-a', '-b', '-c' or '-t' parameter
So, it can be something like this

FROM intersystestems/iris:2020.2.0.204.0

USER root 

# script which will run nodejs application in background
COPY app-entrypoint.sh /

# copy your nodejs application
COPY ./nodeapp /opt/nodeapp

# install nodejs v10, and node_modules
RUN apt-get -y update && \
 DEBIAN_FRONTEND=noninteractive apt-get -y install curl --no-install-recommends && \
 curl -sL https://deb.nodesource.com/setup_10.x | bash - && \
 DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs --no-install-recommends && \
 rm -rf /var/lib/apt/lists/* && \
 chmod +x /app-entrypoint && \
 cd /opt/nodeapp && \
 npm install

USER ${ISC_PACKAGE_MGRUSER}

# say to start your nodejs application after IRIS start
CMD ["-a", "/node-entrypoint.sh"]

I have recently implemented SAML Authentication for one of the projects where I participated, with some SAML providers. I have not tested it with Shibboleth, but with some online providers, including GSuite. It's not so difficult actually and can be solved with SAML classes already implemented in IRIS for SOAP.

But this is the only Authentication, while SAML supports also supports provisioning, which I have not Implemented at the moment.