Synology DSM、Perl、およびMojolicious

Synology DSMで暗号化されたフォルダーをマウントすると同時に Synology DSMを思い出してから、PerlとMojolicious Webフレームワークを使用して、ニーズに合ったシンプルなアプリケーションを作成する方法を示すことにしました。 ブラウザのデバイスに必要な情報を表示するには、膝の上にSynDevInfoユーティリティを作成する必要がありました。 尊敬されているサポートはGNU / Linuxを知らず、ユーザーはssh経由でログインできません。







Mojolicious :: Liteのパッケージの構造、アプリケーション起動スクリプト、およびスクリプト自体について説明します。







プロジェクト構造



画像



アプリケーションの起動



Mojoliciousは、アプリケーションをデプロイするためのさまざまな方法をサポートしています。 原則を使用して、単純なことは単純に行われるべきであるため、 組み込みWebサーバーで説明されているアプローチを採用しました。 この方法では、スクリプトはデーモンモードで実行され、外部Webサーバーは必要ありません。







#!/bin/sh export PERL5LIB="${SYNOPKG_PKGDEST}/3rdparty" case $1 in start) /usr/bin/perl ${SYNOPKG_PKGDEST}/SynDevInfo daemon -m production -l http://*:12345 & sleep 5; exit 0 ;; stop) PID=`ps -aef | grep "SynDevInfo" | grep -v grep | awk '{print $2}'` kill -9 $PID exit 0 ;; restart) exit 0 ;; status) exit 0 ;; log) exit 0 ;; esac
      
      





アプリ



 #!/usr/bin/env perl use strict; use utf8; use feature ':5.14'; use warnings FATAL => 'all'; use FindBin; BEGIN { unshift @INC, "$FindBin::Bin/lib" } use Mojolicious::Lite; use SynInfo::Info; my $CACHE_FILE = "/tmp/syninfo_cashe.json"; get '/' => sub { my $c = shift; $c->render(template => 'index', syno_def => $c->syn_info->syno_defines(), general => $c->syn_info->general(), volumes => $c->syn_info->volume(), networks=> $c->syn_info->networks(), uname => $c->syn_info->uname(), cpuinfo => $c->syn_info->cpuinfo() ); }; helper syn_info => sub { state $info = SynInfo::Info->load($CACHE_FILE) }; my $info = SynInfo::Info->new(); $info->save($CACHE_FILE); app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Summary info'; <pre> PRODUCT: <%= $syno_def->{product} %> MODEL: <%= $general->{model} %> UNIQUE: <%= $syno_def->{unique} %> FIRMWARE: <%= $general->{firmware_ver} %>(<%= $general->{firmware_date} %>) CPU: <%= $general->{cpu_vendor} %> <%= $general->{cpu_family} %> <%= $general->{cpu_series} %> <%= $general->{cpu_clock_speed} %> Mhz, cores <%= $general->{cpu_cores} %> RAM: <%= $general->{ram_size} %> Mb <% foreach my $volume (@$volumes){ %> VOLUME: <%= $volume->{name} %> SIZE: <%= $volume->{total_size} %> Byte USED: <%= $volume->{used_size} %> Byte<% } %> <% foreach my $nif (@{$networks->{'nif'}}){ %> Interface: <%= $nif->{id} %> ADDRESS: <%= $nif->{addr} %> TYPE: <%= $nif->{type} %> <% } %> Name and information about current kernel: <% foreach my $key (sort keys %$uname){ chomp($uname->{$key}); %> <%= $key %>: <%= $uname->{$key}%> <% } %> cat /proc/cpuinfo <%= $cpuinfo %> </pre> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> <style type="text/css"> section{ background: #fff; border-radius: 7px 7px 7px 7px; -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border: 0px solid #000000; margin-bottom: 10px; padding: 27px 27px 20px; } </style> <title><%= title %></title> </head> <body> <section> <%= content %> </section> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> </body> </html>
      
      



= "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"整合性= "sha384-1q8mTJOASx8j1Au + a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin = "匿名"> #!/usr/bin/env perl use strict; use utf8; use feature ':5.14'; use warnings FATAL => 'all'; use FindBin; BEGIN { unshift @INC, "$FindBin::Bin/lib" } use Mojolicious::Lite; use SynInfo::Info; my $CACHE_FILE = "/tmp/syninfo_cashe.json"; get '/' => sub { my $c = shift; $c->render(template => 'index', syno_def => $c->syn_info->syno_defines(), general => $c->syn_info->general(), volumes => $c->syn_info->volume(), networks=> $c->syn_info->networks(), uname => $c->syn_info->uname(), cpuinfo => $c->syn_info->cpuinfo() ); }; helper syn_info => sub { state $info = SynInfo::Info->load($CACHE_FILE) }; my $info = SynInfo::Info->new(); $info->save($CACHE_FILE); app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Summary info'; <pre> PRODUCT: <%= $syno_def->{product} %> MODEL: <%= $general->{model} %> UNIQUE: <%= $syno_def->{unique} %> FIRMWARE: <%= $general->{firmware_ver} %>(<%= $general->{firmware_date} %>) CPU: <%= $general->{cpu_vendor} %> <%= $general->{cpu_family} %> <%= $general->{cpu_series} %> <%= $general->{cpu_clock_speed} %> Mhz, cores <%= $general->{cpu_cores} %> RAM: <%= $general->{ram_size} %> Mb <% foreach my $volume (@$volumes){ %> VOLUME: <%= $volume->{name} %> SIZE: <%= $volume->{total_size} %> Byte USED: <%= $volume->{used_size} %> Byte<% } %> <% foreach my $nif (@{$networks->{'nif'}}){ %> Interface: <%= $nif->{id} %> ADDRESS: <%= $nif->{addr} %> TYPE: <%= $nif->{type} %> <% } %> Name and information about current kernel: <% foreach my $key (sort keys %$uname){ chomp($uname->{$key}); %> <%= $key %>: <%= $uname->{$key}%> <% } %> cat /proc/cpuinfo <%= $cpuinfo %> </pre> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> <style type="text/css"> section{ background: #fff; border-radius: 7px 7px 7px 7px; -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border: 0px solid #000000; margin-bottom: 10px; padding: 27px 27px 20px; } </style> <title><%= title %></title> </head> <body> <section> <%= content %> </section> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> </body> </html>



= "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css"整合性= "SHA384-fLW2N01lMqjakBkx3l / M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV + 0En5r" crossorigin = " #!/usr/bin/env perl use strict; use utf8; use feature ':5.14'; use warnings FATAL => 'all'; use FindBin; BEGIN { unshift @INC, "$FindBin::Bin/lib" } use Mojolicious::Lite; use SynInfo::Info; my $CACHE_FILE = "/tmp/syninfo_cashe.json"; get '/' => sub { my $c = shift; $c->render(template => 'index', syno_def => $c->syn_info->syno_defines(), general => $c->syn_info->general(), volumes => $c->syn_info->volume(), networks=> $c->syn_info->networks(), uname => $c->syn_info->uname(), cpuinfo => $c->syn_info->cpuinfo() ); }; helper syn_info => sub { state $info = SynInfo::Info->load($CACHE_FILE) }; my $info = SynInfo::Info->new(); $info->save($CACHE_FILE); app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Summary info'; <pre> PRODUCT: <%= $syno_def->{product} %> MODEL: <%= $general->{model} %> UNIQUE: <%= $syno_def->{unique} %> FIRMWARE: <%= $general->{firmware_ver} %>(<%= $general->{firmware_date} %>) CPU: <%= $general->{cpu_vendor} %> <%= $general->{cpu_family} %> <%= $general->{cpu_series} %> <%= $general->{cpu_clock_speed} %> Mhz, cores <%= $general->{cpu_cores} %> RAM: <%= $general->{ram_size} %> Mb <% foreach my $volume (@$volumes){ %> VOLUME: <%= $volume->{name} %> SIZE: <%= $volume->{total_size} %> Byte USED: <%= $volume->{used_size} %> Byte<% } %> <% foreach my $nif (@{$networks->{'nif'}}){ %> Interface: <%= $nif->{id} %> ADDRESS: <%= $nif->{addr} %> TYPE: <%= $nif->{type} %> <% } %> Name and information about current kernel: <% foreach my $key (sort keys %$uname){ chomp($uname->{$key}); %> <%= $key %>: <%= $uname->{$key}%> <% } %> cat /proc/cpuinfo <%= $cpuinfo %> </pre> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> <style type="text/css"> section{ background: #fff; border-radius: 7px 7px 7px 7px; -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border: 0px solid #000000; margin-bottom: 10px; padding: 27px 27px 20px; } </style> <title><%= title %></title> </head> <body> <section> <%= content %> </section> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> </body> </html>





1つのファイルとコントローラーコードとhtmlテンプレート。 出力入力処理サイクルを開始する前に、モデルは情報を収集し、jsonでシリアル化します。 この時点では、デーモンは外部リクエストを処理しないため、待機スクリプトは5秒の待機を指定します。 ヘルパーでは、このモデルは逆シリアル化されてコントローラーに表示されます。







この結果を実行する







All Articles