Git Product home page Git Product logo

phpypam's Introduction

phpypam: Python API client library for phpIPAM installation

PyPI version Codacy Badge Documentation Status

As we started to develop phpipam-ansible-modules we used an existing python library for phpIPAM API. As we needed a good error handling and we don't expect a quick fix of existing project we started to develop our own library.

installation

This library is hosted on pypi.org, so you can simply use pip to install it.

pip install phpypam

Alternatively you can install it from source. You need to do the following:

$ git clone https://github.com/codeaffen/phpypam.git
Cloning into 'phpypam'...
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 366 (delta 0), reused 0 (delta 0), pack-reused 365
Receiving objects: 100% (366/366), 88.57 KiB | 521.00 KiB/s, done.
Resolving deltas: 100% (187/187), done.
$ cd phpypam/
$ python setup.py install

quick start

To start using phpypam you simply have to write some lines of code.

import phpypam

pi = phpypam.api(
  url='https://ipam.example.com',
  app_id='ansible',
  username='apiuser',
  password='apiP455wd',
  ssl_verify=True
)
pi.get_entity(controller='sections')

making api connection

To connect to phpIPAM API you need some parameters to authenticate against the phpIPAM instance.

Parameter Description Default
url The URL to a phpIPAM instance. It includes the protocol (http or https).
app_id The app_id which is used for the API operations.
username The username which is used to connect to API. None
password The password to authenticate username against API. None
ssl_verify Should certificate of endpoint verified or not. Useful if you use a self signed certificate. True

Example connect to api and request current token:

connection_params = dict(
url='https://ipam.example.com',
  app_id='ansible',
  username='apiuser',
  password='apiP455wd',
  ssl_verify=True
)

pi = phpypam.api(**connection_params)

token = pi.get_token()

First of all you create a dictionary with the connection data. This dictionary will unpacked for creating a phpypam.api object.

If all went well you can use the get_token to get the currently valid token from API.

get available controllers

To work with the phpIPAM api it is useful if you know all available controllers. To achieve this you can either read the api documentation or you can use the controllers method.

controllers = pi.controllers()

The method returns a set with all supported controllers.

get an entity

To get an entity the get_entity method has to be used.

get_entity(controller, controller_path=None, params=None)

Example get a section by name:

entity = pi.get_entity(controller='sections', controller_path='foobar')

This call returns a dictionary for the entity with the name foobar.

create an entity

To create an entity the create_entity method has to be used.

create_entity(controller, controller_path=None, data=None, params=None)

Example create a section if it does not exists:

my_section = dict(
    name='foobar',
    description='new section',
    permissions='{"3":"1","2":"2"}'
)

try:
    entity = pi.get_entity(controller='sections', controller_path=my_section['name'])
except PHPyPAMEntityNotFoundException:
    print('create entity')
    entity = pi.create_entity(controller='sections', data=my_section)

In this example first we check if the section we work on already exists. If the PHPyPAMEntityNotFoundException is raised we create the entity.

update an entity

To update an entity you have to use the update_entity method.

update_entity(controller, controller_path=None, data=None, params=None)

Example update a section if it exists:

my_section['description'] = 'new description'

entity = pi.get_entity(controller='sections', controller_path=my_section['name'])
pi.update_entity(controller='sections', controller_path=entity['id'], data=my_section)

To change data you have to modify the value of the desired key to the value you want. You can see the data is changed in the dict from the former example. Then you get the entity to obtain its id to work on.

Note: All modifying operations need the id of an entity not the name.

In the last step you call update_entity and put the entity id in parameter controller_path with the data parameter you provide the fully entity description dictionary.

delete an entity

To delete an entity you have to use the delete_entity method.

delete_entity(controller, controller_path, params=None)

Example delete a existing section:

entity = pi.get_entity(controller='sections', controller_path=my_section['name'])
pi.delete_entity(controller='sections', controller_path=entity['id'])

In this example you request the entity you had created/updated in the above examples. After that you call delete_entity with the entity id from the request before.

possible exceptions

  • PHPyPAMInvalidCredentials - will be raised if something goes wrong with the authentication
  • PHPyPAMEntityNotFoundException - will be raised if an entity does not exists
  • PHPyPAMInvalidSyntax - will be raised for requests which will be answered with status code 400 from API
  • PHPyPAMException - for any errors which we catch but no specific exception exists this exception wil be raised

phpypam's People

Contributors

cmeissner avatar codacy-badger avatar mattiasa avatar pyup-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

phpypam's Issues

add a headers arg to create_entity()

Hi,
Thank you for this nice wrapper.

Describe the bug
Sometimes I run into this error phpipam/phpipam#3177
and as stated in this issue, I have to pass {"content-type: "application/x-www-form-urlencoded"}
in the headers to solve it.
Currently create_entity() does not have a 'headers' argument, so I have to call _query() directly to pass the header to the request.

Expected behavior
It is a bite dirty to have to call an internal function directly, so I would like to
be able to pass an 'headers' arg to create_entity(), and also to update_entity() and delete_entity for consistency I guess.

Versions:

  • python 3.10
  • phpypam 1.0.2

unable to login with no clear error message.

Hello,

I m trying to test phpypam with the sample provide.

pi = phpypam.api(
url='http://myipam.com',
app_id='xx',
token='xxxxx',
username='xxx',
password='xxx',
ssl_verify=False
)
pi.get_entity(controller='sections')

And i got the following error

Traceback (most recent call last):
File "test_ipam.py", line 10, in
ssl_verify=False
File "/lib/python3.6/site-packages/phpypam/core/api.py", line 66, in init
self._login()
File "/lib/python3.6/site-packages/phpypam/core/api.py", line 131, in _login
resp = self._query(method=POST, auth=_auth)
File "/lib/python3.6/site-packages/phpypam/core/api.py", line 121, in _query
raise PHPyPAMException(code=result['code'], message=result['message'])
phpypam.core.exceptions.PHPyPAMException

Versions:

  • python 3.6.0
  • phpypam

Search for non-existing hostname results not in correct exception

Describe the bug

Look up for a non existing call raises a PHPyPAMException not PHPyPAMEntityNotFoundException.

To Reproduce
Steps to reproduce the behavior:

pi.get_entity(controller='addresses', controller_path=f"search_hostname/{hostname}/")

Expected behavior

PHPyPAMEntityNotFoundException should be raised instead.

Versions:

phpypam <= 1.0.1

Additional context

Pull section by name

Hello,

is there a way to pull only by section name rather to pull all by default. ?

Thanks

Unable to authenticate to API "Please provide token"

Describe the bug
This follows on from https://github.com/codeaffen/phpipam-ansible-modules/discussions/52

Running the phpypam module on phpIPAM version 1.4.0 results in an unhandled error. Further debugging shows a HTTP 403 forbidden error with "Please provide token" from phpIPAM.

To Reproduce
Example code:

import phpypam

pi = phpypam.api(
  url='https://phpipam.server/',
  app_id='myappid',
  username='myusername',
  password='mypassword',
  ssl_verify=False
)
print(pi.get_entity(controller='sections'))

Version 1.40 of phpIPAM used

Expected behavior
With the above code, I expect an output of the configured sections in phpIPAM

Versions:

  • phpIPAM 1.4.0
  • phpypam 1.0.1

Additional context
Amending api.py in the core package as follows fixes the problem:

72c72
<     def _query(self, path='user/', headers=None, method=GET, data=None, params=None, auth=None, token=None):
---
>     def _query(self, path='user', headers=None, method=GET, data=None, params=None, auth=None, token=None):

It appears that from phpIPAM 1.4.1 and above, the trailing "/" is no longer needed. I tested there and it works fine without the trailing "/"

I'm not sure if the above "fix" is the best way to fix the problem. If it is, let me know and I will try creating a pull request for that together with a feature enhancement for undefined errors (display the HTTP error and message).

Subnet address search with zero results raises incorrect exception

Describe the bug
When searching for addresses in an empty subnet a generic PHPyPAMException is raised instead of PHPyPAMEntityNotFoundException.

To Reproduce
Steps to reproduce the behavior:

  1. In phpIPAM, create a new subnet with no address entries.
  2. Search the subnet for addresses via phpypam: IPAM_API.get_entity(controller='subnets', controller_path=subnet['id']+'/addresses/')
  3. PHPyPAMException is raised with message "No addresses found"

Expected behavior
PHPyPAMEntityNotFoundException should be raised instead.

Versions:

  • python: 3.8.10
  • phpypam: 1.0.2

Additional context
None.

Initial Update

The bot created this issue to inform you that pyup.io has been set up on this repo.
Once you have closed it, the bot will open pull requests for updates as soon as they are available.

Bug: all tests failing for python 3.10.x

Describe the bug

All test cases failing when running in a python 3.10 evironment

To Reproduce

  1. Set up a python 3.10 environment, e.g. with pyenv
  2. make test-setup
  3. make all-tests

All test cases failing with exception requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Expected behavior
A clear and concise description of what you expected to happen.

Versions:

  • python 3.10.9
  • phpypam develop

Additional context

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.