പോർട്ട് 80 വഴി Linux/OpenWrt/Lede അടിസ്ഥാനമാക്കിയുള്ള ഉപകരണങ്ങളുടെ വിദൂര നിരീക്ഷണവും മാനേജ്മെന്റും തുടർന്നു.

ഇത് ലേഖനത്തിന്റെ അവസാന ഭാഗമാണ്, ഇവിടെ തുടക്കം habr.com/en/post/445568
ഉപകരണ നിരീക്ഷണം എങ്ങനെ നടപ്പിലാക്കി എന്നതിനെക്കുറിച്ച് ഞാൻ അവസാനമായി എഴുതിയിരുന്നു, ഇപ്പോൾ നമ്മൾ മാനേജ്മെന്റിനെക്കുറിച്ച് സംസാരിക്കും. ഉപഭോക്താവിന്റെ ഭാഗത്തുള്ള "സാങ്കേതിക വിദഗ്‌ദ്ധരുമായുള്ള" ചർച്ചകളിൽ, അത്തരം ചെറിയ ഉപകരണങ്ങളുടെ (കുറഞ്ഞ മെമ്മറി റിസോഴ്‌സുകളും പ്രകടനവും ഉള്ളത്) കഴിവുകളെക്കുറിച്ചുള്ള പരിമിതമായ ധാരണ എനിക്ക് പലപ്പോഴും നേരിടേണ്ടിവരുന്നു, "നമുക്ക് ഏറ്റവും ആവശ്യമുള്ളത് ഒരു റീബൂട്ട് അയയ്‌ക്കുക എന്നതാണ്, കൂടുതലായി എന്തെങ്കിലും. ഞങ്ങൾ ഒരു ടീമിനെ അയയ്‌ക്കും” .
എന്നാൽ ഇത് പൂർണ്ണമായും ശരിയല്ലെന്ന് പ്രാക്ടീസ് കാണിക്കുന്നു. പൊതുവായ സാധാരണ ജോലികളുടെ ഒരു ചെറിയ ലിസ്റ്റ് ഇതാ:

  1. നെറ്റ്‌വർക്ക് ഡയഗ്‌നോസ്റ്റിക്‌സും ട്രബിൾഷൂട്ടിംഗും. നിങ്ങളുടെ റൂട്ടറിന്റെ ഇഥർനെറ്റ് പോർട്ടിന് പിന്നിൽ സാധാരണയായി സ്വന്തം ആന്തരിക IP വിലാസമുള്ള മറ്റൊരു ഹാർഡ്‌വെയർ ഉണ്ട്. ചിലപ്പോൾ, നിങ്ങൾക്ക് അത് "പിംഗ്" ചെയ്യാൻ കഴിയും. അല്ലെങ്കിൽ ടണൽ മാനേജ്മെന്റ് - 3G മോഡം വഴി പ്രവർത്തിക്കുന്ന ഒരു റൂട്ടറിൽ ടണൽ പെട്ടെന്ന് ഉയരുന്നില്ലെങ്കിൽ, പക്ഷേ നമുക്ക് റൂട്ടർ തന്നെ കാണാൻ കഴിയും.
  2. സിസ്റ്റം പരിപാലനം. ഫേംവെയർ അപ്ഡേറ്റ്, സേവന സ്ക്രിപ്റ്റ് അപ്ഗ്രേഡ്.
  3. ബാലൻസിങ് ആക്ട്. ഇതിനെ "വികൃതം" എന്ന് വിളിക്കാം, എന്നാൽ "സന്തുലിതാവസ്ഥ" എന്ന ആശയം, ഞാൻ ഉദ്ധരിക്കുന്നു, "അസ്ഥിരമായ ശരീര സ്ഥാനത്ത് ബാലൻസ് നിലനിർത്താനുള്ള ഒരു സർക്കസ് കലാകാരന്റെ കഴിവ്" - നന്നായി യോജിക്കുന്നു. ഉപഭോക്താവിന്റെ പരിമിതമായ ബജറ്റ് കാരണം അത്തരം സാഹചര്യങ്ങൾ ഉണ്ടാകുന്നു. ചുവടെ ഞാൻ കുറച്ച് ഉദാഹരണങ്ങൾ നൽകി, പക്ഷേ ... അവ കഥയുടെ പ്രമേയവുമായി നേരിട്ട് ബന്ധപ്പെട്ടിട്ടില്ല, ഞാൻ അവ കുറിപ്പുകളിൽ ഇടുന്നു

Wi-Fi നിരീക്ഷണംകഴിഞ്ഞ അഞ്ച് വർഷമായി ഒരു ഫാഷനബിൾ വിഷയം, പ്രധാനമായും ഫെഡറൽ റീട്ടെയിൽ ശൃംഖലകൾക്കിടയിൽ. നിങ്ങൾ ട്രേഡിംഗ് ഫ്ലോറുകളിൽ വിശ്രമിക്കുന്നു, Wi-Fi ഓണാക്കിയിരിക്കുന്ന നിങ്ങളുടെ മൊബൈൽ ഫോൺ, നെറ്റ്‌വർക്കിന്റെ ചില ത്രെഡുകളിൽ “ഒട്ടിനിൽക്കാൻ” ശ്രമിച്ചുകൊണ്ട്, പ്രോബ് അഭ്യർത്ഥന പാക്കറ്റുകൾ പതിവായി അയയ്‌ക്കുന്നു, അവ കണക്കാക്കാൻ വിശകലനം ചെയ്യാൻ കഴിയും. നിങ്ങൾ: നിങ്ങൾ എത്ര തവണ ഈ സ്റ്റോറിൽ വരുന്നു, എന്ത് കാരണങ്ങളാൽ? നിങ്ങൾ പാതകളിലൂടെയും മറ്റും നടക്കുന്നു. തുടർന്ന് ഡാറ്റ ശേഖരിക്കുകയും വിശകലനം ചെയ്യുകയും ഹീറ്റ് മാപ്പുകൾ വരയ്ക്കുകയും മാനേജർമാർ അത്തരം ചിത്രങ്ങൾക്കായി മാനേജ്മെന്റിൽ നിന്നോ നിക്ഷേപകരിൽ നിന്നോ പണം "കൊള്ളയടിക്കുന്നു". ശരി, ഇപ്പോൾ .... "പണമില്ല, പക്ഷേ നിങ്ങൾ പിടിക്കുക ...", ഫലം (യഥാർത്ഥം) ഇതിനകം കാണിക്കേണ്ടതുണ്ട്, നല്ല പഴയ ഗാനം ആരംഭിക്കുന്നു: "അതെ, അതെ, തീർച്ചയായും ഞങ്ങൾ cis ഉം നിങ്ങൾക്ക് ആവശ്യമുള്ളതെല്ലാം ഇൻസ്റ്റാൾ ചെയ്യും, എന്നാൽ ഇപ്പോൾ ഞങ്ങൾ ഉപഭോക്താവിനെ ഫലം കാണിക്കേണ്ടതുണ്ട്! വഴിയിൽ, ഉപഭോക്താവ് ഞങ്ങളുടെ ഉപകരണങ്ങളെ അവന്റെ ഹോട്ട്‌സ്‌പോട്ടിലേക്ക് Wi-Fi വഴി കണക്‌റ്റ് ചെയ്യാൻ അനുവദിച്ചുവെന്ന് പറയാൻ ഞങ്ങൾ മറന്നു, പക്ഷേ പൊതുവായി പറഞ്ഞാൽ, ഞങ്ങൾ അതിഥി ക്ലയന്റുകളെപ്പോലെയാണ്.” അതിനാൽ നമ്മൾ സന്തുലിത റൂട്ടറുകൾ നിർമ്മിക്കേണ്ടതുണ്ട് - നിരവധി വൈഫൈ ഉപ ഇന്റർഫേസുകൾ ഉയർന്നുവരുന്നു, അതിലൊന്ന് ഹോട്ട്‌സ്‌പോട്ടിൽ പറ്റിനിൽക്കുന്നു, രണ്ടാമത്തേത് പരിസ്ഥിതിയെ നിരീക്ഷിക്കുന്നു, tcpdump ഫലം സ്വയം ഭ്രാന്തമായി അപ്‌ലോഡ് ചെയ്യുന്നു, തുടർന്ന് ഫയലിന്റെ ഉള്ളടക്കങ്ങൾ ഒരു ആർക്കൈവിലേക്ക് പാക്ക് ചെയ്യുകയും അപകടസാധ്യതകൾ സൃഷ്ടിക്കുകയും ചെയ്യുന്നു. "അമിതഭക്ഷണം" മൂലം മരിക്കുന്നത് FTP സെർവറിലെ ഉള്ളടക്കങ്ങൾ തുപ്പാൻ ശ്രമിക്കുന്നു. ബാലൻസിംഗ് റൂട്ടർ പലപ്പോഴും "തകരുന്നു" എന്നതിൽ അതിശയിക്കാനില്ല, എങ്ങനെയെങ്കിലും വിദൂരമായി "പുനരുജ്ജീവിപ്പിക്കണം".

വാസാര്ദ്ധംഉപഭോക്താവിൽ നിന്നുള്ള ഈ പ്രസ്താവന പോലുള്ള ഒന്ന് ഉപയോഗിച്ച് ഇവിടെ സാഹചര്യം വിവരിക്കുന്നത് എളുപ്പമാണ്: “ഞങ്ങൾക്ക് ഒരു വികേന്ദ്രീകൃത ഹോട്ട്‌സ്‌പോട്ടുകളുടെ ശൃംഖല ആവശ്യമാണ്, അത് ചാനലുകൾ വഴി മുൻകൂട്ടി അറിയാത്ത, എന്നാൽ ഇതുവരെ ഞങ്ങൾക്ക് അറിയാത്ത ഉപകരണങ്ങളിൽ പ്രവർത്തിക്കും. ഓ, ഞങ്ങൾ പറയാൻ മറന്നു, ക്ലയന്റുകൾക്ക് പരസ്യം കാണിക്കാൻ മാത്രമല്ല, ഹോട്ട്‌സ്‌പോട്ട് ഇൻസ്റ്റാൾ ചെയ്ത സ്ഥലത്തിന് ചുറ്റുമുള്ള എല്ലാം വിശകലനം ചെയ്യാനും ഞങ്ങൾ ആഗ്രഹിക്കുന്നു. ഇല്ല, എന്തുകൊണ്ടാണെന്ന് ഞങ്ങൾക്ക് ഇതുവരെ അറിയില്ല, പക്ഷേ ഞങ്ങൾ അത് കണ്ടെത്തും, സംശയിക്കരുത്, ഞങ്ങൾക്ക് ഈ ആശയം കൊണ്ടുവരാൻ കഴിഞ്ഞു.

മുമ്പ് അജ്ഞാതമായ നിരവധി സാഹചര്യങ്ങൾ കാരണം, ഐപി: പോർട്ട് വഴി റൂട്ടറിലേക്ക് നേരിട്ട് കണക്റ്റുചെയ്യാൻ കഴിയാത്തപ്പോൾ, അതിൽ നിന്നുള്ള പ്രവർത്തനത്തിനായി കാത്തിരിക്കാൻ നിർബന്ധിതരാകുമ്പോൾ, നിലവാരമില്ലാത്ത സാഹചര്യങ്ങളിൽ നിയന്ത്രണം നടത്തേണ്ടതുണ്ടെന്ന് ഞങ്ങൾ മറക്കരുത്. നമ്മൾ സ്വയം സംഗ്രഹിച്ചാൽ, സെർവറും റൂട്ടറും തമ്മിലുള്ള സംഭാഷണം ഇതുപോലെ പ്രതിനിധീകരിക്കാം:

  • റൂട്ടർ: ഹലോ. ഞാൻ അത്തരമൊരു റൂട്ടറാണ്, എനിക്കായി എന്തെങ്കിലും ജോലികളുണ്ടോ?
  • സെർവർ: റൂട്ടർ അത്തരത്തിലുള്ളവ, നിങ്ങൾ ജീവിച്ചിരിപ്പുണ്ടെന്ന് ഞാൻ രജിസ്റ്റർ ചെയ്തു. വെല്ലുവിളി ഇതാ: ifconfig കമാൻഡിന്റെ ഫലം കാണിക്കണോ?
  • റൂട്ടർ: ഹലോ. ഞാൻ അത്തരമൊരു റൂട്ടറാണ്, കഴിഞ്ഞ തവണ ifconfig ന്റെ ഫലം കാണിക്കാൻ നിങ്ങൾ ആവശ്യപ്പെട്ടത് ഇതാ. എനിക്കായി എന്തെങ്കിലും ജോലികൾ ഉണ്ടോ?
  • സെർവർ: റൂട്ടർ അത്തരത്തിലുള്ളവ, നിങ്ങൾ ജീവിച്ചിരിപ്പുണ്ടെന്ന് ഞാൻ രജിസ്റ്റർ ചെയ്തു. നിങ്ങൾക്കായി ടാസ്‌ക്കുകളൊന്നുമില്ല.

ഏറ്റവും രസകരമായ ചോദ്യം: ഒരു വിദൂര റൂട്ടറിന് എങ്ങനെ ഒരു നിശ്ചിത അളവ് വിവരങ്ങൾ അയയ്ക്കാൻ കഴിയും? അവസാന ഭാഗത്ത്, പരിമിതമായ ഉറവിടങ്ങൾ കാരണം, റൂട്ടറിന് "സ്ട്രിപ്പ്-ഡൌൺ" wget മാത്രമേ ഉള്ളൂ, അത് GET വഴി മാത്രമേ പ്രവർത്തിക്കൂ, മറ്റൊന്നും ഇല്ല; FTP ക്ലയന്റും ചുരുളുകളും ഇല്ല. കൂടുതൽ കൃത്യമായി പറഞ്ഞാൽ, ഇമേജ് അസംബ്ലിയുടെ സവിശേഷതകൾ പരിഗണിക്കാതെ തന്നെ നമുക്ക് ഒരു സാർവത്രിക രീതി ആവശ്യമാണ്. ഞാൻ wget ഉപയോഗിക്കുന്നതിൽ സ്ഥിരതാമസമാക്കി. കൂടുതൽ കൃത്യമായി പറഞ്ഞാൽ, ഞാൻ എങ്ങനെ "നിർത്തി" - എനിക്ക് മറ്റ് മാർഗമില്ല :)

ഒരു നിരാകരണം മാത്രംഎന്റെ മാനേജ്‌മെന്റ് സൊല്യൂഷൻ പ്രവർത്തിക്കുന്നു, വളരെ പരിമിതമല്ല, എന്റെ മിക്ക ഉപഭോക്താക്കൾക്കും ഇത് യോജിച്ചതാണെങ്കിലും ഇത് വളച്ചൊടിച്ചതാണെന്ന് എനിക്ക് ഉറപ്പുണ്ട്. നിങ്ങൾക്ക് ഇത് എങ്ങനെ ബുദ്ധിപൂർവ്വം ചെയ്യാൻ കഴിയും - പോർട്ട് 80 വഴി POST ബൈനറി ഡാറ്റ അയയ്ക്കുന്ന ഒരു ചെറിയ യൂട്ടിലിറ്റി എഴുതുക. റൂട്ടർ ഫേംവെയറിൽ ഇത് (യൂട്ടിലിറ്റി) ഉൾപ്പെടുത്തി ബാഷ് ഉപയോഗിച്ച് ആക്സസ് ചെയ്യുക. എന്നാൽ യാഥാർത്ഥ്യം ഇതാണ്: a) നമുക്ക് വേഗത്തിൽ ആവശ്യമാണ് b) നിലവിലുള്ള “റൂട്ടറുകളുടെ മൃഗശാല” യിൽ ഞങ്ങൾ മിക്കവാറും എല്ലാം ചെയ്യേണ്ടതുണ്ട് c) “ഒരു ദോഷവും വരുത്തരുത്!” - റൂട്ടർ പ്രവർത്തിക്കുകയും മറ്റ് ജോലികൾ ചെയ്യുകയും ചെയ്യുന്നുവെങ്കിൽ, നിലവിലുള്ള പ്രവർത്തനത്തെ ബാധിക്കാത്ത മാറ്റങ്ങൾ വരുത്താൻ ശ്രമിക്കുക.

നമുക്ക് നടപ്പാക്കലിലേക്ക് പോകാം. നിങ്ങളുടെ ഉപഭോക്താവ് "മൗസ് ക്ലിക്ക്" ഉപയോഗിച്ച് എളുപ്പത്തിലും സ്വാഭാവികമായും zabbix-ൽ നിന്ന് റൂട്ടർ റീബൂട്ട് ചെയ്യാൻ ആഗ്രഹിക്കുന്നുവെന്ന് പറയാം. ഇന്ന് ഞങ്ങൾ Zabbix ഉപയോഗിച്ച് നടപ്പിലാക്കൽ വിവരിക്കാൻ തുടങ്ങും.
“അഡ്മിനിസ്ട്രേഷൻ” -> “സ്ക്രിപ്റ്റുകൾ” മെനുവിൽ, ഒരു പുതിയ സ്ക്രിപ്റ്റ് ചേർക്കുക. ഞങ്ങൾ അതിനെ "റീബൂട്ട്" എന്ന് വിളിക്കുന്നു, ഒരു കമാൻഡ് ആയി "php /usr/share/zabbix/reboot.php {HOST.HOST}" നൽകുക

പോർട്ട് 80 വഴി Linux/OpenWrt/Lede അടിസ്ഥാനമാക്കിയുള്ള ഉപകരണങ്ങളുടെ വിദൂര നിരീക്ഷണവും മാനേജ്മെന്റും തുടർന്നു.

അടുത്തത്: മെനു "മോണിറ്ററിംഗ്" -> "ഏറ്റവും പുതിയ ഡാറ്റ" -> "ആവശ്യമുള്ള നെറ്റ്‌വർക്ക് നോഡിൽ വലത്-ക്ലിക്ക് ചെയ്യുക." സ്ക്രിപ്റ്റ് ചേർത്തതിന് ശേഷം മെനു ഇങ്ങനെയായിരിക്കും.

പോർട്ട് 80 വഴി Linux/OpenWrt/Lede അടിസ്ഥാനമാക്കിയുള്ള ഉപകരണങ്ങളുടെ വിദൂര നിരീക്ഷണവും മാനേജ്മെന്റും തുടർന്നു.
അതനുസരിച്ച്, ഞങ്ങൾ reboot.php സ്ക്രിപ്റ്റ് /usr/share/zabbix ഡയറക്‌ടറിയിൽ ഇടുന്നു (നിങ്ങളുടേത് വ്യത്യസ്തമായിരിക്കാം, ഞാൻ zabbixa റൂട്ട് ഡയറക്ടറി ഉപയോഗിക്കുന്നു).

സുരക്ഷാ നിരാകരണംസ്ക്രിപ്റ്റിൽ വിശദീകരണം കൂടുതൽ വ്യക്തമാക്കുന്നതിന്, ഞാൻ റൂട്ടർ ഐഡി മാത്രമേ ഉപയോഗിക്കുന്നുള്ളൂ, പക്ഷേ പാസ്‌വേഡ് ഉപയോഗിക്കരുത്. പ്രൊഡക്ഷൻ പതിപ്പിൽ ഇത് ചെയ്യാൻ ശുപാർശ ചെയ്തിട്ടില്ല! എന്തുകൊണ്ടാണ് ഞാൻ ഇത് ചെയ്തത്: കാരണം റൂട്ടറുകൾക്കുള്ള പാസ്‌വേഡുകൾ എവിടെ സൂക്ഷിക്കണം എന്നതാണ് വലിയ ചോദ്യം? zabbixe-ൽ തന്നെ "ഇൻവെന്ററി ഡാറ്റ"? വിവാദപരമായ ആചാരം. പകരമായി: reboot.php ഫയലിലേക്കുള്ള ബാഹ്യ ആക്‌സസ് നിയന്ത്രിക്കുക

ഫയൽ reboot.php

<?php
	// присваиваем параметры с консоли переменным
	$user = $argv[1];
	// ВНИМАНИЕ. Вот здесь в целях безопасности все-таки прописывать пароль устройства! Но для демонстрации мы будем обращаться к базе данных без использования пароля. 
	//$password = $argv[2];
		
	$conn=new mysqli("localhost","db_user","db_password","db_name");
	if (mysqli_connect_errno()) {
		exit();
	}
	$conn->set_charset("utf8");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

അത്രയേയുള്ളൂ. ചോദ്യം തുറന്നിരിക്കുന്നു: "ഉപകരണത്തിൽ നിന്ന് ഒരു കമാൻഡ് എക്സിക്യൂട്ട് ചെയ്യുന്നതിന്റെ ഫലം എങ്ങനെ നേടാം." ifconfig കമാൻഡ് ഒരു ഉദാഹരണമായി ഉപയോഗിച്ച് ടാസ്ക് നോക്കാം. ഈ കമാൻഡ് ഉപകരണത്തിലേക്ക് അയയ്ക്കാം:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

, എവിടെയാണ്:
സന്ദേശം=`ifconfig` — ifconfig കമാൻഡ് ഔട്ട്പുട്ടിന്റെ ഫലം $message വേരിയബിളിലേക്ക് ഞങ്ങൾ അസൈൻ ചെയ്യുന്നു
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — റൂട്ടറുകൾ രജിസ്റ്റർ ചെയ്യുകയും അവയിൽ നിന്ന് സന്ദേശങ്ങൾ സ്വീകരിക്കുകയും ചെയ്യുന്ന ഞങ്ങളുടെ a.php സ്ക്രിപ്റ്റ്
u=user&p=password!&m=$message — ക്രെഡൻഷ്യലുകളും റിക്വസ്റ്റ് വേരിയബിളിന്റെ മൂല്യവും m — $message വേരിയബിളിന്റെ ഉള്ളടക്കം നൽകുന്നു
-O /tmp/out.txt — ഈ സാഹചര്യത്തിൽ /tmp/out.txt ഫയലിലേക്ക് ഞങ്ങൾക്ക് ഔട്ട്പുട്ട് ആവശ്യമില്ല, എന്നാൽ ഈ പരാമീറ്റർ വ്യക്തമാക്കിയിട്ടില്ലെങ്കിൽ, wget പ്രവർത്തിക്കില്ല

എന്തുകൊണ്ട് ഇത് പ്രവർത്തിക്കുന്നില്ല?കാരണം അത് ഒരു സുരക്ഷാ ദ്വാരമാണ്. ഉദാഹരണത്തിന്, നിങ്ങളുടെ കമാൻഡിന്റെ ഔട്ട്പുട്ടിൽ ഒരു "&" പ്രതീകം ഉണ്ടെങ്കിൽ സംഭവിക്കാവുന്ന ഏറ്റവും ദോഷകരമല്ലാത്ത പിശക്. അതിനാൽ, റൂട്ടറുകളിൽ നിന്ന് അയച്ചതും സെർവറിലേക്ക് വരുന്നതുമായ എല്ലാം ഫിൽട്ടർ ചെയ്യേണ്ടത് ആവശ്യമാണ്. അതെ, എനിക്ക് ലജ്ജ തോന്നുന്നു, ശരിക്കും. എന്റെ പ്രതിരോധത്തിൽ, മുൻ‌കൂട്ടി നിർവചിച്ചിട്ടില്ലാത്ത ഫേംവെയറുകളും ആശയവിനിമയ ചാനലുകളും ഉപയോഗിച്ച് റൂട്ടറുകൾ എങ്ങനെ കൈകാര്യം ചെയ്യാം എന്നതിനാണ് മുഴുവൻ ലേഖനവും നീക്കിവച്ചിരിക്കുന്നതെന്ന് മാത്രമേ എനിക്ക് എഴുതാൻ കഴിയൂ.

ശരി, ഭാവിയിലേക്കുള്ള ഒരു തുടക്കം: സെർവറിലേക്ക് വരുന്ന ഫലങ്ങൾ (ഉദാഹരണത്തിന്, ഒരു കമാൻഡ് എക്സിക്യൂട്ട് ചെയ്യുന്നതിന്റെ ഫലം) പ്രതിഫലിപ്പിക്കുന്നതിന് സ്റ്റാൻഡേർഡ് zabbix ടൂളുകൾ എങ്ങനെ ഉപയോഗിക്കണമെന്ന് ഞാൻ ഇതുവരെ കണ്ടെത്തിയിട്ടില്ല.

എല്ലാ സ്രോതസ്സുകളും Git റിപ്പോസിറ്ററിയിൽ നിന്ന് ലഭിക്കുമെന്ന് ഞാൻ നിങ്ങളെ ഓർമ്മിപ്പിക്കുന്നു: github.com/BazDen/iotnet.online.git

അവലംബം: www.habr.com

ഒരു അഭിപ്രായം ചേർക്കുക