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

所以假设我们只想与用户管理操作交互。怎么 关于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:

>>> 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传递给 构造器。

当前任何不以loginlogoutget开头的命令, 或者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

结束传输

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为游戏添加声音。需要帮助   java在获取数据时忽略模型类中的forign键映射   java为什么Microsoft JDBC驱动程序忽略failoverPartner主机名   java可以下载mozswing文件   java等价于ObjectOutputStream,不仅保存其状态,还保存整个对象?   Java Android LiveData根据其他LiveData调用房间查询   java如何使用jackson jsonNode实现这一点并获得所需的输出   在web服务器上作为web应用程序运行java应用程序?   groovy中java类的元类属性   返回空指针的java图形对象   标头中包含用户名和密码的java SOAP客户端请求   具有堆栈实现和递归的Hanoi算法塔(Java)   java当我运行这两个类时,我的老鼠不会移动   使用图像进行java相似图像搜索   Java8并行流机制   使用单例对象作为枚举元素的java Scala枚举,是否有可能对它们进行迭代?   java Webview更改高度大小   不可序列化对象和函数的java Spark Scala编程   java my app在eclipse中运行良好,而不是在jar中