////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////
:documentationPath: /plugins/transforms/
:language: en_US
:page-alternativeEditUrl: https://github.com/apache/incubator-hop/edit/master/plugins/transforms/systemdata/src/main/doc/systemdata.adoc

= Get System Info

== Description

The Get System Info transform retrieves system information from the Hop project. The transform includes a table where you can designate a name and assign it to any available system info type you want to retrieve. This transform generates a single row with the fields containing the requested information.

It can also accept any number of input streams, aggregate any fields defined by this transform, and send the combined results to the output stream.

== Options

[width="90%", options="header"]
|===
|Option|Description
|Transform name|Name of the transform this name has to be unique in a single pipeline.
|Name|The name you want to give a specific data type
|Type|A list of the available system data types
|===

== Information Types

[width="90%", options="header"]
|===
|Item|Description
|system date (variable)|System time, changes every time you ask a date.
|system date (fixed)|System time, determined at the start of the pipeline.
|start date range (Pipeline)|Start of date range, based upon information in ETL log table. See, also .08 Pipeline Settings.
|end date range (Pipeline)|End of date range, based upon information in ETL log table. See, also .08 Pipeline Settings.
|start data range (Workflow)|Start of date range based upon information in the ETL log table. See also .08 Pipeline Settings.
|End date range (Workflow)|End of date range based upon information in the ETL log table. See also .08 Pipeline Settings.
|Yesterday 00:00:00|Start of yesterday.
|Yesterday 23:59:59|End of yesterday.
|Today 00:00:00|Start of today.
|Today 23:59:59|End of today.
|Tomorrow 00:00:00|Start of tomorrow.
|Tomorrow 23:59:59|End of tomorrow
|First day of last month 00:00:00|Start of last month.
|Last day of last month 23:59:59|End of last month.
|First day of this month 00:00:00|Start of this month.
|Last day of this month 23:59:59|End of this month.
|First day of next month 00:00:00|Start of next month.
|Last day of next month 23:59:59|End of next month.
|copy of transform|Copy nr of the transform. See also Launching several copies of a transform.
|Pipeline name|Name of the pipeline.
|Pipeline file name|File name of the pipeline (XML only).
|User that modified the pipeline last|
|Date when the pipeline was modified last|
|Pipeline batch ID|ID_BATCH value in the logging table, see .08 Pipeline Settings.
|Parent workflow batch ID|The Hop batch ID of the parent workflow taken from the workflow logging table. You need to enable logging in the workflow and set "Pass batch ID" in the workflow settings.
|Hostname|Returns the hostname of the server.
|IP address|Returns the IP address of the server.
|Command line argument 1|Argument 1 on the command line
|Command line argument 2|Argument 2 on the command line
|Command line argument 3|Argument 3 on the command line
|Command line argument 4|Argument 4 on the command line
|Command line argument 5|Argument 5 on the command line
|Command line argument 6|Argument 6 on the command line
|Command line argument 7|Argument 7 on the command line
|Command line argument 8|Argument 8 on the command line
|Command line argument 9|Argument 9 on the command line
|Command line argument 10|Argument 10 on the command line
|Hop version|Returns the Hop version (for example, 1.0.0)
|Hop Build Version|Returns the build version of the core Hop library (for example, 13)
|Hop Build Date|Returns the build date of the core Hop library
|Current process identifier (PID)|The PID under which the Java process is currently running
|JVM max memory|
|JVM total memory|
|JVM free memory|
|JVM available memory|
|Available processors|
|JVM CPU time (milliseconds)|
|Total physical memory size (bytes)|
|Total swap space size (bytes)|
|Committed virtual size (bytes)|
|Free physical memory size (bytes)|
|Free swap space size (bytes)|
|First day of last week 00:00:00|
|Last day of last week 23:59:59|
|Last working day of last week 23:59:59|
|First day of last week 00:00:00 (US)|
|Last day of last week 23:59:59 (US)|
|First day of this week 00:00:00|
|Last day of this week 23:59:59|
|Last working day of this week 23:59:59|
|First day of this week 00:00:00 (US)
|Last day of this week 23:59:59 (US)
|First day of next week 00:00:00|
|Last day of next week 23:59:59|
|Last working day of next week 23:59:59|
|First day of next week 00:00:00 (US)|
|Last day of next week 23:59:59 (US)|
|First day of last quarter 00:00:00|
|Last day of last quarter 23:59:59|
|First day of this quarter 00:00:00|
|Last day of this quarter 23:59:59|
|First day of next quarter 00:00:00|
|Last day of next quarter 23:59:59|
|First day of last year 00:00:00|
|Last day of last year 23:59:59|
|First day of this year 00:00:00|
|Last day of this year 23:59:59|
|First day of next year 00:00:00|
|Last day of next year 23:59:59|
|Previous workflow action result|
|Previous workflow action exit status|
|Previous workflow action nr|
|Previous workflow action nr errors|
|Previous workflow action nr lines input|
|Previous workflow action nr lines output|
|Previous workflow action nr lines read|
|Previous workflow action nr lines updated|
|Previous workflow action nr lines written|
|Previous workflow action nr lines deleted|
|Previous workflow action nr lines rejected|
|Previous workflow action nr rows|
|Previous workflow action stopped|
|Previous workflow action nr files|
|Previous workflow action nr files retrieved|
|Previous workflow action log text|
|===
