【问题标题】:How do I use the functions within this Python script?如何使用此 Python 脚本中的函数?
【发布时间】:2020-10-22 09:43:58
【问题描述】:

我有这个 Python 脚本来通过 FauxAPI 控制 PfSense 路由器。问题是当我调用一个函数时它会出错。我想我调用函数是错误的。有谁知道怎么称呼他们? 这是我正在使用的 API 的链接:https://github.com/ndejong/pfsense_fauxapi 我曾尝试调用 config_get(self, section=none) 但这似乎不起作用。

import os
import json
import base64
import urllib
import requests
import datetime
import hashlib


class PfsenseFauxapiException(Exception):
    pass


class PfsenseFauxapi:

    host = '172.16.1.1'
    proto = None
    debug = None
    version = None
    apikey = 'key'
    apisecret = 'secret'
    use_verified_https = None

    def __init__(self, host, apikey, apisecret, use_verified_https=False, debug=False):
        self.proto = 'https'
        self.base_url = 'fauxapi/v1'
        self.version = __version__
        self.host = host
        self.apikey = apikey
        self.apisecret = apisecret
        self.use_verified_https = use_verified_https
        self.debug = debug
        if self.use_verified_https is False:
            requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

    def config_get(self, section=None):
        config = self._api_request('GET', 'config_get')
        if section is None:
            return config['data']['config']
        elif section in config['data']['config']:
            return config['data']['config'][section]
        raise PfsenseFauxapiException('Unable to complete config_get request, section is unknown', section)

    def config_set(self, config, section=None):
        if section is None:
            config_new = config
        else:
            config_new = self.config_get(section=None)
            config_new[section] = config
        return self._api_request('POST', 'config_set', data=config_new)

    def config_patch(self, config):
        return self._api_request('POST', 'config_patch', data=config)

    def config_reload(self):
        return self._api_request('GET', 'config_reload')

    def config_backup(self):
        return self._api_request('GET', 'config_backup')

    def config_backup_list(self):
        return self._api_request('GET', 'config_backup_list')

    def config_restore(self, config_file):
        return self._api_request('GET', 'config_restore', params={'config_file': config_file})

    def send_event(self, command):
        return self._api_request('POST', 'send_event', data=[command])

    def system_reboot(self):
        return self._api_request('GET', 'system_reboot')

    def system_stats(self):
        return self._api_request('GET', 'system_stats')

    def interface_stats(self, interface):
        return self._api_request('GET', 'interface_stats', params={'interface': interface})

    def gateway_status(self):
        return self._api_request('GET', 'gateway_status')

    def rule_get(self, rule_number=None):
        return self._api_request('GET', 'rule_get', params={'rule_number': rule_number})

    def alias_update_urltables(self, table=None):
        if table is not None:
            return self._api_request('GET', 'alias_update_urltables', params={'table': table})
        return self._api_request('GET', 'alias_update_urltables')

    def function_call(self, data):
        return self._api_request('POST', 'function_call', data=data)

    def system_info(self):
        return self._api_request('GET', 'system_info')

    def _api_request(self, method, action, params=None, data=None):

        if params is None:
            params = {}

        if self.debug:
            params['__debug'] = 'true'

        url = '{proto}://{host}/{base_url}/?action={action}&{params}'.format(
            proto=self.proto, host=self.host, base_url=self.base_url, action=action, params=urllib.parse.urlencode(params))

        if method.upper() == 'GET':
            res = requests.get(
                url,
                headers={'fauxapi-auth': self._generate_auth()},
                verify=self.use_verified_https
            )
        elif method.upper() == 'POST':
            res = requests.post(
                url,
                headers={'fauxapi-auth': self._generate_auth()},
                verify=self.use_verified_https,
                data=json.dumps(data)
            )
        else:
            raise PfsenseFauxapiException('Request method not supported!', method)

        if res.status_code == 404:
            raise PfsenseFauxapiException('Unable to find FauxAPI on target host, is it installed?')
        elif res.status_code != 200:
            raise PfsenseFauxapiException('Unable to complete {}() request'.format(action), json.loads(res.text))

        return self._json_parse(res.text)

    def _generate_auth(self):
        # auth = apikey:timestamp:nonce:HASH(apisecret:timestamp:nonce)
        nonce = base64.b64encode(os.urandom(40)).decode('utf-8').replace('=', '').replace('/', '').replace('+', '')[0:8]
        timestamp = datetime.datetime.utcnow().strftime('%Y%m%dZ%H%M%S')
        hash = hashlib.sha256('{}{}{}'.format(self.apisecret, timestamp, nonce).encode('utf-8')).hexdigest()
        return '{}:{}:{}:{}'.format(self.apikey, timestamp, nonce, hash)

    def _json_parse(self, data):
        try:
            return json.loads(data)
        except json.JSONDecodeError:
            pass
        raise PfsenseFauxapiException('Unable to parse response data!', data)

【问题讨论】:

  • 分享创建PfsenseFauxapi实例并使用它的代码。

标签: python pfsense


【解决方案1】:

如果没有自己测试过上面的脚本,我可以得出结论,是的,你调用了错误的函数。上面的脚本是一个类,必须先实例化,然后才能使用里面的任何函数。

例如,您可以先创建一个对象:

pfsense = PfsenseFauxapi(host='<host>', apikey='<API key>', apisecret='<API secret>')

&lt;host&gt;&lt;API key&gt;&lt;API secret&gt; 替换为所需的值

然后调用函数:

pfsense.config_get() # self is not passed

config_get 可以替换为任何函数

另请注意

  • 只要你调用pfsense = PfsenseFauxapi(...),所有代码在 __init__ 函数也像构造函数一样运行(它 用于初始化类的所有属性)。
  • 当函数的参数为​​parameter=something 时,something 是该参数未传递任何内容时的默认值。因此,为什么不需要传递 use_verified_httpsdebugsection(除非您当然想更改它们)

Here 是有关课程的更多信息,如果您需要的话。

【讨论】:

    【解决方案2】:

    您需要创建该类的对象才能调用该类的功能。例如 x = PfsenseFauxapi()(构造对象时调用init方法) 然后去x.'any function'。为了获得良好的命名质量,也许将变量命名为不 x。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2021-08-11
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多