{ "info": { "author": "Sergey Arkhipov", "author_email": "serge@aerialsounds.org", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5" ], "description": "concierge\n*********\n\n|PyPI| |Build Status| |Code Coverage|\n\n``concierge`` is a small utility/daemon which is intended to help humans\nto maintain their SSH configs.\n\n.. contents::\n :depth: 2\n :backlinks: none\n\n\nIntroduction\n============\n\nThere is not problems with SSH config format: it works for decades and\nis going to work for my children I guess. This utility will die, but one\nwill update his ``~/.ssh/config`` to access some network server.\n\nThe problem with SSH that it really hard to scale. I am not quite sure\nabout other people jobs, but on my current and previous jobs I was\nused to maintain quite large sets of records in SSH configs. Usual\ndeployment of some modern app consist several machines (let's say ``X``)\nand during development we are using several stage environments (let's\nsay ``Y``). So, frankly, you need to have ``X * Y`` records in your\n``~/.ssh/config``. Only for work.\n\nSometimes you need to jugle with jump hosts. Sometimes your stage is\nmoving to another set of IPs. Sometimes life happens and it is quite\nirritating to manage these configuration manually.\n\nI did a lot of CSS stylesheets and SSH config management is pretty close\nto that. I want to have SASS_ for SSH config. The main goal of this\ntool is to provide user with some templating and clutter-free config\nmanagement in SASS way.\n\n\nDemo\n====\n\n.. image:: https://asciinema.org/a/dqxhschtqyx7lxfda25irbgh5.png\n :alt: Asciinema screencast\n :width: 700\n :target: https://asciinema.org/a/dqxhschtqyx7lxfda25irbgh5\n\n\nInstallation\n============\n\nInstallation is quite trivial:\n\n.. code-block:: shell\n\n $ pip install concierge\n\nor if you want to install it manually, do following:\n\n.. code-block:: shell\n\n $ git clone https://github.com/9seconds/concierge.git\n $ cd concierge\n $ python setup.py install\n\nBy default, no template support is going to be installed. If you want to\nuse Mako_ or Jinja2_, please refer to `Templaters`_ section.\n\nAlso, it is possible to install support of `libnotify\n`_. Please install tool like\nthis:\n\n.. code-block:: shell\n\n $ pip install concierge[libnotify]\n\nIn that case, you will have a desktop notifications about any problem\nwith parsing of your ``~/.conciergerc``. Yep, these Ubuntu popups on the\nright top of the screen.\n\nIf you have a problems with Pip installation (with modifiers, for\nexample), please update your pip and setuptools first.\n\n.. code-block:: shell\n\n $ pip install --upgrade pip setuptools\n\nEventually there will be no such problem anywhere.\n\nPlease be noticed, that ``concierge`` is **Python 3** only tool. It\nshould work on ``cPython >= 3.3`` without any problems. Come on, Python\n3.4 is bundled even with CentOS 7!\n\nAfter installation, 2 utilities will be available:\n\n* ``concierge-check``\n* ``concierge``\n\n\nTemplaters\n----------\n\n``concierge`` comes with support of additional templaters, you may plug\nthem in installing the packages from PyPI. At the time of writing,\nsupport of following templaters was done:\n\n* `concierge-mako `_ -\n support of Mako_ templates\n* `concierge-jinja `_ -\n support of Jinja2_ templates\n\nTo install them just do\n\n.. code-block:: shell\n\n $ pip install concierge-mako\n\nAnd ``concierge`` will automatically recognizes support of Mako and now\none may use ``concierge -u mako`` for her ``~/.conciergerc``.\n\n\nconcierge-check\n---------------\n\n``concierge-check`` is a tool to verify syntax of your\n``~/.conciergerc`` file. Please check `Syntax description`_ to get on\nspeed.\n\nAlso, it supports a number of options but they are pretty trivial.\n\nPlease remember, that both ``concierge-check`` and ``concierge``\nuse syslog for logging data in process. Options like ``--debug`` or\n``--verbose`` will affect only stderr logging, syslog will have only\nerrors.\n\n\nconcierge\n---------\n\n``concierge`` is intended to work in daemon mode. It converts between\nyour ``~/.conciergerc`` and destination ``~/.ssh/config`` (so\n`Installation`_ magic work in that way).\n\nI use systemd so ``concierge`` is bundled to support it. To get an\ninstructions of how to use the tool with systemd, please run following:\n\n.. code-block:: shell\n\n $ concierge --systemd\n\nIt will printout an instructions. If you do not care, please run following:\n\n.. code-block:: shell\n\n $ eval \"$(concierge --systemd --curlsh)\"\n\nIt will install systemd user unit and run concierge daemon automatically.\n\n``concierge`` supports the same options and behavior as\n`concierge-check`_ so please track your syslog for problems.\n\n\nSyntax description\n==================\n\nWell, there is no big difference between plain old ``ssh_config(5)`` and\n``concierge`` style. Base is the same so please check the table with\nexamples to understand what is going to be converted and how.\n\nSyntax came from the way I structure my SSH configs for a long time .\nBasically I am trying to keep it in the way it looks like hierarchical .\n\nLet's grow the syntax. Consider following config\n\n::\n\n Host m\n HostName 127.0.0.1\n\n Host me0\n HostName 10.10.0.0\n\n Host me1\n HostName 10.10.0.1\n\n Host m me0 me1\n Compression no\n ProxyCommand ssh -W %h:%p env1\n User nineseconds\n\n Host *\n Compression yes\n CompressionLevel 9\n\n\nSo far so good. Now let's... indent!\n\n::\n\n Host m\n HostName 127.0.0.1\n\n Host me0\n HostName 10.10.0.0\n ProxyCommand ssh -W %h:%p env1\n\n Host me1\n HostName 10.10.0.1\n ProxyCommand ssh -W %h:%p env1\n\n Host m me0 me1\n Compression no\n User nineseconds\n\n Host *\n Compression yes\n CompressionLevel 9\n\n\nIt is still valid SSH config. And valid ``concierge`` config. Probably\nyou already do similar indentation to visually differ different server\ngroups. Let's check what do we have here: we have prefixes, right. And\nmost of options are quite common to the server groups (environments).\n\nNow let's eliminate ``Host m me0 me1`` block. This would be invalid SSH\nconfig but valid ``conciergerc`` config. Also I am going to get rid of\nuseless prefixes and use hierarchy to determine full name (``fullname =\nname + parent_name``).\n\nPlease be noticed that all operations maintain effectively the same\n``conciergerc`` config.\n\n::\n\n Host m\n Compression no\n HostName 127.0.0.1\n User nineseconds\n\n Host e0\n HostName 10.10.0.0\n ProxyCommand ssh -W %h:%p env1\n\n Host e1\n HostName 10.10.0.1\n ProxyCommand ssh -W %h:%p env1\n\n Host *\n Compression yes\n CompressionLevel 9\n\n\nOkay. Do we need rudiment ``Host *`` section? No, let's move everything\non the top. Idea is the same, empty prefix is ``*``.\n\n::\n\n Compression yes\n CompressionLevel 9\n\n Host m\n Compression no\n HostName 127.0.0.1\n User nineseconds\n\n Host e0\n HostName 10.10.0.0\n ProxyCommand ssh -W %h:%p env1\n\n Host e1\n HostName 10.10.0.1\n ProxyCommand ssh -W %h:%p env1\n\n\nBy the way, you may see, that indentation defines parent is the same\nway as Python syntax is organized. So following config is absolutely\nequivalent.\n\n::\n\n Compression yes\n\n Host m\n Compression no\n HostName 127.0.0.1\n User nineseconds\n\n Host e0\n HostName 10.10.0.0\n ProxyCommand ssh -W %h:%p env1\n\n Host e1\n HostName 10.10.0.1\n ProxyCommand ssh -W %h:%p env1\n\n CompressionLevel 9\n\n\nThis is a basic. But if you install ``concierge`` with support of Mako or\nJinja2 templates, you may use them in your ``~/.conciergerc``.\n\n::\n\n Compression yes\n CompressionLevel 9\n\n Host m\n Compression no\n HostName 127.0.0.1\n User nineseconds\n\n % for i in range(2):\n Host e${i}\n HostName 10.10.0.${i}\n ProxyCommand ssh -W %h:%p env1\n % endfor\n\nThis is a Mako template I use. Please refer `Mako\n`__ and `Jinja2\n`__ documentation for details.\n\nBy the way, if you want to hide some host you are using for grouping only,\nplease prefix it with ``-`` (``-Host``).\n\n\nExamples\n--------\n\nHere are some examples. Please do not hesitate to check `Demo`_, pause it,\nlook around.\n\n+----------------------------------------+--------------------------------------------+\n| Source, converted from (~/.concierge) | Destination, converted to (~/.ssh/config) |\n+========================================+============================================+\n| :: | :: |\n| | |\n| Host name | Host name |\n| HostName 127.0.0.1 | HostName 127.0.0.1 |\n| | |\n+----------------------------------------+--------------------------------------------+\n| :: | :: |\n| | |\n| Compression yes | Host name |\n| | HostName 127.0.0.1 |\n| Host name | |\n| HostName 127.0.0.1 | Host * |\n| | Compression yes |\n| | |\n+----------------------------------------+--------------------------------------------+\n| :: | :: |\n| | |\n| Compression yes | Host name |\n| | HostName 127.0.0.1 |\n| Host name | |\n| HostName 127.0.0.1 | Host * |\n| | Compression yes |\n| Host * | CompressionLevel 9 |\n| CompressionLevel 9 | |\n| | |\n+----------------------------------------+--------------------------------------------+\n| :: | :: |\n| | |\n| Compression yes | Host name |\n| | HostName 127.0.0.1 |\n| Host name | |\n| HostName 127.0.0.1 | Host nameq |\n| | HostName node-1 |\n| Host q | ProxyCommand ssh -W %h:%p env1 |\n| ViaJumpHost env1 | |\n| HostName node-1 | Host * |\n| | Compression yes |\n| | |\n+----------------------------------------+--------------------------------------------+\n| :: | :: |\n| | |\n| Compression yes | Host nameq |\n| | HostName node-1 |\n| -Host name | ProxyCommand ssh -W %h:%p env1 |\n| HostName 127.0.0.1 | |\n| | Host * |\n| Host q | Compression yes |\n| ViaJumpHost env1 | |\n| HostName node-1 | |\n| | |\n+----------------------------------------+--------------------------------------------+\n| :: | :: |\n| | |\n| Compression yes | Host blog |\n| | User sa |\n| Host m | |\n| User nineseconds | Host me0 |\n| | HostName 10.10.0.0 |\n| % for i in range(2): | Protocol 2 |\n| Host e${i} | ProxyCommand ssh -W %h:%p gw2 |\n| HostName 10.10.0.${i} | User nineseconds |\n| ViaJumpHost gw2 | |\n| % endfor | Host me1 |\n| | HostName 10.10.0.1 |\n| Protocol 2 | Protocol 2 |\n| | ProxyCommand ssh -W %h:%p gw2 |\n| Host blog | User nineseconds |\n| User sa | |\n| | Host * |\n| | Compression yes |\n| | |\n+----------------------------------------+--------------------------------------------+\n\n\n.. _SASS: http://sass-lang.com\n.. _Mako: http://www.makotemplates.org\n.. _Jinja2: http://jinja.pocoo.org\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/concierge.svg\n :target: https://pypi.python.org/pypi/concierge\n\n.. |Build Status| image:: https://travis-ci.org/9seconds/concierge.svg?branch=master\n :target: https://travis-ci.org/9seconds/concierge\n\n.. |Code Coverage| image:: https://codecov.io/github/9seconds/concierge/coverage.svg?branch=master\n :target: https://codecov.io/github/9seconds/concierge?branch=master", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/9seconds/concierge", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "concierge", "package_url": "https://pypi.org/project/concierge/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/concierge/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/9seconds/concierge" }, "release_url": "https://pypi.org/project/concierge/0.2.2/", "requires_dist": null, "requires_python": null, "summary": "Maintainable SSH config", "version": "0.2.2" }, "last_serial": 2390170, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "1a9ab6c813fc07995ba6076d0d7e2bbe", "sha256": "a27d51bd9b662b9be47985b66efec045774e25d55c97406ba27a2ff840eccced" }, "downloads": -1, "filename": "concierge-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1a9ab6c813fc07995ba6076d0d7e2bbe", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20354, "upload_time": "2016-03-18T08:58:49", "url": "https://files.pythonhosted.org/packages/d7/1f/1c99cc4196bbd81f3dc88776f6356b33e2faebf6465683495ed4d8f8a4f4/concierge-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04d6cccfeb550e50aead4328425b3230", "sha256": "f02c12abc8602ec483dfe1f83af75ffdf0243c039090b4893aa20df150bb7537" }, "downloads": -1, "filename": "concierge-0.1.0.tar.gz", "has_sig": false, "md5_digest": "04d6cccfeb550e50aead4328425b3230", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28488, "upload_time": "2016-03-18T08:58:31", "url": "https://files.pythonhosted.org/packages/c5/b7/41909b21da95c0a80bcc38593714e2a6e5ad5e86cd411d56a1100884802a/concierge-0.1.0.tar.gz" } ], "0.1.0.0rc1": [ { "comment_text": "", "digests": { "md5": "d29cda6736829843f4093616a12e1154", "sha256": "0f27e39cb8ef9e0f64fd0162b2e3b924ea754086ae4de38f54021d7f2ef29786" }, "downloads": -1, "filename": "concierge-0.1.0.0rc1-py3-none-any.whl", "has_sig": false, "md5_digest": "d29cda6736829843f4093616a12e1154", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20432, "upload_time": "2016-03-17T09:52:43", "url": "https://files.pythonhosted.org/packages/fb/4c/2f8236b70ba4ea1630b01b72d1d6402223c48d1ec95118d554a3ffbc8dc5/concierge-0.1.0.0rc1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f91fb19d430684f2cc711f61ebf2232", "sha256": "07bc8f63079bd544f643fd47064a981ac4867c38c571f01c2c7d128b8be62a7b" }, "downloads": -1, "filename": "concierge-0.1.0.0rc1.tar.gz", "has_sig": false, "md5_digest": "6f91fb19d430684f2cc711f61ebf2232", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28136, "upload_time": "2016-03-17T09:52:36", "url": "https://files.pythonhosted.org/packages/01/2a/145b62a7f373d08e3f2badbd0f6e9114feb1cd23817789e86a9ed64a142d/concierge-0.1.0.0rc1.tar.gz" } ], "0.1.0.dev64": [], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ece157921dc4791277ce117d8eac50ae", "sha256": "4a60ce84acc7d4fa070954f61bb8531cd6107e22e78649a348e2045bd0e0b22b" }, "downloads": -1, "filename": "concierge-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ece157921dc4791277ce117d8eac50ae", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20426, "upload_time": "2016-03-19T06:57:05", "url": "https://files.pythonhosted.org/packages/eb/d9/6e2f4d9bdcf649fb5b8823872bb9e95e4ac585fd48401ceb8f8136152cf1/concierge-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8849fe6a78672a2a414fc587e63c2f0b", "sha256": "c607cc87e98a35ad838ff792589b925cc579feaea1e736d5b29c1a04f50fa085" }, "downloads": -1, "filename": "concierge-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8849fe6a78672a2a414fc587e63c2f0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22903, "upload_time": "2016-03-19T06:56:58", "url": "https://files.pythonhosted.org/packages/a2/38/10f45f1c4f18bc3b0512067946fcf6b04ac158239bf937ef35892295b98d/concierge-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "15cc4d0656a037bef43bf031ca591b4b", "sha256": "fe5051f71c6315e055f84f91828d1fc27d891bb738714d634290fe3e82564c72" }, "downloads": -1, "filename": "concierge-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "15cc4d0656a037bef43bf031ca591b4b", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 20574, "upload_time": "2016-03-30T10:50:17", "url": "https://files.pythonhosted.org/packages/c1/1e/a030a9396144e52d6b5ff447bc28ae86bf40038142156166e24cefbbdeb8/concierge-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1b936c7f16c328a2489e46e3d8a3f91", "sha256": "b222eba5743ad99541b9accb391d321e89a4b976bfa77ad4cd5708dead069b0f" }, "downloads": -1, "filename": "concierge-0.1.2.tar.gz", "has_sig": false, "md5_digest": "e1b936c7f16c328a2489e46e3d8a3f91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28088, "upload_time": "2016-03-30T10:50:03", "url": "https://files.pythonhosted.org/packages/4c/29/826a67a4c01965749f360905702d9f05d7161e905586ac5a056e770751f9/concierge-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "3aa92f5c60bb0b450e194d842e56e2e0", "sha256": "7de1aee4e01e219e79cb1dfc529077485840691db679b1bdcbc7e5d98e18c3ab" }, "downloads": -1, "filename": "concierge-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3aa92f5c60bb0b450e194d842e56e2e0", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22481, "upload_time": "2016-04-03T14:24:10", "url": "https://files.pythonhosted.org/packages/ef/af/8dbd960398bc1c27b2beea37d3b211c21ad6742007de49ec737f74836423/concierge-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3f36d30b95eea5ff1c6dbb90fa28680c", "sha256": "a007c8ce75e0a907c75a1721b9c0c01ca8a76239bd718c03c24bf5bd6671764d" }, "downloads": -1, "filename": "concierge-0.2.0.tar.gz", "has_sig": false, "md5_digest": "3f36d30b95eea5ff1c6dbb90fa28680c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25269, "upload_time": "2016-04-03T14:23:34", "url": "https://files.pythonhosted.org/packages/c1/3c/65c5b1c8521a1bf08f72b7adc818bf6a90fa6270fe04d6bc4415ba1ca405/concierge-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "0c79020ebc34a718ab5870deb2ad7979", "sha256": "1ae7bdc9b99b8c3a5b314d3121b9938c70922586103402851843e6c8bc91c6c4" }, "downloads": -1, "filename": "concierge-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0c79020ebc34a718ab5870deb2ad7979", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22130, "upload_time": "2016-09-28T08:10:57", "url": "https://files.pythonhosted.org/packages/4c/cb/c4aea94416699609587c1b55916650bd7d333314489fca35714303cf8a0c/concierge-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef893a5f1b37dfc88313ba9d1d724902", "sha256": "a51be1c0b4913b43823bab26920fdcaf20c9fbde9b5d36a0c723a3fafa96b403" }, "downloads": -1, "filename": "concierge-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ef893a5f1b37dfc88313ba9d1d724902", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18407, "upload_time": "2016-09-28T08:10:54", "url": "https://files.pythonhosted.org/packages/73/5b/5b64854558997cc1d8c7987b422e7652f621b919538abf928ee63960f663/concierge-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "047912ba4df98286db5385787999ce43", "sha256": "4aa72a69bdf7b2fdcb6871b487b66348fbcd932304690af1a7ddaca2906d7dd8" }, "downloads": -1, "filename": "concierge-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "047912ba4df98286db5385787999ce43", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22131, "upload_time": "2016-10-10T06:09:09", "url": "https://files.pythonhosted.org/packages/71/a2/79bd7609dc407741cb01024be68cd5279106871ba6dc4fb1e18c940687e4/concierge-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3cc14fc40d282293e235c613ac1ad45f", "sha256": "2cf74e7e549cf951fccdb4de5ce59783b54c9f120d92304bd0959cb54d8a5907" }, "downloads": -1, "filename": "concierge-0.2.2.tar.gz", "has_sig": false, "md5_digest": "3cc14fc40d282293e235c613ac1ad45f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18430, "upload_time": "2016-10-10T06:09:02", "url": "https://files.pythonhosted.org/packages/79/cc/80fb60384a329744babe404f3b05327b627a5f6631166b8b9e4a978ed0bc/concierge-0.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "047912ba4df98286db5385787999ce43", "sha256": "4aa72a69bdf7b2fdcb6871b487b66348fbcd932304690af1a7ddaca2906d7dd8" }, "downloads": -1, "filename": "concierge-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "047912ba4df98286db5385787999ce43", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22131, "upload_time": "2016-10-10T06:09:09", "url": "https://files.pythonhosted.org/packages/71/a2/79bd7609dc407741cb01024be68cd5279106871ba6dc4fb1e18c940687e4/concierge-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3cc14fc40d282293e235c613ac1ad45f", "sha256": "2cf74e7e549cf951fccdb4de5ce59783b54c9f120d92304bd0959cb54d8a5907" }, "downloads": -1, "filename": "concierge-0.2.2.tar.gz", "has_sig": false, "md5_digest": "3cc14fc40d282293e235c613ac1ad45f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18430, "upload_time": "2016-10-10T06:09:02", "url": "https://files.pythonhosted.org/packages/79/cc/80fb60384a329744babe404f3b05327b627a5f6631166b8b9e4a978ed0bc/concierge-0.2.2.tar.gz" } ] }