IdRemoteCMDServer.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 10303: IdRemoteCMDServer.pas
  11. {
  12. { Rev 1.0 2002.11.12 10:50:10 PM czhower
  13. }
  14. unit IdRemoteCMDServer;
  15. {2001, Feb 17
  16. started this unit with code from TIdRexecServer}
  17. interface
  18. uses
  19. Classes,
  20. IdAssignedNumbers, IdTCPClient, IdTCPServer;
  21. type
  22. TIdRemoteCMDServer = class(TIdTCPServer)
  23. protected
  24. FForcePortsInRange : Boolean;
  25. FStdErrorPortsInRange : Boolean;
  26. function DoExecute(AThread: TIdPeerThread): boolean; override;
  27. procedure DoCMD(AThread: TIdPeerThread;
  28. AStdError : TIdTCPClient; AParam1, AParam2, ACommand : String); virtual; abstract;
  29. public
  30. procedure SendError(AThread : TIdPeerThread; AStdErr : TIdTCPClient; AMsg : String);
  31. procedure SendResults(AThread : TIdPeerThread; AStdErr : TIdTCPClient; AMsg : String);
  32. end;
  33. implementation
  34. uses
  35. IdSocketHandle, IdException, IdGlobal, IdIOHandlerSocket,
  36. SysUtils;
  37. { TIdRemoteCMDServer }
  38. function TIdRemoteCMDServer.DoExecute(AThread: TIdPeerThread): boolean;
  39. var
  40. StdError : TIdTCPClient;
  41. ErrorPort : Integer;
  42. Param1, Param2, Command : String;
  43. procedure ExecuteCMD;
  44. begin
  45. try
  46. Result := True;
  47. StdError := nil;
  48. ErrorPort := StrToIntDef(Trim(AThread.Connection.ReadLn(#0)),0);
  49. if ErrorPort <> 0 then
  50. begin
  51. StdError := TIdTCPClient.Create(nil);
  52. if FStdErrorPortsInRange then
  53. begin
  54. StdError.BoundPortMax := 1023;
  55. StdError.BoundPortMin := 512;
  56. end;
  57. StdError.BoundIP := (AThread.Connection.IOHandler as TIdIOHandlerSocket).Binding.IP;
  58. StdError.Host := (AThread.Connection.IOHandler as TIdIOHandlerSocket).Binding.PeerIP;
  59. StdError.Port := ErrorPort;
  60. repeat
  61. try
  62. StdError.Connect;
  63. break;
  64. except
  65. on E: EIdSocketError do begin
  66. // This will be uncommented after we have the fix into TIdTCPClient.Connect metod
  67. // There is one extra line that has to be added in order to run this code
  68. //
  69. // except
  70. // // This will free IOHandler
  71. // BoundPort := TIdIOHandlerSocket(IOHandler).Binding.Port; // The extra line
  72. // DisconnectSocket;
  73. // raise;
  74. // end;
  75. //
  76. // After we have this code we will know the exact Port on wich the exception has occured
  77. {if E.LastError = 10048 then begin
  78. StdError.BoundPortMax := StdError.BoundPort - 1;
  79. StdError.BoundPort := 0;
  80. StdError.Disconnect;
  81. end
  82. else}
  83. raise;
  84. end;
  85. end;
  86. until false;
  87. end;
  88. Param1 := AThread.Connection.ReadLn(#0);
  89. Param2 := AThread.Connection.ReadLn(#0);
  90. Command := AThread.Connection.ReadLn(#0);
  91. DoCMD(AThread, StdError, Param1, Param2, Command);
  92. if Assigned(StdError) then
  93. begin
  94. StdError.Disconnect;
  95. end;
  96. finally
  97. FreeAndNil(StdError);
  98. end;
  99. end;
  100. begin
  101. if FForcePortsInRange then begin
  102. if ((AThread.Connection.IOHandler as TIdIOHandlerSocket).Binding.Port >= 512) or
  103. ((AThread.Connection.IOHandler as TIdIOHandlerSocket).Binding.Port <= 1023) then
  104. begin
  105. ExecuteCMD;
  106. end;
  107. end
  108. else begin
  109. ExecuteCMD;
  110. end;
  111. AThread.Connection.Disconnect;
  112. end;
  113. procedure TIdRemoteCMDServer.SendError(AThread: TIdPeerThread;
  114. AStdErr: TIdTCPClient; AMsg: String);
  115. begin
  116. AThread.Connection.Write(#1);
  117. if Assigned(AStdErr) then
  118. AStdErr.Write(AMsg)
  119. else
  120. AThread.Connection.Write(AMsg);
  121. end;
  122. procedure TIdRemoteCMDServer.SendResults(AThread: TIdPeerThread;
  123. AStdErr: TIdTCPClient; AMsg: String);
  124. begin
  125. AThread.Connection.Write(#0 + AMsg)
  126. end;
  127. end.