Привет, codeby.net!
Вводная информация
Создаем модуль. Часть 1
Это вторая статья посвященная написанию модуля для WiFi Pineapple. В данной уроке мы разберем базовую структуру файлов и поймем как и где писать код. Хочу с акцентировать внимание на том что я не учу вас программированию, цель данной статьи показать как строиться модуль что бы вы могли сразу приступить к работе.
И так приступим, чтобы наш модуль мог быть частью админ панели ананаса нужно придерживаться стандартов заложенными разработчиками платформы. Есть файлы которые обязательно должны быть в каждом модуле, через них будет происходить взаимодействие с веб-интерфейсом а также система будет распознать что это модуль. Давайте рассмотрим и разберем обязательные файлы и каталоги модуля.
Структура основных файлов в модуле:
Код:
.
├── api
│ └── module.php
├── js
│ └── module.js
├── module.html
└── module.info
Каталог API:
Каталог api содержит обязательный файл
module.php
в нем описываются все action к которым мы будем обращаться через ajax запросы. Также хорошей практикой будет если вы все файлы php которые относятся к вашему модулю будет складывать в этот каталог.Рассмотрим обязательный файл module.php:
PHP:
<?php namespace pineapple;
class ExampleModule extends Module
{
public function route()
{
switch ($this->request->action) {
case 'getHello':
$this->hello();
break;
}
}
}
private function hello()
{
$this->response = array('text' => "Hello World");
}
Модуль должен всегда наследоваться от класса Module, таке должен содержать обязательный метод route в котором должна быть реализована конструкция switch которая позволит обратиться к нужному методу при ajax запросе. Не забудьте указать
namespace pineapple
и не используйте закрывающийся тэг ?>
в конце файл.Каталог JS:
Каталог js содержит обязательный файл module.js в нем описываются все контроллеры angular.
Рассмотрим обязательный файл module.js:
JavaScript:
registerController("ExampleController", ['$api', '$scope', function($api, $scope) {
$api.request({
module: 'ExampleModule',
action: 'getHello'
}, function(response) {
$scope.hello = response.text;
});
}])
Объявление контроллера немного отличаются по сравнению с обычным функционалом Angular, для этого надо использовать функцию
registerController
а в остальном ничего нового. Чтобы отправить ajax запрос к нашему action будем использовать $api.request
, в качестве обязательных параметров нужно указать action к которому мы хотим обратиться и имя модуля у которого хотим вызвать action. Обращаться можно к любым модулям которые есть в вашем анонсе, это может уберечь вас от написание лишнего кода.Файл module.html:
Данный файл содержит весь html который будет использовать ваш модуль. Думаю рассматривать тут нечего. Если вы не особо не знакомы с Angular то в html требуется объявить контроллер для выполнения js который приведен выше.
HTML:
<div class="row">
<div ng-controller="ExampleController" class="col-md-12">
{{ hello }}
</div>
</div>
Файл module.info:
В данном файле содержится информация о вашем модуле. Особо расписывать тут нечего просто придерживайтесь данной структуры оформления.
Код:
{
"author": "n3d.b0y",
"description": "WiFi Pineapple Example Module",
"devices": [
"nano",
"tetra"
],
"title": "ExampleModule",
"version": "1.0"
}
Вот мы и разобрали тот минимум что бы можно было приступить к написанию собственного модуля. Теперь давайте поговорим о необязательных файлах и каталогах а также о некоторых вещах на которые стоит обратить внимание.
Хранение данных:
Для хранение данных можно использовать встроенный функционал от hack5. Для начало вам надо создать файл конфигураций под ваш модуль. Файл должен храниться в каталоге
etc/config
. Название файл не имеет значение но хорошей практикой будет назвать его точно также как модель в нижнем регистре. Затем объявиться секцию с произвольным названием и тогда в нее можно будет положить любые данные.
Код:
# Cоздаем файл
touch /etc/config/pineapplemodule
# Cоздаем секцию с именем module
echo "config pineapplemodule 'module'" > /etc/config/pineapplemodule
# Добавляем переменную installed со значением 1 в секцию module
uci set pineapplemodule.module.installed=1
# Применяем изменения
uci commit pineapplemodule.module.installed
# Получаем значение переменной installed
uci get pineapplemodule.module.installed
Для работы с файлом конфигураций в php нам доступны два метода
uciGet
и uciSet
после того как мы наследовались от класса Module.Рекомендации:
Если вы будете использовать в модули любого рода скрипты shell, python и т.д также хорошей практикой будет складывать в каталог scripts но это не обязательно) так сделано в большинстве модулей.
Для лучшего понимание советую изучить как написаны стандартные модули и модули сторонних разработчиков hak5/wifipineapple-modules. Также изучите файлы в каталоге
pineapple/api
, обязательно обратите внимание есть на Module.php в котором находиться класс от которого мы наследуемся. Не лишним будет заглянуть в каталог pineapple/js
.На этом пожалуй я закончу вторую часть. Осталось осветить еще одну тему по разработки “Как собрать пакет под OpenWrt”. Пока сам не до конца разобрался в данной теме, как разберусь напишу третью часть
Последнее редактирование: