Bläddra i källkod

Adding [tab] completion for bash and zsh.

Kenny Woodson 10 år sedan
förälder
incheckning
d124436d94
3 ändrade filer med 45 tillägg och 10 borttagningar
  1. 18 7
      bin/COMPLETION_SETUP
  2. 20 0
      bin/_ossh_zsh_completion
  3. 7 3
      bin/ossh

+ 18 - 7
bin/COMPLETION_SETUP

@@ -1,17 +1,11 @@
 # ossh is an ssh replacement.
 
+
 Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them
 to something meaningful such as an IP address or dns name.
 
 This allows us to treat our servers as cattle and not as pets.
 
-In order to setup bash completion, source the following script:
-/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion
-
-This bash_completion script will look at the cached version of your
-multi_ec2 results in ~/.ansible/tmp/.  It will then parse a few
-host.env out of the json and return them to be completable.
-
 If you have not run the ossh command and it has not laid down
 a cache file the completions will not be available.
 
@@ -19,3 +13,20 @@ You can populate the cache by running `ossh --list`.  This
 will populate the cache file and the completions should
 become available.
 
+This zsh script will look at the cached version of your
+multi_ec2 results in ~/.ansible/tmp/.  It will then parse a few
+{host}.{env} out of the json and return them to be completable.
+
+# BASH
+In order to setup bash completion, source the following script:
+/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion
+
+# ZSH
+In order to setup zsh completion, you will need to verify
+that the _ossh_zsh_completion script is somewhere in the path
+of $fpath.
+
+Once $fpath includes the _ossh_zsh_completion script then you should
+run `exec zsh`.  This will then allow you to call `ossh host[TAB]` 
+for a list of completions.
+

+ 20 - 0
bin/_ossh_zsh_completion

@@ -0,0 +1,20 @@
+#compdef ossh
+
+_ossh_known_hosts(){
+  if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then
+    /usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])'
+  fi
+
+}
+_ossh(){
+  local curcontext="$curcontext" state line
+  typeset -A opt_args
+
+  _arguments -s : \
+      "*:Hosts:_ossh_known_hosts"
+
+  case $state in
+  *)
+        
+}
+_ossh "$@"

+ 7 - 3
bin/ossh

@@ -26,6 +26,13 @@ class Ossh(object):
         self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)))
         self.parse_cli_args()
 
+        # parse host and user
+        self.process_host()
+
+        if not self.args.list and not self.env:
+            print "Please specify an environment."
+            return
+
         if self.args.host == '' and not self.args.list:
             self.parser.print_help()
             return
@@ -34,15 +41,12 @@ class Ossh(object):
 
         self.host_inventory = self.get_hosts()
 
-
         if self.args.debug:
             print self.args
 
         # get a dict of host inventory
         self.get_hosts()
 
-        # parse host and user
-        self.process_host()
 
         # perform the SSH
         if self.args.list: