ReCheckIP, ForceShutdown を追加
@@ -100,6 +100,7 @@ | ||
100 | 100 | self.flag_running = False |
101 | 101 | self.flag_history = False |
102 | 102 | self.flag_dat = False |
103 | + self.connection = None | |
103 | 104 | def __getstate__(self): |
104 | 105 | return (self.id, self.ip,self.port, self.name, self.pubkey,self.ua,self.flag) |
105 | 106 | def __setstate__(self,x): |
@@ -110,6 +111,10 @@ | ||
110 | 111 | self.removable = False |
111 | 112 | def __cmp__(self,x): |
112 | 113 | return cmp(self.id, x.id) |
114 | + def shutdown(self): | |
115 | + if self.connection: | |
116 | + self.connection.shutdown(socket.SHUT_RDWR) | |
117 | + self.connection.close() | |
113 | 118 | def from_node(self, n): |
114 | 119 | if self.id == n.id: |
115 | 120 | self.ip = n.ip |
@@ -161,9 +166,11 @@ | ||
161 | 166 | conn.connect() |
162 | 167 | socket.setdefaulttimeout(None) |
163 | 168 | conn.sock.settimeout(o2on_config.SocketTimeout) |
169 | + self.connection = conn.sock | |
164 | 170 | conn.request(method,path,body, headers) |
165 | 171 | r = conn.getresponse() |
166 | 172 | conn.close() |
173 | + self.connection = None | |
167 | 174 | except socket.timeout: |
168 | 175 | socket.setdefaulttimeout(None) |
169 | 176 | self.removable = True |
@@ -34,6 +34,10 @@ | ||
34 | 34 | self.name = name |
35 | 35 | self.glob = g |
36 | 36 | self.sec = s |
37 | + self.node = None | |
38 | + def shutdown(self): | |
39 | + if self.node: self.node.shutdown() | |
40 | + self.node = None | |
37 | 41 | def stop(self): |
38 | 42 | self.finish = True |
39 | 43 | def wakeup(self): |
@@ -61,8 +65,10 @@ | ||
61 | 65 | self.glob.logger.log("JOBMANAGER", "job %s started" % self.name) |
62 | 66 | while not self.finish: |
63 | 67 | #t = time.time() |
68 | + self.node = None | |
64 | 69 | self.dojob(self.glob.nodedb, self.glob.logger, self.glob.prof, self.glob.datdb, |
65 | 70 | self.glob.datquery) |
71 | + self.node = None | |
66 | 72 | if self.finish: break |
67 | 73 | diff = int(self.sec) #int(self.sec - (time.time()-t)) |
68 | 74 | if 0<diff: |
@@ -88,7 +94,9 @@ | ||
88 | 94 | if self.finish: break |
89 | 95 | logger.log("NODECOLLECTOR", "findnode to %s" % (hexlify(x.id))) |
90 | 96 | try: |
97 | + self.node = x | |
91 | 98 | newnodes = x.findnode(target) |
99 | + self.node = None | |
92 | 100 | except o2on_node.NodeRemovable: |
93 | 101 | nodes.remove(x) |
94 | 102 | nodes.save() |
@@ -119,7 +127,9 @@ | ||
119 | 127 | if self.finish: break |
120 | 128 | logger.log("DATCOLLECTOR","dat (%s) to %s" % (board,hexlify(n.id))) |
121 | 129 | try: |
130 | + self.node = n | |
122 | 131 | dat = n.dat(None, board, datdb) |
132 | + self.node = None | |
123 | 133 | except o2on_node.NodeRemovable: |
124 | 134 | nodes.remove(n) |
125 | 135 | nodes.save() |
@@ -148,7 +158,9 @@ | ||
148 | 158 | if self.finish: break |
149 | 159 | logger.log("GETIP","getIP to %s" % hexlify(n.id)) |
150 | 160 | try: |
161 | + self.node = n | |
151 | 162 | r = n.ping(True) |
163 | + self.node = None | |
152 | 164 | except o2on_node.NodeRemovable: |
153 | 165 | nodes.remove(n) |
154 | 166 | nodes.save() |
@@ -164,7 +176,10 @@ | ||
164 | 176 | ip = o2on_node.e2ip(r[:8]) |
165 | 177 | if not regLocalIP.match(ip): |
166 | 178 | prof.mynode.ip = ip |
167 | - self.finish = True | |
179 | + if o2on_config.ReCheckIP == None: | |
180 | + self.finish = True | |
181 | + else: | |
182 | + self.sec = o2on_config.ReCheckIP * 60 | |
168 | 183 | logger.popup("GETIP","Got Global IP %s" % ip) |
169 | 184 | nodes.add_node(n) |
170 | 185 | break |
@@ -178,7 +193,9 @@ | ||
178 | 193 | if self.finish: break |
179 | 194 | logger.log("ASKNODECOLLECTION", "node collection to %s" % (hexlify(n.id))) |
180 | 195 | try: |
196 | + self.node = n | |
181 | 197 | colboards = n.collection(self.glob) |
198 | + self.node = None | |
182 | 199 | except o2on_node.NodeRemovable: |
183 | 200 | nodedb.remove(n) |
184 | 201 | nodedb.save() |
@@ -224,7 +241,9 @@ | ||
224 | 241 | if not node: continue |
225 | 242 | logger.log("PUBLISHORIGINAL","publish original to %s" % (hexlify(n))) |
226 | 243 | try: |
244 | + self.node = node | |
227 | 245 | node.store("dat", publish_nodes[n]) |
246 | + self.node = None | |
228 | 247 | except o2on_node.NodeRemovable: |
229 | 248 | nodedb.remove(node) |
230 | 249 | nodedb.save() |
@@ -268,7 +287,9 @@ | ||
268 | 287 | if not node: continue |
269 | 288 | logger.log("PUBLISHKEY","publish key to %s" % (hexlify(n))) |
270 | 289 | try: |
290 | + self.node = node | |
271 | 291 | node.store("dat", publish_nodes[n]) |
292 | + self.node = None | |
272 | 293 | except o2on_node.NodeRemovable: |
273 | 294 | nodedb.remove(node) |
274 | 295 | nodedb.save() |
@@ -319,7 +340,9 @@ | ||
319 | 340 | logger.log("SEARCH","findvalue to %s for %s" % (hexlify(node.id),d.url)) |
320 | 341 | sent.append(node.id) |
321 | 342 | try: |
343 | + self.node = node | |
322 | 344 | res = node.findvalue(d.hash) |
345 | + self.node = None | |
323 | 346 | except o2on_node.NodeRemovable: |
324 | 347 | nodedb.remove(node) |
325 | 348 | nodedb.save() |
@@ -361,7 +384,9 @@ | ||
361 | 384 | if not node: node = o2on_node.Node(k.nodeid, k.ip, k.port) |
362 | 385 | logger.log("DATQUERY","dat query %s to %s" % (hexlify(k.hash),hexlify(node.id))) |
363 | 386 | try: |
387 | + self.node = node | |
364 | 388 | dat = node.dat(k.hash, None, self.glob) |
389 | + self.node = None | |
365 | 390 | except o2on_node.NodeRemovable: |
366 | 391 | nodedb.remove(node) |
367 | 392 | nodedb.save() |
@@ -189,9 +189,15 @@ | ||
189 | 189 | c = 0 |
190 | 190 | for j in jobs: |
191 | 191 | j.join(1) |
192 | + shutcount = 0 | |
192 | 193 | while j.isAlive(): |
193 | 194 | glob.logger.popup("GLOBAL", "Waiting for %s" % j.name) |
194 | - j.join(7) | |
195 | + j.join(8) | |
196 | + shutcount += 1 | |
197 | + if o2on_config.ForceShutdown != None and \ | |
198 | + o2on_config.ForceShutdown / 8 < shutcount: | |
199 | + glob.logger.popup("GLOBAL", "Force Shutdown") | |
200 | + j.shutdown() | |
195 | 201 | c += 1 |
196 | 202 | glob.logger.log("GLOBAL", "Finished %d/%d" % (c, n)) |
197 | 203 | glob.imdb.save() |