How new software is installed on a node remotely
The software of a node can be updated semi-automatically.
A node consists of a kernel and the plugins that this kernel loads. Additionally, there is third-party software in
the form of libraries. All components are located in two directories. The lib
directory contains the
kernel, the API JARs of the plugins, and the third-party software. The classpath contains only one entry, namely the
lib
directory. The plugins
directory contains the plugin JAR files.
During a software update, either the files in the lib
directory, the files in the plugins
directory, or the files in both directories are updated.
Subsequently, a reboot of the node is initiated.
In the shell script (or batch file) that starts the node, the files are replaced before the start.
Finally, the node boots the new software.
There is another variant of the software update. In this case, only the list of plugins to be loaded is changed, followed by a normal reboot of the node. No files are downloaded. This variant is preferably chosen when only the characteristics of the node need to be changed. After all, the plugins to be loaded determine which services the node offers and uses.
1. Preparation of the update
We need a local node that is connected to the network. This node must have the NY_NetSoftwareUpdaterPlugIn plugin loaded.
The remote nodes that are to receive a software update must have the NY_LocalSoftwareUpdaterPlugIn plugin loaded.
2. Preparation of the JARS
Local directories (lib
and plugins
) should be created to contain all the necessary files.
A local node should be started with this software, and the log should be checked to identify any missing libraries.
These files are copied into the incoming directory of the local node's FileStore.
As a result, the files are incorporated into the FileStore and are available for download.
3. Creation of a JSON control file
Next, a JSON file is created that contains the filenames and possibly the hashes of the files to be copied.
Example file
{ "jar_list": { "nodes ": [ "moon" ], "reboot ": true, "sessionToken ": "78febe5e-eae1-4c72-816a-a74114c3376a", "libraries ": [ "annotations-24.1.0.jar(71KKNFM7T4JGHK85967FY2WQ64)", "h2-2.2.224.jar(ETENN1EHKK62P1K21Y683NPRZ0)", "hamcrest-core-1.1.jar(PSPGRJ71Y7E59N12FPTJA4P1BC)", "json-simple-1.1.1.jar(BK1C8Y6Q7T259D63D77ECV2VRW)", "junit-4.10.jar(D0W000DRG03EQS4VWM6EYPXJ78)", "miglayout-core-5.2.jar(AWJP3ENGQQFHM1WXD4WKG71RY4)", "miglayout-swing-5.2.jar(M34QAEFTSPMV3Z13FR0J7QJFEG)", "NY_Kernel-2.0.1.jar(ARC2G32GVEK0HJQET4VDN9YR84)", "NY_KernelStarter-2.0.1.jar(WF0NKRG3MAWZKYK777TS216A2R)", "NY_RecordDatabase-2.0.1.jar(VCYWM45ZRMF53BR6STT2C7ZBSC)", "NY_RecordParserJson-2.0.1.jar(CP2VSZ0FBKTJF104TR25XG2CSW)", "NY_RecordParserXml-2.0.1.jar(K8TJAG76VFK0SN7QB2NG6Q2EDW)" ], "plugins ": [ "NY_ApplicationAPI-2.0.1.jar(8WHT39RZBDMJ8TZCRAAV5DXA1W)", "NY_ApplicationFactoryCollectorAPI-2.0.1.jar(DC9KPWMN9D593NVSNBYYTM7NY8)", "NY_ApplicationFactoryCollectorPlugIn-2.0.1.jar(QXV5SH3CSTRBHV6A0456BDAK5R)", "NY_ApplicationNetworkPlugIn-2.0.1.jar(04DRQB28JD9CW6B3KJ7EDAGHVC)", "NY_ApplicationPlugIn-2.0.1.jar(9SQ1YQ0GBA025DRV3ASYDZDNXR)", "NY_AppMonitor-2.0.1.jar(5MHV918RRF8C12XAR79B0R1JY4)", "NY_AppNodeManager-2.0.1.jar(8Z9VFMPDXTPC6RQ52K9DPR26JW)", "NY_AppUserManager-2.0.1.jar(AHF60TTFBRD3KD0099HG2FVR14)", "NY_AppWebLogIn-2.0.1.jar(DYQZPJDCYT6D4WDC5CYKJ56EJ8)", "NY_AppWidgetShowCase-2.0.1.jar(SAWVPCJF02MGEKJ3V4X7EG47YG)", "NY_ClientNodePlugIn-2.0.1.jar(F5W7YSN65GM6ED7X44NC0Y0ZR4)", "NY_ConfigurationProviderPlugIn-2.0.1.jar(F68A7H7PXK2CJW8MFJ4ETVPASW)", "NY_DevCheckPlugIn-2.0.1.jar(ZBRABSH8YW9AQCPXXP79WQTYQW)", "NY_DialogMessagePanelAPI-2.0.1.jar(1GRM5K52FFHJ3QN3712W9Y7KK8)", "NY_DialogMessagePanelPlugIn-2.0.1.jar(0K4XQNVHNP0AJHQQVPSZFSRHH0)", "NY_DialogNodeListAPI-2.0.1.jar(7A9VWTHZF65M58D4V50M9X97F8)", "NY_DialogNodeListPlugIn-2.0.1.jar(QCQ7W4GRX8XWES4AF3SZ073Z70)", "NY_DialogPasswordChangeAPI-2.0.1.jar(ZPQ0MZZ5EM3Q5NHGP49QV770E4)", "NY_DialogPasswordChangePlugIn-2.0.1.jar(3M181ACPFCEXRHZ5X6RBV5D4PG)", "NY_DialogPresetAPI-2.0.1.jar(WZQRET3MSW489006SKXDE2PA50)", "NY_DialogPresetPlugIn-2.0.1.jar(ET3Z1KYWKG1YN7A559KZ8ZM4GC)", "NY_DialogPropertyEditorAPI-2.0.1.jar(E3HEASDH1QQKMJD3NRREJSDHWM)", "NY_DialogPropertyEditorPlugIn-2.0.1.jar(EBY7JSFZGH6634723NZVKC0TH4)", "NY_DialogUserAPI-2.0.1.jar(G2X20HENG162X4YZDE8EG47NN4)", "NY_DialogUserPlugIn-2.0.1.jar(5BG0CEN93E7YZKQYXJMNKV7QFG)", "NY_Examples-1.1.0.jar(6768RVH4ASC0TDSH2NX2VQYAQW)", "NY_FileCachePlugIn-2.0.1.jar(T02HCKZ2CGKCJN7SFSPGCZY9N8)", "NY_FileRegistryAPI-2.0.1.jar(TQMNVX2YZXV0MF4HJ4K6KQJ60R)", "NY_FileRegistryPlugIn-2.0.1.jar(2EE147FRZ0ABBDV17VQHPH30MW)", "NY_FileStoreAPI-2.0.1.jar(GTTD79F7RF1XJSC4T2ENSM5V8G)", "NY_FileStorePlugIn-2.0.1.jar(41B0EPJS4E3T18VARYEJ2BF190)", "NY_GateKeeperAPI-2.0.1.jar(71XKWEWJVH7EQD0KHZK5SMTR1M)", "NY_GateKeeperPlugIn-2.0.1.jar(AEQWH19QJF57MCR84N0Z52BC10)", "NY_H2DatabasePlugIn-2.0.1.jar(YZY88WEW40Y926D1Y9BF1BEJZ0)", "NY_IntegrationTestPlugIn-2.0.1.jar(WS10PP1WSMX4262T0ZKDWG8KH4)", "NY_LinkCollectorAPI-2.0.1.jar(QMAGPNG5JGBKR1TCZNJCE9TTV8)", "NY_LinkCollectorPlugIn-2.0.1.jar(T2RVJPZYR8RPHGCEEE5T8MBR7G)", "NY_LinkCostCollectorAPI-2.0.1.jar(0F5KRFQM1Q9BRC22SGXZK1Y2TG)", "NY_LinkCostCollectorPlugIn-2.0.1.jar(MB3T7A3CBJSJZCATC43B5X5MYG)", "NY_LinkPrinterPlugIn-2.0.1.jar(HVM1VCEDHM3PN9FC4Z8YGN4N8M)", "NY_LocalSoftwareUpdaterPlugIn-2.0.1.jar(84C4DGTCXBPBV5B1FZ3KATNPQC)", "NY_LogMonitorPlugIn-2.0.1.jar(28NZ5E9G5TA1AXS0JWP10MXGDW)", "NY_MicroServiceAPI-2.0.1.jar(YW8RHX1M8ANZT3RCW2R654YVJ8)", "NY_MicroServicePlugIn-2.0.1.jar(3MK93C4RGKSMRH44PVVWNZ8W94)", "NY_MicroServiceRegistryAPI-2.0.1.jar(A5V4J2S0X5MEGC7M8A9HT1MYJ8)", "NY_MicroServiceRegistryPlugIn-2.0.1.jar(GXTJVBRWJ8Q9K0PXSF71WCG7JM)", "NY_MonitorPlugIn-2.0.1.jar(1BW8DECSYV71SJQBDW4RYB5YB0)", "NY_MonitorTestPlugIn-2.0.1.jar(Z06EVX63NPWDSZ0MKA8KC2TSHM)", "NY_NetSoftwareUpdaterPlugIn-2.0.1.jar(60SHJYAC4ACMCPWR7J2DMCXBV8)", "NY_NetworkAPI-2.0.1.jar(JMVXGP803CKX0EA792DA0SE9MW)", "NY_NetworkIndexPlugIn-2.0.1.jar(C08XZYJJ4X90MK3M81EEXPF060)", "NY_NetworkPlugIn-2.0.1.jar(XHBKRDN3VFD8M5KW1AAPMKY8XR)", "NY_NodeCheckerPlugIn-2.0.1.jar(KQJAB6R1A8VJYTE29YVCAQTZQ8)", "NY_NodeStarterPlugIn-2.0.1.jar(0DBRYKV3Z92BJ321E7S1FS8MAR)", "NY_NodeUiPlugIn-2.0.1.jar(KQH79E9SCH139KBF2799TE1Q74)", "NY_Remote Skin ClientPlugIn-2.0.1.jar(KJ340BT1NADBDYFA9ST52EYTQW)", "NY_Remote Skin DialogMonitorAPI-2.0.1.jar(5ES375NXSZN01BQ6JKQC5TAXP0)", "NY_Remote Skin DialogMonitorPlugIn-2.0.1.jar(EEN62YTMHDN34PF7WKS7C8HCG0)", "NY_Remote Skin ModelPlugIn-2.0.1.jar(HETVMVS669KTSBYQ1RE80R12EM)", "NY_Remote Skin MonitorConfigurationPlugIn-2.0.1.jar(583AJ3HQ7PYQJ83T0JH24QEY88)", "NY_Remote Skin ServerPlugIn-2.0.1.jar(CZ2AZQXVZX61ZB8AB48FNTMN6C)", "NY_Remote Skin SwingPlugIn-2.0.1.jar(51QFQ28M2D7DZ9M42CDZ5HJA54)", "NY_Remote Skin Test-2.0.1.jar(4Z0BS0R2HT5XA2PJEFGXE79FZ4)", "NY_Remote Skin WebProtocolPlugIn-2.0.1.jar(FDV7J60BME6ESRAJS2A8HDSEB0)", "NY_Remote Skin WebServerAPI-2.0.1.jar(3Q6TBPQJF031YXADJF3WBR6KJR)", "NY_Remote Skin WebServerPlugIn-2.0.1.jar(3JT62S1RA171N8A60PV1DEN2GG)", "NY_SequenceMonitorPlugIn-2.0.1.jar(Y55RVNH84AQS9AMP84H564MY64)", "NY_Session2API-2.0.1.jar(TG6XGJZ6ACCFM2VZCNEY74WNE8)", "NY_Session2PlugIn-2.0.1.jar(3SV1HZYSPJWJH5YAHY8WX35068)", "NY_SoftwareUpdaterAPI-2.0.1.jar(AP6XMV7V2ERV9MZAHNBWF8K5J8)", "NY_TcpAPI-2.0.1.jar(12E2Q5WHVN0D63QJRN38R5A458)", "NY_TcpPlugIn-2.0.1.jar(9ESJPXD06G8Y96ZVR5QBS44CER)", "NY_TestSenderPlugIn-2.0.1.jar(RTF914XQF0ZQB5ZR7BZH68REHG)", "NY_TransportStatisticAPI-2.0.1.jar(7PD1A4Q6QS87NNED4M59APF670)", "NY_TransportStatisticPlugIn-2.0.1.jar(T6DEHCSCT6ECV55P9XCJ6TYY90)", "NY_WebSocketAPI-2.0.1.jar(MD70N6X6HS9KMNP1B3CYB2QAFG)", "NY_WebSocketPlugIn-2.0.1.jar(5F6Q3AE2KF1M4YJVHTD2XMD1S8)" ], "pluginsToLoad ": [ "NY_NetworkPlugIn", "NY_TcpPlugIn", "NY_MicroServicePlugIn", "NY_FileStorePlugIn", "NY_Remote Skin ModelPlugIn", "NY_Remote Skin ServerPlugIn", "NY_Remote Skin WebProtocolPlugIn", "NY_WebSocketPlugIn", "NY_AppWebLogIn", "NY_LocalSoftwareUpdaterPlugIn" ] } }
-
nodes : The list of nodes to update. -
reboot : The default here is true for rebooting the nodes after the update. The user must have the right to shut down the node (NY_Shutdown
). -
sessionToken : You get the session token when you log in to the console. You must manually enter it in the JSON file. -
libraries : Optional: The list of libraries and the kernel JAR to download. The hash is optional and is only required if you want to distinguish between files with the same name but different versions. The hash value of the file is displayed on the console when the file is imported into the FileStore. Only the files that do not already exist will be downloaded. Files that existed before the update and no longer exist will be imported into the remote FileStore and deleted from the directory. If this list is missing, the kernel file and libraries will not be modified. Updating the library files requires theNY_SoftwareUpdate
permission. -
plugins : Optional: The list of plugins in theplugins
directory. The hash is optional and is only required if you want to distinguish between files with the same name but different versions. The hash value of the file is displayed on the console when the file is imported into the FileStore. Only the files that do not already exist will be downloaded. Files that existed before the update and no longer exist will be imported into the remote FileStore and deleted from the directory. If the list is missing, the files in theplugins
directory will not be modified. Updating the plugins requires theNY_SoftwareUpdate
permission. -
pluginsToLoad : Optional: The list of plugins to load when the node is started. If this list is missing, the node's existing list is not modified. Preferably use filenames without version numbers here. The kernel automatically selects the latest version when there are multiple versions of a plugin. This way, you avoid updating the list when installing new software.
4: Obtaining the necessary permissions and the session token
The user must now log in to the local node's console. Upon successful login, a session token is generated and displayed on the console. This token must be entered into the JSON file. It is valid for half an hour.
5: Start of the update process
This file must now be copied to the storage/incoming_jar_lists
directory of the local node.
This directory is monitored by the NY_NetSoftwareUpdaterPlugIn plugin.
The file is read and transmitted to the affected remote nodes.
6. What happens
The current software is checked there.
All JARs from the lib
directory are copied to the update/old_files/lib
directory.
All JARs from the plugins
directory are copied to the update/old_files/plugins
directory.
JARs that are no longer needed are imported into the FileStore.
They are available there in case a rollback is necessary.
JARs that are still needed are copied to the update/new_files/lib
and
update/new_files/plugins
directories.
Missing JARs are downloaded from the FileStore and copied to the same directories.
The list of plugins to be loaded is adopted, if provided.
If everything went well and a reboot is to be performed, it is done with an exit code. The following exit codes are important:
- 1: No file is copied by the shell script. The node is restarted. This variant is chosen when only the list of plugins to be loaded has been changed.
-
2:
The
lib
directory is emptied, and the files in theupdate/new_files/lib
directory are adopted. The node is restarted. This variant is chosen when the library list is provided but the plugin list is missing. -
3:
The
plugins
directory is emptied, and the files in theupdate/new_files/plugins
directory are adopted. The node is restarted. This variant is chosen when the plugin list is provided but the library list is missing. - 4: Both directories are emptied, and the files in the "update/new_files" directory are adopted. The node is restarted. This variant is chosen when both lists are included.
Errors
In case of an error (e.g., a file is not found, the session token is invalid, or permissions are missing), the process is aborted. Please check the log of the affected nodes.
Rollback
You can undo the process at any time if you still have the old control file. The update process is then simply repeated with the old control file. However, you must enter a current session token in the file.
You can obtain the old control file by connecting to the node with the local console before the update (connect
[node-id]
) and typing version
.
The output will be displayed on standard out.
Then, you simply need to copy the output into a new file.
The name of the file does not matter.
Hint
Create the control file as described in the previous paragraph. Only change the filenames, versions, or hashes that you want to update.
Don't forget the session token!