From ed85e4f478ef7430eb6cc6e954f489841a3dcf0e Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 10 Dec 2021 15:05:01 -0700 Subject: [PATCH 01/16] Update the version to 1.3 refs https://github.com/csjx/realtime-data/issues/24 --- README.md | 4 ++-- assembly.xml | 2 +- bin/manage-instruments | 2 +- bin/runFakeFileSource.sh | 2 +- bin/runSource.sh | 2 +- docs/_sources/user/user-guide.txt | 4 ++-- docs/source/user/user-guide.rst | 4 ++-- pom.xml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b322a95..a0ba4a2 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,8 @@ Quick Start Set up the software by unpacking the zip file, setting environment variables, and creating the log directory: $ cd /usr/local - $ sudo curl -L -O https://github.com/csjx/realtime-data/raw/1.2.0/realtime-data-1.2.0-bin.zip - $ sudo unzip realtime-data-1.2.0-bin.zip + $ sudo curl -L -O https://github.com/csjx/realtime-data/raw/1.3.0/realtime-data-1.3.0-bin.zip + $ sudo unzip realtime-data-1.3.0-bin.zip $ sudo chown -R ${USER} /usr/local/realtime-data $ export REALTIME_DATA=/usr/local/realtime-data $ export PATH=${PATH}:${REALTIME_DATA}/scripts/shell diff --git a/assembly.xml b/assembly.xml index 1f29895..52179b0 100644 --- a/assembly.xml +++ b/assembly.xml @@ -53,7 +53,7 @@ - target/realtime-data-1.2.0-jar-with-dependencies.jar + target/realtime-data-1.3.0-jar-with-dependencies.jar LICENSE diff --git a/bin/manage-instruments b/bin/manage-instruments index aaaa820..a6293e6 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -25,7 +25,7 @@ LOG_DIR="/var/log/realtime-data"; # log files location if [[ -z ${REALTIME_DATA} ]]; then REALTIME_DATA="."; # installed realtime-data software location fi -VERSION="1.2.0"; # keep track of this script's version +VERSION="1.3.0"; # keep track of this script's version if [[ -d "/etc/realtime-data" ]]; then CLASSPATH="/etc/realtime-data:${REALTIME_DATA}/realtime-data-${VERSION}-jar-with-dependencies.jar"; else diff --git a/bin/runFakeFileSource.sh b/bin/runFakeFileSource.sh index 6733f7a..be1bd34 100755 --- a/bin/runFakeFileSource.sh +++ b/bin/runFakeFileSource.sh @@ -1,5 +1,5 @@ #!/bin/bash -export CLASSPATH=$REALTIME_DATA/realtime-data-1.2.0-jar-with-dependencies.jar; +export CLASSPATH=$REALTIME_DATA/realtime-data-1.3.0-jar-with-dependencies.jar; export SOURCE="TEST01_001CTDXXXXR00"; diff --git a/bin/runSource.sh b/bin/runSource.sh index c18ff31..31e771b 100755 --- a/bin/runSource.sh +++ b/bin/runSource.sh @@ -1,6 +1,6 @@ #!/bin/bash export REALTIME_DATA=/usr/local/realtime-data; -export CLASSPATH=$REALTIME_DATA/realtime-data-1.2.0-jar-with-dependencies.jar; +export CLASSPATH=$REALTIME_DATA/realtime-data-1.3.0-jar-with-dependencies.jar; $REALTIME_DATA/build/classes/:\ $REALTIME_DATA/lib/rbnb.jar:\ $REALTIME_DATA/lib/commons-codec-1.3.jar:\ diff --git a/docs/_sources/user/user-guide.txt b/docs/_sources/user/user-guide.txt index 10128c3..039c631 100644 --- a/docs/_sources/user/user-guide.txt +++ b/docs/_sources/user/user-guide.txt @@ -197,7 +197,7 @@ Instrument drivers are managed with a ``manage-instruments`` script in ``${REALT -h Show this message -i The instrument id. Use -i multiple times for multiple instruments. -o Indicate which operation to perform, start or stop. - -V Show the version (1.2.0) + -V Show the version (1.3.0) The ``manage-instruments`` script is used to start one or many instrument drivers by setting the ``-c`` command option to ``driver``, the ``-o`` operation option to ``start``, and by using one or more ``-i`` options followed by the instrument identifier. In lieu of the individual ``-i`` option, you can use the ``-a`` option to start all instruments configured in the ``${REALTIME_DATA}/conf`` directory. For example, to start a single instrument driver: @@ -532,7 +532,7 @@ Instrument archivers are managed with a ``manage-instruments`` script in ``${REA -h Show this message -i The instrument id. Use -i multiple times for multiple instruments. -o Indicate which operation to perform, start or stop. - -V Show the version (1.2.0) + -V Show the version (1.3.0) The ``manage-instruments`` script is used to start one or many instrument archivers by setting the ``-c`` command option to ``archiver``, the ``-o`` operation option to ``start``, and by using one or more ``-i`` options followed by the instrument identifier. In lieu of the individual ``-i`` option, you can use the ``-a`` option to start all instrument archivers configured in the ``${REALTIME_DATA}/conf`` directory. For example, to start a single instrument archiver: diff --git a/docs/source/user/user-guide.rst b/docs/source/user/user-guide.rst index 10128c3..039c631 100644 --- a/docs/source/user/user-guide.rst +++ b/docs/source/user/user-guide.rst @@ -197,7 +197,7 @@ Instrument drivers are managed with a ``manage-instruments`` script in ``${REALT -h Show this message -i The instrument id. Use -i multiple times for multiple instruments. -o Indicate which operation to perform, start or stop. - -V Show the version (1.2.0) + -V Show the version (1.3.0) The ``manage-instruments`` script is used to start one or many instrument drivers by setting the ``-c`` command option to ``driver``, the ``-o`` operation option to ``start``, and by using one or more ``-i`` options followed by the instrument identifier. In lieu of the individual ``-i`` option, you can use the ``-a`` option to start all instruments configured in the ``${REALTIME_DATA}/conf`` directory. For example, to start a single instrument driver: @@ -532,7 +532,7 @@ Instrument archivers are managed with a ``manage-instruments`` script in ``${REA -h Show this message -i The instrument id. Use -i multiple times for multiple instruments. -o Indicate which operation to perform, start or stop. - -V Show the version (1.2.0) + -V Show the version (1.3.0) The ``manage-instruments`` script is used to start one or many instrument archivers by setting the ``-c`` command option to ``archiver``, the ``-o`` operation option to ``start``, and by using one or more ``-i`` options followed by the instrument identifier. In lieu of the individual ``-i`` option, you can use the ``-a`` option to start all instrument archivers configured in the ``${REALTIME_DATA}/conf`` directory. For example, to start a single instrument archiver: diff --git a/pom.xml b/pom.xml index 1f539ff..268ac97 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 edu.hawaii.soest realtime-data - 1.2.0 + 1.3.0 Realtime Data Streaming Software Software for streaming and managing scientific instrument data. See https://csjx.github.io/realtime-data. From 93ac693ddb60d18ae1ae7889afc24418b70ba655 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 10 Dec 2021 18:08:47 -0700 Subject: [PATCH 02/16] Include configuration subdirectories in the build. refs https://github.com/csjx/realtime-data/issues/24 --- assembly.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assembly.xml b/assembly.xml index 52179b0..f992578 100644 --- a/assembly.xml +++ b/assembly.xml @@ -41,7 +41,7 @@ - conf/* + conf/**/* From 61373206a26c7b09ddfd72d24e85e37b5b4f967f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 10 Dec 2021 18:14:32 -0700 Subject: [PATCH 03/16] Cache the Maven Assembly Schema to enable local catalog namespace mapping. refs https://github.com/csjx/realtime-data/issues/24 --- lib/assembly-1.1.2.xsd | 1368 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1368 insertions(+) create mode 100644 lib/assembly-1.1.2.xsd diff --git a/lib/assembly-1.1.2.xsd b/lib/assembly-1.1.2.xsd new file mode 100644 index 0000000..4325e32 --- /dev/null +++ b/lib/assembly-1.1.2.xsd @@ -0,0 +1,1368 @@ + + + + + + + + + + 1.0.0+ + + + An assembly defines a collection of files usually distributed in an + archive format such as zip, tar, or tar.gz that is generated from a + project. For example, a project could produce a ZIP assembly which + contains a project's JAR artifact in the root directory, the + runtime dependencies in a lib/ directory, and a shell script to launch + a stand-alone application. + + + + + + + 1.0.0+ + + + An assembly defines a collection of files usually distributed in an + archive format such as zip, tar, or tar.gz that is generated from a + project. For example, a project could produce a ZIP assembly which + contains a project's JAR artifact in the root directory, the + runtime dependencies in a lib/ directory, and a shell script to launch + a stand-alone application. + + + + + + + 1.0.0+ + + Sets the id of this assembly. This is a symbolic name for a + particular assembly of files from this project. Also, aside from + being used to distinctly name the assembled package by attaching + its value to the generated archive, the id is used as your + artifact's classifier when deploying. + + + + + + 1.0.0+ + + + Specifies the formats of the assembly. + + It is often better to specify the formats via the goal parameter rather + than here. For example, that allows different profiles to generate + different types of archives. + + Multiple formats can be + supplied and the Assembly Plugin will generate an archive for each + of the desired formats. When deploying your project, all file formats + specified will also be deployed. A format is specified by supplying + one of the following values in a &lt;format&gt; subelement: + <ul> + <li><b>"zip"</b> - Creates a ZIP file format</li> + <li><b>"tar"</b> - Creates a TAR format</li> + <li><b>"tar.gz"</b> - Creates a gzip'd TAR format</li> + <li><b>"tar.bz2"</b> - Creates a bzip'd TAR format</li> + <li><b>"jar"</b> - Creates a JAR format</li> + <li><b>"dir"</b> - Creates an exploded directory format</li> + <li><b>"war"</b> - Creates a WAR format</li> + </ul> + + + + + + + + + + + + 0.0.0+ + + Includes a base directory in the final archive. For example, + if you are creating an assembly named "your-app", setting + includeBaseDirectory to true will create an archive that + includes this base directory. If this option is set to false + the archive created will unzip its content to the current + directory. + + + + + + 1.1.0+ + + Sets the base directory of the resulting assembly archive. If this is not + set and includeBaseDirectory == true, ${project.build.finalName} will be used instead. + (Since 2.2-beta-1) + + + + + + 0.0.0+ + + Includes a site directory in the final archive. The site directory + location of a project is determined by the siteDirectory parameter + of the Assembly Plugin. + + + + + + 1.1.0+ + + + Set of components which filter various container descriptors out of + the normal archive stream, so they can be aggregated then added. + + + + + + + + + + + + 1.0.0+ + + + Specifies which module files to include in the assembly. A moduleSet + is specified by providing one or more of &lt;moduleSet&gt; + subelements. + + + + + + + + + + + + 1.0.0+ + + + Specifies which groups of files to include in the assembly. A + fileSet is specified by providing one or more of &lt;fileSet&gt; + subelements. + + + + + + + + + + + + 1.0.0+ + + + Specifies which single files to include in the assembly. A file + is specified by providing one or more of &lt;file&gt; + subelements. + + + + + + + + + + + + 1.0.0+ + + + Specifies which dependencies to include in the assembly. A + dependencySet is specified by providing one or more of + &lt;dependencySet&gt; subelements. + + + + + + + + + + + + 1.0.0+ + + + Specifies which repository files to include in the assembly. A + repository is specified by providing one or more of + &lt;repository&gt; subelements. + + + + + + + + + + + + 1.0.0+ + + + Specifies the shared components xml file locations to include in the + assembly. The locations specified must be relative to the base location + of the descriptor. If the descriptor was found via a &lt;descriptorRef/&gt; + element in the + classpath, any components it specifies will also be found on the classpath. + If it is found by pathname via a &lt;descriptor/&gt; element + the value here will be interpreted + as a path relative to the project basedir. + When multiple componentDescriptors are found, their + contents are merged. Check out the <a href="component.html"> + descriptor components</a> for more information. A + componentDescriptor is specified by providing one or more of + &lt;componentDescriptor&gt; subelements. + + + + + + + + + + + + + + 1.0.0+ + + A dependencySet allows inclusion and exclusion of project dependencies + in the assembly. + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory, + directly beneath the root of the archive. + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + artifact coordinates to include. If none is present, then + &lt;includes&gt; represents all valid values. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + dependency artifact coordinates to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the directory mode of the directories + included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of + Read = 4, Write = 2, and Execute = 1. For example, the value + 0755 translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.1.2+ + + When specified as true, any include/exclude patterns which aren't used to filter an actual + artifact during assembly creation will cause the build to fail with an error. This is meant + to highlight obsolete inclusions or exclusions, or else signal that the assembly descriptor + is incorrectly configured. (Since 2.2) + + + + + + 1.0.0+ + + Sets the mapping pattern for all dependencies included in this + assembly. (Since 2.2-beta-2; 2.2-beta-1 uses ${artifactId}-${version}${dashClassifier?}.${extension} + as default value) + + + + + + 1.0.0+ + + If set to true, this property will unpack all dependencies + into the specified output directory. When set to false + dependencies will be includes as archives (jars). Can only unpack + jar, zip, tar.gz, and tar.bz archives. + + + + + + 1.1.0+ + + Allows the specification of includes and excludes, along with filtering options, for items + unpacked from a dependency artifact. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + Sets the dependency scope for this dependencySet. + + + + + + 1.1.0+ + + Determines whether the artifact produced during the current project's + build should be included in this dependency set. (Since 2.2-beta-1) + + + + + + 1.1.0+ + + Determines whether the attached artifacts produced during the current project's + build should be included in this dependency set. (Since 2.2-beta-1) + + + + + + 1.1.0+ + + Determines whether transitive dependencies will be included in the processing of + the current dependency set. If true, includes/excludes/useTransitiveFiltering + will apply to transitive dependency artifacts in addition to the main project + dependency artifacts. If false, useTransitiveFiltering is meaningless, and + includes/excludes only affect the immediate dependencies of the project. + By default, this value is true. (Since 2.2-beta-1) + + + + + + 1.1.0+ + + Determines whether the include/exclude patterns in this dependency set will be applied to + the transitive path of a given artifact. If true, and the current artifact is a transitive + dependency brought in by another artifact which matches an inclusion or exclusion pattern, + then the current artifact has the same inclusion/exclusion logic applied to it as well. By + default, this value is false, in order to preserve backward compatibility with version 2.1. + This means that includes/excludes only apply directly to the current artifact, and not to + the transitive set of artifacts which brought it in. (Since 2.2-beta-1) + + + + + + + + 1.1.0+ + + Specifies options for including/excluding/filtering items extracted from an archive. (Since 2.2-beta-1) + + + + + + 1.1.0+ + + + Set of file and/or directory patterns for matching items to be included from an archive as it is unpacked. + Each item is specified as &lt;include&gt;some/path&lt;/include&gt; (Since 2.2-beta-1) + + + + + + + + + + + + 1.1.0+ + + + Set of file and/or directory patterns for matching items to be excluded from an archive as it is unpacked. + Each item is specified as &lt;exclude&gt;some/path&lt;/exclude&gt; (Since 2.2-beta-1) + + + + + + + + + + + + 1.1.0+ + + Whether to filter symbols in the files as they are unpacked from the archive, using + properties from the build configuration. (Since 2.2-beta-1) + + + + + + 1.1.2+ + + + Sets the line-endings of the files. (Since 2.2) + Valid values: + <ul> + <li><b>"keep"</b> - Preserve all line endings</li> + <li><b>"unix"</b> - Use Unix-style line endings</li> + <li><b>"lf"</b> - Use a single line-feed line endings</li> + <li><b>"dos"</b> - Use DOS-style line endings</li> + <li><b>"crlf"</b> - Use Carraige-return, line-feed line endings</li> + </ul> + + + + + + + 1.1.2+ + + Whether standard exclusion patterns, such as those matching CVS and Subversion + metadata files, should be used when calculating the files affected by this set. + For backward compatibility, the default value is true. (Since 2.2) + + + + + + + + 1.0.0+ + + + Defines a Maven repository to be included in the assembly. The artifacts + available to be included in a repository are your project's dependency + artifacts. The repository created contains the needed metadata entries + and also contains both sha1 and md5 checksums. This is useful for creating + archives which will be deployed to internal repositories. + + <br/><b>NOTE:</b> Currently, only artifacts from the central repository + are allowed. + + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory, + directly beneath the root of the archive. + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + artifact coordinates to include. If none is present, then + &lt;includes&gt; represents all valid values. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + dependency artifact coordinates to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the directory mode of the directories + included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of + Read = 4, Write = 2, and Execute = 1. For example, the value + 0755 translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + If set to true, this property will trigger the creation of repository + metadata which will allow the repository to be used as a functional remote + repository. + + + + + + 1.0.0+ + + + Specifies that you want to align a group of artifacts to a specified + version. A groupVersionAlignment is specified by providing one or + more of &lt;groupVersionAlignment&gt; subelements. + + + + + + + + + + + + 1.1.0+ + + Specifies the scope for artifacts included in this repository. (Since 2.2-beta-1) + + + + + + + + 1.0.0+ + + Allows a group of artifacts to be aligned to a specified version. + + + + + + 1.0.0+ + + The groupId of the artifacts for which you want to align the + versions. + + + + + + 1.0.0+ + + The version you want to align this group to. + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define the + artifactIds of the artifacts to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. An exclude is specified + by providing one or more of &lt;exclude&gt; subelements. + + + + + + + + + + + + + + 1.1.0+ + + Configures a filter for files headed into the assembly archive, to enable + aggregation of various types of descriptor fragments, such as components.xml, + web.xml, etc. + + + + + + 1.1.0+ + + The handler's plexus role-hint, for lookup from the container. + + + + + + 1.1.1+ + + Configuration options for the handler. + + + + + + + + + + + + + 1.0.0+ + + + A moduleSet represent one or more project &lt;module&gt; present inside + a project's pom.xml. This allows you to include sources or binaries + belonging to a project's &lt;modules&gt;. + + <br/><b>NOTE:</b> When using &lt;moduleSets&gt; from the command-line, it + is required to pass first the package phase by doing: "mvn package + assembly:assembly". This bug/issue is scheduled to be addressed by Maven 2.1. + + + + + + + 1.1.2+ + + If set to true, the plugin will include all projects in the current reactor for processing + in this ModuleSet. These will be subject to include/exclude rules. (Since 2.2) + + + + + + 1.1.0+ + + If set to false, the plugin will exclude sub-modules from processing in this ModuleSet. + Otherwise, it will process all sub-modules, each subject to include/exclude rules. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + project coordinates to include. If none is present, then + &lt;includes&gt; represents all valid values. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + project artifact coordinates to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + When this is present, the plugin will include the source files of + the included modules from this set in the resulting assembly. + + + + + + 1.0.0+ + + When this is present, the plugin will include the binaries of the + included modules from this set in the resulting assembly. + + + + + + + + 1.0.0+ + + Contains configuration options for including the binary files of a + project module in an assembly. + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory, + directly beneath the root of the archive. + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + artifact coordinates to include. If none is present, then + &lt;includes&gt; represents all valid values. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + dependency artifact coordinates to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + Artifact coordinates may be given in simple groupId:artifactId form, + or they may be fully qualified in the form groupId:artifactId:type[:classifier]:version. + Additionally, wildcards can be used, as in *:maven-* + + + + + + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the directory mode of the directories + included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of + Read = 4, Write = 2, and Execute = 1. For example, the value + 0755 translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.1.0+ + + When specified, the attachmentClassifier will cause the assembler to look at artifacts + attached to the module instead of the main project artifact. If it can find an attached + artifact matching the specified classifier, it will use it; otherwise, it will throw an + exception. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + If set to true, the plugin will include the direct and transitive dependencies of + of the project modules included here. Otherwise, it will only include the module + packages only. + + + + + + 1.1.0+ + + + Specifies which dependencies of the module to include in the assembly. A + dependencySet is specified by providing one or more of + &lt;dependencySet&gt; subelements. (Since 2.2-beta-1) + + + + + + + + + + + + 1.0.0+ + + If set to true, this property will unpack all module packages + into the specified output directory. When set to false + module packages will be included as archives (jars). + + + + + + 1.1.0+ + + Allows the specification of includes and excludes, along with filtering options, for items + unpacked from a module artifact. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + Sets the mapping pattern for all NON-UNPACKED dependencies included + in this assembly. + (Since 2.2-beta-2; 2.2-beta-1 uses ${artifactId}-${version}${dashClassifier?}.${extension} as default value) + NOTE: If the dependencySet specifies unpack == true, outputFileNameMapping WILL NOT BE USED; in these cases, + use outputDirectory. + + + + + + + + 1.0.0+ + + Contains configuration options for including the source files of a + project module in an assembly. + + + + + + 1.1.0+ + + Whether standard exclusion patterns, such as those matching CVS and Subversion + metadata files, should be used when calculating the files affected by this set. + For backward compatibility, the default value is true. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory. + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + files and directory to include. If none is present, then + &lt;includes&gt; represents all valid values. + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + files and directory to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + + + + + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the directory mode of the directories + included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of + Read = 4, Write = 2, and Execute = 1. For example, the value + 0755 translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.1.0+ + + + Specifies which groups of files from each included module to include in the assembly. A + fileSet is specified by providing one or more of &lt;fileSet&gt; subelements. (Since 2.2-beta-1) + + + + + + + + + + + + 1.1.0+ + + + Specifies whether the module's finalName should be prepended to the outputDirectory + values of any fileSets applied to it. (Since 2.2-beta-1) + + + + + + + 1.1.0+ + + + Specifies whether sub-module directories below the current module should be excluded + from fileSets applied to that module. This might be useful if you only mean to copy + the sources for the exact module list matched by this ModuleSet, ignoring (or processing + separately) the modules which exist in directories below the current one. (Since 2.2-beta-1) + + + + + + + 1.1.0+ + + Sets the mapping pattern for all module base-directories included in this assembly. + NOTE: This field is only used if includeModuleDirectory == true. + Default is the module's ${artifactId} in 2.2-beta-1, and ${module.artifactId} in subsequent versions. (Since 2.2-beta-1) + + + + + + + + 1.0.0+ + + A fileSet allows the inclusion of groups of files into the assembly. + + + + + + 1.1.0+ + + Whether standard exclusion patterns, such as those matching CVS and Subversion + metadata files, should be used when calculating the files affected by this set. + For backward compatibility, the default value is true. (Since 2.2-beta-1) + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory. + + + + + + 1.0.0+ + + + When &lt;include&gt; subelements are present, they define a set of + files and directory to include. If none is present, then + &lt;includes&gt; represents all valid values. + + + + + + + + + + + + 1.0.0+ + + + When &lt;exclude&gt; subelements are present, they define a set of + files and directory to exclude. If none is present, then + &lt;excludes&gt; represents no exclusions. + + + + + + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the directory mode of the directories + included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of + Read = 4, Write = 2, and Execute = 1. For example, the value + 0755 translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + Sets the absolute or relative location from the module's + directory. For example, "src/main/bin" would select this + subdirectory of the project in which this dependency is defined. + + + + + + 1.0.0+ + + + Sets the line-endings of the files in this fileSet. + Valid values: + <ul> + <li><b>"keep"</b> - Preserve all line endings</li> + <li><b>"unix"</b> - Use Unix-style line endings (i.e. "\n")</li> + <li><b>"lf"</b> - Use a single line-feed line endings (i.e. "\n")</li> + <li><b>"dos"</b> - Use DOS-/Windows-style line endings (i.e. "\r\n")</li> + <li><b>"windows"</b> - Use DOS-/Windows-style line endings (i.e. "\r\n")</li> + <li><b>"crlf"</b> - Use carriage-return, line-feed line endings (i.e. "\r\n")</li> + </ul> + + + + + + + 1.1.0+ + + Whether to filter symbols in the files as they are copied, using + properties from the build configuration. (Since 2.2-beta-1) + + + + + + + + 1.0.0+ + + A file allows individual file inclusion with the option to change + the destination filename not supported by fileSets. + + + + + + 1.0.0+ + + Sets the absolute or relative path from the module's directory + of the file to be included in the assembly. + + + + + + 1.0.0+ + + Sets the output directory relative to the root + of the root directory of the assembly. For example, + "log" will put the specified files in the log directory. + + + + + + 1.0.0+ + + Sets the destination filename in the outputDirectory. + Default is the same name as the source's file. + + + + + + 1.0.0+ + + + Similar to a UNIX permission, sets the file mode of the files included. + THIS IS AN OCTAL VALUE. + Format: (User)(Group)(Other) where each component is a sum of Read = 4, + Write = 2, and Execute = 1. For example, the value 0644 + translates to User read-write, Group and Other read-only. + <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style permissions)</a> + + + + + + + 1.0.0+ + + + Sets the line-endings of the files in this file. + Valid values are: + <ul> + <li><b>"keep"</b> - Preserve all line endings</li> + <li><b>"unix"</b> - Use Unix-style line endings (i.e. "\n")</li> + <li><b>"lf"</b> - Use a single line-feed line endings (i.e. "\n")</li> + <li><b>"dos"</b> - Use DOS-/Windows-style line endings (i.e. "\r\n")</li> + <li><b>"windows"</b> - Use DOS-/Windows-style line endings (i.e. "\r\n")</li> + <li><b>"crlf"</b> - Use carriage-return, line-feed line endings (i.e. "\r\n")</li> + </ul> + + + + + + + 1.0.0+ + + Sets whether to determine if the file is filtered. + + + + + + \ No newline at end of file From dd62232cc4a4d172b34bb5f4c23be19d30c6b3ce Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sat, 11 Dec 2021 09:46:46 -0700 Subject: [PATCH 04/16] Rename the test log4j2 configuration file as a test file. refs https://github.com/csjx/realtime-data/issues/24 --- src/main/resources/log4j2.xml | 2 +- src/test/resources/{log4j2.xml => log4j2-test.xml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/resources/{log4j2.xml => log4j2-test.xml} (100%) diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 8a06e8e..677d292 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -1,5 +1,5 @@ - + /var/log/realtime-data realtime-data diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2-test.xml similarity index 100% rename from src/test/resources/log4j2.xml rename to src/test/resources/log4j2-test.xml From b81a9a12f09a84cfc3cf21d2b4f1cab117995cf7 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sat, 11 Dec 2021 23:49:46 -0700 Subject: [PATCH 05/16] Add the WQ buoy configuration file back into lib/ - it somehow was removed. --- lib/email.account.properties.xml | 155 +++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 lib/email.account.properties.xml diff --git a/lib/email.account.properties.xml b/lib/email.account.properties.xml new file mode 100644 index 0000000..0d21ed9 --- /dev/null +++ b/lib/email.account.properties.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + HIOOS Water Quality Buoy Data + imap.gmail.com + hiooswqb + sharedPW4WQB + imaps + Inbox + processed + false + + WQAW01_XXXSTRX001R00 + 0062 + + WQAW01_XXXSTRX001R00 + StorXSource + 0062 + WQB-AW + True + https://realtime.pacioos.hawaii.edu/hioos/wqb-aw/calibration/SATSTX0062a.cal + 25000 + 31536000 + BinaryStorXFrameData + + + WQAW01_XXXCTDX001R00 + CTDSource + 6058 + WQB-AW-CTD + True + + 25000 + 31536000 + DecimalASCIISampleData + + + WQAW01_XXXISUS001R00 + ISUSSource + 0206 + WQB-AW-ISUS + True + https://realtime.pacioos.hawaii.edu/hioos/wqb-kn/calibration/ISUS0206NLB.TDF + https://realtime.pacioos.hawaii.edu/hioos/wqb-kn/calibration/ISUS0206NDB.TDF + 25000 + 31536000 + DecimalASCIISampleData + + + + WQKN01_XXXSTRX001R00 + 0063 + + WQKN01_XXXSTRX001R00 + StorXSource + 0063 + WQB-KN-STRX + True + https://realtime.pacioos.hawaii.edu/hioos/wqb-kn/calibration/SATSTX0063a.cal + 25000 + 31536000 + BinaryStorXFrameData + + + WQKN01_XXXCTDX001R00 + CTDSource + 6059 + WQB-KN-CTD + True + + 25000 + 31536000 + DecimalASCIISampleData + + + WQKN01_XXXISUS001R00 + ISUSSource + 0207 + WQB-KN-ISUS + True + https://realtime.pacioos.hawaii.edu/hioos/wqb-kn/calibration/ISUS0207NLB.TDF + https://realtime.pacioos.hawaii.edu/hioos/wqb-kn/calibration/ISUS0207NDB.TDF + 25000 + 31536000 + DecimalASCIISampleData + + + + From 342acc5264dcfc7519b921246c2eba6dbc65c8cf Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sat, 11 Dec 2021 23:54:05 -0700 Subject: [PATCH 06/16] Remove build artifacts. --- .../build/doctrees/dev/developer-guide.doctree | Bin 10270 -> 0 bytes docs/build/doctrees/environment.pickle | Bin 24336 -> 0 bytes docs/build/doctrees/index.doctree | Bin 9549 -> 0 bytes docs/build/doctrees/user/user-guide.doctree | Bin 219404 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/build/doctrees/dev/developer-guide.doctree delete mode 100644 docs/build/doctrees/environment.pickle delete mode 100644 docs/build/doctrees/index.doctree delete mode 100644 docs/build/doctrees/user/user-guide.doctree diff --git a/docs/build/doctrees/dev/developer-guide.doctree b/docs/build/doctrees/dev/developer-guide.doctree deleted file mode 100644 index ee9cfcff59da03fa15d136e2bf8a2addefd6ff72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10270 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 WXMc~{ft)ovHF`PjL>ZT3$NvF&Fw^+} diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree deleted file mode 100644 index 3e92403cf8bde30dd9134238b7d6c3c490b44898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9549 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 From 77adbf82cf33ff945064a75e7008ead318838956 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 12 Dec 2021 17:01:32 -0700 Subject: [PATCH 07/16] Exit the -h option properly. --- bin/manage-instruments | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index a6293e6..e103120 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -143,7 +143,7 @@ while getopts ":ac:hVi:o:d:" OPTION; do case ${OPTION} in "a") instrument_paths=("${REALTIME_DATA}/conf/**/*xml");; "c") command="${OPTARG}";; - "h") usage;; + "h") usage; exit 0;; "i") instrument_paths+=("${OPTARG}.xml");; "o") operation="${OPTARG}";; "d") location="${OPTARG}";; @@ -152,11 +152,6 @@ while getopts ":ac:hVi:o:d:" OPTION; do esac done -# Exit after usage using -h -if [ ${OPTION} == "h" ]; then - exit 0; -fi - # ensure options are passed if [ "${#instrument_paths[@]}" -eq 0 ]; then if [ "${command}" == "driver" ] || [ "${command}" == "archiver" ]; then From 05fd4596fff988cb988b5ef0cc4973b41e9201a7 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 12 Dec 2021 18:57:56 -0700 Subject: [PATCH 08/16] Add the console logger explicitly: Don't rely on the root logger to log to STDOUT, so the formatting is correct. --- src/main/resources/log4j2.xml | 42 ++++------------------------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 677d292..ae0c319 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -29,7 +29,10 @@ --> - + + + + @@ -37,40 +40,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From fc9b5c8ec5db60338aeb07c5788670750aa729f2 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 14 Dec 2021 16:51:51 -0700 Subject: [PATCH 09/16] Get the instrument path correct during start/stop. refs https://github.com/csjx/realtime-data/issues/24 --- bin/manage-instruments | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index e103120..9e567fc 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -36,8 +36,8 @@ if [[ -d "/var/run/realtime-data" && -w "/var/run/realtime-data" ]]; then RUN_DIR="/var/run/realtime-data"; else RUN_DIR="${REALTIME_DATA}/run"; - echo -e "${RED}WARN: /var/run/realtime-data does not exist. Create this directory as root.${RESET}"; - echo -e "${RED}WARN: Using ${REALTIME_DATA}/run to store process ids instead.${RESET}"; + echo -e "${YELLOW}WARN: /var/run/realtime-data does not exist. Create this directory as root.${RESET}"; + echo -e "${YELLOW}WARN: Using ${REALTIME_DATA}/run to store process ids instead.${RESET}"; fi operation=""; # operation to perform, either start or stop @@ -226,7 +226,7 @@ if [ "${command}" == "driver" ] || [ "${command}" == "archiver" ]; then runningPid=""; # Convert the instrument_path to a path when only given as an instrument name if [ ! -f "${instrument_path}" ]; then - instrument_path=$(find ${REALTIME_DATA}/conf -name "${instrument_path}.xml" -print); + instrument_path=$(find ${REALTIME_DATA}/conf -name "${instrument_path}" -print); fi if [ -f "${instrument_path}" ]; then From 2f760fb4d2d1dda7cd6a66800dfa86f22dd915f6 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 14 Dec 2021 17:26:39 -0700 Subject: [PATCH 10/16] Fix typo with run directory path. refs https://github.com/csjx/realtime-data/issues/24 --- bin/manage-instruments | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index 9e567fc..4c1cf9b 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -97,7 +97,7 @@ start() { "${instrument_path}" > /dev/null 2>&1 & pid=$!; sleep 2; - echo ${pid} > "${RUN_DIR}${instrumentName}-driver.pid"; + echo ${pid} > "${RUN_DIR}/${instrumentName}-driver.pid"; # Or start the instrument archiver From 5502e257142b25a5640eb3ec04a71764bf1fd9e0 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 14 Dec 2021 17:55:07 -0700 Subject: [PATCH 11/16] Set sent sample logs to INFO not DEBUG. refs https://github.com/csjx/realtime-data/issues/24 --- .../java/edu/hawaii/soest/pacioos/text/SimpleTextSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/hawaii/soest/pacioos/text/SimpleTextSource.java b/src/main/java/edu/hawaii/soest/pacioos/text/SimpleTextSource.java index 2a3aaac..2fa5d3a 100644 --- a/src/main/java/edu/hawaii/soest/pacioos/text/SimpleTextSource.java +++ b/src/main/java/edu/hawaii/soest/pacioos/text/SimpleTextSource.java @@ -821,12 +821,12 @@ public int sendSample(String sample) throws IOException, SAPIException { try { numberOfChannelsFlushed = getSource().Flush(rbnbChannelMap); - log.debug("[" + getIdentifier() + "/" + getChannelName() + " ] " + + log.info("[" + getIdentifier() + "/" + getChannelName() + " ] " + " sample: " + sample.trim() + " sent data to the DataTurbine."); rbnbChannelMap.Clear(); // in the event we just lost the network, sleep, try again while (numberOfChannelsFlushed < 1) { - log.debug("[" + getIdentifier() + "/" + getChannelName() + " ] " + + log.info("[" + getIdentifier() + "/" + getChannelName() + " ] " + "No channels flushed, trying again in 10 seconds."); Thread.sleep(10000L); numberOfChannelsFlushed = getSource().Flush(rbnbChannelMap, true); From 12bacaa3fc4c3cc1e0247a543efc8d0900a97c7b Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 14 Dec 2021 18:15:45 -0700 Subject: [PATCH 12/16] Ensure there is a proper pid to kill in stop(). refs https://github.com/csjx/realtime-data/issues/24 --- bin/manage-instruments | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index 4c1cf9b..6253985 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -120,7 +120,14 @@ stop() { instrumentName=${3}; echo -e "${BLUE}INFO: Stopping the instrument ${command} for ${instrumentName}.${RESET}"; - kill -15 "${pidToKill}"; + if [[ "$pidToKill" =~ ^[0-9]+$ ]]; then + kill -15 "${pidToKill}"; + else + echo -e "${YELLOW}WARN: Couldn't stop the instrument ${command} for ${instrumentName}. ${RESET}"; + echo -e "${YELLOW}WARN: Couldn't identify the process id. Please use 'kill -15 {pid}' if this issue persists.${RESET}"; + + fi + sleep 1; rm "${RUN_DIR}/${instrumentName}-${command}.pid"; } From 0fc298491a79fb45460dddd3ad3f5c49b9ce5456 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 15 Dec 2021 15:35:13 -0700 Subject: [PATCH 13/16] Kill the pid by instrument name if needed. refs https://github.com/csjx/realtime-data/issues/24 --- bin/manage-instruments | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index 6253985..c179137 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -123,9 +123,17 @@ stop() { if [[ "$pidToKill" =~ ^[0-9]+$ ]]; then kill -15 "${pidToKill}"; else - echo -e "${YELLOW}WARN: Couldn't stop the instrument ${command} for ${instrumentName}. ${RESET}"; - echo -e "${YELLOW}WARN: Couldn't identify the process id. Please use 'kill -15 {pid}' if this issue persists.${RESET}"; - + echo -e "${YELLOW}WARN: Couldn't stop the instrument ${command} for ${instrumentName}. ${RESET}"; + echo -e "${YELLOW}WARN: Couldn't identify the process id. ${RESET}"; + echo -e "${YELLOW}WARN: Trying by the instrument name. ${RESET}"; + pidToKill=$(pgrep -f "${instrumentName}"); + if [[ "$pidToKill" =~ ^[0-9]+$ ]]; then + kill -15 "${pidToKill}"; + else + echo -e "${RED}ERROR: Couldn't stop the instrument ${command} for ${instrumentName}. ${RESET}"; + echo -e "${RED}ERROR: Couldn't identify the process id. ${RESET}"; + echo -e "${RED}ERROR: Please manually find the pid and use 'kill -15 {pid}'. ${RESET}"; + fi fi sleep 1; From 4e10a4221ed710243ef7a6271df3822cecdc5be7 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 15 Dec 2021 23:34:34 -0700 Subject: [PATCH 14/16] Use pgrep to get pids as needed. refs https://github.com/csjx/realtime-data/issues/14 --- bin/manage-instruments | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index c179137..cb68067 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - RESET="\033[0m"; RED="\033[0;31m"; YELLOW="\033[0;33m"; @@ -106,15 +105,14 @@ start() { java -cp ${CLASSPATH} \ edu.hawaii.soest.pacioos.text.TextSinkApp \ ${REALTIME_DATA}/conf/"${instrumentName}.xml" > /dev/null 2>&1 & - pid=$!; sleep 2; + pid=$!; echo ${pid} > "${RUN_DIR}/${instrumentName}-archiver.pid"; fi } # stop the source driver or archiver given a process id, command, and instrument name stop() { - pidToKill=${1}; command=${2} instrumentName=${3}; @@ -237,7 +235,6 @@ fi # iterate through the list and perform the start or stop operation for drivers and archivers if [ "${command}" == "driver" ] || [ "${command}" == "archiver" ]; then for instrument_path in "${instrument_paths[@]}"; do - existingPid=""; runningPid=""; # Convert the instrument_path to a path when only given as an instrument name if [ ! -f "${instrument_path}" ]; then @@ -246,13 +243,26 @@ if [ "${command}" == "driver" ] || [ "${command}" == "archiver" ]; then if [ -f "${instrument_path}" ]; then instrument=$(basename "${instrument_path}"); + # Stop the running instrument driver or archiver (even on start if needed) if [ -f "${RUN_DIR}/${instrument%.xml}-${command}.pid" ]; then - runningPid=$(pgrep -F "${RUN_DIR}/${instrument%.xml}-${command}.pid"); + runningPid=$(cat "${RUN_DIR}/${instrument%.xml}-${command}.pid"); fi - if [ -n "${runningPid}" ]; then - stop "${existingPid}" "${command}" "${instrument%.xml}"; + if [[ "${runningPid}" -gt 0 ]]; then + stop "${runningPid}" "${command}" "${instrument%.xml}"; + else + if [ "${command}" == "driver" ]; then + app="TextSourceApp"; + fi + if [ "${command}" == "archiver" ]; then + app="TextSinkApp"; + fi + runningPid=$(pgrep -f "${app}.*${instrument}"); + if [[ "${runningPid}" =~ [:digit:]+ ]]; then + echo "Calling stop 2: ${runningPid} ${command} ${instrument%.xml}"; + stop "${runningPid}" "${command}" "${instrument%.xml}"; + fi fi # Conditionally start the instrument driver or archiver From 4080c354b7e9485e96bec9836923eee3104294a6 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 16 Dec 2021 12:09:26 -0700 Subject: [PATCH 15/16] Add a status() method to manage-instruments: Provides a listing of all instruments by name and shows the current status for the driver and archiver processes for each instrument. refs https://github.com/csjx/realtime-data/issues/28 --- bin/manage-instruments | 49 +++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/bin/manage-instruments b/bin/manage-instruments index cb68067..0acbdf4 100755 --- a/bin/manage-instruments +++ b/bin/manage-instruments @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -RESET="\033[0m"; -RED="\033[0;31m"; -YELLOW="\033[0;33m"; -BLUE="\033[0;34m"; +RESET="\e[0m"; +RED="\e[31m"; +YELLOW="\e[33m"; +GREEN="\e[32m"; +BLUE="\e[34m"; LOG_DIR="/var/log/realtime-data"; # log files location if [[ -z ${REALTIME_DATA} ]]; then REALTIME_DATA="."; # installed realtime-data software location @@ -55,21 +56,24 @@ usage() { cat << EOF Usage: +$(basename "${0}") -l $(basename "${0}") -c driver|archiver -o start|stop [-a] [-h] [-i instr1] [-i instr2] [-i instrN] $(basename "${0}") -c rebuilder -i instr [-d directory] -Start or stop one or more instrument source drivers or archivers by optionally providing the instrument id. +List the status of all instrument drivers and archivers, or +start or stop one or more instrument source drivers or archivers by optionally providing the instrument id. Alternatively, rebuild an instrument archive by providing the instrument id, and either a file with samples to add to the archive, or an existing raw archive directory path. OPTIONS: - -a Start or stop all configured instruments + -a Start, stop or show status for all configured instruments -c The command to run, 'driver', 'archiver', 'rebuilder', to stream, archive, or rebuild data. -h Show this message. -i The instrument id. Use -i multiple times for multiple instruments. Use once for a rebuild. - -o Indicate which operation to perform, start or stop (requires 'driver' or 'archiver' commands). + -l List the status of all drivers and archivers. + -o Indicate which operation to perform, start, stop, or status (requires 'driver' or 'archiver' commands). -d The existing instrument archive to rebuild (requires 'rebuilder' command). -V Show the version (${VERSION}) @@ -138,6 +142,34 @@ stop() { rm "${RUN_DIR}/${instrumentName}-${command}.pid"; } +# Provide the status of the given instrument drivers or archivers +status() { + # Print + printf "%20s %15s %15s %15s\n" "Instrument" "Driver Status" "Archiver Status" "Deployment Type"; + instrument_paths=$(find "${REALTIME_DATA}"/conf/** -type f -name "*xml"); + for path in ${instrument_paths}; do + filename=$(basename "${path}"); + instrument_name=${filename%.xml}; + deployment=$(rev <<< ${path} | cut -d "/" -f2 | rev); # reverse twice to get second to last column + driver_pid=$(pgrep -f "TextSourceApp.*${instrument_name}"); + archiver_pid=$(pgrep -f "TextSinkApp.*${instrument_name}"); + driver_status="Not Running"; + archiver_status="Not Running"; + if [[ "${driver_pid}" -gt 0 ]]; then driver_status="Running"; fi + if [[ "${archiver_pid}" -gt 0 ]]; then archiver_status="Running"; fi + + if [[ "${deployment}" == "online" && ("${driver_status}" == "Not Running" || "${archiver_status}" == "Not Running") ]]; then + printf "${RED}%20s %15s %15s %15s${RESET}\n" "${instrument_name}" "${driver_status}" "${archiver_status}" "${deployment}"; + + elif [[ "${deployment}" == "offline" || "${deployment}" == "retired" ]]; then + printf "${BLUE}%20s %15s %15s %15s${RESET}\n" "${instrument_name}" "${driver_status}" "${archiver_status}" "${deployment}"; + + else + printf "${GREEN}%20s %15s %15s %15s${RESET}\n" "${instrument_name}" "${driver_status}" "${archiver_status}" "${deployment}"; + fi + done +} + # rebuild an instrument archive from a file or directory rebuild() { location=${1}; @@ -152,11 +184,12 @@ rebuild() { instrument_paths=() # initialize an empty instruments array # figure out how we were called -while getopts ":ac:hVi:o:d:" OPTION; do +while getopts ":ac:hlVi:o:d:" OPTION; do case ${OPTION} in "a") instrument_paths=("${REALTIME_DATA}/conf/**/*xml");; "c") command="${OPTARG}";; "h") usage; exit 0;; + "l") status; exit 0;; "i") instrument_paths+=("${OPTARG}.xml");; "o") operation="${OPTARG}";; "d") location="${OPTARG}";; From ecba44347ca9acda721bb350218abaf92e170365 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 16 Dec 2021 12:16:13 -0700 Subject: [PATCH 16/16] Rename the current Maui instrument - had a typo. --- .../{MU02XX_002CTDXXXR00.xml => MU02XX_002CTDXXXXR00.xml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename conf/offline/{MU02XX_002CTDXXXR00.xml => MU02XX_002CTDXXXXR00.xml} (98%) diff --git a/conf/offline/MU02XX_002CTDXXXR00.xml b/conf/offline/MU02XX_002CTDXXXXR00.xml similarity index 98% rename from conf/offline/MU02XX_002CTDXXXR00.xml rename to conf/offline/MU02XX_002CTDXXXXR00.xml index 64f3ad5..be6b7b7 100644 --- a/conf/offline/MU02XX_002CTDXXXR00.xml +++ b/conf/offline/MU02XX_002CTDXXXXR00.xml @@ -2,7 +2,7 @@ - MU02XX_002CTDXXXR00 + MU02XX_002CTDXXXXR00 socket - MU02XX_002CTDXXXR00 + MU02XX_002CTDXXXXR00 realtime.pacioos.hawaii.edu