<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>The Wombelix Post - Code</title><link href="https://dominik.wombacher.cc/" rel="alternate"/><link href="/feeds/tag_code.atom.xml" rel="self"/><id>https://dominik.wombacher.cc/</id><updated>2021-09-23T00:00:00+02:00</updated><entry><title>pipx behave different than pip if package already exists</title><link href="https://dominik.wombacher.cc/posts/pipx-behave-different-than-pip-if-package-already-exists.html" rel="alternate"/><published>2021-09-23T00:00:00+02:00</published><updated>2021-09-23T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-09-23:/posts/pipx-behave-different-than-pip-if-package-already-exists.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I decided to put as much as possible of my local config into an Ansible Playbook.
Makes it easier to track what I install and change, also to setup from  ... &lt;a class="read-more" href="/posts/pipx-behave-different-than-pip-if-package-already-exists.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I decided to put as much as possible of my local config into an Ansible Playbook.
Makes it easier to track what I install and change, also to setup from scratch should it necessary.&lt;/p&gt;
&lt;p&gt;In the past I mainly used &lt;cite&gt;pip&lt;/cite&gt; in combination with &lt;cite&gt;venv&lt;/cite&gt; to install Python stuff.
Changing for most of it to &lt;cite&gt;pipx&lt;/cite&gt; seems logical, it will take care about the necessary &lt;em&gt;venvs&lt;/em&gt; on it's own.&lt;/p&gt;
&lt;p&gt;Just had to learn that the return code of &lt;cite&gt;pip&lt;/cite&gt; is &lt;strong&gt;0&lt;/strong&gt; but from &lt;cite&gt;pipx&lt;/cite&gt; it's &lt;strong&gt;1&lt;/strong&gt; in case a package already exists.&lt;/p&gt;
&lt;p&gt;Why does it matter? Not the most elegant solution but I decided to just use &lt;cite&gt;command&lt;/cite&gt; to trigger &lt;em&gt;pip&lt;/em&gt; / &lt;em&gt;pipx&lt;/em&gt; from my Playbook:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Python Package Installation (pip)&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;command&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;&amp;quot;python3&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;-m&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;pip&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;install&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;--user&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;{{&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;item&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;}}&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;changed_when&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;loop&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;pipx&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;nox&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Python Package Installation (pipx)&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;command&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;&amp;quot;pipx&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;install&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;{{&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;item&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;}}&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;changed_when&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;loop&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;poetry&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;duplicity&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;pre-commit&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;No problem with &lt;cite&gt;pip&lt;/cite&gt;, but &lt;cite&gt;pipx&lt;/cite&gt; failed after the first run.&lt;/p&gt;
&lt;p&gt;There was an older &lt;a class="reference external" href="https://github.com/pypa/pipx/issues/125"&gt;GitHub Issue&lt;/a&gt;, based on the comments,
&lt;cite&gt;pipx&lt;/cite&gt; was supposed to behave smilar as &lt;cite&gt;pip&lt;/cite&gt; and also use return code 0 since v0.13 already.
After some research I found the &lt;a class="reference external" href="https://github.com/pypa/pipx/pull/560"&gt;Pull Request&lt;/a&gt;
that reverted the earlier change during some re-factoring.&lt;/p&gt;
&lt;p&gt;Thanks to the great improvements in that PR, it was just a very small change necessary to restore the
functionality introduced in &lt;a class="reference external" href="https://github.com/pypa/pipx/commit/11b853e9c6926b32133b27822516b2a5b4f35411"&gt;Commit 11b853e&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/docs/changelog.md b/docs/changelog.md&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 0a95ce15..67d14929 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/docs/changelog.md&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/docs/changelog.md&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -1,6 +1,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;dev&lt;span class="pygments-w"&gt;

 &lt;/span&gt;- Fixed `pipx list` output phrasing to convey that python version displayed is the one with which package was installed.&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+- Fixed `pipx install` to provide return code 0 if venv already exists, similar to pip’s behavior. (#736)&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;0.16.4&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gh"&gt;diff --git a/src/pipx/constants.py b/src/pipx/constants.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 4fe2d58b..11fc013f 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/src/pipx/constants.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/src/pipx/constants.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -21,7 +21,7 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;# pipx shell exit codes&lt;span class="pygments-w"&gt;
 &lt;/span&gt;EXIT_CODE_OK = ExitCode(0)&lt;span class="pygments-w"&gt;
 &lt;/span&gt;EXIT_CODE_INJECT_ERROR = ExitCode(1)&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-EXIT_CODE_INSTALL_VENV_EXISTS = ExitCode(1)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+EXIT_CODE_INSTALL_VENV_EXISTS = ExitCode(0)&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;EXIT_CODE_LIST_PROBLEM = ExitCode(1)&lt;span class="pygments-w"&gt;
 &lt;/span&gt;EXIT_CODE_UNINSTALL_VENV_NONEXISTENT = ExitCode(1)&lt;span class="pygments-w"&gt;
 &lt;/span&gt;EXIT_CODE_UNINSTALL_ERROR = ExitCode(1)&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;diff --git a/tests/test_install.py b/tests/test_install.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 941f4c01..0eb2d9cc 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/tests/test_install.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/tests/test_install.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -109,7 +109,7 &amp;#64;&amp;#64; def test_install_no_packages_found(pipx_temp_env, capsys):&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;def test_install_same_package_twice_no_force(pipx_temp_env, capsys):&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    assert not run_pipx_cli([&amp;quot;install&amp;quot;, &amp;quot;pycowsay&amp;quot;])&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-    assert run_pipx_cli([&amp;quot;install&amp;quot;, &amp;quot;pycowsay&amp;quot;])&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    assert not run_pipx_cli([&amp;quot;install&amp;quot;, &amp;quot;pycowsay&amp;quot;])&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    captured = capsys.readouterr()&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    assert (&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        &amp;quot;'pycowsay' already seems to be installed. Not modifying existing installation&amp;quot;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Related Pull Request: &lt;a class="reference external" href="https://github.com/pypa/pipx/pull/736"&gt;https://github.com/pypa/pipx/pull/736&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merged into &lt;cite&gt;pipx/main&lt;/cite&gt; on 25th September 2021&lt;/p&gt;
&lt;p&gt;That's a good example why I love and prefer Open Source, I could fix the Problem on my own and share the improvement with the community, within a few days it was already merged and will be part of the next Release.&lt;/p&gt;
</content><category term="Code"/><category term="Python"/><category term="Code"/><category term="pipx"/><category term="pip"/></entry><entry><title>Create BMC Control-M usage reports from CLI instead GUI</title><link href="https://dominik.wombacher.cc/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html" rel="alternate"/><published>2021-08-21T00:00:00+02:00</published><updated>2021-08-21T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-08-21:/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to solve a quite interesting problem recently, the Task was to generate Control-M usage reports on a monthly basis and send them via E-Mail.&lt;/p&gt;
&lt;p&gt;Control-M provides a Solution  ... &lt;a class="read-more" href="/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to solve a quite interesting problem recently, the Task was to generate Control-M usage reports on a monthly basis and send them via E-Mail.&lt;/p&gt;
&lt;p&gt;Control-M provides a Solution for that: &lt;strong&gt;BMC Control-M Usage Reporting Tool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But it's a Java GUI Application that can't be automated or run in Batch mode. So I decided to write a small &amp;quot;wrapper&amp;quot; in Java which re-use the original Classes from the Control-M Usage Reporting Tool (Version 9.0.00).&lt;/p&gt;
&lt;p&gt;That way the results are 100% identical without any (unsupported) customizing but it can be executed from the command line.&lt;/p&gt;
&lt;p&gt;I want to make clear: All Control-M Copyrights belong to BMC, including the Java Code and Classes. All what my little wrapper does, is loading the Class which comes with the original Tool and call the same methods as it would be done in the GUI to generate the report.&lt;/p&gt;
&lt;p&gt;Therefore I want to share the Code of my wrapper and the necessary cmd file (yes, all this is only running on Windows due to hardcoded backslashes in file paths in the used Class) to start it.&lt;/p&gt;
&lt;p&gt;Downloading the required Jar file from BMC, Building the Project (I used &amp;quot;Export: Runnable JAR file&amp;quot; in Eclipse), adding the necessary &lt;em&gt;data/env.txt&lt;/em&gt; and &lt;em&gt;data/config.ini&lt;/em&gt; is up to you.
I suggest you take a look into the directory structure and files of the &lt;em&gt;BMC Control-M Usage Reporting Tool&lt;/em&gt;, it isn't that hard figure it out and get it working :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ctmusagereport&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code java literal-block"&gt;
&lt;span class="pygments-kn"&gt;package&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;ctmusagereport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;java.io.File&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.Enhancement.ZipFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.AddOnsReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.DBAccess&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.DBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.EndpointReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.JobCountReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.Params&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kd"&gt;public&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kd"&gt;class&lt;/span&gt; &lt;span class="pygments-nc"&gt;Main&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-kd"&gt;public&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kd"&gt;static&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kt"&gt;void&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nf"&gt;main&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;String&lt;/span&gt;&lt;span class="pygments-o"&gt;[]&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;args&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Used to Load Env and Config File also to Generate and Get Report Directory&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;Params&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;Params&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;instance&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;try&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;LoadEMEnvironmentsFromFile&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;catch&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;Exception&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;printStackTrace&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;try&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;LoadConfigParamFromFile&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;catch&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;Exception&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;printStackTrace&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Initiates DB Connection based on values in data/env.txt&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccessManager&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;instance&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;RefreshDBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Get DB Connection for Environment 0 (first line in env file)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccess&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;con&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetDBAccess&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-mi"&gt;0&lt;/span&gt;&lt;span class="pygments-p"&gt;);&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;con&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetEMVersionFromDB&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Creates new Directory in reports/ with datetime now (&amp;quot;yyyy-MM-dd-HHmmss&amp;quot;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;CreateReportDir&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Trigger Generation of all Reports identical to GUI (Wizard / FlowManager)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;JobCountReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;AddOnsReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;EndpointReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;(),&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kc"&gt;true&lt;/span&gt;&lt;span class="pygments-p"&gt;);&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// For easier handling, add all generated files to &amp;quot;reports.zip&amp;quot; in Generated Report Directory&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;File&lt;/span&gt;&lt;span class="pygments-o"&gt;[]&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;fileReportsDir&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;File&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;()).&lt;/span&gt;&lt;span class="pygments-na"&gt;listFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;ZipFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;Zip&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;fileReportsDir&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ctmusagereport.cmd&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
java -cp &amp;quot;./*;ctmusagereport_lib/*&amp;quot; ctmusagereport.Main

&lt;/pre&gt;
&lt;p&gt;I tested it successfully with &lt;em&gt;&amp;quot;OpenJDK11U-jdk_x64_windows_hotspot_11.0.12_7&amp;quot;&lt;/em&gt; from &lt;a class="reference external" href="https://adoptium.net/"&gt;https://adoptium.net/&lt;/a&gt; on Windows Server 2016.&lt;/p&gt;
&lt;p&gt;What I like about working with Control-M is that you can Script and Customize almost everything somehow, even worse that I had to find a workaround like that for the usage reporting, would be great if BMC would offer such an CLI option with the original Tool.&lt;/p&gt;
</content><category term="Code"/><category term="Control-M"/><category term="Code"/><category term="Java"/></entry></feed>