Commit Graph

4374 Commits (c603caca27bec4697ee053902f46ae1e0a05930c)

Author SHA1 Message Date
James Cammarata 2576f480fd Restoring a state check to play_iterator, which otherwise broke block functionality 9 years ago
Matt Martz 65fdcf8b9d Check for name or pkg when templating squashed items. Fixes #11430 9 years ago
James Cammarata 0cfebb8760 Fixes a bug whereby tags are expected to be a set
Fixes #11424
Fixes #11429
9 years ago
Brian Coca d149ea5222 ported timer.py callback to v2 9 years ago
Brian Coca 7416e00541 fixed condition for loading whitelisted callbacks 9 years ago
James Cammarata 9785e5397e Fix typo in SharedObjectLoader field basedirs 9 years ago
James Cammarata 927072546b Fixing up some issues with plugin loading 9 years ago
James Cammarata 2a5fbd8570 Winrm fixes for devel
* Include fixes for winrm connection plugin from v1 code
* Fixing shell plugin use
9 years ago
Henry Finucane 2d1cb7f328 Treat generators like lists and tuples 9 years ago
Toshio Kuratomi 8a76371a1c Merge pull request #11394 from dlundquist/ipaddr-slaac-filter
IPv6 SLAAC address computation filter
9 years ago
Matt Martz 4059904a18 Add splitext filter 9 years ago
Toshio Kuratomi be6db1a730 Refactor the argspec type checking and add path as a type 9 years ago
James Cammarata 21c14363fd Allow callback plugins to be whitelisted 9 years ago
James Cammarata 24226646fc When loading the play hosts list, enforce some consistency
Fixes #9580
9 years ago
James Cammarata 9d9cd0c42c Handle getting the ds for Conditionals which may not be mixed in 9 years ago
James Cammarata f433e709f2 Fix templating of hostvars values
Also adds play information into the hostvars creation, to assure the
variable manager used there has access to vars and vars_files

Fixes #9501
Fixes #8213
Fixes #7844
9 years ago
James Cammarata 8ef28253e3 Properly catch and report conditional test failures 9 years ago
James Cammarata 0eb1c880dd Use itertools instead of set for tags, as the data may not hash well
The tags field may contain bad data before it is post_validated, however
some methods assumed it would be a simple list or string. Using itertools
gets us around the problem of the data potentially not being hashable

Fixes #9380
9 years ago
Brian Coca af49944ab2 Merge pull request #11398 from resmo/for-ansible
cloudstack: fixes and updates
9 years ago
James Cammarata bb8d87ceb6 Allow field attributes which are lists to validate the type of the list items
Starting to apply this for tags too, however it is not correcting things
as would be expected.
9 years ago
James Cammarata f68223b9ed Don't add module args into variables at all
Getting recursive errors otherwise, so this is probably not something
we want to do. This most likely only worked in v1 due to the fact that
module args were templated earlier than the point in Runner() when
they were fed into the templating engine.
9 years ago
Brian Coca e153f76c95 now validate that we do get a vault password 9 years ago
Uli Martens 25fc0c7e1b Fixing bug in failed_when results introduced by c3c398c 9 years ago
James Cammarata b723f9a09a Allow squashed loop items to use name=foo-{{item}}
Fixes #9235
Fixes #11184
9 years ago
Rene Moser 7952723530 cloudstack: fix domain name is not unique, use full path 9 years ago
Rene Moser b9b1e294d7 cloudstack: add get_or_failback() 9 years ago
Dustin Lundquist cf7744f2f1 IPv6 SLAAC address computation filter
Jinja2 filter to compute SLAAC address.

Usage:
    {{ '2db8::/64' | slaac(ansible_eth0.macaddress) }}
9 years ago
Toshio Kuratomi 9911a947ed Vendorize match_hostname code so that ansible can push it out to clients along with the code that uses it. 9 years ago
Toshio Kuratomi 00aed57295 Update submodule refs 9 years ago
Toshio Kuratomi 160e71e2cf Some flake8 cleanup 9 years ago
James Cammarata 332ca927d9 Fix parent attribute lookup
Using 'value is None' instead of 'not value', in order to account
for boolean values which may be false

Fixes #11232
9 years ago
James Cammarata 256a323de5 Submodule update 9 years ago
Toshio Kuratomi 548a7288a9 Use BUFSIZE when putting file as well as fetching file. 9 years ago
Toshio Kuratomi 270be6a6f5 Fix exec_command to not use a shell 9 years ago
Toshio Kuratomi a1a7d6c462 Fix forwarding the user-given params from fetch_url() to open_url() 9 years ago
Toshio Kuratomi e461241d7b Fix fetch_file() method 9 years ago
James Cammarata d0d9be30d5 Correctly compile handler blocks for dependent roles 9 years ago
James Cammarata 0b16580567 Add in playbook_dir magic variable 9 years ago
James Cammarata 4c6adcf143 Submodule pointer update 9 years ago
Hugh Saunders 4246777759 Re-implement the ssh connection retry, originally added in 2df690 9 years ago
James Cammarata 006391eb83 Add the improved exception reporting to the minimal callback plugin 9 years ago
Toshio Kuratomi 6aae500a2c Documentation fix 9 years ago
Toshio Kuratomi 125e6f49a1 Update submodule refs 9 years ago
James Cammarata 72d4b40a26 Don't allow empty (none) loop values
Fixes #8593
9 years ago
James Cammarata 24d2202591 Make sure role parsing can handle a few more types in includes/defs 9 years ago
James Cammarata aa53212a9b Don't use all task params for vars, just the module args 9 years ago
Toshio Kuratomi 952166f48e Fix problem with chroot connection plugins and symlinks from within the chroot. 9 years ago
Toshio Kuratomi 61e367f549 Better error messages when the file to be transferred does not exist. 9 years ago
James Cammarata 7490044bbe Implement play_hosts magic variable (and ansible_current_hosts)
Fixes #8073
9 years ago
James Cammarata cb5f630f33 Don't post_validate vars and vars_files on Play objects
Fixes #11343
9 years ago
James Cammarata ff251a0dcc Catch runtime errors due to recursion when calculating group depth
Fixes #7708
9 years ago
James Cammarata 97954ff658 Minor tweak to potentially speed the linear strategy up
* Don't fetch vars for the task unless we're going to use them
9 years ago
Benno Joy f17bdc4d61 Set the ansible_ssh_port variable instead of saving it internally for Host
Fixes #11330
9 years ago
Brian Coca b34b606fcf fixed and/or grouping 9 years ago
Brian Coca 68325dbfe2 fixed remote tmp creation when becoem user is not root and '~/' instead of $HOME is the default 9 years ago
Brian Coca 102de96ebf avoid password handling when no password is supplied 9 years ago
Brian Coca 3bad03d57a cleaned up and optimized become handling paths 9 years ago
Benno Joy be81b650e8 fixes issue 11286 where role handlers are not run 9 years ago
James Cammarata fc5be30c2f Change the use of a mutable arg for a default value for locals 9 years ago
James Cammarata 0d92599d18 Make exception printing a bit smarter 9 years ago
Toshio Kuratomi a77b58e351 Bumpt the BUFSIZE to 64k for better performance 9 years ago
Toshio Kuratomi 0777d02505 Fix problem with jail and zone connection plugins and symlinks from within the jail/zone. 9 years ago
Toshio Kuratomi ca2f2c4ebd Fix problem with jail and zone connection plugins and symlinks from within the jail/zone. 9 years ago
Toshio Kuratomi f0777d9c4e Update submodule refs 9 years ago
James Cammarata 18a9eff11f Properly use local variables from templates including other templates
Fixes #6653
9 years ago
James Cammarata c0dfa8d512 Make sure task names are templated before callbacks are sent 9 years ago
James Cammarata 98fee172ee Fix bug in async action plugin 9 years ago
James Cammarata 270eb4274c Make sure we safe_eval booleans too
Fixes #5779
9 years ago
Brian Coca 4d5a98d8d9 Merge pull request #11307 from dagwieers/patch-6
Change syslog (priority) level from LOG_NOTICE to LOG_INFO
9 years ago
Brian Coca 7bb2a7aa87 actually no password to handle, this should return false 9 years ago
Brian Coca 87a0ccc354 fixed typo 9 years ago
Brian Coca aede9f08db fixed case in which prompt was None 9 years ago
Dag Wieers 4ca4d36ae6 Change syslog (priority) level from LOG_NOTICE to LOG_INFO
If you look at the meaning of the different syslog levels, NOTICE means that the event may need someone to look at it. Whereas INFO is pure informational.

Since module invocations are in fact requested (deliberate) actions, they shouldn't need any additional post-processing, and therefore should not be logged as NOTICE.

This may seem like hairsplitting, but correctly categorizing system events helps weeding through the noise downhill.

According to Wikipedia: https://en.wikipedia.org/wiki/Syslog

5 	Notice 		notice 	Events that are unusual but not error conditions .
6 	Informational 	info 		Normal operational messages -no action required. Example an application has started, paused or ended successfully.
9 years ago
Brian Coca 7c65f3ddd7 partial become support for local connection plugin 9 years ago
Brian Coca 671118ba71 fixed become password handling with paramiko 9 years ago
Brian Coca 744ec2bbad put hostkey locking into function (still needs fixing)
implemneted become handling here, cannot generalize well enough in base class
9 years ago
Brian Coca d6672ad285 removed unused import 9 years ago
Brian Coca 5cfd0f82a0 moved away from generic function for become 9 years ago
Brian Coca 3fab516d3d fixed detection of incorrect password 9 years ago
Brian Coca faed1b2d05 better error reporting when doc parsing fails 9 years ago
James Cammarata 87ca475704 Exclude the all/ungrouped groups from pattern matching results
Fixes #5375
9 years ago
James Cammarata 90445ee67d Add ::1 where we see 127.0.0.1, for better ipv6 support
Fixes #5764
9 years ago
James Cammarata c3c398cffe Cleaning up some task failure detection problems
* fixed a bug in which failures from a with_* loop were not being
  caught correctly, leading to tasks continuing when they should stop
* when ignore_errors is enabled, the failure will no longer count
  towards the number of failed tasks
9 years ago
Marc Abramowitz a385744426 Add inventory file to "Unable to find" error msg
E.g.:

    $ ansible gabriel -m ping -i ssh_config.py
    ERROR! Unable to find an inventory file (ssh_config.py), specify one with -i ?
9 years ago
James Cammarata daa319881f Make sure registered variable message is sent before other messages
Avoids a race condition where previously the registered variable message
was being sent after the 'host_task_ok' message, meaning the next task
may be started before the var is registered, leading to an undefined
variable error
9 years ago
Benno Joy 0d5b7ae669 fixes 11296 where the groups does not have all the groups 9 years ago
James Cammarata ff998b6022 Make sure the templar is using the right vars when evaluating conditionals 9 years ago
Brian Coca d7fcd9456a Merge pull request #11288 from kstrauser/aixfixes
Don't panic if AIX's uname doesn't support -W
9 years ago
Kirk Strauser eb820837ac Don't panic if AIX's uname doesn't support -W
The current code expects "uname -W" on AIX to always succeed. The AIX 5
instance I have doesn't support the -W flag and facts gathering always
crashes on it.

This skips some WPAR handling code if "uname -W" doesn't work.
9 years ago
Kirk Strauser 935da01068 Fixes for FreeBSD get_memory_facts
- swapinfo on FreeBSD 6 (maybe 7 too?) doesn't support the "-m" flag for
  fetching amounts in megabytes. This patch fetches amounts in kilobytes
  and divides by 1024 (and also returns the result as an int instead of
  a string).

- When no swap is configured, swapinfo prints a header line and nothing
  else:

    $ swapinfo
    Device         1K-blocks     Used    Avail Capacity

  The old version unexpectedly parsed that header line and emitted
  nonsense values like:

    "ansible_swapfree_mb": "Avail"
    "ansible_swaptotal_mb": "1K-blocks"

  This version emits those items altogether.
9 years ago
Brian Coca 3b1b95b916 moved ipv6 handling to init
fixed become password handling
9 years ago
Brian Coca bb7d33adbc moved become password handlingn to base class 9 years ago
James Cammarata 4b28a51f25 Don't fail outright when a play has an empty hosts list 9 years ago
James Cammarata 30c1a2d861 Have group/host var file loading check for YAML extensions too
Fixes #11132
9 years ago
Brian Coca 423f1233c8 removed typo file 9 years ago
Brian Coca c87591f76f updated to new exec_command signature 9 years ago
Brian Coca b76dbb01cc generalized prereqs check
added vaultfile class for action and lookup plugin usage
9 years ago
Brian Coca 9116ff1c28 replaced removed pager_print for print 9 years ago
Brian Coca 98f5534d9c adaptaed to new exec signature
should fix #11275
9 years ago
Brian Coca 6c884c9e39 Merge pull request #11271 from sivel/build-play-method
Allow AdHocCLI to be more flexible for overriding
9 years ago
Brian Coca dcf81e3ffe removed useless comments 9 years ago
Matt Martz 1d55e193c1 Expose the TaskQueueManager to self 9 years ago
Matt Martz 670894e2bd Move building the play_ds into a method, that can be overridden 9 years ago
Brian Coca 8ae58f7ea3 fixed executable, correctly this time 9 years ago
Brian Coca f576d29b6b allow for any non string iterable in listify 9 years ago
Brian Coca 1ce1c52f6f centralized bad password handling, fixed outputing of become method 9 years ago
Brian Coca b89071e485 now detects incorrect password with sudo and su (at least in english) 9 years ago
Brian Coca be8d797c23 fixed su prompt function reference 9 years ago
Brian Coca 872448e9e8 updated connection info update_vars to only update if data is not alreayd present
aslo added comment clarifying why we do this
9 years ago
Brian Coca 956937b110 made executable shell configurable again 9 years ago
Brian Coca 580993fef7 enabled initial support for password prompt on become
- moved check prompt/password functions to connection, make more senes there
- TODO: consider moving make_become to connection from connection_info
- removed executable param that was never overriden outside of connection info
9 years ago
Brian Coca bac35ae773 set correct become mehotds for plugin
fixed mixup with remote password vs become_password
9 years ago
Brian Coca ff443d4534 added note to figurte out correct var udpate on connection_info 9 years ago
Brian Coca c3ccf26b70 added become check back to connections 9 years ago
Brian Coca de82c953f2 added privilege escalation special var mapping 9 years ago
Brian Coca a248678518 initial become support to ssh plugin
- password prompt detection and incorrect passwrod detection to connection info
- sudoable flag to avoid become on none pe'able commands
9 years ago
Brian Coca a267f93c83 removed incorrect assumption on become user being set 9 years ago
Brian Coca ff15f374ad fixed new become settings, rearranged constants to find PE related vars easier 9 years ago
Brian Coca e7abe06440 added first_found to template 9 years ago
Brian Coca 8ee4c7266c corrected original_file code path to use actually use data from original file 9 years ago
Brian Coca 491761f880 added note to add faf deprecation 9 years ago
Brian Coca a6ca133da8 got first_available working with copy 9 years ago
Brian Coca aca125d03e Merge pull request #11252 from sivel/deprecated-warning
Display a warning when using a deprecated module
9 years ago
Matt Martz 9ed3e2ef48 Display a warning when using a deprecated module 9 years ago
Toshio Kuratomi d315f6e22c Fix Etcd constructor 9 years ago
Toshio Kuratomi 77c76e632e Switch etcd and url lookup plugins to verify ssl certificates 9 years ago
Toshio Kuratomi 4161d78a94 Split the fetch_url() function into fetch_url and open_url().
open_url() is suitable for use outside of a module environment.  Will
let us use open_url to do SSL cert verification in other, non-module
code.
9 years ago
Brian Coca e07dde1a3c Merge pull request #11251 from sivel/issue/11244
Require passlib over crypt in password_hash for Mac OS X/Darwin. Fixes #11244

i was almost done with my patch ... but I like yours better
9 years ago
Matt Martz a4e2d1eb62 Require passlib over crypt in password_hash for Mac OS X/Darwin. Fixes #11244 9 years ago
Brian Coca aaab69cae9 brought back terms testing as with_ is not only way to call and we cannot guarantee terms is a list otherwise. 9 years ago
Toshio Kuratomi c346788194 Slight optimization of how we squash loops. Add dnf to the list of modules for which we squash.
Fixes #11235
9 years ago
Brian Coca aed429554d better checks to ensure listify emits a non string iterable 9 years ago
Brian Coca c8fde467b5 Merge pull request #11163 from sivel/ssh-private-key-fixme
Re-introduce ssh connection private key support
9 years ago
Brian Coca f174682e19 facts should now not be overriten with NA option unless they are NA
this way we don't need a break per distro that matched already with
the python default functions
9 years ago
Brian Coca 4098e8283e several fixes to template
- now obeys global undefined var setting and allows override (mostly for with_ )
- moved environment instanciation to init instead of each template call
- removed hardcoded template token matching and now use actually configured tokens, now it won't break if someone changes default configs in ansible.cfg
- made reenetrant template calls now pass the same data it got, dictionary and lists were loosing existing and new params
- moved fail_on_undeinfed parameter to template call, as it should only realky be set to false on specific templates and not globally
- added overrides, which will allow template to implement jinja2 header override features
- added filter list to overrides to disallow possibly insecure ones, TODO: check if this is still needed as facts should not be templated anymore
- TODO: actually implement jinja2 header overrides
9 years ago
Brian Coca 7291f9e965 removed cruft
made sure it does not fail on undefined
9 years ago
Brian Coca f29c1c7452 respect undefined config setting 9 years ago
Brian Coca 40336b50af removed redundant string check
added playbook path lookup
9 years ago
Brian Coca 7306a5397e simplified function, always attempt to template, always check if string before return, should avoid most cases of strings being passed to lookups 9 years ago
Brian Coca aa6e204b6e Merge pull request #11115 from jhawkesworth/second_go_at_fixing_1404
Part fix for https://github.com/ansible/ansible-modules-core/issues/1404 (replaces #11086)
9 years ago
Brian Coca f2934eeb0a Merge pull request #11226 from resmo/for-ansible
cloudstack: cleanup, remove unused parts
9 years ago
Brian Coca d68111382d updated with nagios doc fix 9 years ago
Brian Coca 39764ed7d8 updated submodule refs 9 years ago
Rene Moser 0b074c449b cloudstack: methods renaming 9 years ago
Rene Moser 7b3dd55c3d cloudstack: remove unused methods used for backward compatibility 9 years ago
Dionysis Grigoropoulos 6f11896303
ansible-pull: Add option to verify gpg signature of a commit
Add option '--verify-commit' to verify a GPG signature of the checked
out commit. As noted in the git module documentantion, this requires
git version >= 2.1.0
9 years ago
Brian Coca 757fb39a2e now uses new module_loader 9 years ago
Brian Coca 24b7c353cc readjusted limit opts, makes no sense in adhoc when you already specify selection
changed pull to reflect this
9 years ago
Brian Coca 845d564d89 removed debug, moved limit to runtask instead section 9 years ago
Brian Coca fdeca37257 switched to argv[0] from __file__ as it is what we actually wanted 9 years ago
Brian Coca 5aec5e5eb0 fixed ansible pull, reorged validate function for cli to be function specific like parser
added missing cmd_functions with run_cmd, mostly for ansible pull
9 years ago
Brian Coca 19161dfd72 fixed typo in placeholder check 9 years ago
Rene Moser fc3020c57a cloudstack: prevent getting the wrong project.
Since we use domain and account data to filter the project, listall is not needed and can return the wrong identical named project of another account if root admin permissions are used.

Fixed projects names are not case insensitive.
9 years ago
Brian Coca 8e3213a91e updated copyright as MPD does not deserve the blame for this one 9 years ago
Brian Coca 45f80328ae updated submodule refs 9 years ago
Brian Coca 70b5c28694 initial implementation of the generic OS package module 9 years ago
Toshio Kuratomi e88a9e943c Use to_bytes to avoid tracebacks when passed a byte str instead of a unicode string
Fixes #11198
9 years ago
Brian Coca 97bc92d2df minor cleanup, pushed ipv6 fixing to init
pushed up using host short var
made close conditional, started implementing close for controlmaster
9 years ago
Matt Martz 6a1c175991 Raise AnsibleParserError instead of AssertionError 9 years ago
Brian Coca bdba807fd1 minor fixes to ssh error reporting
shoudl fix #11041
9 years ago
Edward J Kim 6a5a930c5a Add missing import in vault.py 9 years ago
Toshio Kuratomi 65d982b186 Merge pull request #11186 from sivel/winrm-syntax-error
Fix syntax error in winrm
9 years ago
Brian Coca d67c9858a9 removed become_pass as it should not be used 9 years ago
Brian Coca 46673cd620 Merge pull request #11183 from sivel/issue/11169-become-pass
Don't empty out become_pass. See #11169
9 years ago
Matt Martz 6f5ebb4489 Fix syntax error in winrm 9 years ago
Matt Martz 45b4ee9cfe Don't allow setting become_pass in a play 9 years ago
Toshio Kuratomi f9b56a5d7c Fix raising AnsibleError 9 years ago
Matt Martz 6bc2ea1f2b Don't empty out become_pass. See #11169 9 years ago
Brian Coca 04f4f77d91 Merge pull request #11124 from sivel/jit-connect
Use a decorator to perform just in time connection
9 years ago
James Cammarata 73c956366e Correctly determine failed task state when checking results
Fixes #11172
9 years ago
James Cammarata a4ebee4b16 Merge pull request #11170 from dguerri/devel
Fix lookup() plugin
9 years ago
James Cammarata ee5e166563 Fixing ansible_*_interpreter use
Fixes ansible/ansible-modules-core#1459
9 years ago
Davide Guerri ee06eebea3 Fix lookup() plugin
lookup() plugin is currently broken because _get_file_contents() now
returns a tuple: (contents, show_data).

This patch fix that issue.
9 years ago
Matt Martz bce281014c Decorate the ConnectionBase methods, switch to calling super from individual connection classes 9 years ago
Matt Martz 9754c67138 Use a decorator to ensure jit connection, instead of an explicit call to _connect 9 years ago
James Cammarata f3f3fb7c49 Fixing vars_prompt 9 years ago
Matt Martz 6a97e49a06 Re-introduce ssh connection private key support 9 years ago
Toshio Kuratomi 7dd3ef7b60 Older python-six from early RHEL and ubuntu do not have add_metaclass but do have with_metaclass 9 years ago
Brian Coca f3ccff42e5 Merge pull request #11142 from Etienne-Carriere/factor_f5
Add common fonctions for F5 modules (FQ Name functions)
9 years ago
Etienne CARRIERE 94fa5e8794 Simplify Fully Qualified function 9 years ago
Brian Coca 9856a8f674 added missing imports to doc module 9 years ago
Toshio Kuratomi 96836412aa Make error messages tell which inventory script the error came from 9 years ago
Brian Coca a87687dccb Merge pull request #11147 from sivel/module-docs-import-mutablemapping
Import missing MutableMapping class for module_docs
9 years ago
Toshio Kuratomi 1c8527044b Fix error handling when pasing output from dynamic inventory 9 years ago
Toshio Kuratomi c3caff5eeb Fix for six version 1.1.0 (rhel6). 9 years ago
Brian Coca 6b642afc7b Merge pull request #11146 from sivel/issue/11136
Don't set a default on the _become FieldAttribute
9 years ago
Toshio Kuratomi d8c8ca11cf Add compatibility for old version of six (present on rhel7) 9 years ago
Matt Martz 89dceb503a Import missing MutableMapping class 9 years ago
Matt Martz f983557e7e Don't set a default on the _become FieldAttribute. Fixes #11136 9 years ago
Etienne CARRIERE 5204d7ca88 Add common fonctions for F5 modules (FQ Name functions) 9 years ago
Patrick McConnell a899f8f016 Fix for task_executor on OS X
I get this exception during the setup task:

AttributeError: 'ConnectionInformation' object has no attribute 'remote_pass'

I believe it is supposed to be looking at the password attribute. Either that
or we should create a remote_pass attribute in ConnectionInformation.
9 years ago
Brian Coca 3e2e81d896 missing path in import path for making paths 9 years ago
Brian Coca 65b82f69e4 avoid failing when mode is none 9 years ago
Brian Coca 5622fc23bc fixed frozen set, missing iterable 9 years ago
Brian Coca 48c0d6388f moved RAW var to class and as a frozenset 9 years ago
Matt Martz 1b48111b12 If remote_addr isn't set, set to ipv4_address 9 years ago
James Cammarata f57eaece88 Merge pull request #11134 from sivel/import-display-cli-base
Add missing import in ansible.cli
9 years ago
Matt Martz 6519118106 Add missing import in ansible.cli 9 years ago
James Cammarata 7a617e7b93 Merge pull request #11131 from sivel/issue/11130
Don't override ansible_ssh_host with inventory_hostname
9 years ago
James Cammarata c4ae51089d Merge pull request #11129 from sivel/fix-scp-if-ssh
Fix command building for scp if ssh
9 years ago