An open API service indexing awesome lists of open source software.

https://github.com/JeffersonLab/epics2web

EPICS CA Web Gateway
https://github.com/JeffersonLab/epics2web

ace acg epics gateway java websockets

Last synced: 1 day ago
JSON representation

EPICS CA Web Gateway

Awesome Lists containing this project

README

          

# epics2web [![Java CI with Gradle](https://github.com/JeffersonLab/epics2web/actions/workflows/ci.yaml/badge.svg)](https://github.com/JeffersonLab/epics2web/actions/workflows/ci.yaml) [![Docker](https://img.shields.io/docker/v/jeffersonlab/epics2web?sort=semver&label=DockerHub)](https://hub.docker.com/r/jeffersonlab/epics2web)
A gateway server and accompanying JavaScript client API to monitor EPICS Channel Access over the web.

![MonitorTest](https://github.com/JeffersonLab/epics2web/raw/main/doc/img/MonitorTest.png?raw=true "MonitorTest")

---
- [Overview](https://github.com/JeffersonLab/epics2web#overview)
- [Quick Start with Compose](https://github.com/JeffersonLab/epics2web#quick-start-with-compose)
- [Install](https://github.com/JeffersonLab/epics2web#build)
- [API](https://github.com/JeffersonLab/epics2web#api)
- [Configure](https://github.com/JeffersonLab/epics2web#configure)
- [Build](https://github.com/JeffersonLab/epics2web#build)
- [Test](https://github.com/JeffersonLab/epics2web#test)
- [Release](https://github.com/JeffersonLab/epics2web#release)
- [Deploy](https://github.com/JeffersonLab/epics2web#deploy)
- [See Also](https://github.com/JeffersonLab/epics2web#see-also)
---

## Overview
The epics2web application allows users to monitor [EPICS](https://epics-controls.org/) PVs from the web using Web Sockets and a REST web service endpoint. The application leverages the Java [JCA](https://github.com/epics-base/jca) library and is designed to run on Apache Tomcat.

## Quick Start with Compose
1. Grab project
```
git clone https://github.com/JeffersonLab/epics2web
cd epics2web
```
2. Launch [Compose](https://github.com/docker/compose)
```
docker compose up
```
3. Monitor test PV via web browser

http://localhost:8080/epics2web/test-camonitor

PV name: `HELLO`

**See**: [Docker Compose Strategy](https://gist.github.com/slominskir/a7da801e8259f5974c978f9c3091d52c)

## Install
1. Download Java 21
1. Download [Apache Tomcat 11](http://tomcat.apache.org/)
1. Download [epics2web.war](https://github.com/JeffersonLab/epics2web/releases) and drop it into the Tomcat webapps directory
1. Start Tomcat and navigate your web browser to localhost:8080/epics2web

**Note:** epics2web also works and was tested with GlassFish, and presumably works with WildFly or any other Java web application server that supports Web Sockets.

**Note:** The dependency jars are included in the _war_ file that is generated by the build. You can copy the dependency jar files downloaded by Gradle to the Tomcat lib directory and change the build.gradle script to use _providedCompile_ instead of _implementation_ if you'd prefer to include the dependencies that way.

## API

[API Reference](https://github.com/JeffersonLab/epics2web/wiki/API-Reference)

## Configure

This application uses the [Java Channel Access](https://github.com/epics-base/jca) library. It requires a working EPICS channel access environment with the environment variable *EPICS_CA_ADDR_LIST* set. See Also: [Advanced Configuration](https://github.com/JeffersonLab/epics2web/wiki/Advanced-Configuration).

### Context Prefix
When proxying epics2web it is sometimes useful to have multiple instances accessible via the same host via separate context paths. In order to return correct links to resources an instance proxied with a namespacing prefix needs to be aware of the prefix. The environment variable **CONTEXT_PREFIX** does this. For example at Jefferson Lab we use a single proxy server for multiple departments each with their own instance of epics2web, and each configured with a prefix such as "/fel", "/chl", "/itf", and "/srf" ("/ops" uses default/empty prefix).

### Logging
This app is designed to run on Tomcat so [Tomcat logging configuration](https://tomcat.apache.org/tomcat-9.0-doc/logging.html) applies. We use the built-in JVM logging library, which Tomcat uses with some slight modifications to support separate classloaders. In the past we bundled an application [logging.properites](https://github.com/JeffersonLab/epics2web/blob/956894699ef1b303907a04720aeb50260ffa72b1/src/main/resources/logging.properties) inside the epics2web.war file. We no longer do that because it then appears to require repackaging/rebuilding a new version of the app to modify the logging config as the app bundled config overrides the global Tomcat config at conf/logging.properties. The recommend logging strategy is to now make configuration in the global Tomcat config so as to make it easy to modify logging levels. An app specific handler can be created. The global configuration location is generally set by the Tomcat default start script via JVM system properties. The system properties should look something like:
- `-Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties`
- `-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager`

The contents of the logging.properties should be modfied to look something like:
```
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, 5epics2web.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

5epics2web.org.apache.juli.FileHandler.level = FINEST
5epics2web.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
5epics2web.org.apache.juli.FileHandler.prefix = epics2web.

org.jlab.epics2web.handlers = 5epics2web.org.apache.juli.FileHandler
org.jlab.epics2web.level = ALL
```

**Note**: This example is for older versions of Tomcat as newer version use an AsyncFileHandler. Refer to your logging configuration guide for your version of Tomcat.

## Build
This project is built with [Java 21](https://adoptium.net/) (compiled to Java 21 bytecode), and uses the [Gradle 9](https://gradle.org/) build tool to automatically download dependencies and build the project from source:

```
git clone https://github.com/JeffersonLab/epics2web
cd epics2web
gradlew build
```
**Note**: If you do not already have Gradle installed, it will be installed automatically by the wrapper script included in the source

**Note for JLab On-Site Users**: Jefferson Lab has an intercepting [proxy](https://gist.github.com/slominskir/92c25a033db93a90184a5994e71d0b78)

**See**: [Docker Development Quick Reference](https://gist.github.com/slominskir/a7da801e8259f5974c978f9c3091d52c#development-quick-reference)

## Test
```
docker compose -f build.yaml up
```
Wait for containers to start then:
```
gradlew integrationTest
```
## Release
1. Bump the version number in the VERSION file and commit and push to GitHub (using [Semantic Versioning](https://semver.org/)).
2. The [CD](https://github.com/JeffersonLab/epics2web/blob/main/.github/workflows/cd.yaml) GitHub Action should run automatically invoking:
- The [Create release](https://github.com/JeffersonLab/java-workflows/blob/main/.github/workflows/gh-release.yaml) GitHub Action to tag the source and create release notes summarizing any pull requests. Edit the release notes to add any missing details. A war file artifact is attached to the release.
- The [Publish docker image](https://github.com/JeffersonLab/container-workflows/blob/main/.github/workflows/docker-publish.yaml) GitHub Action to create a new demo Docker image.

## Deploy
At JLab this app is found at [epicsweb.jlab.org/epics2web](https://epicsweb.jlab.org/epics2web/), plus other fiefdom specific subpaths, and internally at [epicswebtest9.acc.jlab.org/epics2web](https://epicswebtest9.acc.jlab.org/epics2web/). However, the epicsweb server is a proxy for `epicswebops9.acc.jlab.org`, `epicswebops99.acc.jlab.org`, `epicswebchl9.acc.jlab.org`, `epicsweblerf9.acc.jlab.org`, `epicswebsrf9.acc.jlab.org` and `epicswebuitf9.acc.jlab.org`. Additionally, the context root for each is adjusted with a prefix such that all servers can be reached from a single namespace. The context root prefixes are `/`, `/ops2`, `/chl`, `/fel`, `/srf`, and `/itf` respectively. Tomcat interprets context roots from _war_ file name unless overridden elsewhere. Therefore each _war_ must be prefixed with `#`. Use wget or the like to grab the release war file. Don't download directly into webapps dir as file scanner may attempt to deploy before fully downloaded. Be careful of previous war file as by default wget won't overrwite. The war file should be attached to each release, so right click it and copy location (or just update version in path provided in the example below).

A script is provided to automate the deployment. As root run:
```
cd /root/setup
./deploy.sh epics2web {version}
```

Or manually execute (CHL fiefdom shown):
```
cd /tmp
rm epics2web.war
wget https://github.com/JeffersonLab/wmenu/releases/download/v1.2.3/epics2web.war
mv epics2web.war chl#epics2web.war
mv  chl#epics2web.war /opt/tomcat/current/webapps
```

## See Also
- [Web Extensible Display Manager (wedm)](https://github.com/JeffersonLab/wedm)
- [Web Archive Viewer and Expositor (WAVE)](https://github.com/JeffersonLab/wave)
- [PV Monitor Runchart](https://github.com/JeffersonLab/runchart)
- [Similar Projects](https://github.com/JeffersonLab/epics2web/wiki/Similar-Projects)
- [Technical Notes](https://github.com/JeffersonLab/epics2web/wiki/Technical-Notes)
- [Testing Suite](https://github.com/JeffersonLab/jca-test-suite)