家庭用NASシステムopenmediavaultプラグイン開発


Openmediavaultプラグイン開発
OpenMediaVaultは、omvと略称され、Debian Linuxベースのオープンソースの次世代ネットワーク付加ストレージ(NAS)ソリューションです.SSH、(S)FTP、SMB/CIFS、DAAPメディアサーバ、RSync、BitTorrentクライアントなど、多くのサービスが含まれています.プラグインによって強化できるモジュール化された設計フレームワークの特性を備えています.
OMVのプラグイン開発は、3つの部分から構成されています
  • GUI
  • プロファイルとRPC
  • モジュールとshellスクリプト
  • GUI(webインタフェース)
    バックグラウンドでは、次のディレクトリとそのサブディレクトリを自動的にスキャンします.
    /var/www/openmediavault/js/omv/module/admin/
    /var/www/openmediavault/js/omv/module/user/
    /var/www/openmediavault/js/omv/module/public/

    1.サービスディレクトリの下に新しいディレクトリexampleを追加
    /var/www/openmediavault/js/omv/module/admin/service/example

    2.node(左側のナビゲーションバーのtreeオブジェクト)を追加し、/var/www/openmediavault/js/omv/module/admin/service/example/EXampleを作成します.js
    // Register a node in the navigation tree.
    //
    // id: 
    //     Set the ID of the node.
    // path: 
    //     Parent path in the navigation view.
    // Text: 
    //     Service name/title. This is displayed in the navigation.
    // icon16: 
    //     16x16 pixel icon that is displayed in the navigation tree.
    // iconSvg:
     //     SVG icon that is displayed in the navigation view.
     
     OMV.WorkspaceManager.registerNode({
        id: 'example',
        path: '/service',
        text: _('Example'),
        icon16: 'p_w_picpaths/example.png',
        iconSvg: 'p_w_picpaths/example.svg'});

    注意:test:()この中の内容はページに従って自動的に各国の言語に翻訳できる.
    3.nodeのメインビュー(workspace)
    ワークスペースクラスから派生する、Settingsを作成する.js
    Ext.define('OMV.module.admin.service.example.Settings', {
        extend: 'OMV.workspace.form.Panel',    
        
        // This path tells which RPC module and methods this panel will call to get 
        // and fetch its form values.
        
        rpcService: 'Example',
        rpcGetMethod: 'getSettings',
        rpcSetMethod: 'setSettings',    
        
        // getFormItems is a method which is automatically called in the 
        // instantiation of the panel. This method returns all fields for 
        // the panel.
        
        getFormItems: function() {        
                return [{           
                
                 // xtype defines the type of this entry. Some different types
                // is: fieldset, checkbox, textfield and numberfield. 
                
                xtype: 'fieldset',
                title: _('General'),
                fieldDefaults: {
                    labelSeparator: ''
                },            
                // The items array contains items inside the fieldset xtype.
                items: [{
                    xtype: 'checkbox',              
                      
                    // The name option is sent together with is value to RPC
                    // and is also used when fetching from the RPC.
                    
                    name: 'enable',
                    fieldLabel: _('Enable'),                
                    // checked sets the default value of a checkbox.
                    checked: false
                },
                {
                    xtype: 'numberfield',
                    name: 'max_value',
                    fieldLabel: _('Max value'),
                    minValue: 0,
                    maxValue: 100,
                    allowDecimals: false,
                    allowBlank: true
                }]
            }];
        }
    });
    // Register a panel into the GUI.
    //
    // path: 
    //     We want to add the panel in our example node. 
    //     The node was configured with the path /service and the id example.
    //     The path is therefore /service/example.//// className: 
    //     The panel which should be registered and added (refers to
     //     the class name).
     
     OMV.WorkspaceManager.registerPanel({
        id: 'settings',
        path: '/service/example',
        text: _('Settings'),
        position: 10,
        className: 'OMV.module.admin.service.example.Settings'});

    注意:rpcが定義されているため、ページのリフレッシュでエラーが発生します.「RPC service not found(name=Example)」は、rpcファイル/usr/share/openmediavault/engined/rpc/exampleを追加する必要がある.inc、内容は第2部を参照
    プロファイルconfig.xmlとRPC
    Config.xml
    /etc/openmediavault/config.xmlはプラグイン設定項目を格納し、debianパッケージを作成するときにpostinstスクリプトに書くことができます.
    #!/bin/shset -e
    
    . /etc/default/openmediavault
    . /usr/share/openmediavault/scripts/helper-functions
    
    case "$1" in
        configure)
            SERVICE_XPATH_NAME="example"
            SERVICE_XPATH="/config/services/${SERVICE_XPATH_NAME}"
    
            # Add the default configuration
            if ! omv_config_exists "${SERVICE_XPATH}"; then
                omv_config_add_element "/config/services" "${SERVICE_XPATH_NAME}"
                omv_config_add_element "${SERVICE_XPATH}" "enable" "0"
                omv_config_add_element "${SERVICE_XPATH}" "max_value" "0"
            fi
    
            # Activate package triggers. These triggers are only set during the
            # package installation.
            dpkg-trigger update-fixperms
            dpkg-trigger update-locale
        ;;
    
        abort-upgrade|abort-remove|abort-deconfigure)
        ;;
    
        *)        echo "postinst called with unknown argument" >&2
            exit 1
        ;;esac
        
        #DEBHELPER#
        
        exit 0

    The RPC = Remote Procedure Call
    RPCファイルは/usr/share/openmediavault/engined/rpcディレクトリに格納、incの最後のphpファイル、rpcファイルはweb GUIとconfigに接続されている.xmlは、インタフェースがconfigファイルexampleを制御できるようにする.inc
    registerMethod.
         *
         * @return void
         */
         
        public function initialize()
        {        $this->registerMethod('getSettings');        
                 $this->registerMethod('setSettings');
        }    
        
        public function getSettings($params, $context)
        {        
           // $xmlConfig is needed when reading and writing from the configuration.
            global $xmlConfig;        
            
            // Validate the RPC caller context.
            //
            // validateMethodContext takes the currentcontext as the first
            // parameter. The second paramter is the valid context and that can be
            // OMV_ROLE_ADMINISTRATOR, OMV_ROLE_USER or OMV_ROLE_EVERYONE.
            // This is used to make sure that the right user accesses the method.
            $this->validateMethodContext($context, ['role' => OMV_ROLE_ADMINISTRATOR]);        
            // Get the configuration object.
            $object = $xmlConfig->get($this->getXpath());        
            
            // If no data was found, throw an exception and provide the XPath that
            // failed.
            if (is_null($object)) {            
                    throw new OMVException(
                    OMVErrorMsg::E_CONFIG_GET_OBJECT_FAILED,                
                    $this->getXpath()
                );
            }        
            
            // Modify the result data.
            // boolval and intval converts strings and numbers to their boolean
            // and integer value.
            $object['enable'] = boolval($object['enable']);        
            $object['max_value'] = intval($object['max_value']);       
             return $object;
        }    
        
        public function setSettings($params, $context)
        {        
                global $xmlConfig;       
                $this->validateMethodContext($context, array(            
                       "role" => OMV_ROLE_ADMINISTRATOR
            ));       
            
             // Validate the parameters of the RPC service method.
            //
            // OpenMediavault uses JSON Schema to validate parameters. A more
            // detailed specification is provided here http://json-schema.org/
            $this->validateMethodParams(            
                 $params,            '{
                    "type": "object",
                    "properties": {
                        "enable": {
                            "type": "boolean"
                        },
                        "max_value":{ 
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100
                        }
                    }
                }'
            );        
            
            // Update the configuration object.
            $object = [            
                       'enable' => boolval($params['enable']),            
                       'max_value' => $params['max_value'],
            ];        
            
            // Update the configuration file. If it fails it throws an exception.
            if ($xmlConfig->replace($this->getXpath(), $object) === false) {            
                         throw new OMVException(
                                    OMVErrorMsg::E_CONFIG_SET_OBJECT_FAILED,                
                                    $this->getXpath()
                );
            }        
            
            // Notify configuration changes.
            //
            // This will notify event listeners such as the service module
            // to perform certain tasks. The most common one is to mark the
            // service as dirty.
            
            $dispatcher = &OMVNotifyDispatcher::getInstance();        
            $dispatcher->notify(OMV_NOTIFY_MODIFY, $this->eventMessagePath, $object);        
            
            return $object;
        }
    }
    
    // Register the RPC service.
    $rpcServiceMgr = &OMVRpcServiceMgr::getInstance();
    $rpcServiceMgr->registerService(new OMVRpcServiceExample());

    モジュールとshellスクリプト
    module
    RPCはインタフェースの変更とプロファイルの取得を実現し、モジュールは変更を監視し、有効にするために使用されます.モジュールディレクトリは/usr/share/openmediavault/engined/moduleExample.inc
    get($this->getXpath());  
                 
             if (is_null($object)) {            
                     throw new OMVException(
                    OMVErrorMsg::E_CONFIG_GET_OBJECT_FAILED,                
                    $this->getXpath()
                );
            }        
            
            // Return the status of the service. This information is displayed
            // under Diagnostics/Services.
            return array(           
                   'name' => $this->getName(),            
                   'title' => gettext('Example'),            
                   'enabled' => boolval($object['enable']),            
                   'running' => false
            );
        }   
        
         /**
         * Generate the configuration.
         *
         * @return void
         *
         * @throws OMVException
         */
        public function applyConfig()
        {        
                    global $xmlConfig;        
                    $cmd = sprintf('export LANG=C; omv-mkconf %s 2>&1', $this->getName());        
                    if (0 !== $this->exec($cmd, $output)) {            
                          throw new OMVException(
                                    OMVErrorMsg::E_EXEC_FAILED,                
                                    $cmd,
                                    implode(PHP_EOL, $output)
                );
            }
        }    
        
        /**
         * Bind listeners.
         *
         * @param OMVNotifyDispatcher $dispatcher
         * @return void
         */
        public function bindListeners(OMVNotifyDispatcher $dispatcher)
        {        
             $moduleMgr = &OMVModuleMgr::getInstance();        
             // Add listeners here. The most common thing is to monitor configuration
            // changes on the service. When the config is changed the module
            // sets itself as dirty (as seen below). Setting a module as dirty
            // makes the apply button appear in the web interface (which in turn
            // calls the applyConfig function on each module with a dirty state).
            
            $dispatcher->addListener(
                OMV_NOTIFY_MODIFY,           
                 $this->eventMessagePath,
                [$this, 'setDirty']
            );
        }
    }
    
    // Register the module.
    $moduleMgr = &OMVModuleMgr::getInstance();
    $moduleMgr->registerModule(new OMVModuleExample());

    注意:モジュールはnotifyを登録しており、rpcはプロファイルを変更するとnotifyファイルがdirty状態であることを通知し、ページでapply changeプロンプトをトリガーします.
    Shellスクリプト生成プロファイル
    moduleのapplyconfig関数では、/usr/share/openmediavault/mkconf/exampleスクリプトexampleを呼び出すomv-mkconf exampleコマンドが実行されます.
    set -e. /etc/default/openmediavault
    . /usr/share/openmediavault/scripts/helper-functions
    OMV_EXAMPLE_XPATH="/config/services/example"OMV_EXAMPLE_CONF="/tmp/example.conf"
    
    cat < ${OMV_EXAMPLE_CONF}enable    = $(omv_config_get "${OMV_EXAMPLE_XPATH}/enable")
    max_value = $(omv_config_get "${OMV_EXAMPLE_XPATH}/max_value")
    EOF
    
    exit 0

    注意:755権限が必要です.スクリプトを実行すると/tmp/exampleが生成されます.confファイル.
    これでopenmediavaultの簡単なプラグインのソースコードが作成され、次はパッケージを作成するだけです.
    refer:https://forum.openmediavault.org/index.php/Thread/5600-DIY-Plugin-Development/