Архив метки: php

FreeRadius и аутентификация через внешний скрипт

Например можно реализовать вот так:

authorize{
    update control { 
        Auth-Type := `/usr/bin/php -f /etc/raddb/yourscript.php '%{User-Name}' '%{User-Password}'`
    }

В этом случае, PHP должен только проверить логин&пароль и ответить либо Accept либо Reject.

Zend Framework 3 получение конфигурации приложения из контроллера

Казалось бы простая вещь, а телодвижений много. Странно. Но тем не менее, решение есть.

Конфигурация приложения:

<?php
return [
    'database'=>[
                        'host'  => '127.0.0.1',
                        'username'=>'root',
                        'password'=>'perferfre',
                        'basename'=>'mysql'        
    ],
    'modules' => [
            'Zend\Router',
            'Zend\Validator',
            'Application',            
    ],
    'module_listener_options' => [
        'module_paths' => [
            './module',
            './vendor',
        ],
        'config_cache_enabled' => false,
        'config_cache_key' => 'application.config.cache',
        'module_map_cache_enabled' => false,
        'module_map_cache_key' => 'application.module.cache',
        'cache_dir' => 'data/cache/',
    ],    
];

Создаем  фабрику IndexControllerFactory.php:

namespace Application\Controller;

use Zend\ServiceManager\Factory\FactoryInterface;
use Interop\Container\ContainerInterface;

class IndexControllerFactory implements FactoryInterface{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $config = $container->get("ApplicationConfig");
        return new IndexController($config);
    }
}

В конфигурации модуля:

            'controllers' => [
                'factories' => [
                    Controller\IndexController::class => Controller\IndexControllerFactory::class,                        
                    Controller\UserController::class => InvokableFactory::class,                        
                ],
            ],

В контроллере:

class IndexController extends AbstractActionController{        
    var $sqln; 
    public function __construct(array $config) {     
        var_dump($config);
	 }    
...

 

Использование Composer в проектах на PHP

Composer — это менеджер внешних библиотек для вашего проекта. Например, если вы используете jquery, jqueryui, какие-то другие библиотеки, то для того чтобы не тащить их при переносе проекта, не следить за их обновлением и актуальностью, достаточно использовать Composer. При новой инсталляции проекта достаточно будет выполнить

composer install

для генерации начального composer.json  (создание нового проекта) достаточно выполнить:

composer init

добавить нужные пакеты в папку vendor можно:

composer require components/jquery:3.3.1
composer require components/jqueryui:1.12.1
composer require components/font-awesome:5.4.2
composer require components/bootstrap:4.1.1

Обновить пакеты можно:

composer update

Ну и далее как использовать в своем коде PHP:

require_once vendor/autoload.php
 
Или JS:
 
<script src="/vendor/components/jquery/jquery.js"></script>

Ну и в догонку. Если у вас из проекта нет доступа к папке vendor, а нужно для использования например css и js непосредственно на странице, можно сделать симлинк, например что-то вроде:

pavel@pavelpc:/var/www/webuseorg4/public$ ln -s ../vendor/components/ components
pavel@pavelpc:/var/www/webuseorg4/public$

 

Работаем с Router OS через API

Задача: организовать блокировку абонентов по «балансу», установка скорости интернета абонента, защита от «ручных IP». Биллинг: Lanbilling, Железка: Router OS

  1. Блокировка по «балансу»
Читать далее Работаем с Router OS через API

Клиент IRC сети на PHP

Задача: отправить сообщение абоненту сети IRC.

Решение: написал соответствующий класс. Исходники выложил на GitHub

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

class Tirc{
    var $debug=false;
    var $server="localhost";
    var $port=6667;    
    var $errno0;
    var $errstr="";
    var $timeout=10;
    var $socket;
    var $nick="noname";
    var $chanel="noname";
    
    /**
     *  Внутрення функция для логов
     */
    private function putlog($st){
        if ($this->debug==true) echo date("H-i-s")." : ".trim($st)."\n";
    }
    
    /**
     * Конструктор класса. Вызывается при создании экземпляра
     * @param type $server  - хост сервера
     * @param type $port    - порт сервера
     */
    function __construct($server, $port,$debug=false) {
            $this->server = $server;
            $this->port = $port;
            $this->debug=$debug;
            $this->putlog("лог в режиме DEBUG");
            $this->putlog("сервер $server, порт $port");
    }	    
    /**
     *  Соединение с сервером. Возврат - результат
     * @return type
     */
    function connect(){
        $this->putlog("пробуем соедениться с irc сервером");        
        $this->socket=stream_socket_client("tcp://$this->server:$this->port", $this->errno, $this->errstr,$this->timeout,STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
        $this->putlog("возврат: errno: $this->errno, errstr: $this->errstr, socket: $this->socket");              
        return $this->socket;        
    }
    /**
     * Разрыв соединения с сервером. Возврат - результат
     */
    function disconnect(){
        $this->putlog("пробуем закрыть соединение с сервером $this->socket");
        $ret=fclose($this->socket);
        $this->putlog("результат: $ret");
    }
    /**
     *  Послать команду серверу. Возврат false или количество посланый байт
     * @param type $command
     * @return type
     */
    function send($command){
        $this->putlog("пробуем послать команду сервер $command");
        $ret=fwrite($this->socket, $command);
        $this->putlog("результат: $ret");
        return $ret;
    }
    function Join($chanel){
        $this->chanel=$chanel;
        $res=$this->send("JOIN :#$chanel\r\n");        
        return $res;
    }
    function is_ping($line){         
        if(strstr($line, 'PING')) {
            $this->putlog("получен PING");
            return true;         
        }            
        
    }
    function pong(){         
        $this->send("PONG :".$this->server."\r\n");         
        $this->putlog("отправлен PONG");
    }    
    function is_msg($line){ 
        if(strstr($line, 'PRIVMSG')) return true;         
    }        
    function SetNick($nick){
        $this->nick=$nick;
        $ret=$this->send("NICK $nick\r\n");
        return $ret;
    }
    function User($name){        
        $ret=$this->send("USER $name $this->server bla :$name\r\n");        
        return $ret;
    }
    function listChans(){
        $this->send("LIST\r\n");         
    }    
    function sendmessage($target, $msg){ 
        $this->send("PRIVMSG $target :$msg\r\n");         
    }    
    function loop($onMessage){
        while (!feof($this->socket)) {
             $res = fgets($this->socket, 256); // ждем сообщений
             $onMessage($res);
             if($this->is_ping($res)) $this->pong();
        };
    }
}

Пример использования:

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

include_once 'irc_class.php';

$irc=new Tirc('ыкуаыукаыука',6667,true);
$irc->connect();
$irc->SetNick("каыукаы");
$irc->User("ыукаыукаыук");
$irc->Join("tviinet");
$irc->listChans();
$irc->loop("OnMessage");
$irc->disconnect();

function OnMessage($msg){
global $irc;
    var_dump(trim($msg));    
    if(strstr($msg,"PRIVMSG")){
        //получаю кто прислал сообщение?
        $ma=  explode("!",$msg);
        $user=  str_replace(":", "", $ma[0]);
        $irc->sendmessage("$user","Hello $user!");
    };
    //список пользователей канала
    if(strstr($msg,":$irc->server 353 $irc->nick = #$irc->chanel :")){
        $users_list=  str_replace(":$irc->server 353 $irc->nick = #$irc->chanel :", "", $msg);        
        //получаю список кто онлайн?
        $irc->send("ISON $users_list");
    };
    //кто онлайн?
    if(strstr($msg,":$irc->server 303 $irc->nick :")){
        $users_online_list= explode(" ",trim(str_replace(":$irc->server 303 $irc->nick :", "", $msg)));                
        //Всем кто онлайн, отправляем сообщения
        foreach ($users_online_list as $user) {
            $irc->sendmessage("$user","Hello $user!");
        }
    };
};