Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

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

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
Parliament

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 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 написал систему валюты на сервере, оттуда и выдрал кусок, ибо лень было переписывать, т.ч. скрипт мог быть короче и проще, но я ленивая жопа)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.