Telnetでゲームサーバを再起動するスクリプトです。

Active Perl 5.8.8以降で動作します。 ファイル名は「ゲームサーバ再起動.pl」とでもしておいてください。

  1. ## Active Perl 5.8.8
  2. use strict;
  3. use warnings;
  4. use Net::Telnet;
  5. use Win32::Console;
  6. $|=1;
  7. my $console = new Win32::Console(STD_OUTPUT_HANDLE);
  8. my $defaultColor = $console->Attr;
  9. my $password = 'XXXXXXXXXX'; #ここにtelnetのパスワード
  10. my $telnet = new Net::Telnet(
  11. Host => '192.168.0.xx' #ここにゲームサーバのIPアドレス
  12. , Port => 12345 #ここにゲームサーバのtelnetポート番号
  13. , Timeout => 10
  14. );
  15. &message("Connect GameServer.");
  16. $telnet->open;
  17. print $telnet->waitfor('/Password:/i');
  18. &echo("*****"); $telnet->print($password);
  19. my @m = $telnet->waitfor('/\n/'); print @m;
  20. die unless grep /Password Correct/i,@m;
  21. &send('restart 30');
  22. print $telnet->waitfor('/\n/'); #Type "abort" To Abort Restart!
  23. &send('exit');
  24. print $telnet->waitfor('/\n/'); #Bye Bye!
  25. &flush;
  26. $telnet->close;
  27. &message("Disconnect.");
  28. exit 0;
  29. sub send {
  30. my ($msg) = @_;
  31. &flush;
  32. &echo($msg);
  33. $telnet->print($msg);
  34. }
  35. sub echo {
  36. $console->Attr(10);
  37. print @_,"\n";
  38. $console->Attr($defaultColor);
  39. }
  40. sub message {
  41. $console->Attr(11);
  42. print @_,"\n";
  43. $console->Attr($defaultColor);
  44. }
  45. sub flush {
  46. print @m if my @m = $telnet->getlines(Timeout => 3, Errmode => "return");
  47. }

こちらはシャットダウンするスクリプトです。

ファイル名は「ゲームサーバシャットダウン.pl」とでもしておいてください。 -wオプションを指定すると、シャットダウンするまで待機します。

  1. ## Active Perl 5.8.8
  2. use strict;
  3. use warnings;
  4. use Net::Telnet;
  5. use Socket;
  6. use Win32::Console;
  7. $|=1;
  8. my $console = new Win32::Console(STD_OUTPUT_HANDLE);
  9. my $defaultColor = $console->Attr;
  10. my $wait = 0;
  11. foreach (@ARGV) {
  12. $wait = 1 if $_ eq '-w';
  13. $wait = 1 if $_ eq '/w';
  14. }
  15. my $password = 'XXXXXXXXXX'; #ここにtelnetのパスワード
  16. my $telnet = new Net::Telnet(
  17. Host => '192.168.0.xx' #ここにゲームサーバのIPアドレス
  18. , Port => 12345 #ここにゲームサーバのtelnetポート番号
  19. , Timeout => 10
  20. );
  21. &message("Connect GameServer.");
  22. $telnet->open;
  23. print $telnet->waitfor('/Password:/i');
  24. &echo("*****"); $telnet->print($password);
  25. my @m = $telnet->waitfor('/\n/'); print @m;
  26. die unless grep /Password Correct/i,@m;
  27. &send('shutdown 30');
  28. print $telnet->waitfor('/\n/'); #Type "abort" To Abort Restart!
  29. &send('exit');
  30. print $telnet->waitfor('/\n/'); #Bye Bye!
  31. &flush;
  32. $telnet->close;
  33. &message("Disconnect.");
  34. if ($wait) {
  35. while (&portCheck($telnet->host, 7777)) {print '.'; sleep 15} #ゲームサーバのポート7777
  36. print "\n";
  37. }
  38. exit 0;
  39. sub portCheck {
  40. my ($host,$port) = @_;
  41. my $iaddr = inet_aton($host) or die;
  42. my $sock_addr = pack_sockaddr_in($port, $iaddr);
  43. return undef unless socket(SOCKET, PF_INET, SOCK_STREAM, 0);
  44. return undef unless connect(SOCKET, $sock_addr);
  45. close(SOCKET);
  46. 1;
  47. }
  48. sub send {
  49. my ($msg) = @_;
  50. &flush;
  51. &echo($msg);
  52. $telnet->print($msg);
  53. }
  54. sub echo {
  55. $console->Attr(10);
  56. print @_,"\n";
  57. $console->Attr($defaultColor);
  58. }
  59. sub message {
  60. $console->Attr(11);
  61. print @_,"\n";
  62. $console->Attr($defaultColor);
  63. }
  64. sub flush {
  65. print @m if my @m = $telnet->getlines(Timeout => 3, Errmode => "return");
  66. }