pLan Gaming Client

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » pLan Gaming Client » Технические вопросы » установка постоянной комнаты на VDS (linux...)


установка постоянной комнаты на VDS (linux...)

Сообщений 1 страница 11 из 11

1

Так как воротил вечнорумных Браина и Мостярика больше нету, а скрипт запуска был потерян, то этим делом занялся я,
долгие поиски увенчались успехом и я нашел этот скрипт запускающий комнату
кстати вот он
скрипт остался без изменения еще от Brian

Код:
# Для включения скрипта на канале: !set +u2

setudef flag u2

bind pub - !стартс addroom                 
bind pub - !start addroom
          
proc addroom {nick uhost hand chan text} {
if {$chan == "#planu2" && [channel get $chan u2]} {

# game - Название игры
set game "Need For Speed Underground 2"

# roomname - Название комнаты
set roomname "St.Races 24/7"

# port - Порт комнаты
set port 1098

# vpnPort - порт open vpn
set vpnPort 1097

set list [join [chanlist #planu2] ", "]
set playerscount [llength [chanlist $chan]]
set up 20
::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)" -urlencoding cp1251
catch {set parsing_tok [::http::geturl "http://tracker.plangc.ru/?do=vpn_add&addr=&port=$port&game=VPN&mod=[http::formatQuery $game]&vpnport=$vpnPort&playerscount=$playerscount&chan=planu2&roomname=[http::formatQuery $roomname]&ts2=none&playerlist=[http::formatQuery $list]" -timeout 20000]}
::http::cleanup $parsing_tok
utimer $up [list addroom $nick $uhost $hand $chan ""]
}
}

# ________________________________________________ С т а т у с  к о м н а т ы ____________________________________

bind pub - !статус statusroom
bind pub - !status statusroom

proc statusroom {nick uhost hand chan text} {  
 
::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"
set parsing_tok [::http::geturl "http://tracker.plangc.ru/" -timeout 20000]
set data [::http::data $parsing_tok]
set data [regsub -all -- {\n|\r|\t|\v} [::http::data $parsing_tok] ""] 
::http::cleanup $parsing_tok

# Между тегов <td>...</td> вписать название канала

if {[regexp -- {<td>planu2</td>} $data]} {putserv "PRIVMSG $chan :Комната ONLINE"} {putserv "PRIVMSG $chan :Комната OFFLINE"}
} 

# ____________________________________________________Запуск демона пинга____________________________________

bind pub - !юдп udp   

proc udp { udp nick uhost hand chan } {
catch { exec /home/brian/udpdaemon 1098 & }
}

впрочем комментарии присутствуют и если кто то будет ставить то сможет легко отредактировать, а так же я думаю, что эта тема поможет не потерять скрипт в будущем

Отредактировано Shin (2013-11-26 20:40:31)

0

2

Жаль не всё так просто. Во первых udpdaemon, который показывает пинг комнаты, также утерян. Это один из самых первых нестабильных тикль скриптов - отваливался через пару суток аптайма. Shin, тогда написал sh скрипт для добавления комнаты на трекер. И udpdaemon и sh скрипт комнаты дело рук творение Шина. Может придет, подкинет что-нибудь.

Надо старый винт посмотреть -были же все скрипты.

0

3

Alexander
ясно, но я думаю браин умный парень и куда либо его выложил, я поищу завтра или даже сегодня... крон кстати хочет опять поставить сервер по мост вонтеду если будет комната

0

4

Создание сервера

от рута

apt-get install openvpn

Запросить у администрации вдс установку tun/tap драйвера.

Распаковать файлы https://www.dropbox.com/s/00n9xa40w2erot3/New Folder3.tar.gz в папку /etc/openvpn/

Ребут сервера  /etc/init.d/openvpn restart
Остановка /etc/init.d/openvpn stop
Запуск /etc/init.d/openvpn start

Отредактировано Alexander (2013-11-26 20:26:21)

0

5

Alexander написал(а):

Создание сервера

от рута

apt-get install openvpn

Распаковать файлы https://www.dropbox.com/s/00n9xa40w2erot3/New Folder3.tar.gz в папку /etc/openvpn/

Ребут сервера  /etc/init.d/openvpn restart
Остановка /etc/init.d/openvpn stop
Запуск /etc/init.d/openvpn start

ну что я могу сказать у меня там что то с опенвпн вайлед, короче нифига, зайди вечером в план обсудим

0

6

Привет всем!

1. Код выделенного сервера NFS Most Wanted "nfsmwd" (автор Kr0ne), собирается в Delphi, запускается в линуксе под wine:

Код:
program nfsmwd;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

  function StartServer(Name: PChar; P1, P2, P3: Integer): Boolean; cdecl; external 'server.dll' name 'StartServer';
  function ServStat: Boolean; cdecl; external 'server.dll' name 'IsServerRunning';
  procedure StopServer; cdecl; external 'server.dll' name 'StopServer';

var
  Name: string;
  Buf: array[0..50] of Char;
  Count: Cardinal;
  S: string;
  I: Integer;
  Cmd: string;
begin
  if Length(ParamStr(1)) = 0 then
  begin
    Writeln('Usage: nfsmwd.exe <name>');
    Exit;
  end;

  Name := ParamStr(1);

  if (Length(Name) < 3) or (Length(Name) > 20) then
  begin
    Writeln('Error: Bad server name');
    Exit;
  end;

  StartServer(PChar(Name), 0, 0, 0);

  repeat
    ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @Buf, 50, Count, nil);
    S := string(Buf);
    I := Pos(#13, S);
    if I > 0 then
    begin
      Cmd := Copy(S, 1, I - 1);
      if UpperCase(Cmd) = 'STOP' then
      begin
        StopServer;
        Break;
      end;
    end;
  until False;
end.

Он же только собранный с нужными библиотеками из NFS Most Wanted: https://drive.google.com/file/d/0B981nG … sp=sharing
Распаковать в /opt/nfsmwd/
Сервер реагирует на команду stop для его выключения, введённую в консоли, ну или Ctrl + C :D.

2. Файлы конфигурации openvpn: https://drive.google.com/file/d/0B981nG … sp=sharing
Распаковать в /etc/openvpn/

3. Скрипт запуска сервера start.sh:

Код:
#!/bin/sh

cd /opt/nfsmwd/

LOCK_FILE=`basename $0`.lck

if [ -f "${LOCK_FILE}" ]; then
	MYPID=`head -n 1 $LOCK_FILE`
	if [ -n "`ps -p ${MYPID} | grep ${MYPID}`" ]; then
    echo `basename $0` is already running [$MYPID].
    exit
	fi
fi

echo $$ > $LOCK_FILE

route add -host 255.255.255.255 dev tap0

nohup wine nfsmwd.exe Kr0neSERV &

Возможно в последню строчку запуска сервера надо добавить что-то типа "nohup wine nfsmwd.exe Kr0neSERV > /dev/null 2>&1 &", чтобы не плодило кучу мусора в папке (не проверял!)

4. Скрипт создания комнаты на трекере tracker.sh:

Код:
#!/bin/sh

LOCK_FILE=`basename $0`.lck

if [ -f "${LOCK_FILE}" ]; then
	MYPID=`head -n 1 $LOCK_FILE`
	if [ -n "`ps -p ${MYPID} | grep ${MYPID}`" ]; then
    echo `basename $0` is already running [$MYPID].
    exit
	fi
fi

echo $$ > $LOCK_FILE

port=1098
vpnport=1097
chan=Most_Wanted
roomname=MOSTYRA2

while sleep 20
do
	lines=$(cat users.txt)

	playerscount=0
	playerlist=

	for line in $lines; do
    playerscount=$(($playerscount+1))
    playerlist="$playerlist$line,"
	done

	#echo "$playerlist"
	#echo "$playerscount"

	wget -O /dev/null -q "http://tracker.plangc.ru/?do=vpn_add&addr=&port=$port&game=VPN&mod=Need%20for%20Speed%20Most%20Wanted&vpnport=$vpnport&playerscount=$playerscount&chan=$chan&roomname=$roomname&ts2=none&playerlist=$playerlist"
done

Файл users.txt, в котором список игроков разделён переводом строки, должен лежать в папке со скриптом (пожалуйста не злоупотребляйте количеством игроков в списке :D)

5. Код udpdaemon.cc:

Код:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class udpdaemon {
  protected:
    void daemonize();
    void mainloop();
    void commit();
    static void sighandler(int signum);
  public:
    void exec();
};

void udpdaemon::sighandler(int signum) {
    waitpid(0, 0, WNOHANG);
}

void udpdaemon::daemonize() {
    int pid;
    struct sigaction sa;

    cout << "Daemonizing ourselves.. " << flush;
    pid = fork();

    switch(pid) {
    case 0:
        setsid();
        chdir("/");

        close(0);
        close(1);
        close(2);

        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = &sighandler;
        sigaction(SIGCHLD, &sa, 0);

        openlog("udpdaemon", 0, LOG_USER);
        mainloop();
        closelog();

        exit(0);

    case -1:
        cout << "fork() error" << endl;
        break;

    default:
        cout << "ok. PID=" << pid << endl;
        break;
    }
}

void udpdaemon::mainloop() {
    int sockfd, size;
    fd_set fds;
    struct sockaddr_in sa;
    struct sockaddr_in from;
    socklen_t fromlen;
    char buf[100];

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);

    if (sockfd != -1) {
        memset(&sa, 0, sizeof(sa));

        sa.sin_family = AF_INET;
        sa.sin_addr.s_addr = htonl(INADDR_ANY);
        sa.sin_port = htons(1098);

        if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) != -1) {
            while(1) {
                FD_ZERO(&fds);
                FD_SET(sockfd, &fds);

                if (select(sockfd+1, &fds, 0, 0, 0) < 0) {
                    syslog(LOG_NOTICE, "select() error");
                }

                if (FD_ISSET(sockfd, &fds)) {
                    size = recvfrom(sockfd, buf, 100, 0, (struct sockaddr *)&from, &fromlen);

                    if (size >= 0) {
                        sendto(sockfd, buf, size, 0, (struct sockaddr *)&from, fromlen);
                    }
                }
            }
        }
    }
}

void udpdaemon::exec() {
    daemonize();
}

int main() {
    udpdaemon d;
    d.exec();
    return 0;
}

Собирается скриптом make.sh:

Код:
#!/bin/sh
killall udpdaemon
c++ udpdaemon.cc -o udpdaemon
#./udpdaemon

Собранный udpdaemon: https://drive.google.com/file/d/0B981nG … sp=sharing

Пользуйтесь на здоровье! :D

0

7

Shin
cпасибо, при возможности соберем все

0

8

Кстати, статус получения комнаты в TCL-скрипте можно переделать, указав URL: http://tracker.plangc.ru/?do=vpn_get - так меньше инфы будет грузить, ну или http://tracker.plangc.ru/?do=vpn_get&format=json - если скрипт научить работать с json форматом.

0

9

На данный момент скрипты имеют следующий вид. Потихоньку буду модернизировать.
sh скрипт добавления комнаты на трекер

Код:
#!/bin/sh

LOCK_FILE=`basename $0`.lck

if [ -f "${LOCK_FILE}" ]; then
	MYPID=`head -n 1 $LOCK_FILE`
	if [ -n "`ps -p ${MYPID} | grep ${MYPID}`" ]; then
    echo `basename $0` is already running [$MYPID].
    exit
	fi
fi

echo $$ > $LOCK_FILE

port=1098
vpnport=1097
chan=plangcMW
roomname="pLanGC 24/7"

while sleep 20
do
	lines=$(cat users.txt)

	playerscount=0
	playerlist=

	for line in $lines; do
    playerscount=$(($playerscount+1))
    playerlist="$playerlist$line,"
	done

	#echo "$playerlist"
	#echo "$playerscount"

	wget -O /dev/null -q "http://tracker.plangc.ru/?do=vpn_add&addr=&port=$port&game=VPN&mod=Need%20for%20Speed%20Most%20Wanted&vpnport=$vpnport&playerscount=$playerscount&chan=$chan&roomname=$roomname&ts2=none&playerlist=$playerlist"
done

tcl скрипт раз в минуту перезаписывает список юзеров в файл

Код:
bind time - "?? * * * *" timeproc
proc timeproc {min hour day month year} {
set file "/home/nova/users.txt"
set list [join [chanlist #plangcMW] " "]
set filep [open $file w]
puts $filep $list
close $filep
}

tcl скрипт проверки статуса комнаты. Также отображает число юзеров в комнате и перечисляет ники

Код:
bind pub - !статус statusroom
bind pub - !status statusroom

proc statusroom {nick uhost hand chan text} {  
 
::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"
set parsing_tok [::http::geturl "http://tracker.plangc.ru/?do=vpn_get" -timeout 20000]
set data [::http::data $parsing_tok]
set data [regsub -all -- {\n|\r|\t|\v} [::http::data $parsing_tok] ""] 
::http::cleanup $parsing_tok
set usersnum [llength [chanlist #plangcmw]]
set noom [chanlist #plangcmw]

if {[regexp -- {plangcMW} $data]} {putserv "PRIVMSG $chan :Комната  pLanGC 24/7 (NFS MW) ONLINE В комнате $usersnum юзеров: $noom"} {putserv "PRIVMSG $chan $::gcolor(04):Комната pLanGC 24/7 (NFS MW) OFFLINE"}
}

tcl скрипт ловит юзеров со старой версией плана и выдает сообщение на канал с просьбой обновить план

Код:
bind join - * name          
proc name {nick uhost hand chan} {          
if {[string match "*pLanGC*@*" $uhost]} {putserv "PRIVMSG $chan :$nick, обнови план. Актуальная версия pLan OpenVPN v0.6.64 Скачать на http://plangc.ru "}                  
}

tcl скрипт вывод версии irc клиента определенного юзера на канал

Код:
set ctcpuse 0; set ctcpchan "" 

bind pub - !версия ctcpverpub 
proc ctcpverpub {nick uhost hand chan text} { 
global ctcpuse ctcpchan 
if {[string is space $text]} {putserv "NOTICE $nick :Формат: $::lastbind <ник>"; return} 
set ctcpuse 1; set ctcpchan $chan 
putserv "PRIVMSG [lindex [split $text] 0] :\001VERSION\001" 
} 

bind ctcr - VERSION ctcpverctcr 
proc ctcpverctcr {nick uhost hand dest keyword text} { 
global ctcpuse ctcpchan 
if {$ctcpuse == 1} {putserv "PRIVMSG $ctcpchan :$nick использует $text"; set ctcpuse 0} 
}

Отредактировано Alexander (2013-12-06 08:42:06)

0

10

udpdaemon.pl (он же UDP Echo Server) на Perl на замену C-шного:

Код:
#!/usr/bin/perl
use IO::Socket::INET;

# flush after every write
$| = 1;

my ($socket, $received_data);

$socket = new IO::Socket::INET (
	LocalPort => defined($ARGV[0]) ? $ARGV[0] : '1098',
	Proto => 'udp'
) or die "ERROR in Socket Creation : $! \n";

while(1) {
	$socket->recv($recieved_data, 100);
	$socket->send($recieved_data);
}

$socket->close();

Запуск
1. Порт комнаты - 1098 (по умолчанию): ./udpdaemon.pl &
2. Другой порт (например, 9999): ./udpdaemon.pl 9999 &

0

11

Alexander
шурик ответь нам )) мы тебя ждем))  mostyra

0


Вы здесь » pLan Gaming Client » Технические вопросы » установка постоянной комнаты на VDS (linux...)