<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: DynDNS-сервер на связке .cmd & Netcat]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=7597</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7597&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: DynDNS-сервер на связке .cmd & Netcat».]]></description>
		<lastBuildDate>Thu, 20 Sep 2012 14:42:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: DynDNS-сервер на связке .cmd & Netcat]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64019#p64019</link>
			<description><![CDATA[<p><span style="color: Green"><strong>dasknix</strong>, <a href="http://forum.script-coding.com/rules.html#2.5.">§2.5</a>, <a href="http://forum.script-coding.com/rules.html#2.6.">§2.6</a>, <a href="http://forum.script-coding.com/rules.html#3.3.">§3.3</a>. Тема закрыта.</span></p><p><span style="color: Green">Пообсуждать, почему <em>некоторые</em> не русские призывают <em>некоторых</em> русских писать грамотно, а те, мягко говоря, <em>овощ</em> хотели на это дело класть, а также и всё прочее с сим связанное, можете в этом разделе: <a href="http://forum.script-coding.com/viewforum.php?id=8">Script-Coding.com community</a>.</span></p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 20 Sep 2012 14:42:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64019#p64019</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: DynDNS-сервер на связке .cmd & Netcat]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64014#p64014</link>
			<description><![CDATA[<p>я русский. питерец. воспитан двуми интеллигентами. квалифицированный специалист. сейчас работаю тех. консультантом и разработчиком расширенного пакета документации к промышленному оборудованию, с ориентацией на ГОСТ. так вот.. всю жизнь бесили точки и большие буквы в начале предложения!!! не нравиться - три тему. люди в нете тоже люди и у каждого свои загоны и менталитет, ставя коммьюнити в такие жёсткие рамки вы только себя ограничиваете. я даже везде на девайсах, где только можно убираю автомат красной строки ибо сил нет. и между прочим: ни характер содержания, ни читабельность параграфа, по сути - не меняются! а про уважение и пр - это прежде всего просматривается в манере общения, как давно известно из реала, а не как кто точки ставит и лицемерно большие буковки в начале пихает, а потом понимаешь - что суть-то и не изменилась. особенно, если человек не уважал.. никакой синтаксис, пунктуация и прочие приблуды тут не помогут. корень в идее!.., который в отличии от воплощения, всегда индивидуален, блин, вы то разрабы должны знать!</p><p>зы предвзятость такая предвзятость..<br />зы2 и вообще одно дело доки заполнять и составлять эписталярно че-то а другое в нете долбить сутками по буквам, не до шифта, знаете-ли когда только успеваешь записывать.<br />зы3 ..офигенно обламывает, конечно, что это всё происходит на форуме, которому так давно был рад</p>]]></description>
			<author><![CDATA[null@example.com (dasknix)]]></author>
			<pubDate>Thu, 20 Sep 2012 12:16:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64014#p64014</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: DynDNS-сервер на связке .cmd & Netcat]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=64001#p64001</link>
			<description><![CDATA[<p><span style="color: Green"><strong>dasknix</strong>, в русском языке предложения начинаются с заглавных букв и заканчиваются точкой.</span></p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 20 Sep 2012 00:12:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=64001#p64001</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: DynDNS-сервер на связке .cmd & Netcat]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=63998#p63998</link>
			<description><![CDATA[<p>решил сегодня накатать сервак динамического обновления ip для доменов клиентских узлов (в моем случае - GSM-роутеры),<br />интересует вот что, поскольку биться с темой, <a href="http://forum.script-coding.com/viewtopic.php?pid=63970#p63970">созданной ранее</a>, я не стал и взялся за готовую слушалку (netcat, кто не слышал - советую,<br />исключительно локаничное и очень удобное решение для отладки всего, что связано с сеткой и tcp-портами в частности)</p><p>время шло своим чередом, я доедал третью тарелку с гречкой и даже начал забывать к ночи про сигареты, но вопрос вселенной,<br />смысла жизни и всего такого не давал мне покоя всё больше и больше: как сделать нормальную синхронизацию процесса обновления<br />инфы от нескольких клиентов одновременно, не просто WRITE_LOCK-ами (файлами), а адекватно, через какое-нибудь shared memory..<br />и самое главное - как делать спаун коннект и освобождать порт для новых клиентов сразу, как только подрубился последний, тоесть<br />чтобы работало как полноценный сервис, типо опача, эндажайнекс и вообще всего, что имеет established в протоколе!</p><p>так же надеюсь, что кому-нибудь данный кодес будет полезен! не работает в данной версии только тема с socket_count, т.к. пока в раздумьях,<br />стоит ли создавать пул слушалок на определённом port range, уж больно костыльно как-то, реал.. =\</p><p>любая критика принимается с радостью, как и предложения! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="codebox"><pre><code>@echo off
REM ---------------
REM -- EXECUTION --
REM ---------------

REM common.config
set      irz.ddns.fork.fastwrite_mode=yes
set           irz.ddns.nc.listen.port=44044
set         irz.ddns.nc.listen.ipaddr=127.0.0.1
set   irz.ddns.nc.listen.socket_count=3
set              irz.ddns.nc.fullpath=..\..\nc.exe
set                    irz.ddns.debug=yes
set             irz.ddns.remote_debug=yes
set              irz.ddns.debug.level=1

REM common.config.predefined
set               irz.ddns.hosts_file=%systemroot%\system32\drivers\etc\hosts

REM common.preexec_wrappers
setlocal enabledelayedexpansion
if not &quot;%1&quot; == &quot;&quot; (
    if &quot;%1&quot; == &quot;--fork&quot; (
        call :fork %0 %2
    ) else if &quot;%1&quot; == &quot;--listener&quot; (
        call :listener %2 %3
    )

    goto :EOF
)

REM 0.0 main.start
echo [main]:STARTED
echo ----------------
if &quot;%irz.ddns.debug%&quot; == &quot;2&quot; echo [main].env: nc execall = &#039;%irz.ddns.nc.execall%&#039;

echo [main]:preparing
if not exist &quot;.\cache&quot; mkdir &quot;cache&quot;
if not exist &quot;.\cache&quot; (
    echo [main][cache]:[!] error, cannot create cache directory
    goto :EOF
    ) else echo [main][cache]:directory existing

if %irz.ddns.debug% GTR 2 (
    echo [main][info]:listener will bind on %irz.ddns.nc.listen.ipaddr%:%irz.ddns.nc.listen.port%
    if &quot;%irz.ddns.fork.fastwrite_mode%&quot; == &quot;yes&quot; echo [main][info]:fastwrite mode enabled
    if &quot;%irz.ddns.fork.fastwrite_mode%&quot; == &quot;no&quot; echo [main][info]:fastwrite mode disabled
)
echo ----------------

REM 0.1 creating cycled NC fork pool
set irz.ddns.forkpid=%random%
echo [main]:fork() #1 [PID=%irz.ddns.forkpid%]
start /b %0 --fork %irz.ddns.forkpid%

echo [main]:exit
exit

REM ---------------
REM -- FUNCTIONS --
REM ---------------

REM Threads
:fork
setlocal enabledelayedexpansion
echo ----------------
echo [fork.%2]:called

set irz.ddns.fork.%2.lpid=%random%
echo [fork.%2]:creating listener [LPID=!irz.ddns.fork.%2.lpid!]
rem %1 - executable .cmd, because of %0 == &#039;:fork&#039;; %2 - current PID

set irz.ddns.nc.execall=%irz.ddns.nc.fullpath%
set irz.ddns.nc.execall=%irz.ddns.nc.execall% -l -s %irz.ddns.nc.listen.ipaddr%
set irz.ddns.nc.execall=%irz.ddns.nc.execall% -p %irz.ddns.nc.listen.port%
set irz.ddns.nc.execall=%irz.ddns.nc.execall% -e &quot;%1 --listener %2 !irz.ddns.fork.%2.lpid!&quot;

rem Calling listening utility
%irz.ddns.nc.execall%

if %irz.ddns.debug.level% GTR 0 (
    echo [fork.%2].[listener.!irz.ddns.fork.%2.lpid!] exited. respawning..
    REM if %irz.ddns.debug.level% GTR 2 echo [fork.%2].[listener.!irz.ddns.fork.%2.lpid!] exited (return code = &#039;%errorlevel%&#039;). respawning..
)
goto :fork

echo [fork.%1]:EXIT
exit /b

REM Executable by NC
:listener
setlocal enabledelayedexpansion
rem [th.1.0: ]
if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
    echo [fork.%1].[listener.%2]:called
    echo [fork.%1].[listener.%2]:asking client for DDNS INFO
)

set /p irz.ddns.fork.%1.imei=IMEI:
set /p nullvar1=
if &quot;!irz.ddns.fork.%1.imei!&quot; == &quot;&quot; (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        echo [fork.%1].[listener.%2]:no IMEI/UNIT-NAME given. client rejected.
        echo [fork.%1].[listener.%2]:EXIT
        pause
    )
    exit /b
)

set /p irz.ddns.fork.%1.ip=IP:
set /p nullvar2=
if &quot;!irz.ddns.fork.%1.ip!&quot; == &quot;&quot; (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        echo [fork.%1].[listener.%2]:no IP-address given. client rejected.
        echo [fork.%1].[listener.%2]:EXIT
        pause
    )
    exit /b
)

REM Debug info for remote host
if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
    if &quot;%irz.ddns.debug.level%&quot; == &quot;1&quot; echo [fork.%1].[listener.%2]:recieved DDNS-INFO
    if &quot;%irz.ddns.debug.level%&quot; == &quot;2&quot; echo [fork.%1].[listener.%2]:recieved DDNS-INFO: [IMEI=!irz.ddns.fork.%1.imei!], [IP=!irz.ddns.fork.%1.ip!]
)

REM Fastwrite try (cache evasion, directly to HOSTS)
if &quot;%irz.ddns.fork.fastwrite_mode%&quot; == &quot;yes&quot; (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%1].[listener.%2]:evasing cache ^(fastwrite^)
    call :update_fastwrite !irz.ddns.fork.%1.imei! !irz.ddns.fork.%1.ip! %1 %2
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%1].[listener.%2]:fastwrite return code: %errorlevel%
    if &quot;%errorlevel%&quot; == &quot;0&quot; exit /b 0 else exit /b -1
    REM arg #1 - IMEI/UNIT-NAME, arg #2 - IP-address
)

REM Creating cache
set irz.ddns.fork.%1.listener.%2.cache-id=id-!irz.ddns.fork.%1.imei!.pid-%1.lpid-%2
if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
    if &quot;%irz.ddns.debug.level%&quot; == &quot;1&quot; echo [fork.%1].[listener.%2]:creating listener private cache
    if &quot;%irz.ddns.debug.level%&quot; == &quot;2&quot; echo [fork.%1].[listener.%2]:creating listener private cache [CACHE-ID=!irz.ddns.fork.%1.listener.%2.cache-id!]
)

REM Writing vars to cache
if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
    if &quot;%irz.ddns.debug.level%&quot; == &quot;1&quot; echo [fork.%1].[listener.%2]:writing DDNS-INFO to cache
    if &quot;%irz.ddns.debug.level%&quot; == &quot;2&quot; echo [fork.%1].[listener.%2]:writing DDNS-INFO to cache [&quot;.\cache\cache_!irz.ddns.fork.%1.listener.%2.cache-id!&quot;]
)
echo !irz.ddns.fork.%1.ip!&gt; &quot;.\cache\cache_!irz.ddns.fork.%1.listener.%2.cache-id!&quot;

if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%1].[listener.%2]:sleeping
call :sleep 10 %1 %2

if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%1].[listener.%2]:EXIT
pause
exit /b

REM Update HOSTS, using given call arguments
REM arg #1 - IMEI/UNIT-NAME, arg #2 - IP-address
:update_fastwrite
setlocal enabledelayedexpansion
if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:called
set irz.ddns.tmpvar.updated=0
set irz.ddns.tmpvar.cut_comment=0
set irz.ddns.tmpvar.first_line=1
for /f &quot;tokens=* delims= &quot; %%a in (%irz.ddns.hosts_file%) do (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        if %irz.ddns.debug.level% GTR 1 echo incycle start: irz.ddns.tmpvar.updated = !irz.ddns.tmpvar.updated!
    )
    set line=%%a
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        if %irz.ddns.debug.level% GTR 1 echo     old line = !line!
    )
    for /f &quot;tokens=1,2&quot; %%b in (&quot;!line!&quot;) do (
        set token1=%%b
        set token2=%%c
        if !token2! == %1 (
        rem echo host &#039;%str-to-find%&#039; found in string &#039;!line!&#039;
            set line=%2 !token2!
            set irz.ddns.tmpvar.updated=1
            if %irz.ddns.debug.level% GTR 0 echo [fork.%3].[listener.%4].fastwrite:entry for host &#039;%1&#039; updated
        ) else if &quot;!token1!&quot; == &quot;#&quot; (
            set irz.ddns.tmpvar.cut_comment=1
        ) else if &quot;!token1!&quot; == &quot;&quot; (
            set irz.ddns.tmpvar.cut_comment=1
        ) else (
            set irz.ddns.tmpvar.cut_comment=0
            set line=!token1! !token2!
        )
    )
    echo irz.ddns.tmpvar.cut_comment = !irz.ddns.tmpvar.cut_comment!
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        if %irz.ddns.debug.level% GTR 1 (
            if &quot;!irz.ddns.tmpvar.cut_comment!&quot; == &quot;0&quot; (
                echo updated line = !line!
                echo.
            ) else (
                echo this line will be removed, because it&#039;s a comment
                echo.
            )
        )
    )
    
    echo after word parsing cycle: irz.ddns.tmpvar.cut_comment = !irz.ddns.tmpvar.cut_comment!
    rem Storing old &amp; updated content: no comments, no empty lines
    if not &quot;!irz.ddns.tmpvar.cut_comment!&quot; == &quot;1&quot; (
        if not &quot;!irz.ddns.tmpvar.first_line!&quot; == &quot;1&quot; (
            echo !line!&gt;&gt; &quot;.\cache\updated_hosts&quot;
        ) else (
            echo FIRSTLINE MOTHER FUCKER!!!!!!!!
            echo !line!&gt; &quot;.\cache\updated_hosts&quot;
            set irz.ddns.tmpvar.first_line=0
        )
    )
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        if %irz.ddns.debug.level% GTR 1 echo incycle end: irz.ddns.tmpvar.updated = !irz.ddns.tmpvar.updated!
    )
)   
rem Creating new entry if needed
if &quot;!irz.ddns.tmpvar.updated!&quot;==&quot;0&quot; (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
        if %irz.ddns.debug.level% GTR 0 echo [fork.%3].[listener.%4].fastwrite:entry for host &#039;%1&#039; not found
        if %irz.ddns.debug.level% GTR 0 echo [fork.%3].[listener.%4].fastwrite:creating new entry..
    )
    echo %2 %1 &gt;&gt; &quot;.\cache\updated_hosts&quot;
)

if not exist &quot;.\cache\WRITE_LOCK&quot; (
    if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:writelock not set. creating..
    echo.&gt;&quot;.\cache\WRITE_LOCK&quot;
    if not exist &quot;.\cache\WRITE_LOCK&quot; (
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:ERROR! unable to set writelock
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:EXIT
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; pause
        exit /b -1
    ) else (
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:writelock set
        copy %irz.ddns.hosts_file% &quot;.\cache\backup_hosts&quot; &gt;nul
        if not exist &quot;.\cache\backup_hosts&quot; (
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:ERROR! unable to backup HOSTS file
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:EXIT
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; pause
        )
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:updating system HOSTS file..
        REM move /y &quot;.\cache\updated_hosts&quot; %irz.ddns.hosts_file% &gt;nul
        del /f %irz.ddns.hosts_file% &gt;nul
        copy /y &quot;.\cache\updated_hosts&quot; %irz.ddns.hosts_file% &gt;nul

        REM Validation information in updated HOSTS file
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
            if %irz.ddns.debug.level% GTR 1 (
                echo pause for updated HOSTS validation tracing.
                echo now edit address for &#039;%1&#039; in HOSTS file to wrong value not equal &#039;%2&#039;
                pause
            )
        )
        rem set errorlevel=0
        echo errorlevel=%errorlevel%
        echo findstr /i /p /x /c:&quot;%1 %2&quot; %irz.ddns.hosts_file%
        findstr /x /c:&quot;%1 %2&quot; %irz.ddns.hosts_file%
        echo errorlevel=%errorlevel%
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; (
            if %irz.ddns.debug.level% GTR 1 (
                echo validation result: errorlevel=%errorlevel%
                pause
            )
        )
        if not &quot;%errorlevel%&quot; == &quot;0&quot; (
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:ERROR! new HOSTS validation failed!
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:EXIT
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; pause
        ) else (
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:new HOSTS file validation succeeded
        )
        
        REM Unset WRITE_LOCK
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:removing writelock..
        del /f &quot;.\cache\WRITE_LOCK&quot;
        if not exist &quot;.\cache\WRITE_LOCK&quot; (
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:writelock removed
            if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:EXIT
            exit /b -10
        )
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:ERROR! unable to remove writelock!
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; echo [fork.%3].[listener.%4].fastwrite:EXIT
        if &quot;%irz.ddns.remote_debug%&quot; == &quot;yes&quot; pause
        exit /b -3
    )
) else exit /b -1
exit /b 0

REM Timer for WRITE_LOCK file monitoring task
:sleep
setlocal enabledelayedexpansion
echo [fork.%2].[listener.%3].sleep():called
echo [fork.%2].[listener.%3].sleep():sleeping for %1 seconds..
exit /b

REM Message indention
:nfof
echo ^%1^(^): %2
exit /b

:nfop
echo ^[%1^]: %2
exit /b

:nfo_1
REM Echo given string with indent
for /f in (%1) (
    echo        %%i
)
exit /b

:EOF
echo [main]:EXIT</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (dasknix)]]></author>
			<pubDate>Wed, 19 Sep 2012 20:29:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=63998#p63998</guid>
		</item>
	</channel>
</rss>
