GLPI SDK written in Python.
This SDK is written in Python to help developers integrate their apps, APIS and scripts in GLPI infrastructure. This SDK abstract the GLPI Rest API.
To usage it, you should have username, password and API-Token from your GLPI server.
To create an API token: Setup > General > API :
Enable Rest API
:Yes
See also:
Just install from:
-
PyPi:
pip install glpi
-
repository (development):
pip install -e git+https://github.com/texnofobix/py-glpi.git@master#egg=glpi
-
requirements.txt (development)
pip install -r requirements-dev.txt
You should enable the GLPI API and generate an App Token.
Then import it in your script and create a glpi
API connection:
from glpi import GLPI
url = "GLPI_API_URL"
user = "GLPI_USERNAME"
password = "GLPI_PASSWORD"
app_token = "GLPI_APP_TOKEN"
glpi = GLPI(url, app_token, (user, password))
glpi.kill() #Destroy a session identified by a session token
To usage the SDK, you just set the DBTM item that you want and get information from GLPI.
The Item value must be valid, otherwise you will get the following error.
[
"ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM",
"resource not found or not an instance of CommonDBTM; view documentation in your browser at http://<GLPI_URL>/apirest.php/#ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM"
]
print("Getting all the profiles associated to logged user: ")
print(json.dumps(glpi.get('getMyProfiles'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting the current active profile: ")
print(json.dumps(glpi.get('getActiveProfile'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Changing active profile to the profiles_id one: ")
ticket_dict = glpi.post(item_name='changeActiveProfile', item_id=1, is_recursive=True)
#is_recursive: (default false) Also display sub entities of the active entity
print("Getting all the possible entities of the current logged user: ")
print(json.dumps(glpi.get('getMyEntities'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting active entities of current logged user: ")
print(json.dumps(glpi.get('getActiveEntities'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Changing active entity to the entities_id one: ")
ticket_dict = glpi.post(item_name='changeActiveEntities', item_id=1)
print("Getting the current php $_SESSION: ")
print(json.dumps(glpi.get('getFullSession'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting all Tickets: ")
print(json.dumps(glpi.get_all('ticket'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting Ticket with ID 1: ")
print(json.dumps(glpi.get('ticket', 1),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting a collection of rows of the sub_itemtype for the identified item: ")
print(json.dumps(glpi.get('ticket', 1, 'log'),
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting 'Locations': ")
print(json.dumps(glpi.get('location'),
indent=4,
separators=(',', ': '),
sort_keys=True))
ticket_payload = {
'name': 'New ticket from SDK',
'content': '>>>> Content of ticket created by SDK API <<<'
}
ticket_dict = glpi.create(item_name='ticket', item_data=ticket_payload)
if isinstance(ticket_dict, dict):
print("The create ticket request was sent. See results: ")
print(json.dumps(ticket_dict,
indent=4,
separators=(',', ': '),
sort_keys=True))
ticket_payload = {
'name': 'New name of ticket from SDK',
'content': '>>>> New content of ticket created by SDK API <<<'
'id': 1 #Id value generated in creation of ticket
}
ticket_dict = glpi.update(item_name='ticket', data=ticket_payload)
if isinstance(ticket_dict, dict):
print("The update ticket request was sent. See results: ")
print(json.dumps(ticket_dict,
indent=4,
separators=(',', ': '),
sort_keys=True))
ticket_dict = glpi.delete(item_name='ticket', item_id=1, force_purge=true)
#force_purge (default false): boolean, if the itemtype have a dustbin, you can force purge (delete finally)
if isinstance(ticket_dict, dict):
print("The delete ticket request was sent. See results: ")
print(json.dumps(ticket_dict,
indent=4,
separators=(',', ': '),
sort_keys=True))
print("Getting a list of search options for the item type provided: ")
print(json.dumps(glpi.search_options('ticket'),
indent=4,
separators=(',', ': '),
sort_keys=True))
GLPI has a powerfull search engine builtin, which is exposed via the API.
See the documentation at your GLPI instance via apirest.php#search-items
.
The usage sample using curl
is:
query 'name' and return the ID
curl -X GET 'http://path/to/apirest.php/search/Knowbaseitem?
criteria\[0\]\[field\]\=6
&criteria\[0\]\[searchtype\]=contains
&criteria\[0\]\[value\]=sites-multimidia
&criteria\[0\]\[link\]\=AND
&criteria\[1\]\[field\]\=2
&criteria\[1\]\[searchtype\]\=contains
&criteria\[1\]\[value\]\=
&criteria\[1\]\[link\]\=AND'
You can use it as follows:
print("Search 'Computers': ")
criteria = { "criteria": [
{
# "link": "AND", # this is optional for the first criterion
"searchtype": None, # default to "contains"
"field": "name",
"value": "TEST"
},
{
"link": "AND",
#"searchtype": "bb", # default to "contains"
"field": "otherserial",
"value": "xxx"
}
]}
print(json.dumps(glpi.search_engine('computer', criteria),
indent=4,
separators=(',', ': '),
sort_keys=True))
Usage:
field
parameter:- You can use field names instead of their integer IDs (see output from
/listSearchOptions
)- These names are taken from their
uid
, but the item type is stripped. - If you need a special field from a plugin, just find out the corresponding
uid
and strip the item type. - Example:
{"1": {"uid": "Computer.name"}}
gets{"name": 1}
for type Computer
- These names are taken from their
- If you provide an integer or a number as string, it won't be touched before use.
- If you provide an unmappable field name, an exception is raised.
- You can use field names instead of their integer IDs (see output from
searchtype
is entirely optional, accepts garbage andNone
.link
is only enforced on criterions that are not the first.value
is entirely optional likesearchtype
.
Limitations:
- You cannot use other search parameters other than
criteria
right now. - You cannot use the
metacriteria
parameter, which makes linked searches unavailable.
TODO: create an full example with various Items available in GLPI Rest API.
See CONTRIBUTING.md