3
votes

I have a script which detects OS using Catalina.bat for windows and Catalina.sh for UNIX..it executes successfully for UNIX but for windows its not able to extract OS version from Catalina.bat..the reason i find out is because in Catalina.bat when it executes this line

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome

then OS version statement is not reached in catalina.bat file,so the solution to this is i guess; explicitly set CATALINA_HOME environment variable using my Ant script itself; how to do that plz suggest any solution.

i was using this code, here OS.version property should have cached the OS version from catalina.bat file similar code in UNIX is working fine but win i wonder whats wrong

<property name="version" location="${My_proj}\tomcat\bin\catalina.bat"/>
<exec executable="${version}" outputproperty="OS.version">
        <arg value="version" />
          <redirector>
            <outputfilterchain>
               <tokenfilter>
                <containsstring contains="OS Name:"/>
                 <replacestring from="OS Name:        " to=""/> 
                </tokenfilter>
            </outputfilterchain>
         </redirector>


  </exec>

PROBLEM O SOLVED: you were right ..

<exec executable="cmd" outputproperty="tomcat.version">
      <arg value="/c"/>
      <arg value="${MY_PROJ}\tomcat\bin\version.bat"/>
      <env key="CATALINA_HOME" value="${MY_PROJ}\tomcat\"/>

        <redirector>
        <outputfilterchain>
          <tokenfilter>
            <containsstring contains="Server version"/> 
            <replaceregex pattern="Server version: Apache Tomcat/(.*)$" replace="\1"/>
          </tokenfilter>
        </outputfilterchain>
      </redirector>

    </exec>
    <echo message="tomcat.version: ${tomcat.version}"/>

OUTPUT:

versioncat:
     [echo] tomcat.version: 6.0.33

LAST BUL NOT THE LEAST CAN ANY1 ANSWER OR SUGGEST A WORKAROUND FOR MY LAST COMMENT QUERY THE SILLY QUESTION

3
I wonder what the reason for the downvote was? It's a bit discouraging to a new user to downvote without even providing constructive feedback on the reason.sudocode
I think you are over-complicating things by trying to extract OS version from the output of catalina.bat. I think you will be able to get what you need using built in Ant properties and conditions.sudocode
actually my code extracts OS version and tomcat version both from catalina.bat thats y i am searching inside catalina.bat..as u said tomcat is runtime config. so cant be directly detected by ant using properties..and my main perpose in not setting CATALINA_HOME rather finding out tomcat version ..apologies for ques.. i thought setting catalina_home may resolve this problem.if there is any other way to find tomcat version the no need to go into these complexities.user1037728

3 Answers

2
votes

If I understand correctly, you are executing this OS detection from Ant. In that case, can you not instead use Ant's built-in support for OS identification - in the os condition?

However, if you really need to execute catalina.bat while setting CATALINA_HOME, you could do so using a nested env element in you exec task.

Here is a sample build file which uses both approaches:

<project default="test">

  <target name="test">

    <!-- Execute a command, in this case a simple bat file
         which echoes the value of the var set in the env block 
    -->
    <exec executable="cmd">
      <arg value="/c"/>
      <arg value="test.bat"/>
      <env key="CATALINA_HOME" value="whatever"/>
    </exec>

    <!-- echo the values of built-in OS related properties -->
    <echo message="os.arch: ${os.arch}"/>
    <echo message="os.name: ${os.name}"/>
    <echo message="os.version: ${os.version}"/>

    <!-- test one of the os conditions -->
    <condition property="is.windows">
      <os family="windows"/>
    </condition>
    <echo message="is.windows ? ${is.windows}"/>

  </target>

</project>

Here is the content of test.bat:

echo CATALINA_HOME=%CATALINA_HOME%

Here is the output:

test:
     [exec]
     [exec] C:\tmp\ant>echo CATALINA_HOME=whatever
     [exec] CATALINA_HOME=whatever
     [echo] os.arch: x86
     [echo] os.name: Windows XP
     [echo] os.version: 6.1 build 7601 Service Pack 1
     [echo] is.windows ? true

Regarding your subsequent question (in comments) about tomcat version...

I now guess you are executing this version detection via Ant in your runtime environment.

Ant and Java don't know about your Tomcat environment, so now you're back to executing %CATALINA_HOME%\bin\catalina.bat -version and parsing what you need from the output.

Here's a working example:

<project default="version">
  <property environment="env"/>

  <condition property="script.ext" value="bat">
    <os family="windows"/>
  </condition>
  <condition property="script.ext" value="sh">
    <os family="unix"/>
  </condition>

  <target name="version">
    <exec executable="${env.CATALINA_HOME}/bin/version.${script.ext}" outputproperty="tomcat.version">
      <redirector>
        <outputfilterchain>
          <tokenfilter>
            <containsstring contains="Server version"/> 
            <replaceregex pattern="Server version: Apache Tomcat/(.*)$" replace="\1"/>
          </tokenfilter>
        </outputfilterchain>
      </redirector>
    </exec>
    <echo message="tomcat.version: ${tomcat.version}"/>
  </target>
</project>

And here is the output:

version:
     [echo] tomcat.version: 5.5.33

Note that this example assumes that you have the CATALINA_HOME (and JAVA_HOME) environment variable set in your terminal.

Alternatively, you could pass these variables using a nested <env> element as previously discussed. But it seems more likely that these should come from the runtime environment rather than embedded in your build file.

0
votes

Do it like this :

<condition property="catalina.path" value="C:\Foo\catalina.bat">
   <os family="windows"/>
</condition>
<condition property="catalina.path" value="/home/foo/catalina.sh">
   <os family="unix"/>
</condition>

<exec> ... execute your script here </exec>
0
votes

Depending on your situation, you may find this approach a little more platform agnostic and less error prone as you do not need to fork off a shell. This works at least as far back as Tomcat 6.x

<property environment="env"/>
<loadproperties>
  <zipentry zipfile="${env.CATALINA_HOME}/bin/bootstrap.jar" name="META-INF/MANIFEST.MF"/>
  <filterchain>
    <prefixlines prefix="tomcat."/>
  </filterchain>
</loadproperties>

<!-- Prints MAJOR.MINOR version, e.g.: 8.0 -->
<echo message="Tomcat Version: ${tomcat.Specification-Version}"/>

<!-- Prints full version, e.g.: 8.0.26 -->
<echo message="Tomcat Release: ${tomcat.Implementation-Version}"/>