netscaler api是一个python接口,用于与citrix netscaler应用程序交付控制器交互,利用soap api执行命令。
netscaler-api的Python项目详细描述
摘要
netscaler api是一个用于与citrix netscaler交互的python接口。 应用程序交付控制器,利用SOAP API执行命令
依赖关系
:python-suds:轻量级soap客户端
示例
将任何Kwargs传递给init,您将把它传递给suds.client.Client 构造器。使用ImportDoctor来覆盖 缺少WSDL中使用的类型
- 如果您specify wsdl,则将从默认的http url中提取此文件
- 如果您specify wsdl_url,它将重写wsdl文件。本地
- file://url工作正常。
为了节省可重用代码的时间,将其子类化为 为应用程序中常用的命令创建方法:
class MyAPI(API): def change_password(self, username, newpass): return self.run("setsystemuser_password", username=username, password=newpass)
在脚本中:
import netscaler if __name__ == '__main__': netscaler.DEBUG = True wsdl_url = 'file:///home/j/jathan/sandbox/NSUserAdmin.wsdl' client = netscaler.API('nos', username='nsroot', password='nsroot', wsdl_url=wsdl_url) print client.logged_in
性能
默认的netscaler wsdl非常庞大,无疑是最全面的 我使用过的soap api。截至本文撰写时,这是250万英镑。它描述了 服务于NetScaler所能做的一切,这对大多数工具来说都是过分的。 获取默认的NSConfig.wsdl将导致netscaler.py编译 全都是。
这可能需要很长时间:
% time ./nstest.py WSDL: file:///home/j/jathan/sandbox/NSConfig.wsdl Starting client... Done. ./netscaler.py 12.23s user 0.37s system 99% cpu 12.613 total
如果每次启动时都必须下载wsdl,则需要更长的时间 启动你的程序。所以你肯定想过滤你的wsdl和netscaler 有一个名为filterwsdl的cli工具来实现这一点。
如果你想知道为什么要这样做,请阅读http://bit.ly/aX57SS
所以假设我们只想与用户管理操作交互。怎么 关于login、logout、savensconfig(当然)以及 systemuser在里面。它是这样的(从NetScaler上的CLI shell运行):
# filterwsdl /netscaler/api/NSConfig.wsdl +"log*" +"*systemuser*" +"savensconfig" > /netscaler/api/NSUserAdmin.wsdl
然后scp将文件从设备发送到本地主机。现在让我们比较一下:
-rw-r--r-- 1 jathan jathan 2.6M 2009-08-19 00:40 NSConfig.wsdl -rw-r--r-- 1 jathan jathan 14K 2010-03-02 16:36 NSUserAdmin.wsdl
差别很大。观察子集wsdl编译的速度:
% time ./nstest.py WSDL: file:///home/j/jathan/sandbox/NSUserAdmin.wsdl Starting client... Done. ./netscaler.py 0.36s user 0.03s system 100% cpu 0.392 total
差别很大。
suds wsdl缓存
在我们玩它之前有一件事要记住 suds.client。默认情况下,它将缓存WSDL,这有助于 但在测试和调试时可能会混淆,特别是在 您正在调整筛选的wsdl。所以每次测试都要通过 cache=None到构造函数以避免这种混淆
命令行示例
好的,现在让我们开始玩吧:
>>> import netscaler >>> wsdl_url = 'file:///Users/jathan/sandbox/netscaler-api/NSUserAdmin.wsdl' >>> api = netscaler.API('netscaler', username='nsroot', password='nsroot', wsdl_url=wsdl_url, cache=None) setting username to nsroot setting cache to None setting password to nsroot wsdl_url: file:///Users/jathan/sandbox/netscaler-api/NSUserAdmin.wsdl soap_url: http://netscaler/soap/
现在,如果您打印api对象,它的行为就像suds.client.Client 反对。注意,这个方法子集比 主wsdl:
>>> print api Suds ( https://fedorahosted.org/suds/ ) version: 0.3.9 GA build: R659-20100219 Service ( NSConfigService ) tns="urn:NSConfig" Prefixes (2) ns0 = "http://schemas.xmlsoap.org/soap/encoding/" ns1 = "urn:NSConfig" Ports (1): (NSConfigPort) Methods (10): addsystemuser(xs:string username, xs:string password, ) bindsystemuser_policy(xs:string username, xs:string policyname, xs:unsignedInt priority, ) getsystemuser(xs:string username, ) login(xs:string username, xs:string password, ) loginchallengeresponse(xs:string response, ) logout() rmsystemuser(xs:string username, ) savensconfig() setsystemuser_password(xs:string username, xs:string password, ) unbindsystemuser_policy(xs:string username, xs:string policyname, ) Types (54): ns0:Array ns0:ENTITIES ns0:ENTITY ns0:ID ns0:IDREF ns0:IDREFS ns0:NCName ns0:NMTOKEN ns0:NMTOKENS ns0:NOTATION ns0:Name ns0:QName ns0:Struct ns0:anyURI ns0:arrayCoordinate ns0:base64 ns0:base64Binary ns0:boolean ns0:byte ns0:date ns0:dateTime ns0:decimal ns0:double ns0:duration ns0:float ns0:gDay ns0:gMonth ns0:gMonthDay ns0:gYear ns0:gYearMonth getsystemuserResult ns0:hexBinary ns0:int ns0:integer ns0:language ns0:long ns0:negativeInteger ns0:nonNegativeInteger ns0:nonPositiveInteger ns0:normalizedString ns0:positiveInteger ns0:short simpleResult ns0:string stringList systemuser systemuserList ns0:time ns0:token ns0:unsignedByte ns0:unsignedInt unsignedIntList ns0:unsignedLong ns0:unsignedShort
现在我们可以运行命令:
>>> api.run("addsystemuser", username='jathan', password='jathan') config changed, autosaving. Done (simpleResult){ rc = 0 message = "Done" }
自动保存
配置已更改,自动保存
你自己为什么不直接调用 api.client.service.addsystemuser()。这是个好问题。这取决于 你想不想利用我自动加的小优惠 在易失性操作上登录并自动保存配置。一些 人们可能喜欢这些想法,但其他人可能不喜欢自动保存由启用 默认设置,但可以通过将autosave=False传递给 构造器。
当前任何不以login,logout,get开头的命令, 或者save被认为是不稳定的,并将触发自动保存。
useradmin-子类化示例
在examples目录中是nsuser.py,这是一个如何 利用子类化在某些命令周围包装一些业务逻辑。在这里 它是:
class IllegalName(netscaler.InteractionError): pass class UserAdmin(netscaler.API): def is_safe(self, username): """Returns False for names containing 'root' or starting with 'ns'.""" if 'root' in username or username.startswith('ns'): return False return True def add_user(self, username, password): """Custom user adder that won't allow unsafe names""" if not self.is_safe(username): raise IllegalName(username) try: resp = self.run("addsystemuser", username=username, password=password) return True except netscaler.InteractionError, err: return False def del_user(self, username): """Custom user remover that protects usernames""" if not self.is_safe(username): raise IllegalName(username) try: resp = self.run("rmsystemuser", username=username) return True except netscaler.InteractionError, err: return False def user_exists(self, username): """Returns True if user exists.""" try: resp = self.run("getsystemuser", username=username) return True except netscaler.InteractionError, err: return False
我用了一个黑名单的例子来创建或删除 名称中的“根”或以“ns”开头。所以如果你尝试任何不稳定的操作 对于使用此模块的用户,将发生以下情况:
>>> import nsuser >>> wsdl_url = 'file:///Users/jathan/sandbox/netscaler-api/examples/NSUserAdmin.wsdl' >>> api = nsuser.UserAdmin('netscaler', username='nsroot', password='nsroot',wsdl_url=wsdl_url, cache=None) >>> api.del_user('nsroot') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "nsuser.py", line 29, in del_user raise IllegalName(username) nsuser.IllegalName: nsroot
如果运行nsuser,它会添加一些丢失的用户或删除 现有的一些虚拟帐户只是为了说明它是如何工作的:
% py nsuser.py setting username to nsroot setting cache to None setting password to nsroot wsdl_url: file:///Users/jathan/sandbox/netscaler-api/examples/NSUserAdmin.wsdl soap_url: http://netscaler/soap/ Done logged in: True autosave? True checking jathan config changed; consider saving! config changed; autosaving. Done jathan added! checking dynasty config changed; consider saving! config changed; autosaving. Done dynasty added! checking john config changed; consider saving! config changed; autosaving. Done john added!
另一方面:
% py nsuser.py setting username to nsroot setting cache to None setting password to nsroot wsdl_url: file:///Users/jathan/sandbox/netscaler-api/examples/NSUserAdmin.wsdl soap_url: http://netscaler/soap/ Done logged in: True autosave? True checking jathan jathan exists. deleting config changed; consider saving! config changed; autosaving. Done checking dynasty config changed; autosaving. Done dynasty exists. deleting config changed; consider saving! config changed; autosaving. Done checking john config changed; autosaving. Done john exists. deleting config changed; consider saving! config changed; autosaving. Done
结束传输