Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на торговую площадку

    Там вы можете купить
    Всё что касается игровых серверов
  • 0
Parliament

Рандомный Вайп из-за крашей

Как решаете проблему с рандомным вайпом из-за крашей? Просто делать бэкап стораджа не продуктивно т.к нужно вручную потом перезаписывать всю папку да и не узнаешь был ли рандомный вайп или нет, как этот момент автоматизировать и чтобы у людей после вайпа автоматом всё возвращалось?

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0
43 минуты назад, Parliament сказал:

Как решаете проблему с рандомным вайпом из-за крашей? Просто делать бэкап стораджа не продуктивно т.к нужно вручную потом перезаписывать всю папку да и не узнаешь был ли рандомный вайп или нет, как этот момент автоматизировать и чтобы у людей после вайпа автоматом всё возвращалось?

У меня скрипт делает backup'ы каждые 30 минут и в случае падения сервера восстанавливает последний. Для определения правильного завершения работы сервера в деструкторе класса MissionServer создаётся файл, по которому скрипт определяет упал сервер или его перезагрузили.

Share this post


Link to post
Share on other sites



  • 0

Init.c

...
class RestartFlag
{
	void RestartFlag()
	{
		
		return;
	}
	
	void ~RestartFlag()
	{
		FileHandle fp;
		
		fp = OpenFile("$profile:restart.pid", FileMode.WRITE);
		if( fp ) {
			FPrintln(fp, "1");
			CloseFile(fp);
		}
		
		return;
	}
}

class CustomMission: MissionServer
{
	ref RestartFlag rf = new RestartFlag();
...
	

 

watchdog.cmd

@echo off

title FASGG #1 (TvTRP) Watchdog
color 03

set DAYZ_LOCATION="D:\dayzserver"
set BEC_LOCATION="D:\bec"

goto checksv

:checksv
taskkill /f /im WerFault.exe >NUL
timeout 1 >NUL
tasklist /FI "IMAGENAME eq DayZServer_x64.exe" 2>NUL | find /I /N "DayZServer_x64.exe">NUL
if "%ERRORLEVEL%"=="0" goto checkbec
cls
echo Server is not running..
goto killsv

:checkbec
tasklist /FI "IMAGENAME eq Bec.exe" 2>NUL | find /I /N "Bec.exe">NUL
if "%ERRORLEVEL%"=="0" goto loopsv
cls
echo Bec is not running..
goto startbec

:loopsv
for /L %%s in (30,-1,0) do (
	cls
	echo Server is running. Checking again in %%s seconds.. 
	timeout 1 >nul
)
goto checksv

:killsv
if exist D:\dayzserver\profile\restart.pid goto startsv
taskkill /f /im Bec.exe
taskkill /f /im DayZServer_x64.exe
echo %DATE% %TIME% >> D:\crashes.txt
for /f %%i in ('dir /B /AD /OD /T:C D:\dayzserver\mpmissions\fasgg.chernarusplus\Backups\') do set LAST=%%i
set "LASTDB=D:\dayzserver\mpmissions\fasgg.chernarusplus\Backups\%LAST%\*.*"
xcopy /E /Y %LASTDB% D:\dayzserver\mpmissions\fasgg.chernarusplus\storage_1 >D:\restore.log
goto startsv

:startsv
del /f /q D:\dayzserver\profile\restart.pid >NUL
cls
echo Starting DayZ SA Server.
timeout 1 >nul
cls
echo Starting DayZ SA Server..
timeout 1 >nul
cls
echo Starting DayZ SA Server...
cd "%DAYZ_LOCATION%"
start DayZServer_x64.exe -dologs -adminlog -freezecheck -config=serverDZ.cfg -BEpath=D:\Bec -profiles=D:\dayzserver\profile -port=2302 -cpuCount=8 -filepatching -scrAllowFileWrite
for /L %%s in (45,-1,0) do (
	cls
	echo Running server.. Wait %%s seconds to start Bec.. 
	timeout 1 >nul
)
goto startbec

:startbec
cls
echo Starting Bec...
cd "%BEC_LOCATION%"
start Bec.exe -f Config.cfg --dsc
goto checksv

:eof

backup_db.cmd

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "backupname=%YYYY%%MM%%DD%_%HH%%Min%%Sec%"
xcopy /I /E /C /Q d:\dayzserver\mpmissions\fasgg.chernarusplus\storage_1 d:\dayzserver\mpmissions\fasgg.chernarusplus\backups\%backupname%

restart.cmd

@echo off

if exist D:\dayzserver\profile\restart.pid goto EOF
echo 1 >D:\dayzserver\profile\restart.pid

echo %DATE% %TIME% %1 %2 >> d:\restarts.txt

echo alert 90sec
c:\usr\local\php\php.exe d:\msg.php Restart in 90 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL
echo alert 75sec
c:\usr\local\php\php.exe d:\msg.php Restart in 75 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL
echo alert 60sec
c:\usr\local\php\php.exe d:\msg.php Restart in 60 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL
echo alert 45sec
c:\usr\local\php\php.exe d:\msg.php Restart in 45 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL
echo alert 30sec
c:\usr\local\php\php.exe d:\msg.php Restart in 30 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL
echo alert 15sec
c:\usr\local\php\php.exe d:\msg.php Restart in 15 seconds!
ping -n 15 -w 1000 127.0.0.1 >NUL

echo killing processes...
taskkill /F /IM Bec.exe
taskkill /F /IM DayZServer_x64.exe

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

echo backuping world...
set "backupname=%YYYY%%MM%%DD%_%HH%%Min%%Sec%"
xcopy /I /E /C /Q d:\dayzserver\mpmissions\fasgg.chernarusplus\storage_1 d:\dayzserver\mpmissions\fasgg.chernarusplus\backups\%backupname%

echo finished!
:EOF

msg.php

<?php
set_time_limit(0);

if( isset( $argc )  && $argc > 1 )
{
	$msg = '';
	for( $i = 1; $i < $argc; $i++ ) {
		$msg .= ' ' .$argv[$i];
	}
	$msg = ltrim($msg);
	
	$ip = "127.0.0.1";
	$port = "2302";
	$password = "MyPaSsWoRd";

	$msgSeq = 0;

	function beCrc32($data) {
		$data = sprintf("%08x", crc32($data));
		$data = array(substr($data,-2,2), substr($data,-4,2), substr($data,-6,2), substr($data,0,2));
		$data = chr(hexdec($data[0])) . chr(hexdec($data[1])) . chr(hexdec($data[2])) . chr(hexdec($data[3]));
		return $data;
	}

	function bePacket($data) {
		$crc = beCrc32(chr(255) . $data);
		$packet = "BE" . $crc . chr(255) . $data;
		return $packet;
	}

	function beAuth() {
		global $password;
		$data = chr(0) . $password;
		return bePacket($data);
	}

	function beCmd($data) {
		global $msgSeq;
		$data = chr(1) . chr($msgSeq) . $data;
		$msgSeq += 1;
		$msgSeq %= 256;
		return bePacket($data);
	}

	function bePing() {
		global $msgSeq;
		$data = chr(1) . chr($msgSeq);
		$msgSeq += 1;
		$msgSeq %= 256;
		return bePacket($data);
	}

	function beSayAll($data) {
		global $msgSeq;
		$data = chr(1) . chr($msgSeq) . "say -1 " . $data;
		$msgSeq += 1;
		$msgSeq %= 256;
		return bePacket($data);
	}

	function beResponse($seq) {
		$data = chr(2) . chr($seq);
		return bePacket($data);
	}

	function doAuth() {
		global $sock, $ip, $port;
		
		$buf = '';
		$data = beAuth();
		$len = strlen($data);
		$sent = socket_sendto($sock, $data, $len, 0, $ip, $port);
			
		if($sent == false)
		{
			die("Failed to send login:" . socket_last_error() . PHP_EOL);
		}
		
		$ret = socket_recvfrom($sock, $buf, 64, 0, $ip, $port);
		if($ret != 9) {
			die("Failed recv login response");
		}
		if(ord($buf[strlen($buf)-1]) != 1)
		{
			echo "Login failed: ";
			if(ord($buf[strlen($buf)-1]) == 0)
			{
				echo "wrong password" . PHP_EOL;
			}
			else
			{
				echo "unknown result" . PHP_EOL;
			}
			die("WTF");
		}
	}

	$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
	if(!$sock)
	{
		die("Socket create failed: " . socket_last_error() . PHP_EOL);
	}

	doAuth();

	socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
	
	usleep(250);
	
	$data = beSayAll($msg);
	$len = strlen($data);

	$sent = socket_sendto($sock, $data, $len, 0, $ip, $port);
			
	if($sent == false)
	{
		die("Failed to send login:" . socket_last_error() . PHP_EOL);
	}
	
}

?>

 

Да пожалуйста! Как бы не жалко.. Грязновато, конечно.. Многое хочется переделать и(ли) подчистить, но не до того сейчас..

watchdog.cmd — скрипт, следящий за падением сервера

restart.cmd — скрипт, перезапускающий сервер; так же он вызывается через веб-админку для рестарта сервера

backup_db.cmd — скрипт, делающий резервную копию; вызывается из планировщика задач (нужно добавить проверку на наличие файла *.journal-db, чтоб избежать копирования по время транзакции в БД игроков)

msg.php — скрипт для отправки сообщения на сервер (ещё для версии 0.5x написал систему валюты на сервере, оттуда и выдрал кусок, ибо лень было переписывать, т.ч. скрипт мог быть короче и проще, но я ленивая жопа)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.