-
Notifications
You must be signed in to change notification settings - Fork 46
/
ideas-2017.html
341 lines (315 loc) · 22.7 KB
/
ideas-2017.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>OpenWISP GSoC 2017 Ideas List</title>
<link rel="stylesheet" href="../css/reset.css" type="text/css">
<link rel="stylesheet" href="../css/semantic.min.css" type="text/css">
<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen">
<link rel="icon" type="image/x-icon" href="../images/favicon.png" />
</head>
<body class="content">
<div class="ui sidebar vertical menu">
<a class="item" href="../index.html">Home</a>
<a class="item" href="../whatis.html">Features</a>
<a class="item" href="../history.html">History</a>
<a class="item" href="../support.html">Support</a>
<a class="item" href="https://openwisp.io/docs">Docs</a>
<a class="item" href="../thecode.html">Code</a>
<a class="item" href="../about.html">People</a>
</div>
<div class="pusher">
<div class="ui grid" id="top-bar">
<div class="ui computer only column sixteen wide">
<div class="ui center aligned container secondary menu">
<h1 class="item logo">
<a href="../">OpenWISP</a>
</h1>
<div class="right menu">
<a class="item" href="../index.html">Home</a>
<a class="item" href="../whatis.html">Features</a>
<a class="item" href="../history.html">History</a>
<a class="item" href="https://openwisp.io/docs">Docs</a>
<a class="item" href="../support.html">Support</a>
<a class="item" href="../thecode.html">Code</a>
<a class="item" href="../about.html">People</a>
</div>
</div>
</div>
<div class="ui mobile tablet only sixteen wide column">
<div class="ui menu">
<h1 class="item logo">
<a href="../">OpenWISP</a>
</h1>
<div class="right menu">
<div class="menu-open item">
<i class="sidebar icon"></i>
</div>
</div>
</div>
</div>
</div>
<div class="ui grid" id="main">
<article class="ui container">
<h1>Google Summer of Code 2017 Idea List</h1>
<p>
Do you want to apply with us?
We have a page that describes how to increase your chances of success. Please read it carefully.
</p>
<p class="center">
<a class="ui big inverted red button"
href="https://openwisp.io/docs/developer/google-summer-of-code.html">
Get started!
</a>
</p>
<h2 id="network-topology">OpenWISP 2 Network Topology</h2>
<p><strong>Languages & technologies used:</strong> python, django, django-rest-framework, javascript, netjson.</p>
<p>One of the use case scenarios of OpenWISP 2 is <a href="https://en.wikipedia.org/wiki/Mesh_networking" target="_blank">mesh networking</a>.<br/>
In these scenarios being able to collect and visualize topology information is crucial.</p>
<p>The basic work to implement this feature has been already done, read
<a href="http://nemesisdesign.net/blog/coding/network-topology-visualizer-django-netjsongraph/">
"Network Topology Visualizer: django-netjsongraph"
</a> to know more details.
</p>
<p>
This project idea consists in pulling <a href="https://github.com/netjson/django-netjsongraph">django-netjsongraph</a>
in <a href="https://github.com/openwisp/ansible-openwisp2">OpenWISP 2</a> and adding new features on top of it,
in a similar way as the package <a href="https://github.com/openwisp/openwisp-controller">openwisp-controller</a>
pulls in <a href="https://github.com/openwisp/django-netjsonconfig">django-netjsonconfig</a> and adds features to it.</p>
<p>To work on this idea, the student will have to create a new django reusable app as well as improve existing components like
<a href="https://github.com/netjson/django-netjsongraph">django-netjsongraph</a>,
<a href="https://github.com/ninuxorg/netdiff">netdiff</a> and
<a href="https://github.com/netjson/netjsongraph.js">netjsongraph.js</a>.</p>
<p>The new app will be named <strong>openwisp-network-topology</strong> and must have a code structure similar
to the wrapper django apps already shipped with <a href="https://github.com/openwisp/ansible-openwisp2">OpenWISP 2</a>:
<a href="https://github.com/openwisp/openwisp-controller">openwisp-controller</a>,
<a href="https://github.com/openwisp/openwisp-users">openwisp-users</a>.</p>
<p>This app, in substance, will be a web interface to setup the collection of network topology data from
mesh networks as well as a mesh network visualizer and very basic monitoring system.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>implement a reusable django app named <strong>openwisp-network-topology</strong> which depends on <a href="https://github.com/netjson/django-netjsongraph">django-netjsongraph</a></li>
<li>add multi-tenancy features by using <a href="https://github.com/openwisp/openwisp-users">openwisp-users</a>:
each model of <em>django-netjsongraph</em> must be related to a specific organization</li>
<li>avoid duplication of the logic contained <em>django-netjsongraph</em> as much as possible</li>
<li>improve <em>django-netjsongraph</em>, <em>netdiff</em> and/or <em>netjsongraph.js</em> when is necessary to implement a feature upstream</li>
<li>create a new signal in <em>django-netjsongraph</em> that is sent when the status of a link changes</li>
<li>add a way to customize the theme (CSS and netjsongraph.js options) of the visualizer</li>
<li>add a netdiff parser for <a href="https://openvpn.net/">OpenVPN</a> that works with both of its status formats (version1 and version2)</li>
<li>implement a way to save daily snapshots of the network topology so users can go back in time and visualize the status of the network in specific days</li>
<li>add a switcher in the visualizer that allows to go back in time and see one of the previous daily snapshots</li>
<li>document all the features in the README</li>
<li>prepare a <code>setup.py</code> script that will be used to install the python package of the reusable django app</li>
<li>achieve a test coverage higher than 80%</li>
<li>provide documentation using <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a>,
the documentation must be included in a docs/ directory in the repository</li>
</ul>
<h2 id="ansible-plugin-for-netjsonconfig">Ansible plugin for the netjsonconfig library</h2>
<p><strong>Languages & technologies used:</strong> python, ansible.</p>
<p><a class="reference external" href="https://github.com/ansible/ansible">Ansible</a> is an IT automation tool that has been recently
gaining popularity also in the <a class="reference external" href="http://openwrt.org">OpenWRT</a> world.</p>
<p>We want to implement an ansible plugin that integrates <a class="reference external" href="http://netjsonconfig.openwisp.org">netjsonconfig</a>
and allows using its two most interesting features, that is templates and context, in ansible.</p>
<p>It should be possible to define configuration templates, assign them to specific playbooks and define
specific configurations for hosts.</p>
<p>The configuration format format used by netjsonconfig is <a class="reference external" href="http://netjson.org/docs/what.html#deviceconfiguration">NetJSON DeviceConfiguration</a>, but a <em>YAML</em>
conversion of <em>NetJSON</em> would be good as well. Support for both would be preferred.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>Implement an ansible module that integrates netjsonconfig in ansible and allows using
<a class="reference external" href="http://netjson.org/docs/what.html#deviceconfiguration">NetJSON DeviceConfiguration</a> (or its <em>YAML</em> equivalent) to configure OpenWRT devices</li>
<li>Achieve a test coverage higher than 80%</li>
<li>Provide documentation using <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a></li>
</ul>
<h2 id="netjsongraphjs">netjsongraph.js: canvas and geographic data</h2>
<p><strong>Languages & technologies used:</strong> javascript, ES6, CSS, netjson.</p>
<p><a href="https://github.com/interop-dev/netjsongraph.js">netjsongraph.js</a> is a javascript library based on d3 that allows visualization of
<a href="http://netjson.org/docs/what.html#networkgraph">NetJSON NetworkGraph objects</a>.</p>
<p>The library uses SVG for visualization, which can be quite slow when many elements are shown,
therefore we would like to try switching to canvas.
We also need an optional mode in which the network is displayed on a map.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>Rewrite the visualizer to use canvas</li>
<li>Add an optional map mode</li>
<li>Modernize javascript code organization: you may want to use some modern JS tool for building the library, you may rewrite the code in ES6, up to you</li>
<li>Update documentation and examples in README</li></ul>
<h2 id="netjson-ubus">Implement NetJSON output in ubus (OpenWRT/LEDE)</h2>
<p><a href="http://netjson.org">NetJSON</a> is emerging as a common format to exchange configuration and monitoring information
from network devices. Year after year it's becoming easier to achieve interoperability between different software packages
for community networks. Now is time to start implementing NetJSON in a lower level of the stack and the next
natural step in that direction is to implement it in <a href="https://wiki.openwrt.org/doc/techref/ubus">ubus (OpenWrt micro bus architecture)</a>,
which is included by default in <a href="http://www.lede-project.org/">LEDE</a> and <a href="https://openwrt.org/">OpenWRT</a>, the two linux distributions
commonly used with OpenWISP.
</p><p>In this project the student will have to develop ubus API extensions that allow retrieving two NetJSON object types:
<a href="http://netjson.org/docs/what.html#deviceconfiguration">DeviceConfiguration</a> and <a href="http://netjson.org/docs/what.html#devicemonitoring">DeviceMonitoring</a>.
</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>Implement a way to retrieve <a href="http://netjson.org/docs/what.html#deviceconfiguration">DeviceConfiguration</a> output in ubus using <a href="https://github.com/prplfoundation/scal">scal (System Configuration Abstraction Layer)</a>, </li>
<li>Implement a way to retrieve <a href="http://netjson.org/docs/what.html#devicemonitoring">DeviceMonitoring</a> output in ubus, consider reusing part of the code used in <a href="https://github.com/wlanslovenija/nodewatcher-agent#ubus-api">nodewatcher-agent</a></li>
<li>Write a Makefile to package the software for OpenWRT/LEDE</li>
<li>Document the compilation/install process and the usage of the module in the README</li></ul>
<h2 id="airos-backend-for-netjsonconfig">AirOS backend for OpenWISP 2</h2>
<p><strong>Languages & technologies used:</strong> python, AirOS, json-schema, netjson.</p>
<p>Implement an <a class="reference external" href="https://www.ubnt.com/airmax/airos7/">AirOS backend</a> in <a class="reference external" href="http://netjsonconfig.openwisp.org">netjsonconfig</a>.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>The <code class="docutils literal"><span class="pre">AirOs</span></code> backend must generate a configuration archive compatible with AirOS 6.x and AirOS 7.x,
two separate classes can be created if preferred</li>
<li>The <code class="docutils literal"><span class="pre">AirOs</span></code> backend schema must cover at least 75% of the configuration features
offered by <em>AirOS</em> web interface, with particular attention to interfaces, wireless settings and vlans</li>
<li>The general test coverage of the library must be kept higher than 95%</li>
<li>Both backends must be documented inside the <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a> docs dir
contained in the <em>netjsonconfig</em> repo</li>
</ul>
<h2 id="raspbian-backend-for-netjsonconfig">Raspbian backend for OpenWISP 2</h2>
<p><strong>Languages & technologies used:</strong> python, raspberry pi, debian, json-schema, netjson.</p>
<p>Implement a <a class="reference external" href="https://www.raspbian.org/">Raspbian</a> backend in <a class="reference external" href="http://netjsonconfig.openwisp.org">netjsonconfig</a>.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li><p class="first">The <code class="docutils literal"><span class="pre">Raspbian</span></code> backend must generate a configuration archive compatible with Raspbian Jessie</p>
</li>
<li><dl class="first docutils">
<dt>The <code class="docutils literal"><span class="pre">Raspbian</span></code> backend schema must cover at least the following features:</dt>
<dd><ul class="disc first last simple" style="margin-left:40px">
<li>general (eg: hostname)</li>
<li>ntp settings</li>
<li>network interface settings</li>
<li>wireless setttings</li>
<li>dns servers</li>
<li>dns search domains</li>
<li>static routes</li>
<li>files</li>
</ul>
</dd>
</dl>
</li>
<li><p class="first">The general test coverage of the library must be kept higher than 95%</p>
</li>
<li><p class="first">The backend must be to be documented inside the <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a> docs dir
contained in the <em>netjsonconfig</em> repo</p>
</li>
</ul>
<h2 id="pfsense-backend-for-netjsonconfig">PfSense backend for OpenWISP 2</h2>
<p><strong>Languages & technologies used:</strong> python, pfsense, json-schema, netjson.</p>
<p>Implement a <a class="reference external" href="https://pfsense.org/">PfSense</a> backend in <a class="reference external" href="http://netjsonconfig.openwisp.org">netjsonconfig</a>.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>The <code class="docutils literal"><span class="pre">PfSense</span></code> backend must generate a configuration archive compatible with PfSense 2.2.x</li>
<li>The <code class="docutils literal"><span class="pre">PfSense</span></code> backend must generate a configuration archive compatible with PfSense 2.3.x</li>
<li>The <code class="docutils literal"><span class="pre">PfSense</span></code> backend schema must cover at least 75% of the features offered by the PfSense
web interface, with particular attention to interfaces, wireless settings, vlans, firewall rules and VPNs</li>
<li>The general test coverage of the library must be kept higher than 95%</li>
<li>The backend must be to be documented inside the <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a> docs dir
contained in the <em>netjsonconfig</em> repo</li>
</ul>
<h2 id="netjsonconfig-backward-conversion">netjsonconfig backward conversion</h2>
<p><strong>Languages & technologies used:</strong> python, json-schema, netjson.</p>
<p>As of today, <a class="reference external" href="http://netjsonconfig.openwisp.org">netjsonconfig</a> is only able to generate a native router
configuration (eg: <a class="reference external" href="http://openwrt.org">OpenWRT</a>) from a
<a class="reference external" href="http://netjson.org/docs/what.html#deviceconfiguration">NetJSON DeviceConfiguration</a> object and not vice versa.</p>
<p>We want to add the backward conversion process into the library.</p>
<p>This project will require a thoughtful design, probably involving some serialization and deserialization mechanism.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>Backward <code class="docutils literal"><span class="pre">generate()</span></code> pocess: a configuration archive must be converted to
<a class="reference external" href="http://netjson.org/docs/what.html#deviceconfiguration">NetJSON DeviceConfiguration</a> through the available backends</li>
<li>Backward <code class="docutils literal"><span class="pre">render()</span></code> process: a configuration string (eg: uci export in OpenWRT) must be converted to NetJSON</li>
<li>The general test coverage of the library must be kept higher than 95%</li>
<li>The feature must be documented in the documentation files contained in the netjsonconfig repo</li>
</ul>
<h2 id="django-radius">django-radius: web interface for freeradius</h2>
<p><strong>Languages & technologies used:</strong> python, django, freeradius, django-rest-framework.</p>
<p>One of the most important features missing in OpenWISP 2 is the <strong>AAA</strong> (Authorization, Authenticatio and Accounting),
which in OpenWISP 1 is implemented with <a href="https://github.com/openwisp/OpenWISP-User-Management-System">OpenWISP User Management System</a> from now on (OWUMS).</p>
<p>OWUMS is implemented in ruby on rails and suffers the same limitations that brought us to develop OpenWISP 2:
monolithic, hard to extend without changing the core code, hard to maintain, hard to reuse in different contexts than the ones for which it was specifically designed.</p>
<p>For these reasons, in this project we aim to reimplement the basic, "core" features of OWUMS in a new lightweight
<a class="reference external" href="https://www.djangoproject.com/">django</a>
reusable app so it can fit with the emergent OpenWISP 2 ecosystem.</p>
<p>The app must have a code structure similar to the core django apps of OpenWISP 2:
<a href="https://github.com/openwisp/django-netjsonconfig">django-netjsonconfig</a>,
<a href="https://github.com/openwisp/django-x509">django-x509</a>.</p>
<p>This app, in substance, will be a web interface to manage a
<a class="reference external" href="http://freeradius.org/">freeradius</a> database, with an additional
RESTful API (using <a class="reference external" href="http://www.django-rest-framework.org/">django REST framework</a>)
that will be used to retrieve session data from freeradius and to allow new users to register via third party apps.</p>
<p><strong>Measurable outcomes:</strong></p>
<ul class="ui bulleted link list">
<li>implement a reusable django app which allows to manage the main freeradius
database tables (session/accounting, check, group, nas, reply) via the <strong>django-admin</strong></li>
<li>model references to the <code>User</code> must should be implemented using the
<a href="https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#referencing-the-user-model">swappable user model mechanism of django</a>
and default to <code>django.contrib.auth.models.User</code>
</li>
<li>implement a "batch add users" feature, each batch operation and its details must be saved to the database</li>
<li>implement a RESTful API through which authorized users will be able to retrieve radius sessions, this API
must be implemented using django REST framework</li>
<li>achieve a test coverage higher than 80%</li>
<li>provide documentation using <a class="reference external" href="http://www.sphinx-doc.org/">python-sphinx</a>,
the documentation must be included in a docs/ directory in the repository</li>
</ul>
<h2 id="javascript-base-configuration-ui">Javascript based configuration UI</h2>
<p><strong>Languages & technologies used:</strong> javascript, css, json-schema, netjson.</p>
<p>The configuration editor present in OpenWISP 2 is built with <a href="https://github.com/jdorn/json-editor">jsoneditor</a>, a <a href="http://json-schema.org">JSON-Schema</a> compatible UI generator that builds a UI from the <a href="http://netjson.org/docs/what.html#deviceconfiguration">NetJSON DeviceConfiguration</a> JSON-schema.</p>
<p>This solution has been a first step toward a configuration UI but it's not the best we can achieve.</p>
<p>We want to explore the possibility of using alternative solutions. These are our needs and <strong>measureable outcomes</strong>:</p>
<ul class="ui bulleted link list">
<li>the configuration UI must be automatically generated from JSON-Schema</li>
<li>it must validate the JSON-schema before saving, and provide useful error messages to the user</li>
<li>it must provide an advanced mode for editing <a href="http://netjson.org/">NetJSON</a> directly</li>
<li>when using the advanced mode, it should provide syntax highlighting, line numbers and JSON-schema validation before saving or before going back to normal mode</li>
<li>should have the possibility to guide the user in some way</li>
<li>should have a mechanism to show only relevant categories of configuration options (eg: network, wireless, vpn) and switch between these views without reloading the web page</li>
<li>it must be built as a standalone javascript library that can be imported in larger projects (eg: openwisp2)</li>
<li>the most important features must be covered by some sort of automated tests; this is vital to allow future maintainers to add new features or perform refactoring without being worried of breaking existing functionality</li>
<li>it should not bring in too many dependencies, it should find a right balance between feature set and dependencies</li>
<li>it should be published as a javascript package on the most popular javascript package manager</li>
<li>its features should be documented briefly in its README</li>
</ul>
<h2>Apply with us</h2>
<p>
Do you want to apply with us?
We have a page that describes how to increase your chances of success. Please read it carefully.
</p>
<p class="center">
<a class="ui big inverted red button"
href="https://openwisp.io/docs/developer/google-summer-of-code.html">
Get started!
</a>
</p>
</article>
</div>
<div class="ui black inverted segment padding-vertical" id="footer">
<div class="ui container stackable two column grid">
<div class="column logo white">
<a href="./">OpenWISP</a>
</div>
<div class="column social">
<a href="https://twitter.com/openwisp" class="ui twitter button">
<i class="twitter icon"></i>
Twitter
</a>
<a href="https://facebook.com/openwisp" class="ui facebook button">
<i class="facebook icon"></i>
Facebook
</a>
<a href="https://www.linkedin.com/company/openwisp" class="ui linkedin button">
<i class="linkedin icon"></i>
Linked In
</a>
<a href="https://github.com/openwisp" class="ui black button">
<i class="github icon"></i> Github
</a>
</div>
<p>© 2008-<script>document.write(new Date().getFullYear())</script> OpenWISP and individual contributors.</p>
</div>
</div>
</div>
<script src="../js/jquery-3.7.1.min.js"></script>
<script src="../js/semantic.min.js"></script>
<script src="../js/scripts.js"></script>
</body>
</html>