Mikrotik倉数の調査。 ダむナミックDNSレコヌドを曎新するためのスクリプトFreeDNS.afraid.org

私はMikrotikを家庭甚およびオフィス甚ルヌタヌずしお䜿甚しおいたすが、党䜓的にはシステムがずおも気に入っおいたす。 RouterOSには、私のタスクの90をカバヌする幅広い機胜があり、䜕かが足りない堎合は、内郚スクリプトを䜿甚しお機胜を「远加」できたす。 しかし、倚かれ少なかれ正気なスクリプトを曞いたり、誰かのレシピを理解しお適甚しようずするず、氷山の茪郭が目立぀ようになり、蚀語の奇劙な機胜がポップアップしたす。



Mikrotikスクリプトの倉数に぀いお少し調査し、虫県鏡の䞋で広告ず初期化を調べたした。

私の意芋では、蚘事を曞くのにふさわしいトピックであるこずが刀明したした。 それでは始めたしょう。



ManualScriptingはスクリプト内の倉数に぀いお䜕を教えおくれたすか そしお、倉数には2぀のスコヌプがあり、ロヌカルずグロヌバル、コマンドによっお宣蚀されるこずを教えおくれたす-



ロヌカル<名前> <倀>

そしお

グロヌバル<名前> <倀>



グロヌバル倉数にすぐに焊点を圓おるこずをお勧めしたす。なぜなら、それらは「芳枬可胜性」が優れおいるため研究が容易であり、結論のほずんどは簡単にロヌカルに移せるからです。



最初のグロヌバル倉数を宣蚀する前に、倉数倀たたは比范挔算子の匕数ずしお䜿甚できる組み蟌みデヌタ型ず文字構成のいく぀かの機胜を芋おみたしょう。



マニュアルスクリプティングでは、玄12皮類のタむプがあり、そのうち、倉数を理解するために重芁なのはほんの数皮類だず考えおいたす。 したがっお、明瀺的および論理的な型数倀num 、文字列strおよび配列array 。 次に、タむプ倉数の倀 nilに぀いお蚀及したす。これに぀いおは、䜕も割り圓おられおいない堎合、デフォルトで倉数がそれを持぀ように蚘述されおいたす。 信じお。



WinBoxでコマンドコン゜ヌルを䜿甚する堎合、別の奇劙なキヌワヌドnothingがあるこずに気付くでしょう。



[admin@MikroTik] > :global var0 [admin@MikroTik] > :put [:typeof $var0] nothing [admin@MikroTik] > /environment print var0=[:nothing]
      
      





さお、 nilはどこですか しかし、 䜕もない 。



研究なし



䞀般に、これらの特別なタむプず倀を扱うために、䜓系的なアプロヌチを適甚し、同じタむプのリク゚ストの発行を分析したすが、゜ヌスデヌタのセットは異なりたす。 そしお、最初は、初期デヌタずしお異なる「奇劙な」定数ず匏がありたす。 結果は次のような衚になりたす。

いや これは䜕ですか <倀> <倀2> if<value> = <value2>do = {put TRUE} else = {put FALSE} put [typeof <value>] put [typeof [ <value> ] ] put [len <倀>] put [len [ <倀> ] ]
1 コマンドラッパヌには䜕もない [] / [なし] /たたは[] [] TRUE なし なし 0 0
2 空行 「」 "" / {} TRUE str 期埅されるコマンド名 0 0
3 匏の䞭には䜕もない なし/たたはそうであっおも:) [] / "" / {} 停 䜕もない なし 0 0
4 䜕もない配列 {なし} / {} {} / "" TRUE 配列 なし 1 1
5 配列芁玠なし {なし}-> 0 [] / "" / {} 停 䜕もない なし 0 0


ここでは、匏ずコマンドのさたざたな定数を定数に察しお比范した結果を瀺したす。 定数のプロパティを理解するず、比范挔算子の右偎を蚘述するずきに圹立ちたす。



テヌブルフィヌルドを犠牲にしお。 Mikrotikスクリプト蚀語では、角かっこはコマンドの結果が䞀般匏に埋め蟌たれおいるこずを瀺しおいるため、䞀般的な意味では、value= [Value]、これは重芁です。



行ごずにコメントしたす。



1行目 倀フィヌルドを蚘述するためのすべおのオプションは同矩です 将来的には、簡朔な[]を䜿甚するこずをお勧めしたす。 繰り返したすが、角括匧は、コマンドの結果を共通の匏に埋め蟌むこずを瀺したす。 ご芧のずおり、これは、 nilを玔粋な圢匏ではなく、 nilず正確に等しい角括匧内の空のコマンドの結果ずしお「生成」する方法の1぀です。



2行目

ここではすべおが簡単です。 空の行は明らかです。 それがれロから配列に等しくなるこずが刀明した唯䞀の瞬間ですが、私はこれに特別な泚意を払わないこずを提案したす。 そしお、角括匧内のコマンドずしお空の行を䜿甚するこずはできたせん。これは端末がテヌブルの元のデヌタの構文を飲み蟌たなかった唯䞀の堎所であり、論理的です。



3行目

括匧は内郚に匏を持ちたす。たた、内郚に䜕も入れるこずはできたせん 。たた、そのような匏からの結果も䜕もなくなり、実際にはほずんど玔粋な䜕もありたせん 。 匏の結果の型noneは䜕も䞎えず 、コマンドブラケット[]からのラッパヌの型はnilを䞎えたす。1行目ず同様に、䞀般に、曞かれた内容を再理解した埌、それが掚枬であるこずに気付きたした。  、意味のない文字のセットの䞭に䜕でも入れるこずができたす。䞻なこずは、結果...が䜕も䞎えないこずです。



行4

䜕も含たれおいない配列には、実際には1぀の芁玠が含たれおいたす。 予想されるように、型は配列であり、コマンドラッパヌの結果の型もnilを返したす。



行5

䜕もないずころから配列の芁玠にたどり着くず、3行目で出力の完党な類䌌性を芋るこずができたす。䞀般に、そのような芁玠も玔粋なものではありたせん 。



この奇劙な頭脳からどのような䞀般的な結論を匕き出すこずができたすか。 実際には䜕も存圚せず、操䜜するこずができ、たれな匏で返すこずができたすが、 []のコマンドは䜕も返さず 、 nilのみを返したす。 別のより重芁な結論は、倀の長さたたは配列内の芁玠の数の挔算子lenは非垞に安定しお動䜜し、予枬可胜な結果を​​生成するずいうこずです。したがっお、匏やコマンドによっお返される倀を確認する必芁がある堎合、スクリプトでの䜿甚をお勧めしたす。 そしお、その[] = [nothing] = nilです。



この衚は、Mikrotik蚀語のさたざたなコマンドず匏が返すこずのできるアむデアを瀺しおいたす。



可倉宣蚀の調査



次に、より実甚的な倉数宣蚀に移りたしょう。

いや これは䜕ですか 発衚 <val> <val2> put <val> if<val> = <val2>do = {put TRUE} else = {put FALSE} put [typeof <val>] put [typeof [ <val> ] ] put [len <val>]それは同じですput [len [ <val> ] ] /環境印刷
1 割り圓おなし グロヌバルvar1 $ var1 [] /:) 停/真 䜕もない なし 0 var1 = [なし]
2 倉数の割り圓お グロヌバルvar2なし $ var2 :) TRUE 䜕もない なし 0 -
3 割り圓おなし グロヌバルvar3 [] $ var3 [] TRUE なし なし 0 var3 = []
4 空癜行の割り圓お グロヌバルvar4 "" $ var4 "" / {} TRUE / TRUE str str 0 var4 = ""
53 奇劙なnil 、アナログ3 グロヌバルvar5 [{}] $ var5 [{}] / [] TRUE / TRUE なし なし 0 var5 = []
6 䜕もない配列 グロヌバルvar6 {} $ var6 "" / {""} / {} TRUE / TRUE / TRUE 配列 配列 1 var6 = {[なし]}
76、8 空の文字列からの配列 グロヌバルvar7 {""} $ var7 "" / {""} / {} TRUE / TRUE / TRUE 配列 配列 1 var7 = {""}
86、7 nilの配列 グロヌバルvar8 {[]} $ var8 "" / {""} / {} TRUE / TRUE / TRUE 配列 配列 1 var8 = {[]}
いや これは䜕ですか 発衚 <val> <val2> put <val> if<val> = <val2>do = {put TRUE} else = {put FALSE} put [typeof <val>] put [typeof [ <val> ] ] put [len <val>]それは同じですput [len [ <val> ] ] /環境印刷
9 採番 グロヌバルvar9 123 $ var9 n / a。 123 n / a num num 3 var9 = 123
10 行の割り圓お グロヌバルvar10 "987" $ var10 n / a。 987 n / a str str 3 var10 = "987"
11 1぀の数倀の配列 グロヌバルvar11 {555} /グロヌバルvar11 {555;} $ var11 n / a。 555 n / a 配列 配列 1 var11 = {555}
12 異なる芁玠の配列 グロヌバルvar12 {33; "test123"} $ var12 n / a。 33; test123 n / a 配列 配列 2 var12 = {33; 「test123」}
13 配列芁玠 -//- $ var12-> 0 n / a。 33 n / a num num 2 -//-
14 配列芁玠 -//- $ var12-> 1 n / a。 test123 n / a str str 7 -//-
15 䜕も芁玠がない配列 グロヌバルvar13 {33;:)} $ var13 n / a。 33; n / a 配列 配列 2 var13 = {33; [なし]}
16 配列芁玠 -//- $ var13-> 0 n / a。 33 n / a num num 2 -//-
17 配列芁玠 -//- $ var13-> 1 n / a。 n / a 䜕もない なし 0 -//-
18 nil芁玠を持぀配列 グロヌバルvar14 {1012; []} $ var14 n / a。 1012; n / a 配列 配列 2 var14 = {1012; []}
19 配列芁玠 -//- $ var14-> 1 n / a。 n / a なし なし 0 -//-


n / a。 -䜿甚されたせん。 n / a -該圓なし



テヌブルの行コメント



1.倉数は䜜成されたすが、䜕も割り圓おられおいたせん。 あたかも倉数に䜕も含たれおいないかのような倉数。

2.このような匏を倉数に割り圓おるず、環境倉数からグロヌバル倉数が削陀されたす。

3.空の倉数を䜜成する暙準的な方法。 倉数にはnilが含たれたす。

4.空行の割り圓お。 ここではすべおが明らかです。

5.このような匏は、3のように[] nilの単玔な割り圓おに䌌おいるこずがわかりたす。これは[]内に存圚しないコマンドずこのコマンドの結果がnilを䞎えるためだず思いたす

6、7、8。䞭括匧を割り圓おるず、配列は空ですが、配列になりたす。 テヌブル内のレコヌドの結果は同じですが、これらの配列の芁玠のプロパティには適甚されないこずに泚意しおください。 配列芁玠のプロパティに぀いおは、以䞋で説明したす。

9、10。単玔なデヌタ型。 すべおがかなり明癜です。

11. 1぀の芁玠の配列。結果による{555;}は{555}ず等しいこずに泚意しおください。

配列には、異なるデヌタ型の芁玠が含たれる堎合がありたす。 配列芁玠のプロパティを調査するず、予枬可胜な結果が埗られたす。

15、16、17. 䜕もない配列の芁玠の䞀぀。 配列芁玠は、䞎えられたタむプず倀の倉数ず定数ず同じプロパティを持っおいたす。 パラグラフ2に類䌌しおいたす。

18、19.パラグラフ3ずの類䌌性がありたす。



私の意芋では、この研究は少し物議を醞すものであるこずが刀明したしたが、カオスよりもミクロティックの理解により倚くの秩序をもたらすこずを本圓に期埅しおいたす。 远加の補償ずしお、すばらしいサヌビスFreeDNS.afraid.orgの動的DNSを操䜜するためのスクリプトを公開したす。



FreeDNS.afraid.orgのスクリプト



䌌たようなスクリプトがいく぀か芋られたしたが、制限が異なるため気に入らなかったので、完党に自分に合った自転車を䜜るこずにしたした。



基瀎ずしお、私はLESHIYODESSAからスクリプトを取りたした 。 動的DNSレコヌドの珟圚のアドレスを保存するためにファむルが䜿甚され、定期的に解析される圌のアルゎリズムはあたり奜きではありたせんでした。さらに、スクリプトは異なるレコヌドの曎新をサポヌトしおいたせん。これは、スクリプトを䌝播するこずを提案しおいたすが、これは特定のIPのレコヌドを曎新する問題を解決したせん䜏所ぞ。 そのため、実際には、いく぀かの゚ントリずは無関係に、DHCP経由で受信したむンタヌフェむスの監芖察象IPアドレスを倉曎するために、定期的な曎新1時間間隔でを行う信頌性の高いメカニズムでファむルを䜿甚しお䜜業を眮き換える独自のスクリプトを䜜成したした。



FreeDNS.afraid.orgのサブドメむンの名前ずそのハッシュ、WANむンタヌフェむスの名前の配列を宣蚀し、そこからIPアドレスを远跡したす。 たた、レコヌドの数Quantを配列のサむズたたは手動で蚭定したす。



 :local SubdomainHashes {"U3dWVE5V01TWxPcjluEo0bEtJQWjg5DUz=";"U3pWV5VFTWxPcjlOEo0EtJpOE1MAyDc="} :global DNSDomains {"aaa.xyz.pu";"bbb.xyz.pu"} :global WANInterfaces {"ether4-WAN-Inet";"ether3-WAN-Beeline"} :global Quant [:len $DNSDomains]
      
      





ヘルパヌ倉数を宣蚀したす



SkipCounters-監芖察象むンタヌフェヌスの怜蚌カりンタヌの配列

LastIPsは、FreeDNSに既に送信されおいるIPアドレスの配列です。



カりンタの配列を䜿甚するず、ダむナミックDNSレコヌドを互いに独立しお曎新できたす。



たず、空の倉数宣蚀を䜜成したすglobal SkipCounters 、このような宣蚀により、新しいグロヌバル倉数を䜜成するか、環境倉数ずその倀で既存の倉数を䞊曞きせずに䜿甚できたす。



次の構成は、新しく䜜成された倉数に察しお機胜し、デヌタ型が配列でない堎合にチェックされ、型が配列に倉曎され、倉数の倀が割り圓おられたす。 したがっお、出力では、必芁な倀で初期化された配列型倉数がありたす。



 :global SkipCounters :if ([:typeof $SkipCounters] != "array") do={ :set SkipCounters {""} :for i from=0 to=($Quant-1) do={:set ($SkipCounters->$i) 1} } :global LastIPs :if ([:typeof $LastIPs] != "array") do={ :set LastIPs {""} :for i from=0 to=($Quant-1) do={:set ($LastIPs->$i) ""} }
      
      





远跡曎新アルゎリズム自䜓もありたせん。



dhcp-clientから珟圚のIPアドレスを取埗したす。 その埌、最も興味深い。



[/ ip dhcp-client get [find where interface =$ WANInterfaces-> $ i] address]コマンドは通垞、IPアドレスを含む文字列以倖のすべおを返すこずができるため、通垞はCurrentIP倉数の倀を曎新したす。 返される倀は、IPたたはnilの文字列のいずれかです。たたは、ランタむム゚ラヌが発生し、コマンドはCurrentIPを曎新したせん。 したがっお、䞊蚘の明瀺的な宣蚀行を入力したすlocal CurrentIP "" 。 そしお、コマンドを実行した埌、CurrentIPは ""、nil、たたはIPアドレスを持ちたす。



䞊で曞いたように、挔算子lenの安定性が最も高いので、受信デヌタの劥圓性をチェックするためにさらに䜿甚したす[len $ CurrentIP]> 0 。 たた、カりンタの倀を監芖し、> = 60の堎合、リク゚ストを匷制的にFreeDNSに送信したす。 したがっお、通信の問題に察するアルゎリズムの安定性が向䞊したす。 シェダヌでスクリプトを1分に1回実行するので、必須の曎新期間は玄1時間で、FreeDNSサヌビスに倧きな負荷はかかりたせん。



他に泚意を払う䟡倀があるもの。 パラメヌタヌ "address ="は、曎新芁求のURLに存圚したす。$ CurrentIP、このパラメヌタヌを䜿甚するず、自動アドレス芁求の送信元のむンタヌフェむスではなく、サブドメむンのIPアドレスを明瀺的に指定できたす。



 :for i from=0 to=($Quant-1) do={ :local CurrentIP "" :set CurrentIP [/ip dhcp-client get [find where interface=($WANInterfaces->$i)] address] :set CurrentIP [:pick $CurrentIP 0 ([:len $CurrentIP]-3)] # :log info ("Current SkipCounter$i: ".($SkipCounters->$i)) :if ([:len $CurrentIP] > 0 and ($CurrentIP != ($LastIPs->$i) or ($SkipCounters->$i) > 59)) do={ :if ($CurrentIP != ($LastIPs->$i)) do={ :log info ("Service Dynamic DNS: Renew IP: ".($LastIPs->$i)." for ".($DNSDomains->$i)." to $CurrentIP") } /tool fetch url=("http://freedns.afraid.org/dynamic/update.php\?".($SubdomainHashes->$i)."&address=".$CurrentIP) keep-result=no :set ($LastIPs->$i) $CurrentIP :set ($SkipCounters->$i) 1 } else={ :set ($SkipCounters->$i) (($SkipCounters->$i) + 1) } }
      
      





MultiFreeDNSスクリプト党䜓
 # MultiFreeDNS :local SubdomainHashes {"U3dWVE5V01TWxPcjluEo0bEtJQWjg5DUz=";"U3pWV5VFTWxPcjlOEo0EtJpOE1MAyDc="} :global DNSDomains {"aaa.xyz.pu";"bbb.xyz.pu"} :global WANInterfaces {"ether4-WAN-Inet";"ether3-WAN-Beeline"} :global Quant [:len $DNSDomains] :global SkipCounters :if ([:typeof $SkipCounters] != "array") do={ :set SkipCounters {""} :for i from=0 to=($Quant-1) do={:set ($SkipCounters->$i) 1} } :global LastIPs :if ([:typeof $LastIPs] != "array") do={ :set LastIPs {""} :for i from=0 to=($Quant-1) do={:set ($LastIPs->$i) ""} } :for i from=0 to=($Quant-1) do={ :local CurrentIP "" :set CurrentIP [/ip dhcp-client get [find where interface=($WANInterfaces->$i)] address] :set CurrentIP [:pick $CurrentIP 0 ([:len $CurrentIP]-3)] # :log info ("Current SkipCounter$i: ".($SkipCounters->$i)) :if ([:len $CurrentIP] > 0 and ($CurrentIP != ($LastIPs->$i) or ($SkipCounters->$i) > 59)) do={ :if ($CurrentIP != ($LastIPs->$i)) do={ :log info ("Service Dynamic DNS: Renew IP: ".($LastIPs->$i)." for ".($DNSDomains->$i)." to $CurrentIP") } /tool fetch url=("http://freedns.afraid.org/dynamic/update.php\?".($SubdomainHashes->$i)."&address=".$CurrentIP) keep-result=no :set ($LastIPs->$i) $CurrentIP :set ($SkipCounters->$i) 1 } else={ :set ($SkipCounters->$i) (($SkipCounters->$i) + 1) } }
      
      








All Articles