| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content=""> |
| <meta name="keywords" content="installationdocker, docker, configuration, CLI, cli"> |
| <title>CLI Reference | Eclipse Che Documentation</title> |
| <link rel="stylesheet" href="css/syntax.css"> |
| |
| <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous"> |
| <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">--> |
| <link rel="stylesheet" href="css/modern-business.css"> |
| <!-- Latest compiled and minified CSS --> |
| <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> |
| <link rel="stylesheet" href="css/customstyles.css"> |
| <link rel="stylesheet" href="css/boxshadowproperties.css"> |
| <!-- most color styles are extracted out to here --> |
| <link rel="stylesheet" href="css/theme-che.css"> |
| |
| |
| <link rel="stylesheet" href="/css/coderay.css" media="screen" type="text/css"> |
| |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js" crossorigin="anonymous"></script> |
| |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js" crossorigin="anonymous"></script> |
| <script src="js/jquery.navgoco.min.js"></script> |
| |
| |
| <!-- Latest compiled and minified JavaScript --> |
| <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> |
| <!-- Anchor.js --> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/2.0.0/anchor.min.js" crossorigin="anonymous"></script> |
| <script src="js/toc.js"></script> |
| <script src="js/customscripts.js"></script> |
| |
| <link rel="shortcut icon" href="che/docs/images/favicon.ico"> |
| |
| <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> |
| <!--[if lt IE 9]> |
| <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> |
| <![endif]--> |
| |
| <link rel="alternate" type="application/rss+xml" title="che" href="http://0.0.0.0:4000/feed.xml"> |
| |
| <script> |
| $(document).ready(function() { |
| // Initialize navgoco with default options |
| $("#mysidebar").navgoco({ |
| caretHtml: '', |
| accordion: true, |
| openClass: 'active', // open |
| save: false, // leave false or nav highlighting doesn't work right |
| cookie: { |
| name: 'navgoco', |
| expires: false, |
| path: '/' |
| }, |
| slide: { |
| duration: 400, |
| easing: 'swing' |
| } |
| }); |
| |
| $("#collapseAll").click(function(e) { |
| e.preventDefault(); |
| $("#mysidebar").navgoco('toggle', false); |
| }); |
| |
| $("#expandAll").click(function(e) { |
| e.preventDefault(); |
| $("#mysidebar").navgoco('toggle', true); |
| }); |
| |
| }); |
| |
| </script> |
| <script> |
| $(function () { |
| $('[data-toggle="tooltip"]').tooltip() |
| }) |
| </script> |
| <script> |
| $(document).ready(function() { |
| $("#tg-sb-link").click(function() { |
| $("#tg-sb-sidebar").toggle(); |
| $("#tg-sb-content").toggleClass('col-md-9'); |
| $("#tg-sb-content").toggleClass('col-md-12'); |
| $("#tg-sb-icon").toggleClass('fa-toggle-on'); |
| $("#tg-sb-icon").toggleClass('fa-toggle-off'); |
| }); |
| }); |
| </script> |
| |
| |
| </head> |
| <body> |
| <!-- Navigation --> |
| <nav class="navbar navbar-inverse navbar-static-top"> |
| <div class="container topnavlinks"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| <a class="fa fa-home fa-lg navbar-brand" href="index.html"> <span class="projectTitle"> Eclipse Che Documentation</span></a> |
| </div> |
| <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> |
| <ul class="nav navbar-nav navbar-right"> |
| <!-- toggle sidebar button --> |
| <li><a id="tg-sb-link" href="#"><i id="tg-sb-icon" class="fa fa-toggle-on"></i> Nav</a></li> |
| <!-- entries without drop-downs appear here --> |
| |
| |
| |
| |
| |
| |
| |
| <li><a href="https://medium.com/eclipse-che-blog/" target="_blank">Blog</a></li> |
| |
| |
| |
| <li><a href="https://github.com/eclipse/che" target="_blank">Source Code</a></li> |
| |
| |
| |
| <!-- entries with drop-downs appear here --> |
| <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.--> |
| |
| |
| <li class="dropdown"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">Get Support<b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li><a href="https://github.com/eclipse/che/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Akind%2Fbug" target="_blank">Known Bugs</a></li> |
| |
| |
| |
| <li><a href="https://github.com/eclipse/che/issues/new" target="_blank">File an Issue</a></li> |
| |
| |
| |
| <li><a href="https://stackoverflow.com/questions/tagged/eclipse-che" target="_blank">Che on StackOverflow</a></li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| <!-- |
| <li> |
| |
| |
| |
| <a class="email" title="Submit feedback" href="#" onclick="javascript:window.location='mailto:?subject= feedback&body=I have some feedback about the CLI Reference page: ' + window.location.href;"><i class="fa fa-envelope-o"></i> Feedback</a> |
| |
| </li> |
| --> |
| |
| <!--comment out this block if you want to hide search--> |
| <li> |
| <!--start search--> |
| <div id="search-demo-container"> |
| <input type="text" id="search-input" placeholder="search..."> |
| <ul id="results-container"></ul> |
| </div> |
| <script src="js/jekyll-search.js" type="text/javascript"></script> |
| <script type="text/javascript"> |
| SimpleJekyllSearch.init({ |
| searchInput: document.getElementById('search-input'), |
| resultsContainer: document.getElementById('results-container'), |
| dataSource: 'search.json', |
| searchResultTemplate: '<li><a href="{url}" title="CLI Reference">{title}</a></li>', |
| noResultsText: 'No results found.', |
| limit: 10, |
| fuzzy: true, |
| }) |
| </script> |
| <!--end search--> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <!-- /.container --> |
| </nav> |
| |
| <!-- Page Content --> |
| <div class="container"> |
| <div id="main"> |
| <!-- Content Row --> |
| <div class="row"> |
| |
| |
| <!-- Sidebar Column --> |
| <div class="col-md-3" id="tg-sb-sidebar"> |
| |
| |
| <ul id="mysidebar" class="nav"> |
| <li class="sidebarTitle"> </li> |
| |
| |
| |
| |
| |
| <li> |
| <a href="#">Overview</a> |
| <ul> |
| |
| |
| |
| <li><a href="index.html">Introduction</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="quick-start.html">Getting Started</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="single-multi-user.html">Single and Multi-User Flavors</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="infra-support.html">Supported Infrastructures</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Che on Docker</a> |
| <ul> |
| |
| |
| |
| <li><a href="docker-single-user.html">Docker - Single User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="docker-multi-user.html">Docker - Multi User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="docker-config.html">Docker - Configuration</a></li> |
| |
| |
| |
| |
| |
| |
| <li class="active"><a href="docker-cli.html">Docker - CLI Reference</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Che on Kubernetes</a> |
| <ul> |
| |
| |
| |
| <li><a href="kubernetes-single-user.html">Kubernetes - Single User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="kubernetes-multi-user.html">Kubernetes - Multi User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="kubernetes-config.html">Kubernetes - Configuration</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="kubernetes-admin-guide.html">Kubernetes - Admin Guide</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Che on OpenShift</a> |
| <ul> |
| |
| |
| |
| <li><a href="openshift-single-user.html">OpenShift - Single User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="openshift-multi-user.html">OpenShift - Multi User</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="openshift-config.html">OpenShift - Configuration</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="openshift-admin-guide.html">OpenShift - Admin Guide</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">User Management</a> |
| <ul> |
| |
| |
| |
| <li><a href="user-management.html">Authentication and Authorization</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="authentication.html">Security Model</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="permissions.html">Permissions</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="organizations.html">Organizations in UD</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="resource-management.html">Resource Management</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">User Guides</a> |
| <ul> |
| |
| |
| |
| <li><a href="creating-starting-workspaces.html">Creating and starting Workspaces</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="ide-projects.html">Projects</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="editor-code-assistance.html">Editor and Code-Assistance</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="dependency-management.html">Dependency Management</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="commands-ide-macro.html">Commands and IDE Macros</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="version-control.html">Version Control</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="debug.html">Debug</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Workspace Administration</a> |
| <ul> |
| |
| |
| |
| <li><a href="what-are-workspaces.html">Workspace Overview</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="stacks.html">Workspace - Stacks</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="recipes.html">Workspace - Recipes</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="servers.html">Workspace - Servers</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="installers.html">Workspace - Installers</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="volumes.html">Workspace - Volumes Mount</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="env-variables.html">Workspace - Environment Variables</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="projects.html">Workspace - Projects</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="workspaces-troubleshooting.html">Workspace - Troubleshooting</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="workspace-data-model.html">Workspace Data Model</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Portable Workspaces</a> |
| <ul> |
| |
| |
| |
| <li><a href="chedir-getting-started.html">Chedir - Getting Started</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="why-chedir.html">Chedir - Why Chedir?</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="chedir-installation.html">Chedir - Installation</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="chedir-project-setup.html">Chedir - Project Setup</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="chedir-up-and-down.html">Chedir - Up and Down</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="chefile.html">Chedir - Chefile</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="chedir-ssh.html">Chedir - SSH</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="factories-getting-started.html">Factory - Getting Started</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="creating-factories.html">Factory - Creating</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="factories_json_reference.html">Factory - JSON Reference</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Developer Guides</a> |
| <ul> |
| |
| |
| |
| <li><a href="framework-overview.html">Overview</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="rest-api.html">SDK - REST API</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="che-in-che-quickstart.html">SDK - Your First Plugin</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="build-reqs.html">SDK - Building Che</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="assemblies.html">SDK - Assemblies</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="logging.html">SDK - Logging</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="ide-extensions-gwt.html">SDK - GWT IDE Extensions</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="server-side-extensions.html">SDK - Server Side Extensions</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="custom-installers.html">SDK - Installers</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="project-types.html">SDK - Project Types</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="language-servers.html">SDK - Language Support</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="parts.html">IDE UI: Parts</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="actions.html">IDE UI: Actions</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Dev Essentials</a> |
| <ul> |
| |
| |
| |
| <li><a href="guice.html">Dependency Injection</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="dto.html">Transport: DTO</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="json-rpc.html">Communication: JSON-RPC</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="handling-projects-in-plugins.html">Handling Projects in Plugins</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="dao.html">Persistence, DAO</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="properties.html">Properties</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li> |
| <a href="#">Infrastructure and SPI</a> |
| <ul> |
| |
| |
| |
| <li><a href="spi_overview.html">Overview</a></li> |
| |
| |
| |
| |
| |
| |
| <li><a href="spi-implementation.html">Implementation Notes</a></li> |
| |
| |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <!-- if you aren't using the accordion, uncomment this block: |
| <p class="external"> |
| <a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a> |
| </p> |
| --> |
| </ul> |
| |
| <!-- this highlights the active parent class in the navgoco sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.--> |
| <script>$("li.active").parents('li').toggleClass("active");</script> |
| |
| </div> |
| |
| |
| |
| |
| <!-- Content Column --> |
| <div class="col-md-9" id="tg-sb-content"> |
| <div class="post-header"> |
| <h1 class="post-title-main">CLI Reference</h1> |
| </div> |
| |
| |
| |
| <div class="post-content"> |
| |
| |
| |
| |
| |
| <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. --> |
| <script> |
| $( document ).ready(function() { |
| // Handler for .ready() called. |
| $('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2' }); |
| /* this offset helps account for the space taken up by the floating toolbar. */ |
| $('#toc').on('click', 'a', function() { |
| var target = $(this.getAttribute('href')) |
| , scroll_target = target.offset().top |
| $(window).scrollTop(scroll_target - 10); |
| return false |
| }) |
| |
| }); |
| </script> |
| |
| <div id="toc"></div> |
| |
| |
| |
| |
| <!-- |
| |
| |
| --> |
| |
| <div class="sect1"> |
| <h2 id="cli-syntax-and-commands">CLI Syntax and Commands</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The CLI is a Docker image that comes with a collection of commands to configure, interact and start Che. The CLI also contains commands for end users to interact with workspaces such as sync and ssh.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>USAGE: |
| docker run -it --rm <DOCKER_PARAMETERS> eclipse/che-cli:<version> [COMMAND] |
| |
| MANDATORY DOCKER PARAMETERS: |
| -v <LOCAL_PATH>:/data Where user, instance, and log data saved |
| |
| OPTIONAL DOCKER PARAMETERS: |
| -e CHE_HOST=<YOUR_HOST> IP address or hostname where che will serve its users |
| -e CHE_PORT=<YOUR_PORT> Port where che will bind itself to |
| -e CHE_CONTAINER=<YOUR_NAME> Prefix name for the che container |
| -v <LOCAL_PATH>:/data/instance Where instance, user, log data will be saved |
| -v <LOCAL_PATH>:/data/backup Where backup files will be saved |
| -v <LOCAL_PATH>:/repo che git repo - uses local binaries and manifests |
| -v <LOCAL_PATH>:/assembly che assembly - uses local binaries |
| -v <LOCAL_PATH>:/sync Where remote ws files will be copied with sync command |
| -v <LOCAL_PATH>:/unison Where unison profile for optimizing sync command resides |
| -v <LOCAL_PATH>:/chedir Soure repository to convert into workspace with Chedir utility |
| |
| COMMANDS: |
| action <action-name> Start action on che instance |
| backup Backups che configuration and data to /data/backup volume mount |
| config Generates a che config from vars; run on any start / restart |
| destroy Stops services, and deletes che instance data |
| dir <command> Use Chedir and Chefile in the directory mounted to :/chedir |
| download Pulls Docker images for the current che version |
| help This message |
| info Displays info about che and the CLI |
| init Initializes a directory with a che install |
| offline Saves che Docker images into TAR files for offline install |
| restart Restart che services |
| restore Restores che configuration and data from /data/backup mount |
| rmi Removes the Docker images for <version>, forcing a repull |
| ssh <wksp-name> [machine-name] SSH to a workspace if SSH agent enabled |
| start Starts che services |
| stop Stops che services |
| sync <wksp-name> Synchronize workspace with local directory mounted to :/sync |
| test <test-name> Start test on che instance |
| upgrade Upgrades che from one version to another with migrations and backups |
| version Installed version and upgrade paths |
| |
| GLOBAL COMMAND OPTIONS: |
| --fast Skips networking, version, nightly and preflight checks |
| --offline Runs CLI in offline mode, loading images from disk |
| --debug Enable debugging of che server |
| --trace Activates trace output for debugging CLI</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The CLI has three primary phases: initialization, configuration, and start. The initialization phase is executed by <code>init</code> and will install version-specific files into the folder mounted to <code>/data</code>. This includes the universal configuration file named <code>che.env</code>, a version identifier, and a location where configuration files will be saved. The configuration is executed by the <code>config</code> command and takes as input your <code>che.env</code> configuration file, the OS of your host, and then generates an OS-specific set of configuration files in the <code>/data/instance</code> folder that can be used to run an instance of Che. The configuration phase will run an initialization if a folder is not found. Every execution of the <code>config</code> command will overwrite the files in <code>/data/instance</code> with the latest configuration. This way if an admin modifies any configuration file, the instance’s configuration files will be updated to be guaranteed consistent. The CLI generates a large number of configuration files specific to running Che. The configuration files are sourced from Puppet templates that are stored in our GitHub repository under <code>/dockerfiles/init</code>. The start phase is executed by <code>start</code> and will use a configuration-generated <code>docker-compose-container.yml</code> file to launch Eclipse Che. The start phase always executes a <code>config</code> command, so any files that were edited in <code>/data/instance</code> will be overwritten with the generated configuration from the CLI.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The CLI will hide most error conditions from standard out. Internal stack traces and error output is redirected to <code>cli.log</code>, which is saved in the host folder where <code>:/data</code> is mounted.</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can override any value in <code>che.env</code> for a single execution by passing in <code>-e NAME=VALUE</code> on the command line. The CLI will detect the values on the command line and ignore those imported from <code>che.env</code>.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>action</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Executes some actions on the Eclipse Che instance or on a workspace running inside Che. For example to list all workspaces on Che, the following command can be used <code>action list-workspaces</code>. To execute a command on a workspace <code>action execute-command <workspace-name> <action></code> where action can be any bash command.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>backup</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>TARS your <code>/instance</code> into files and places them into <code>/backup</code>. These files are restoration-ready.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>config</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Generates a Che instance configuration thta is placed in <code>/instance</code>. This command uses puppet to generate Docker Compose configuration files to run Che and its associated server. Che’s server configuration is generated as a che.properties file that is volume mounted into the Che server when it boots. This command is executed on every <code>start</code> or <code>restart</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If you are using a <code>eclipse/che:<version></code> image and it does not match the version that is in <code>/instance/che.ver</code>, then the configuration will abort to prevent you from running a configuration for a different version than what is currently installed.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This command respects <code>--no-force</code>, <code>--pull</code>, <code>--force</code>, and <code>--offline</code>.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>destroy</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Deletes <code>/docs</code>, <code>che.env</code> and <code>/instance</code>, including destroying all user workspaces, projects, data, and user database. If you pass <code>--quiet</code> then the confirmation warning will be skipped. Passing <code>--cli</code> will also destroy the <code>cli.log</code>. By default this is left behind for traceability.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>dir</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Boots a new Eclipse Che instance with a workspace for the folder <code>:/chedir</code> defined as volume mount in parameter.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If for example <code>$HOME/my-project</code> is given as parameter, a new Che instance will be created, using <code>$HOME/my-project</code> as project in the IDE.</p> |
| </div> |
| <div class="paragraph"> |
| <p>So inside the IDE, <code>/projects</code> folder will contain a <code>my-project</code> folder with your host folder. Then, any changes inside the IDE will be reflected in your host folder. And the opposite is also true, updating a file on your local computer will update the content of the file inside the IDE.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Other commands are <code>init</code>,<code>up</code>, <code>down</code>, <code>ssh</code> and <code>status</code></p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>init</code> : Initialize the directory specified and add a default <code>Chefile</code> file if there is none</p> |
| </li> |
| <li> |
| <p><code>up</code> : Boot Eclipse Che with workspace on folder</p> |
| </li> |
| <li> |
| <p><code>down</code> : Stop Eclipse Che and any workspaces</p> |
| </li> |
| <li> |
| <p><code>ssh</code> : Connect to the running workspace by using ssh</p> |
| </li> |
| <li> |
| <p><code>status</code> : Display if an instance of Eclipse Che is running or not for the specified folder.</p> |
| </li> |
| </ul> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>download</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Used to download Docker images that will be stored in your Docker images repository. This command downloads images that are used by the CLI as utilities, for Che to do initialization and configuration, and for the runtime images that Che needs when it starts. This command respects <code>--offline</code>, <code>--pull</code>, <code>--force</code>, and <code>--no-force</code> (default). This command is invoked by <code>che init</code>, <code>che config</code>, and <code>che start</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>download</code> is invoked by <code>che init</code> before initialization to download images for the version specified by <code>eclipse/che:<version></code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>It is possible to override the docker images used by the CLI by setting the following environment variables:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>IMAGE_INIT</code> to override the default <code>eclipse/che-init:<version></code> docker image,</p> |
| </li> |
| <li> |
| <p><code>IMAGE_CHE</code> to override the default <code>eclipse/che-server:<version></code> docker image.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For example if, for both images, you need to use to use a given tag in you own docker account, you can add the following parameters to the docker command:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>-e IMAGE_INIT=myDockerAccount/che-init:givenTag -e IMAGE_CHE=myDockerAccount/che-server:givenTag</pre> |
| </div> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>info</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Displays system state and debugging information. <code>--network</code> runs a test to take your <code>CHE_HOST</code> value to test for networking connectivity simulating browser > Che and Che > workspace connectivity. <code>--bundle</code> will generate a support diagnostic bundle in a TAR file which includes the output of certain commands and your execution logs.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>init</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Initializes an empty directory with a Che configuration and instance folder where user data and runtime configuration will be stored. You must provide a <code><path>:/data</code> volume mount, then Che creates a <code>instance</code> and <code>backup</code> subfolder of <code><path></code>. You can optionally override the location of <code>instance</code> by volume mounting an additional local folder to <code>/data/instance</code>. You can optionally override the location of where backups are stored by volume mounting an additional local folder to <code>/data/backup</code>. After initialization, a <code>che.env</code> file is placed into the root of the path that you mounted to <code>/data</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>These variables can be set in your local environment shell before running and they will be respected during initialization:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 44%;"> |
| <col style="width: 56%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Variable</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CHE_HOST</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The IP address or DNS name of the Che service. We use <code>eclipse/che-ip</code> to attempt discovery if not set.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CHE_PORT</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The port the Che server will run on and expose in its container for your clients to connect to.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>Che depends upon Docker images. We use Docker images to:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Provide cross-platform utilities within the CLI. For example, in scenarios where we need to perform a <code>curl</code> operation, we use a small Docker image to perform this function. We do this as a precaution as many operating systems (like Windows) do not have curl installed.</p> |
| </li> |
| <li> |
| <p>Look up the master version and upgrade manifest, which is saved within the CLI docker image in the /version subfolder.</p> |
| </li> |
| <li> |
| <p>Perform initialization and configuration of Che such as with <code>eclipse/che-init</code>. This image contains templates to be installed onto your computer used by the CLI to configure Che for your specific OS.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="paragraph"> |
| <p>You can control how Che downloads these images with command line options. All image downloads are performed with <code>docker pull</code>.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 32%;"> |
| <col style="width: 68%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Mode >>>>>>>>>></th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>--no-force</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Default behavior. Will download an image if not found locally. A local check of the image will see if an image of a matching name is in your local registry and then skip the pull if it is found. This mode does not check DockerHub for a newer version of the same image.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>--pull</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Will always perform a <code>docker pull</code> when an image is requested. If there is a newer version of the same tagged image at DockerHub, it will pull it, or use the one in local cache. This keeps your images up to date, but execution is slower.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>--force</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Performs a forced removal of the local image using <code>docker rmi</code> and then pulls it again (anew) from DockerHub. You can use this as a way to clean your local cache and ensure that all images are new.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>--offline</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Loads Docker images from <code>backup/*.tar</code> folder during a pre-boot mode of the CLI. Used if you are performing an installation or start while disconnected from the Internet.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>You can reinstall Che on a folder that is already initialized and preserve your <code>che.env</code> values by passing the <code>--reinit</code> flag.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>offline</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Saves all of the Docker images that Che requires into <code>/backup/*.tar</code> files. Each image is saved as its own file. If the <code>backup</code> folder is available on a machine that is disconnected from the Internet and you start Che with <code>--offline</code>, the CLI pre-boot sequence will load all of the Docker images in the <code>/backup/</code> folder.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>--list</code> option will list all of the core images and optional stack images that can be downloaded. The core system images and the CLI will always be saved, if an existing TAR file is not found. <code>--image:<image-name></code> will download a single stack image and can be used multiple times on the command line. You can use <code>--all-stacks</code> or <code>--no-stacks</code> to download all or none of the optional stack images.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>restart</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Performs a <code>stop</code> followed by a <code>start</code>, respecting <code>--pull</code>, <code>--force</code>, <code>--offline</code>, <code>--skip:config</code>, <code>--skip:preflight</code>, and <code>--skip:postflight</code>.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>restore</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Restores <code>/instance</code> to its previous state. You do not need to worry about having the right Docker images. The normal start / stop / restart cycle ensures that the proper Docker images are available or downloaded, if not found.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This command will destroy your existing <code>/instance</code> folder, so use with caution, or set these values to different folders when performing a restore.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>rmi</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Deletes the Docker images from the local registry that Che has downloaded for this version.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>ssh</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Connects the current terminal where the command is started to the terminal of a machine of the workspace. If no machine is specified in the command, it will connect to the default machine which is the dev machine. The syntax is <code>ssh <workspace-name> [machine-name]</code> The ssh connection will work only if there is a workspace ssh key setup. A default ssh key is automatically generated when a workspace is created.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>sync</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Synchronizes a workspace’s contents with a local folder mounted to :/sync The syntax is <code>-v <path-on-your-machine>:/sync eclipse/che sync <workspace-name></code></p> |
| </div> |
| <div class="paragraph"> |
| <p>To get extra information, the flag <code>--unison-verbose</code> can be used to display log of the underlying unison tool.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>start</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Starts Che and its services using <code>docker-compose</code>. If the system cannot find a valid configuration it will perform an <code>init</code>. Every <code>start</code> and <code>restart</code> will run a <code>config</code> to generate a new configuration set using the latest configuration. The starting sequence will perform pre-flight testing to see if any ports required by Che are currently used by other services and post-flight checks to verify access to key APIs.</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can skip pre-flight and post-flight checks with <code>--skip:preflight</code> and <code>--skip:postflight</code> respectively. The typical Che start sequence includes an invocation of the <code>config</code> method, which regenerates configuration files placed into the <code>/instance</code> folder. You can skip this generation with <code>--skip:config</code>. You can automatically print out the server logs to the console during the booting of the server by appending <code>--follow</code>. This flag is blocking and requires you to CTRL-C to interrupt the output.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>stop</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>The default stop is a graceful stop where each workspace is stopped and confirmed shutdown before stopping system services. If workspaces are configured to snap on stop, then all snaps will be completed before system service shutdown begins. You can ignore workspace stop behavior and shut down only system services with –force flag.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>test</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Performs some tests on your local instance of Che. It can for example check the ability to create a workspace, start the workspace by using a custom Workspace runtime and then use it. The list of all the tests available can be obtained by providing only <code>test</code> command.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>upgrade</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Manages the sequence of upgrading Che from one version to another. Run <code>che version</code> to get a list of available versions that you can upgrade to.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Upgrading Che is done by using a <code>eclipse/che:<version></code> that is newer than the version you currently have installed. For example, if you have 5.0.0-M2 installed and want to upgrade to 5.0.0-M7, then:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre># Get the new version of Che |
| docker pull eclipse/che:5.0.0-M7 |
| |
| # You now have two eclipse/che images (one for each version) |
| # Perform an upgrade - use the new image to upgrade old installation |
| docker run <volume-mounts> eclipse/che:5.0.0-M7 upgrade</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The upgrade command has numerous checks to prevent you from upgrading Che if the new image and the old version are not compatiable. In order for the upgrade procedure to proceed, the CLI image must be newer than the value of '/instance/che.ver'.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The upgrade process: a) performs a version compatibility check, b) downloads new Docker images that are needed to run the new version of Che, c) stops Che if it is currently running triggering a maintenance window, d) backs up your installation, e) initializes the new version, and f) starts Che.</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can run <code>che version</code> to see the list of available versions that you can upgrade to.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>--skip-backup</code> option allow to skip <a href="https://github.com/codenvy/che-docs/blob/master/src/main/_docs/setup/setup-cli.md#backup">backup</a> during update, that could be useful to speed up upgrade because <a href="https://github.com/codenvy/che-docs/blob/master/src/main/_docs/setup/setup-cli.md#backup">backup</a> can be very expensive operation if <code>/instace</code> folder is really big due to many user worksapces and projects.</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p><em>version</em></p> |
| </div> |
| <div class="paragraph"> |
| <p>Provides information on the current version and the available versions that are hosted in Che’s repositories. <code>che upgrade</code> enforces upgrade sequences and will prevent you from upgrading one version to another version where data migrations cannot be guaranteed.</p> |
| </div> |
| <hr> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cli-development">CLI Development</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>You can customize the CLI using a variety of techniques. This section discusses how engineers develop and test the CLI on their local machines.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="structure">Structure</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The Che CLI is constructed of multiple Docker images within the Che source repository.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>/dockerfiles/base # Common functions and commands |
| /dockerfiles/cli # CLI entrypoint, overrides, and version information |
| /dockerfiles/init # Manifests used to configure Che on a host installation</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The Che CLI is authored in <code>bash</code>. The <code>cli</code> image depends upon both the <code>base</code> image and the <code>init</code> image. In the source repository, we have <code>build.sh</code> commands which will build these Docker images for you either one at a time or collectively as a group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>It can become tedious rebuilding images every time you want to test a small change to a bash script. You can avoid having to rebuild images each time for every change to a bash script by volume mounting the contents during the image execution. You cannot volume mount the <code>entrypoint.sh</code> file which is where each container has a launch point, but you can volume mount others:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre># Volume mount the contents of the base image |
| -v <path-to-che-repo>/dockerfiles/scripts/base/scripts:/base/scripts |
| |
| # Volume mount the contents of the init image |
| -v <path-to-che-repo>:/repo</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If you run the Che CLI in this configuration, then any changes made to the bash files or templates in those repositories will be used without having to first rebuild the CLI image.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="custom-cli">Custom CLI</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The Che CLI was designed to be overridden to allow different CLIs to be created from the same base structure. This is how Codenvy and ARTIK has an identical CLIs to Che. The CLI is created with a few minimal assets:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>/dockerfiles/cli/build.sh # Local file to build the image |
| /dockerfiles/cli/Dockerfile # Image definition, must FROM eclipse/che-base:nightly |
| /dockerfiles/cli/scripts # Contains additional commands in form of cmd_<name>.sh |
| /dockerfiles/cli/scripts/entrypoint.sh # The entrypoint of the CLI container, with usage() method |
| /dockerfiles/cli/scripts/cli.sh # Defines CLI-specific product names & variables |
| /dockerfiles/cli/version # Contains version-specific data the CLI requires</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>You can add additional commands to the Che CLI beyond the base set of commands that are provided by adding a file of the name <code>cmd_<name>.sh</code> into the <code>scripts</code> folder. Codenvy is an <a href="https://github.com/codenvy/codenvy/tree/master/dockerfiles/cli/scripts">example that adds additional commands</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>version</code> folder has information that details the latest version and a sub-folder for each version that is available for installation. Each version subfolder has version-specific data that the CLI depends upon to create a manifest of Docker images that must be downloaded to support the product that is going to be run. When we generate a release of the Che CLI, we have our CI systems automatically update the <code>/version</code> folder with the version-specific information contained in a release.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="puppet-templates">Puppet Templates</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The Che CLI uses Puppet to generate OS-specific configuration files based upon environment variables set by the user either with <code>-e <VALUE></code> options on the command line, or by modifying their <code>che.env</code> file. We pass all of these values into Puppet and then run a puppet configuration utility across the files contained in the <code>/dockerfiles/init/modules</code> and <code>/dockerfiles/init/manifests</code> folder to take the templates contained within the <code>/init</code> module, marry them with user-specific variables, and then generate an instance-specific configuration in <code>/instance</code>. Puppet has logic constructs that allow us to generate different kinds of constructs with logic based upon the values provided by end users.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This puppet-based approach allow us to simplify the outputs for end users and limit the locations where end users need to configure various parts of the system. One powerful example of this is that we generate two <code>docker-compose.yml</code> files from a single Puppet template. In the user’s <code>/instance</code> folder is <code>docker-compose.yml</code> and <code>docker-compose-container.yml</code>. The first one is a configuration file that allows a user to run Docker compose for Che on their host. They can just <code>docker-compose up</code> in that folder. The second file is for running Docker compose from within a container, which is what the CLI does. The syntax of Docker compose changes in each of these scenarios as the files being referenced from within the compose syntax are different. In the <code>init</code> image, we have a single template for Docker Compose and then apply it in two configurations using Puppet.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cli-tests">CLI Tests</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>There are existing <a href="https://github.com/sstephenson/bats">bats</a> tests for the Che CLI, which runs automatically with each execution of a <code>build.sh</code> script located in the <code>dockerfiles/cli</code> folder. To skip them, pass <code>--skip-tests</code> argument when running the build script. If you want to just run tests you can achieve it by running script <code>test.sh</code> located in the same folder. Tests utilizes docker image <code>eclipse/che-bats</code> which is build from <code>Dockerfile</code> placed in <code>dockerfiles/bats</code>.</p> |
| </div> |
| </div> |
| </div> |
| |
| <div class="tags"> |
| |
| <b>Tags: </b> |
| |
| |
| |
| <a href="tag_installation.html" class="btn btn-default navbar-btn cursorNorm" role="button">installation</a> |
| |
| |
| |
| <a href="tag_docker.html" class="btn btn-default navbar-btn cursorNorm" role="button">docker</a> |
| |
| |
| |
| </div> |
| |
| <!-- |
| --> |
| |
| </div> |
| |
| <hr class="shaded"/> |
| |
| <footer> |
| <div class="row"> |
| <div class="col-lg-12 footer"> |
| Eclipse Che - Documentation <br/> |
| Site last generated: Sep 13, 2018 <br/> |
| <hr> |
| <a href="http://www.eclipse.org" target="_blank">Eclipse Foundation</a><br/> |
| <a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a><br/> |
| <a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a><br/> |
| <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">Eclipse Public License</a><br/> |
| <a href="http://www.eclipse.org/legal" target="_blank">Legal Resources</a><br/> |
| </div> |
| </div> |
| </footer> |
| |
| |
| |
| |
| <!-- /.row --> |
| </div> |
| <!-- /.container --> |
| </div> |
| <!-- /#main --> |
| </div> |
| |
| </body> |
| |
| </html> |