Package pywbem :: Module wbemcli
[frames] | no frames]

Source Code for Module pywbem.wbemcli

  1  #!/usr/bin/env python 
  2  # 
  3  # (C) Copyright 2008 Hewlett-Packard Development Company, L.P. 
  4  # 
  5  # This library is free software; you can redistribute it and/or 
  6  # modify it under the terms of the GNU Lesser General Public 
  7  # License as published by the Free Software Foundation; either 
  8  # version 2.1 of the License, or (at your option) any later version. 
  9  # 
 10  # This program is distributed in the hope that it will be useful, but 
 11  # WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 13  # Lesser General Public License for more details. 
 14  # 
 15  # You should have received a copy of the GNU Lesser General Public 
 16  # License along with this program; if not, write to the Free Software 
 17  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 18  # 
 19  # Author: Tim Potter <tpot@hp.com> 
 20  # 
 21   
 22  """A small utility to wrap up a PyWBEM session in a Python interactive 
 23  console. 
 24   
 25  Usage: 
 26    wbemcli.py HOSTNAME [-u USERNAME -p PASSWORD] [-n namespace] [--no-ssl] \ 
 27        [--port PORT] 
 28   
 29  The utility creates a ``pywbem.WBEMConnection`` object for the specified 
 30  WBEM server location. Subsequent operatoins then use that connection. 
 31   
 32  There are two sets of aliases available for usage in the interpreter. For 
 33  example, the following two commands are equivalent: 
 34   
 35    >>> EnumerateInstanceNames('SMX_ComputerSystem') 
 36    >>> ein('SMX_ComputerSystem') 
 37   
 38  Pretty-printing of results is also available using the 'pp' 
 39  function. For example: 
 40   
 41    >>> cs = ei('SMX_ComputerSystem')[0] 
 42    >>> pp(cs.items()) 
 43    [(u'RequestedState', 12L), 
 44     (u'Dedicated', [1L]), 
 45     (u'StatusDescriptions', [u'System is Functional']), 
 46     (u'IdentifyingNumber', u'6F880AA1-F4F5-11D5-8C45-C0116FBAE02A'), 
 47    ... 
 48  """ 
 49   
 50  import os 
 51  import sys 
 52  import getpass 
 53  import errno 
 54  import code 
 55  import optparse 
 56   
 57  # Conditional support of readline module 
 58  _HAVE_READLINE = False 
 59  try: 
 60      import readline 
 61      _HAVE_READLINE = True 
 62  except ImportError, arg: 
 63      pass 
 64   
 65  import pywbem 
 66   
 67  # Additional symbols for use in the interactive session 
 68  from pprint import pprint as pp 
 69   
 70  __all__ = [] 
 71   
 72  _CONN = None 
 73   
74 -def remote_connection(argv, opts):
75 """Initiate a remote connection, via PyWBEM.""" 76 77 global _CONN 78 79 if argv[0][0] == '/': 80 url = argv[0] 81 else: 82 proto = 'https' 83 84 if opts.no_ssl: 85 proto = 'http' 86 87 url = '%s://%s' % (proto, argv[0]) 88 89 if opts.port is not None: 90 url += ':%d' % opts.port 91 92 creds = None 93 94 if opts.user is not None and opts.password is None: 95 opts.password = getpass.getpass('Enter password for %s: ' % opts.user) 96 97 if opts.user is not None or opts.password is not None: 98 creds = (opts.user, opts.password) 99 100 _CONN = pywbem.WBEMConnection(url, creds, default_namespace=opts.namespace) 101 102 _CONN.debug = True 103 104 return _CONN
105 106 # 107 # Create some convenient global functions to reduce typing 108 # 109
110 -def EnumerateInstanceNames(classname, namespace=None):
111 """Enumerate the names of the instances of a CIM Class (including the 112 names of any subclasses) in the target namespace.""" 113 114 global _CONN 115 116 return _CONN.EnumerateInstanceNames(classname, namespace=namespace)
117
118 -def EnumerateInstances(classname, namespace=None, LocalOnly=True, 119 DeepInheritance=True, IncludeQualifiers=False, 120 IncludeClassOrigin=False):
121 """Enumerate instances of a CIM Class (includeing the instances of 122 any subclasses in the target namespace.""" 123 124 global _CONN 125 126 return _CONN.EnumerateInstances(classname, 127 namespace=namespace, 128 DeepInheritance=DeepInheritance, 129 IncludeQualifiers=IncludeQualifiers, 130 IncludeClassOrigin=IncludeClassOrigin)
131 132
133 -def GetInstance(instancename, LocalOnly=True, IncludeQualifiers=False, 134 IncludeClassOrigin=False):
135 """Return a single CIM instance corresponding to the instance name 136 given.""" 137 138 global _CONN 139 140 return _CONN.GetInstance(instancename, 141 LocalOnly=LocalOnly, 142 IncludeQualifiers=IncludeQualifiers, 143 IncludeClassOrigin=IncludeClassOrigin)
144
145 -def DeleteInstance(instancename):
146 """Delete a single CIM instance.""" 147 148 global _CONN 149 150 return _CONN.DeleteInstance(instancename)
151
152 -def ModifyInstance(*args, **kwargs):
153 global _CONN 154 return _CONN.ModifyInstance(*args, **kwargs)
155
156 -def CreateInstance(*args, **kwargs):
157 global _CONN 158 return _CONN.CreateInstance(*args, **kwargs)
159
160 -def InvokeMethod(*args, **kwargs):
161 global _CONN 162 return _CONN.InvokeMethod(*args, **kwargs)
163
164 -def AssociatorNames(*args, **kwargs):
165 global _CONN 166 return _CONN.AssociatorNames(*args, **kwargs)
167
168 -def Associators(*args, **kwargs):
169 global _CONN 170 return _CONN.Associators(*args, **kwargs)
171
172 -def ReferenceNames(*args, **kwargs):
173 global _CONN 174 return _CONN.ReferenceNames(*args, **kwargs)
175
176 -def References(*args, **kwargs):
177 global _CONN 178 return _CONN.References(*args, **kwargs)
179
180 -def EnumerateClassNames(*args, **kwargs):
181 global _CONN 182 return _CONN.EnumerateClassNames(*args, **kwargs)
183
184 -def EnumerateClasses(*args, **kwargs):
185 global _CONN 186 return _CONN.EnumerateClasses(*args, **kwargs)
187
188 -def GetClass(*args, **kwargs):
189 global _CONN 190 return _CONN.GetClass(*args, **kwargs)
191
192 -def DeleteClass(*args, **kwargs):
193 global _CONN 194 return _CONN.DeleteClass(*args, **kwargs)
195
196 -def ModifyClass(*args, **kwargs):
197 global _CONN 198 return _CONN.ModifyClass(*args, **kwargs)
199
200 -def CreateClass(*args, **kwargs):
201 global _CONN 202 return _CONN.CreateClass(*args, **kwargs)
203
204 -def EnumerateQualifiers(*args, **kwargs):
205 global _CONN 206 return _CONN.EnumerateQualifiers(*args, **kwargs)
207
208 -def GetQualifier(*args, **kwargs):
209 global _CONN 210 return _CONN.GetQualifier(*args, **kwargs)
211
212 -def SetQualifier(*args, **kwargs):
213 global _CONN 214 return _CONN.SetQualifier(*args, **kwargs)
215
216 -def DeleteQualifier(*args, **kwargs):
217 global _CONN 218 return _CONN.DeleteQualifier(*args, **kwargs)
219 220 # Aliases for global functions above 221 222 ein = EnumerateInstanceNames 223 ei = EnumerateInstances 224 gi = GetInstance 225 di = DeleteInstance 226 mi = ModifyInstance 227 ci = CreateInstance 228 229 im = InvokeMethod 230 231 an = AssociatorNames 232 ao = Associators 233 rn = ReferenceNames 234 re = References 235 236 ecn = EnumerateClassNames 237 ec = EnumerateClasses 238 gc = GetClass 239 dc = DeleteClass 240 mc = ModifyClass 241 cc = CreateClass 242 243 eq = EnumerateQualifiers 244 gq = GetQualifier 245 sq = SetQualifier 246 dq = DeleteQualifier 247 248
249 -def get_banner():
250 """Return a banner message for the interactive console.""" 251 252 global _CONN 253 254 result = '' 255 256 # Note how we are connected 257 result += 'Connected to %s' % _CONN.url 258 if _CONN.creds is not None: 259 result += ' as %s' % _CONN.creds[0] 260 261 # Give hint about exiting. Most people exit with 'quit()' which will 262 # not return from the interact() method, and thus will not write 263 # the history. 264 result += '\nPress Ctrl-D to exit' 265 266 return result
267 268
269 -def main():
270 """Main routine, when called as a script.""" 271 272 global _CONN 273 274 # Parse command line args 275 optparser = optparse.OptionParser( 276 usage='%prog HOSTNAME [-u USER -p PASS] [-n NAMESPACE] [--no-ssl]') 277 278 # Username and password 279 optparser.add_option('-u', '--user', dest='user', 280 action='store', type='string', 281 help='user to connect as') 282 optparser.add_option('-p', '--password', dest='password', 283 action='store', type='string', 284 help='password to connect user as') 285 286 # Change the default namespace used 287 optparser.add_option('-n', '--namespace', dest='namespace', 288 action='store', type='string', default='root/cimv2', 289 help='default namespace to use') 290 291 # Don't use SSL for remote connections 292 optparser.add_option('--no-ssl', dest='no_ssl', action='store_true', 293 help='don\'t use SSL') 294 295 # Specify non-standard port 296 optparser.add_option('--port', dest='port', action='store', type='int', 297 help='port to connect as', default=None) 298 299 # Check usage 300 (opts, argv) = optparser.parse_args() 301 302 if len(argv) != 1: 303 optparser.print_usage() 304 sys.exit(1) 305 306 # Set up a client connection 307 _CONN = remote_connection(argv, opts) 308 309 # Determine file path of history file 310 home_dir = '.' 311 if 'HOME' in os.environ: 312 home_dir = os.environ['HOME'] # Linux 313 elif 'HOMEPATH' in os.environ: 314 home_dir = os.environ['HOMEPATH'] # Windows 315 histfile = '%s/.wbemcli_history' % home_dir 316 317 # Read previous command line history 318 if _HAVE_READLINE: 319 try: 320 readline.read_history_file(histfile) 321 except IOError, arg: 322 if arg[0] != errno.ENOENT: 323 raise 324 325 # Interact 326 i = code.InteractiveConsole(globals()) 327 i.interact(get_banner()) 328 329 # Save command line history 330 if _HAVE_READLINE: 331 readline.write_history_file(histfile) 332 333 return 0
334 335 if __name__ == '__main__': 336 exit(main()) 337