]> git.ipfire.org Git - location/libloc.git/blame - src/python/locationmodule.c
Move location-downloader functionality into location-query
[location/libloc.git] / src / python / locationmodule.c
CommitLineData
18e2b14c
MT
1/*
2 libloc - A library to determine the location of someone on the Internet
3
4 Copyright (C) 2017 IPFire Development Team <info@ipfire.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15*/
16
17#include <Python.h>
c941dd31 18#include <syslog.h>
18e2b14c 19
3ee36b5e 20#include <loc/format.h>
f4fef543
MT
21#include <loc/resolv.h>
22
62ffafdd 23#include "locationmodule.h"
fadebc89 24#include "as.h"
af208e26 25#include "country.h"
9cdf6c53 26#include "database.h"
39967361 27#include "network.h"
d688e569 28#include "writer.h"
9cdf6c53 29
51173f45
MT
30/* Declare global context */
31struct loc_ctx* loc_ctx;
32
7c13a4e6 33PyMODINIT_FUNC PyInit__location(void);
18e2b14c 34
62ffafdd
MT
35static void location_free(void) {
36 // Release context
37 if (loc_ctx)
38 loc_unref(loc_ctx);
39}
40
c941dd31
MT
41static PyObject* set_log_level(PyObject* m, PyObject* args) {
42 int priority = LOG_INFO;
43
44 if (!PyArg_ParseTuple(args, "i", &priority))
45 return NULL;
46
47 loc_set_log_priority(loc_ctx, priority);
48
49 Py_RETURN_NONE;
50}
51
f4fef543 52static PyObject* discover_latest_version(PyObject* m, PyObject* args) {
a6f1e346 53 unsigned int version = LOC_DATABASE_VERSION_LATEST;
f4fef543 54
a6f1e346 55 if (!PyArg_ParseTuple(args, "|i", &version))
f4fef543
MT
56 return NULL;
57
58 time_t t = 0;
59
3ee36b5e
MT
60 int r = loc_discover_latest_version(loc_ctx, version, &t);
61 if (r)
62 Py_RETURN_NONE;
f4fef543
MT
63
64 return PyLong_FromUnsignedLong(t);
65}
66
0f0829ef
MT
67static PyObject* country_code_is_valid(PyObject* m, PyObject* args) {
68 const char* country_code = NULL;
69
70 if (!PyArg_ParseTuple(args, "s", &country_code))
71 return NULL;
72
73 if (loc_country_code_is_valid(country_code))
74 Py_RETURN_TRUE;
75
76 Py_RETURN_FALSE;
77}
78
18e2b14c 79static PyMethodDef location_module_methods[] = {
0f0829ef
MT
80 {
81 "country_code_is_valid",
82 (PyCFunction)country_code_is_valid,
83 METH_VARARGS,
84 NULL,
85 },
f4fef543
MT
86 {
87 "discover_latest_version",
88 (PyCFunction)discover_latest_version,
89 METH_VARARGS,
90 NULL,
91 },
c941dd31
MT
92 {
93 "set_log_level",
94 (PyCFunction)set_log_level,
95 METH_VARARGS,
96 NULL,
97 },
18e2b14c
MT
98 { NULL },
99};
100
101static struct PyModuleDef location_module = {
102 .m_base = PyModuleDef_HEAD_INIT,
7c13a4e6 103 .m_name = "_location",
18e2b14c
MT
104 .m_size = -1,
105 .m_doc = "Python module for libloc",
106 .m_methods = location_module_methods,
62ffafdd 107 .m_free = (freefunc)location_free,
18e2b14c
MT
108};
109
7c13a4e6 110PyMODINIT_FUNC PyInit__location(void) {
62ffafdd
MT
111 // Initialise loc context
112 int r = loc_new(&loc_ctx);
113 if (r)
114 return NULL;
115
18e2b14c
MT
116 PyObject* m = PyModule_Create(&location_module);
117 if (!m)
118 return NULL;
119
fadebc89
MT
120 // AS
121 if (PyType_Ready(&ASType) < 0)
122 return NULL;
123
124 Py_INCREF(&ASType);
125 PyModule_AddObject(m, "AS", (PyObject *)&ASType);
126
af208e26
MT
127 // Country
128 if (PyType_Ready(&CountryType) < 0)
129 return NULL;
130
131 Py_INCREF(&CountryType);
132 PyModule_AddObject(m, "Country", (PyObject *)&CountryType);
133
9cdf6c53
MT
134 // Database
135 if (PyType_Ready(&DatabaseType) < 0)
136 return NULL;
137
138 Py_INCREF(&DatabaseType);
139 PyModule_AddObject(m, "Database", (PyObject *)&DatabaseType);
140
afb426df
MT
141 // Database Enumerator
142 if (PyType_Ready(&DatabaseEnumeratorType) < 0)
143 return NULL;
144
145 Py_INCREF(&DatabaseEnumeratorType);
146 //PyModule_AddObject(m, "DatabaseEnumerator", (PyObject *)&DatabaseEnumeratorType);
147
39967361
MT
148 // Network
149 if (PyType_Ready(&NetworkType) < 0)
150 return NULL;
151
152 Py_INCREF(&NetworkType);
153 PyModule_AddObject(m, "Network", (PyObject *)&NetworkType);
154
d688e569
MT
155 // Writer
156 if (PyType_Ready(&WriterType) < 0)
157 return NULL;
158
159 Py_INCREF(&WriterType);
160 PyModule_AddObject(m, "Writer", (PyObject *)&WriterType);
161
24ca7992 162 // Add flags
c1467f55 163 if (PyModule_AddIntConstant(m, "NETWORK_FLAG_ANONYMOUS_PROXY", LOC_NETWORK_FLAG_ANONYMOUS_PROXY))
24ca7992
MT
164 return NULL;
165
c1467f55 166 if (PyModule_AddIntConstant(m, "NETWORK_FLAG_SATELLITE_PROVIDER", LOC_NETWORK_FLAG_SATELLITE_PROVIDER))
24ca7992
MT
167 return NULL;
168
c1467f55 169 if (PyModule_AddIntConstant(m, "NETWORK_FLAG_ANYCAST", LOC_NETWORK_FLAG_ANYCAST))
24ca7992
MT
170 return NULL;
171
3ee36b5e
MT
172 // Add latest database version
173 if (PyModule_AddIntConstant(m, "DATABASE_VERSION_LATEST", LOC_DATABASE_VERSION_LATEST))
174 return NULL;
175
18e2b14c
MT
176 return m;
177}