Статья [3] Wi-Fi Pineapple - Создаем модуль. Часть 2

26927

Привет, 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”. Пока сам не до конца разобрался в данной теме, как разберусь напишу третью часть ;)
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!