Giter VIP home page Giter VIP logo

tomcat-formula's Introduction

tomcat

Travis CI Build Status Semantic Release

Formula to set up and configure tomcat webserver

See the full SaltStack Formulas installation and usage instructions.

If you are interested in writing or contributing to formulas, please pay attention to the Writing Formula Section.

If you want to use this formula, please pay attention to the FORMULA file and/or git tag, which contains the currently released version. This formula is versioned according to Semantic Versioning.

See Formula Versioning Section for more details.

If you need (non-default) configuration, please pay attention to the pillar.example file and/or Special notes section.

Commit message formatting is significant!!

Please see How to contribute for more details.

None

Installs Tomcat and starts the service. The main configuration files are not changed, and the distro's defaults are preserved as they come in the package.

Configures the configuration file. Sane defaults are provided for the major Linux distros (Debian, RedHat, Arch) and their derivatives.

Installs Apache Portable Runtime for Tomcat. Depends on tomcat.config to manage the configuration.

Installs the host-manager and manager web applications for Apache Tomcat.

Configures Tomcat name-based virtual hosts using data from Pillar.

Enables Tomcats' ExpiresFilter using data from Pillar.

Configures Tomcat simple TCP cluster using data from Pillar.

Configures context element in the $CATALINA_BASE/conf/context.xml file: the information in this file will be loaded by all web applications. (Check the context examples in the pillar.example file for more information.

Linux testing is done with kitchen-salt.

  • Ruby
  • Docker
$ gem install bundler
$ bundle install
$ bin/kitchen test [platform]

Where [platform] is the platform name defined in kitchen.yml, e.g. debian-9-2019-2-py3.

Creates the docker instance and runs the TEMPLATE main state, ready for testing.

Runs the inspec tests on the actual instance.

Removes the docker instance.

Runs all of the stages above in one go: i.e. destroy + converge + verify + destroy.

Gives you SSH access to the instance for manual testing.

tomcat-formula's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tomcat-formula's Issues

State tomcat.config.tomcat_conf.file.managed fails on MacOS

On MacOS the variable {{ tomcat.main_config }} causes failed state, because bin/ is absent in /usr/local/opt/tomcat/libexec/.

         ID: tomcat_conf
    Function: file.managed
        Name: /usr/local/opt/tomcat/libexec/bin/setenv.sh
      Result: False
     Comment: Parent directory not present
     Started: 11:32:38.260754
    Duration: 13.34 ms
     Changes:

...

          ID: tomcat
    Function: service.running
        Name: homebrew.mxcl.tomcat
      Result: False
     Comment: One or more requisite failed: tomcat.config.tomcat_conf
     Changes:

tomcat.native Symlink Broken on Trusty

When using the tomcat.native state on Trusty, I receive the following error message is in catalina.out:

SEVERE: Failed to initialize connector [Connector[HTTP/1.1-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:813)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:638)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:663)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:280)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:454)
Caused by: org.apache.catalina.LifecycleException: The configured protocol 
[org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is not available
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:972)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        ... 12 more

I believe this bug was introduced in d3a36d9 while creating a workaround for LP#1326255. It appears to change the target of libtcnative-1.so instead of symlinking to it. Since libtcnative-1.so is itself a symlink to libtcnative-1.so.0.1.29, Salt updates the link rather than throwing an error.

Here's what /usr/lib/{x86_64-linux-gnu/,}libtcnative-1.so looks like with libtcnative-1 installed, but before calling highstate:

# ls -l /usr/lib/x86_64-linux-gnu/libtcnative-1.so
lrwxrwxrwx 1 root root 23 Dec 25  2013 /usr/lib/x86_64-linux-gnu/libtcnative-1.so -> libtcnative-1.so.0.1.29
# ls -l /usr/lib/libtcnative-1.so
ls: cannot access /usr/lib/libtcnative-1.so: No such file or directory

Here's what they look like after calling highstate:

# ls -l /usr/lib/x86_64-linux-gnu/libtcnative-1.so
lrwxrwxrwx 1 root root 25 Apr 11 10:31 /usr/lib/x86_64-linux-gnu/libtcnative-1.so -> /usr/lib/libtcnative-1.so
# ls -l /usr/lib/libtcnative-1.so
ls: cannot access /usr/lib/libtcnative-1.so: No such file or directory

Centos: package not found


      ID: tomcat7
Function: pkg.installed
  Result: False
 Comment: The following package(s) were not found, and no possible matches were found in the package db: tomcat7
 Changes:   

Debian settings in osmap.yaml conflict

Everything is hard-coded for tomcat8, ignoring the version and requiring the user override every property.

          ID: tomcat
    Function: pkg.installed
        Name: tomcat8
      Result: False
     Comment: Problem encountered installing package(s). Additional info follows:

              errors:
                  - E: Version '7' for 'tomcat8' was not found
     Started: 15:26:08.279425
    Duration: 67624.108 ms
     Changes:   

The version property now refers to the package version rather than the major version e.g., 7 or 8.

RFE: Abstract MacOS/Darwin from Tomcat vendor

The Tomcat formula only supports Homebrew as software vendor of Tomcat. Need to introduce support for other software vendors of Tomcat for MacOS/Darwin.

osmap.yaml

+  #Not used on Arch
 +  manager_pkg:
 +MacOS:
 +  {% set darwin_javahome = salt['cmd.run']('/usr/libexec/java_home') if grains.os =='MacOS' else {} %}
 +  service: homebrew.mxcl.tomcat`

Tomcat takes very long to start up on a fresh Ubuntu VM

When deploying Tomcat server on a fresh VM using automation just after the boot, it takes very long for the service to start accepting requests (> 3 mins average). Per https://www.digitalocean.com/community/questions/fresh-tomcat-takes-loong-time-to-start-up, this is a low entropy problem which could be mitigated by installing haveged package. I think the formula could be enhanced by adding this package installation when running on Ubuntu.

Missing YAML output filters lead to render-time errors

This formula renders variables without the use of the yaml or yaml_encode filters, for example in the current version of tomcat/config.sls:

tomcat_conf:
[...]
  file.managed:
    - name: {{ tomcat.main_config }}
    - source: {{ tomcat.main_config_template }}
    - makedirs: True
    - template: jinja
    - defaults:
        tomcat: {{ tomcat }}

This leads to render-time parsing errors because of differences in syntax between the Python pretty printer (as invoked by the Jinja code above) and YAML, for example when applying the above SLS on a CentOS 7 minion running Salt 2018.3.0:

local:
    Data failed to compile:
----------
    Rendering SLS 'development:tomcat.config' failed: found unexpected ':'; line 16

---
[...]
    - name: /etc/sysconfig/tomcat
    - source: salt://tomcat/files/tomcat-default-CentOS.template
    - makedirs: True
    - template: jinja
    - defaults:
        tomcat: {u'main_config_template': u'salt://tomcat/files/tomcat-default-CentOS.template', u'java_opts': ['XX:+UseG1GC', 'Xmx2048m', 'XX:MaxPermSize=128m', 'classpath /usr/share/java/mysql-connector-java.jar'], u'main_config': u'/etc/sysconfig/tomcat', u'catalina_pid': u'/var/run/tomcat.pid', u'cluster': {u'simple': True}, u'connectors': {'ajp': {'protocol': 'AJP/1.3', 'port': 8009}}, u'pkg': u'tomcat', u'id': [u'example.com', u'example.net'], u'jvm_tmp': u'/tmp/tomcat', u'catalina_tmpdir': u'/var/cache/tomcat/temp', u'service': u'tomcat', u'sites': {}, u'java_home': '/usr/lib/jvm/java', u'manager_pkg': u'tomcat-admin-webapps', u'resources': {}, u'native_pkg': u'tomcat-native', u'service_enabled': True, u'user': u'tomcat', u'group': u'tomcat', u'catalina_home': u'/usr/share/tomcat', u'with_haveged': False, u'conf_dir': u'/etc/tomcat', u'haveged_enabled': False, u'catalina_base': u'/usr/share/tomcat', u'limit': {u'hard': 64000, u'soft': 64000}, u'ver': 7}    <======================

    - require:
      - pkg: tomcat
    - require_in:
      - service: tomcat
[...]
---

Note the Python pretty printer's output of Unicode string literals in the above. While this is valid Python dictionary key syntax, it is not valid YAML. The correct way to render such variables is by wrapping them with the yaml (for lists and mappings) or yaml_encode (for scalars and strings) filters. For string substitutions it's better to use Jinja's format filter to compose the strings and filter the output of that through yaml_encode. This will ensure that only valid YAML gets output by the Jinja processor.

RHEL7 mutliple classpaths

If you try to use the enviornmental variable Java_OPTS to define your class path in RHEL7 and tomcat7, you will get 2 classpath's on the java pid at run time. Needless to say, you lose. We need a way to be able to define the CLASSPATH environmental variable in the tomcat_main_config. See pull request...

JDBC support

Hi all,

I'm wondering should jdbc support be included in this formula or should it go into the java formula or into it's own separate formula? I've merged support for mysql/pgsql jdbc in my own master branch and I am just wondering what your thoughts would be about the subject.

https://github.com/fintanmm/tomcat-formula/tree/master/tomcat

Thanks
fintan

Darwin - Missing support

Need support for Darwin (MacOS).

[ERROR   ] Rendering exception occurred: Jinja variable 'dict object' has no attribute 'main_config_template'
[CRITICAL] Rendering SLS 'base:tomcat.config' failed: Jinja variable 'dict object' has no attribute 'main_config_template'
[ERROR   ] Rendering exception occurred: Jinja variable 'dict object' has no attribute 'native_pkg'
[CRITICAL] Rendering SLS 'base:tomcat.native' failed: Jinja variable 'dict object' has no attribute 'native_pkg'
[ERROR   ] Rendering exception occurred: Jinja variable 'dict object' has no attribute 'manager_pkg'
[CRITICAL] Rendering SLS 'base:tomcat.manager' failed: Jinja variable 'dict object' has no attribute 'manager_pkg'
local:
    Data failed to compile:
----------
    Rendering SLS 'base:tomcat.config' failed: Jinja variable 'dict object' has no attribute 'main_config_template'
----------
    Rendering SLS 'base:tomcat.native' failed: Jinja variable 'dict object' has no attribute 'native_pkg'
----------
    Rendering SLS 'base:tomcat.manager' failed: Jinja variable 'dict object' has no attribute 'manager_pkg'

config.sls refers to non-existent `limit.hard` and `limit.soft`

#46 (specifically d3a36d9) introduces a bug whereby limit_hard and limit_soft in config.sls are changed to limit.hard and limit.soft respectively, but these values are not changed anywhere else (specifically in defaults.yaml), so unless you override the default values, Jinja throws a rendering issue.

JAVA option handling is suboptimal

This formula really shouldn't require global java keys in the pillar and the file.append approach is quite horrible as it adds new lines whenever an option changes and also doesn't allow users to set additional options.

It would, IMHO, be much better to simply allow users to set JAVA_OPTS in their entirety in the pillar with a sensible default.

MacOS issue

This will not work if Java is not installed yet

{% set darwin_javahome = salt['cmd.run']('/usr/libexec/java_home') if grains.os =='MacOS' else {} %}

Debian 10 support with tomcat9

I'm using this formula for Debian 9 (tomcat8) and wanted to use it for Debian 10 as well (tomcat9), which isn't supported by the formula yet. At first that seemed as easy as applying the correct information to the codenamemap.

However, the map.jinja seems to merge the osmap and oscodenamemap in the reverse order (at least compared to the implementation in most formulas).
In most formulas the map.jinja works with mapping yml files, where the more generic mappings are overruled by the more specific mappings. E.g.:
defaults.yml -> osfamilymap.yml -> osmap.yml -> oscodenamemap.yml

Is there a good reason why this is implemented differently in this fomula's map.jinja? As it doesn't seem to work as expected.

Are there objections against changing that in a more common used?

I can create a pull request if that works.

Native components fails to install


      ID: libtcnative-1
Function: pkg.installed
  Result: False
 Comment: The following package(s) were not found, and no possible matches were found in the package db: libtcnative-1
 Started:
 Duration:
 Changes:

Looks like the package name is incorrect for RedHat, I'll issue a PR for the updated map.

tomcat states can't be combined due to conflicting ID's

States tomcat.package and tomcat.ssl can't be combined due to the conflicting ID's.

top.sls

  'tomcat.host':
    - tomcat
    - tomcat.ssl

error during highstate

local:
    Data failed to compile:
----------
    Detected conflicting IDs, SLS IDs need to be globally unique.
    The conflicting ID is "tomcat7" and is found in SLS "base:tomcat.package" and SLS "base:tomcat.ssl"

osmap.yaml references java_home

I'm not sure tomcat-formula should set java_home in osmap.yaml. Its also a variable in tomcat namespace in pillar.example. Should this not be a shared pillar value?

Archlinux: salt detects upstart so service.running fails

Function service.running fails on Archlinux.

          ID: tomcat
    Function: service.running
        Name: tomcat8
      Result: False
     Comment: An exception occurred in this state: Traceback (most recent call last):
                File "/usr/lib/python2.7/site-packages/salt/state.py", line 1837, in call
                  **cdata['kwargs'])
                File "/usr/lib/python2.7/site-packages/salt/loader.py", line 1794, in wrapper
                  return f(*args, **kwargs)
                File "/usr/lib/python2.7/site-packages/salt/states/service.py", line 887, in mod_watch
                  __salt__['service.stop'](name)
                File "/usr/lib/python2.7/site-packages/salt/modules/service.py", line 119, in stop
                  return __salt__['service.run'](name, 'stop')
                File "/usr/lib/python2.7/site-packages/salt/modules/service.py", line 93, in run
                  return not __salt__['cmd.retcode'](cmd, python_shell=False)
                File "/usr/lib/python2.7/site-packages/salt/modules/cmdmod.py", line 1882, in retcode
                  **kwargs)
                File "/usr/lib/python2.7/site-packages/salt/modules/cmdmod.py", line 564, in _run
                  raise CommandExecutionError(msg)
              CommandExecutionError: Unable to run command '['/etc/init.d/tomcat8', 'stop']' 
           <<cut>>
 reason: command not found

found conflicting ID 'with_haveged'

I am just running the tomcat state on Debian 9 and I get this error:
salt tomcat-web1 state.sls tomcat

tomcat-web1:
    Data failed to compile:
----------
    Rendering SLS 'base:tomcat' failed: Jinja syntax error: Encountered error loading yaml: found conflicting ID 'with_haveged'
---
[...]
  resources: {}

  #Relocated from pillar.example
  id: ['example.com','example.net']
  jvm_tmp: /tmp/tomcat
  with_haveged: true    <======================
  haveged_enabled: true
  cluster:
    simple: true

  catalina_base: /usr/share/tomcat
[...]
---
/var/cache/salt/minion/files/base/tomcat/map.jinja(4):
---
# -*- coding: utf-8 -*-
# vim: ft=jinja

{% import_yaml "tomcat/defaults.yaml" as defaults %}    <======================
{% import_yaml "tomcat/osmap.yaml" as osmap %}
{% import_yaml "tomcat/codenamemap.yaml" as codemap %}

{# get the settings for the os_family grain #}
{% set osfam = salt['grains.filter_by'](osmap) or {} %}
[...]
---

I believe when I just run it like this it should install the standard tomcat package.

SUSE: wrong ver inherited by tomcat.config state

SUSE uses tomcat 8 but inherits wrong version value from defaults.yaml leading to inconsistent configuration being applied (see below). Addingsuse.ver to osmap.yaml fixes the issue.

Extract from suse_tomcat_resultt.log.txt

limits_conf:

  file.managed:
    - name: /etc/security/limits.d/tomcat7.conf
    - contents:

Wanted configuration:

limits_conf:

  file.managed:
    - name: /etc/security/limits.d/tomcat8.conf
    - contents:

Tomcat.Config state fails with error - Jinja variable list object has no element 0

Background:
We are carrying out a POC of SaltStack to be used in App Env Provisioning/Management via java-based netAPI modules with CherryPy service.

Issue:
We ran into a problem while trying to apply the tomcat.config state via command line (once this succeeds we will plan to apply via netAPI) where the run fails while creating a managed server.xml file and hence the service fails to start. Please note that the package was installed successfully.

Error Message:
Full output and Environment details are copied at the bottom of this issue, Just copying the root cause of the failure here:

_file_|-server_xml_|-/etc/tomcat6/server.xml_|-managed:
    ----------
    __run_num__:
        5
    changes:
        ----------
    comment:
        Unable to manage file: Jinja variable list object has no element 0
    duration:
        662.827
    name:
        /etc/tomcat6/server.xml
    result:
        False
    start_time:
        11:33:51.940248_

Environment Details:

System:
Red Hat Enterprise Linux Server release 6.8 (Santiago)

Salt Versions:
[MASKED@MASKED salt]# salt --versions-report
Salt: 2015.5.10
Python: 2.7.12 (default, Dec 6 2016, 12:45:38)
Jinja2: 2.8
M2Crypto: 0.25.1
msgpack-python: 0.4.8
msgpack-pure: 0.1.3
pycrypto: 2.6.1
libnacl: Not Installed
PyYAML: 3.12
ioflo: Not Installed
PyZMQ: 14.0.0
RAET: Not Installed
ZMQ: 4.0.8
Mako: Not Installed
Tornado: 4.4.2
timelib: 0.2.4
dateutil: 2.5.3

Complete Output:

MASKED:
    ----------
    file_|-100_server_xml_|-100_server_xml_|-accumulated:
        ----------
        __run_num__:
            4
        changes:
            ----------
        comment:
        duration:
            32.984
        name:
            100_server_xml
        result:
            True
        start_time:
            11:33:51.906130
    file_|-400_server_xml_|-400_server_xml_|-accumulated:
        ----------
        __run_num__:
            3
        changes:
            ----------
        comment:
            Accumulator 400_server_xml for file /etc/tomcat6/server.xml was charged by text
        duration:
            62.042
        name:
            400_server_xml
        result:
            True
        start_time:
            11:33:51.841904
    file_|-500_server_xml_|-500_server_xml_|-accumulated:
        ----------
        __run_num__:
            2
        changes:
            ----------
        comment:
        duration:
            25.113
        name:
            500_server_xml
        result:
            True
        start_time:
            11:33:51.816044
    file_|-limits_conf_|-/etc/security/limits.d/tomcat7.conf_|-managed:
        ----------
        __run_num__:
            6
        changes:
            ----------
        comment:
            File /etc/security/limits.d/tomcat7.conf is in the correct state
        duration:
            52.333
        name:
            /etc/security/limits.d/tomcat7.conf
        result:
            True
        start_time:
            11:33:52.604187
    file_|-server_xml_|-/etc/tomcat6/server.xml_|-managed:
        ----------
        __run_num__:
            5
        changes:
            ----------
        comment:
            Unable to manage file: Jinja variable list object has no element 0
        duration:
            662.827
        name:
            /etc/tomcat6/server.xml
        result:
            False
        start_time:
            11:33:51.940248
    file_|-tomcat_conf_|-/etc/sysconfig/tomcat6_|-managed:
        ----------
        __run_num__:
            1
        changes:
            ----------
            diff:
                ---
                +++
                @@ -27,7 +27,7 @@

                 # You can pass some parameters to java here if you wish to
                 #JAVA_OPTS="-Xminf0.1 -Xmaxf0.3"
                -JAVA_OPTS="-Djava.awt.headless=true -Xmx256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
                +JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"

                 # Use JAVA_OPTS to set java.library.path for libtcnative.so
                 #JAVA_OPTS="-Djava.library.path=/usr/lib64"
        comment:
            File /etc/sysconfig/tomcat6 updated
        duration:
            804.27
        name:
            /etc/sysconfig/tomcat6
        result:
            True
        start_time:
            11:33:51.008464
    pkg_|-tomcat_|-tomcat6_|-installed:
        ----------
        __run_num__:
            0
        changes:
            ----------
        comment:
            Package tomcat6 is already installed.
        duration:
            8505.572
        name:
            tomcat6
        result:
            True
        start_time:
            11:33:42.287560
    service_|-tomcat_|-tomcat6_|-running:
        ----------
        __run_num__:
            7
        __sls__:
            tomcat
        changes:
            ----------
        comment:
            One or more requisite failed: tomcat.config.server_xml
        result:
            ****False****

Mysterious tomcat.version variable in init.sls

The init.sls refers to a tomcat.version variable not defined or referenced elsewhere.

tomcat:
  pkg.installed:
    - name: {{ tomcat.pkg }}
    {% if tomcat.version is defined %}
    - version: {{ tomcat.version }}
    {% endif %}

Maybe the following was intended?

tomcat:
  pkg.installed:
    - name: {{ tomcat.pkg }}
    - version: '{{ tomcat.ver }}*'

vhosts.sls not working

I needed to edit vhosts.sls to get it working. It would never apply any vhost settings otherwise.

I added the bolded line below to get it working.

tomcat 300_server_xml:
file.accumulated:
- name: 300_server_xml

SLS Rendering - Jinja variable host_name is undefined

Where and how should this variable be defined for any distro?

pillar.example: example.com: # must be unique; used as an ID declaration in Salt; also used in the template as {{ host_name }} is name is not declared
/files/server.xml: {%- set host_name = site.name if site.name is defined else id %}
files/server.xml: <Host name="{{ host_name }}"

README and pillar.example are unhelpful. Whats the best thing to do here? Any PR needed?

Travis CI - service running fails with no java

States work on CentOS/Vagrant but fails in Travis CI. NOTE: Tomcat has dependency on Java!!

----------
          ID: tomcat package installed and service running
    Function: service.running
        Name: tomcat
      Result: True
     Comment: Service tomcat has been enabled, and is running
     Started: 09:52:39.541845
    Duration: 273.18 ms
     Changes:   
              ----------
              tomcat:
                  True

[root@selenium-node salt]# systemctl list-unit-files | grep tomcat
tomcat.service                                enabled 
[email protected]                               disabled

Best solution might be to set service_enabled: False in pillar.example
so Travis/Kitchen tests are not misleadingly failing.

                 ID: whats wrong with tomcat service
           Function: cmd.run
               Name: systemctl status tomcat8
             Result: False
            Comment: Command "systemctl status tomcat8" run
            Started: 18:57:55.444799
           Duration: 22.749 ms
            Changes:   
              ----------
              pid:
                  6412
              retcode:
                  3
              stderr:
              stdout:
                  โ— tomcat8.service - LSB: Start Tomcat.
                     Loaded: loaded (/etc/init.d/tomcat8; generated)
                     Active: failed (Result: exit-code) since Fri 2019-02-15 18:57:50 UTC; 4s ago
                       Docs: man:systemd-sysv-generator(8)
                  
                  Feb 15 18:57:50 salt-formula.ci.local systemd[1]: Starting LSB: Start Tomcat....
                  Feb 15 18:57:50 salt-formula.ci.local systemd[1]: tomcat8.service: Control process exited, code=exited status=1
                  Feb 15 18:57:50 salt-formula.ci.local systemd[1]: tomcat8.service: Failed with result 'exit-code'.
                  Feb 15 18:57:50 salt-formula.ci.local systemd[1]: Failed to start LSB: Start Tomcat..

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.