如何使用此Python脚本中的功能?

问题描述

我有这个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,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,nonce,hash)

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

解决方法

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

,

如果没有亲自测试上面的脚本,我可以得出结论,是的,您在调用函数时出错。上面的脚本是一个类,必须先实例化该类,然后才能使用其中的任何函数。

例如,您可以首先使用以下对象创建对象:

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

用所需的值替换<host><API key><API secret>

然后使用以下命令调用该函数:

pfsense.config_get() # self is not passed

其中config_get可以用任何函数替换

也请注意

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

Here是有关类的更多信息。