Compare commits

..
26 Commits
Author SHA1 Message Date
admin fad6d3913e Merge branch 'develop' into 'main'
v3.4 updates

See merge request signalytic/client-external/streamline/streamline-emr!28
2026-08-28 11:04:49 +00:00
admin 4578b8cd30 removed unused vars 2026-08-28 13:31:22 +03:00
admin 119908dfec - review cleanups 2026-08-28 13:04:44 +03:00
adminandGitLab Duo d2a4558a39 Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:48:30 +00:00
adminandGitLab Duo 605702f19f Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:45:55 +00:00
adminandGitLab Duo d04fd97791 Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:45:28 +00:00
adminandGitLab Duo d8da3f11eb Apply 1 suggestion(s) to 1 file(s)
Co-authored-by: GitLab Duo <gitlab-duo@gitlab.com>
2026-08-28 09:42:19 +00:00
admin 9f5573b5c9 Merge branch 'ft-3.4' into 'develop'
StreamlinEMR v3.4

See merge request signalytic/client-external/streamline/streamline-emr!27
2026-08-28 09:12:43 +00:00
admin b9c59fede7 - streamline-emr printing bugfixes
- updated version
2026-08-28 11:34:11 +03:00
admin ae235109ab - updated streamline-image tag
- updated package version
- edit source image tags
2026-05-22 10:44:14 +03:00
alec.turner 207bc3a600 Merge branch 'vm-3.2-updates' into 'develop'
Vm 3.2 updates

See merge request signalytic/client-external/streamline/streamline-emr!24
2026-05-08 18:31:05 +00:00
root 28fb0e5c53 bump image and version to 3.2; use latest hosted-app-utils 2026-05-07 16:46:56 +00:00
adminandroot fde938dc9d updated package script 2026-05-07 16:46:56 +00:00
adminandroot 52d336ae20 added clientappctl for app-dev-updates 2026-05-07 16:46:56 +00:00
admin 9010781c60 Merge branch 'ft-streamline-updates' into 'develop'
release-3.1

See merge request signalytic/client-external/streamline/streamline-emr!23
2026-05-06 09:33:26 +00:00
conrad96 40bff8a89d - updated v3.1 image tags
- removed residual scripts
- updated gitignore
2026-04-29 12:39:06 +03:00
alec.turner 0c22190528 Merge branch 'update-3' into 'main'
update image to v3

See merge request signalytic/client-external/streamline/streamline-emr!22
2026-04-17 19:51:38 +00:00
root ad69af376f update image to v3
streamline-emr v3 -> streamlinehealth/streamline:signalytic (79c61263b626)
statistics v3 -> streamlinehealth/streamline:statistics (c4ae505ffef0)
2026-04-17 18:51:42 +00:00
alec.turner 088687ba73 Merge branch 'update-2.7' into 'main'
Release 2.7

See merge request signalytic/client-external/streamline/streamline-emr!20
2025-04-28 20:29:56 +00:00
root 75183da725 update version to 2.7
- streamline image updated to include minor bug fixes
2025-04-28 15:39:01 +00:00
alec.turner 3d2844a59b Merge branch 'update-2.6' into 'main'
Release 2.6

See merge request signalytic/client-external/streamline/streamline-emr!19
2025-04-25 14:41:33 +00:00
root 2c1067c1ae update to version v2.6
- updated streamline image to fix issue with missing database migrations
2025-04-24 21:59:11 +00:00
alec.turner 113d8ba7a8 Merge branch 'develop' into 'main'
Release 2.5

See merge request signalytic/client-external/streamline/streamline-emr!18
2025-04-23 15:05:00 +00:00
alec.turner 9857664bfd Merge branch 'update_statistics_image' into 'develop'
update statistics image and bump version to 2.5

See merge request signalytic/client-external/streamline/streamline-emr!17
2025-04-23 14:04:05 +00:00
root 375bad1f1a update streamline and statistics images
The previous statistics image (2.5-rc1) was replaced with a new version 2.5-rc2.
Version 2.5 is specified in the compose file and currently matches 2.5-rc2. The
streamline-emr image is also updated, now specifying version 2.5. For
consistency, the redis image is re-tagged with 2.5 as well, but the image itself
has not been changed.
2025-04-22 18:13:09 +00:00
root a738c4bb37 update statistics image and bump version to 2.5
The statistics image is updated to the latest available as of 2025-04-22, image
ID e0705e6cb218. This image was retagged with v2.5. The version is also updated
in the config file, now 2.5.
2025-04-22 16:07:39 +00:00
9 changed files with 180 additions and 96 deletions
+1
View File
@@ -1,3 +1,4 @@
build-packages
.local
vendor/
.vscode/
-25
View File
@@ -1,25 +0,0 @@
#!/bin/bash
LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# build an app-only package (ie don't include images) and store the package path
echo "building app-only package"
package=$(${LOCATION}/package --app | awk -F'saved package: ' '/^saved package: / {print $2}')
echo "generated package: {package}"
# use a temp folder for unpacking and make sure to clean up when done
tmp="/tmp/build-install-local-$(date +%s)"
echo "prepping temp folder: {tmp}"
rm -rf $tmp
mkdir -p $tmp
trap 'rm -rf $tmp' EXIT
# unpack to temp folder
echo "unpacking app package: $package"
tar xf $package -C $tmp
# install package
echo "installing package"
${tmp}/*/install.sh
echo "done."
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "streamline-emr",
"org": "streamline",
"version": "2.4",
"version": "3.4",
"platforms": [
"linux/arm64"
]
+1 -1
View File
@@ -1 +1 @@
FROM streamlinehealth/streamline:signalytic
FROM streamline:signalytic_latest
-62
View File
@@ -1,62 +0,0 @@
#!/bin/bash
#
# Copyright (C) Wendepunkt Medical Innovations, Inc - All Rights Reserved.
# Unauthorized copying of this file, via any medium is strictly prohibited.
# Proprietary and confidential
#
# For information: dev@signalytic.ca
#
#
# Install the streamline-emr application
#
# The caller of this script must check the exit value and possibly do a
# roll-back if it is non-zero. If the exit value is non-zero services have not
# been restarted.
#
# Note: This version resets data from v1 installations
LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit 1
fi
set -e
APP_SLUG="streamline_emr"
ORG_SLUG="streamline"
INSTALL_ROOT="/var/signalytic/clientapps/${ORG_SLUG}/${APP_SLUG}"
VERSION_FILE="${INSTALL_ROOT}/version"
DATA_ROOT="${INSTALL_ROOT}/data"
# stop the application (if installed)
if [ -f ${INSTALL_ROOT}/stop ]; then
${INSTALL_ROOT}/stop
fi
# reset data for any v1 or v2.0 installations
if grep -q "^1." ${VERSION_FILE} || grep -q "^2.0" ${VERSION_FILE}; then
echo "demo installation detected (v$(cat ${VERSION_FILE})) - resetting data"
rm -rf ${DATA_ROOT}
fi
# copy root files (if present)
if [ -d "${LOCATION}/root" ] && [ -n "$(ls -A ${LOCATION}/root)" ]; then
echo "importing root files"
cp -rfv $LOCATION/root/* /
fi
# import docker images (if present)
for f in $(find $LOCATION/images -name "*.img" 2>/dev/null);do
echo "importing docker image: $f"
docker load -i $f
done
for f in $(find $LOCATION/images -name "*.img.xz" 2>/dev/null);do
echo "importing docker image: $f"
xz -d -c $f | docker load
done
# start the application
${INSTALL_ROOT}/start
+1 -2
View File
@@ -5,6 +5,5 @@ LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
CONFIG=${CONFIG:-${LOCATION}/config.json}
SRC=${SRC:-${LOCATION}/src}
BUILD_DIR=${BUILD_DIR:-${LOCATION}/build-packages}
INSTALL_SCRIPT=${LOCATION}/install.sh
${LOCATION}/hosted-app-utils/package ${CONFIG} ${SRC} ${INSTALL_SCRIPT} output=${BUILD_DIR} $@
${LOCATION}/hosted-app-utils/package ${CONFIG} ${SRC} output=${BUILD_DIR} $@
+171
View File
@@ -0,0 +1,171 @@
#! /usr/bin/env python3
import sys, os, argparse, json, shutil, tempfile, subprocess, traceback
def run_script(script_path: str) -> int:
"""
Helper to handle subprocess execution
Args:
script_path (str): script path to execute
Returns:
int: 0 if both succeed, 1 if any step fails
"""
if not os.path.exists(script_path):
print(f"Error: Script not found at {script_path}", file=sys.stderr)
return 1
try:
subprocess.run(f'{script_path}', check=True, capture_output=True, text=True)
return 0
except subprocess.CalledProcessError as e:
print(f"Error: {os.path.basename(script_path)} failed (Exit {e.returncode})", file=sys.stderr)
print(f"Details: {e.stderr.strip() or e.stdout.strip()}", file=sys.stderr)
return 1
except PermissionError:
print(f"Error: {os.path.basename(script_path)} is not executable. Check permissions.", file=sys.stderr)
return 1
def handle_start(src_dir, install_path):
"""
Start application
Args:
src_dir (str): Path to source directory (Working directory)
install_path (str): Path to target installation directory
Returns:
int: 0 -> success
"""
try:
# disable app
if os.path.exists(os.path.join(install_path, 'disable')):
subprocess.check_output(f'{install_path}/disable')
# copy all source files to installation path
shutil.copytree(src_dir, install_path, dirs_exist_ok=True)
# start application
if run_script(f'{install_path}/start') != 0:
return 1
return 0
except Exception as ex:
print(f'Error: {ex}')
return 1
def handle_stop(install_path: str):
"""
Stop application
Args:
install_path (str): Path to installation directory
Returns:
int: 0 -> success
"""
if not os.path.exists(os.path.join(install_path, 'stop')):
print(f"Error: stop script not found at {install_path}")
return 1
try:
# stop application
if run_script(f'{install_path}/stop') != 0:
return 1
return 0
except subprocess.CalledProcessError as e:
print(f"Error: Stop script failed with exit code {e.returncode}")
print(f"Output: {e.stderr or e.stdout}")
return 1
def handle_restart(src_path: str, install_path: str):
"""
Restart application
Args:
install_path (str): Path to installation directory
Returns:
int: 0 -> success
"""
if handle_stop(install_path) != 0:
print("Restart aborted: Stop script execution failed.", file=sys.stderr)
return 1
if handle_start(src_path, install_path) != 0:
print("Restart aborted: Start script execution failed.", file=sys.stderr)
return 1
print('Application restarted successfully.')
return 0
# script constants
utils_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
working_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
src_path = os.path.join(working_dir, 'src')
CONFIG_JSON = os.path.join(working_dir, 'config.json')
templates_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'hosted-app-utils', 'templates'))
template_files = {
f'{templates_dir}/start': f'{working_dir}/src/start',
f'{templates_dir}/stop': f'{working_dir}/src/stop',
f'{templates_dir}/disable': f'{working_dir}/src/disable'
}
# command line arguments
parser = argparse.ArgumentParser(
prog="clientappctl",
description="Manage client application operations. [ start, stop, restart ]")
parser.add_argument("-c", "--config", default=CONFIG_JSON, help=f"Path to application configuration (default: {CONFIG_JSON})")
subparsers = parser.add_subparsers(dest="command", required=True)
start_parser = subparsers.add_parser("start", help="Start the application")
stop_parser = subparsers.add_parser("stop", help="Stop the application")
restart_parser = subparsers.add_parser("restart", help="Restart the application")
def main() -> int:
# parse user args
args = parser.parse_args()
# load configuration
try:
config_path = args.config
if not os.path.exists(config_path):
raise ValueError("Configuration not found.")
with open(config_path) as f:
config_data = json.load(f)
name_slug = config_data['name'].strip().replace(' ', '_').replace('-', '_').lower()
org_slug = config_data['org'].strip().replace(' ', '_').replace('-', '_').lower()
version = config_data['version']
install_path = f'/var/signalytic/clientapps/{org_slug}/{name_slug}'
# copy temp files into working dir
for src, dest in template_files.items():
if not os.path.exists(src):
continue
shutil.copy(src, dest)
if args.command == "start":
print(f"Starting app: {config_data['name']}-{version}")
if not os.path.exists(install_path):
os.makedirs(install_path)
return handle_start(src_path, install_path)
elif args.command == "stop":
print(f"Stopping app: {config_data['name']}-{version}")
return handle_stop(install_path)
elif args.command == "restart":
print(f"Restarting app: {config_data['name']}-{version}")
return handle_restart(src_path, install_path)
else:
raise ValueError('Invalid operation passed.')
except Exception as ex:
print(f'Error: {ex}')
return 1
if __name__ == '__main__':
sys.exit(main())
Executable → Regular
+3 -3
View File
@@ -1,6 +1,6 @@
services:
streamline-emr:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/streamline-emr/arm64:2.3
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/streamline-emr/arm64:3.4
container_name: streamline-emr
restart: unless-stopped
volumes:
@@ -18,7 +18,7 @@ services:
retries: 5
statistics:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/statistics/arm64:2.4
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/statistics/arm64:3.1
container_name: streamline-emr-statistics
restart: unless-stopped
environment:
@@ -37,7 +37,7 @@ services:
- redis
redis:
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/redis/arm64:2.3
image: registry.gitlab.com/signalytic/client-external/streamline/streamline-emr/redis/arm64:v3
container_name: streamline-emr-redis
restart: unless-stopped
volumes: