NetScaler API是一个用于与Citrix NetScaler应用交付控制器交互的Python接口,使用SOAP API执行命令。
项目描述
摘要
NetScaler API是一个用于与Citrix NetScaler应用交付控制器交互的Python接口,使用SOAP API执行命令。
依赖项
- python-suds:
轻量级SOAP客户端
示例
将任何kwargs传递给init,就像传递给suds.client.Client构造函数一样。使用ImportDoctor进行一些魔法操作,以覆盖在WSDL中使用的缺失类型。
如果您指定了wsdl,此文件将从默认的http URL中拉取
如果您指定了wsdl_url,它将覆盖wsdl文件。本地
file:// URLs可以正常工作。
为了节省重复代码的时间,继承这个类来创建应用程序中常用命令的方法是个不错的选择。
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。截至本文撰写时,它是2.5M。它描述了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中的2800多个方法
>>> 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 - 继承示例
在示例目录中有一个名为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
我使用了黑名单创建或删除任何名字中含有“root”或以“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
传输结束