跳转到主要内容

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

假设我们只想与用户管理操作交互。比如loginlogoutsavensconfig(当然),以及包含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传递给构造函数来禁用它。

目前,任何不以loginlogoutgetsave开头的命令都被视为易变,并将触发自动保存。

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

传输结束

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源代码分布

netscaler-api-0.2.3.tar.gz (29.6 kB 查看散列值)

上传时间 源代码

支持