watobo 0.9.21 → 0.9.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +46 -1
- data/bin/nfq_server.rb +0 -9
- data/bin/watobo_gui.rb +3 -13
- data/custom-views/prettify-json.rb +9 -18
- data/icons/watobo.ico +0 -0
- data/icons/watobo.ico.old +0 -0
- data/lib/watobo.rb +10 -19
- data/lib/watobo/adapters.rb +5 -14
- data/lib/watobo/adapters/data_store.rb +50 -59
- data/lib/watobo/adapters/file/file_store.rb +287 -296
- data/lib/watobo/adapters/file/marshal_store.rb +293 -296
- data/lib/watobo/adapters/session_store.rb +5 -14
- data/lib/watobo/ca.rb +1 -10
- data/lib/watobo/config.rb +197 -206
- data/lib/watobo/constants.rb +0 -9
- data/lib/watobo/core.rb +3 -12
- data/lib/watobo/core/active_check.rb +72 -135
- data/lib/watobo/core/active_checks.rb +49 -58
- data/lib/watobo/core/ca.rb +369 -389
- data/lib/watobo/core/cert_store.rb +34 -43
- data/lib/watobo/core/chat.rb +92 -101
- data/lib/watobo/core/chats.rb +271 -280
- data/lib/watobo/core/client_cert_store.rb +106 -35
- data/lib/watobo/core/conversation.rb +48 -57
- data/lib/watobo/core/cookie.rb +23 -32
- data/lib/watobo/core/egress_handlers.rb +98 -0
- data/lib/watobo/core/finding.rb +66 -75
- data/lib/watobo/core/findings.rb +107 -114
- data/lib/watobo/core/forwarding_proxy.rb +13 -22
- data/lib/watobo/core/fuzz_gen.rb +0 -9
- data/lib/watobo/core/intercept_carver.rb +166 -177
- data/lib/watobo/core/intercept_filter.rb +235 -244
- data/lib/watobo/core/interceptor.rb +98 -107
- data/lib/watobo/core/min_class.rb +4 -13
- data/lib/watobo/core/netfilter_queue.rb +170 -179
- data/lib/watobo/core/ott_cache.rb +132 -141
- data/lib/watobo/core/parameter.rb +43 -52
- data/lib/watobo/core/passive_check.rb +103 -102
- data/lib/watobo/core/passive_checks.rb +48 -57
- data/lib/watobo/core/passive_scanner.rb +54 -55
- data/lib/watobo/core/plugin.rb +11 -20
- data/lib/watobo/core/project.rb +3 -9
- data/lib/watobo/core/proxy.rb +43 -52
- data/lib/watobo/core/request.rb +125 -123
- data/lib/watobo/core/response.rb +44 -53
- data/lib/watobo/core/scanner.rb +0 -9
- data/lib/watobo/core/scanner3.rb +405 -414
- data/lib/watobo/core/scope.rb +83 -92
- data/lib/watobo/core/session.rb +1043 -1026
- data/lib/watobo/core/sid_cache.rb +98 -107
- data/lib/watobo/core/subscriber.rb +25 -34
- data/lib/watobo/defaults.rb +21 -30
- data/lib/watobo/external/diff/lcs.rb +0 -9
- data/lib/watobo/external/diff/lcs/array.rb +0 -9
- data/lib/watobo/external/diff/lcs/block.rb +0 -9
- data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
- data/lib/watobo/external/diff/lcs/change.rb +0 -9
- data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
- data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
- data/lib/watobo/external/diff/lcs/string.rb +0 -9
- data/lib/watobo/externals.rb +6 -15
- data/lib/watobo/framework.rb +4 -13
- data/lib/watobo/framework/create_project.rb +60 -69
- data/lib/watobo/framework/init.rb +0 -9
- data/lib/watobo/framework/init_modules.rb +0 -9
- data/lib/watobo/framework/license_text.rb +28 -37
- data/lib/watobo/framework/load_chat.rb +13 -22
- data/lib/watobo/gui.rb +132 -123
- data/lib/watobo/gui/about_watobo.rb +0 -9
- data/lib/watobo/gui/browser_preview.rb +0 -9
- data/lib/watobo/gui/certificate_dialog.rb +0 -9
- data/lib/watobo/gui/chat_diff.rb +0 -9
- data/lib/watobo/gui/chatviewer_frame.rb +73 -72
- data/lib/watobo/gui/checkboxtree.rb +0 -9
- data/lib/watobo/gui/checks_policy_frame.rb +0 -9
- data/lib/watobo/gui/client_cert_dialog.rb +96 -87
- data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
- data/lib/watobo/gui/conversation_table.rb +158 -164
- data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
- data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
- data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
- data/lib/watobo/gui/custom_viewer.rb +374 -383
- data/lib/watobo/gui/dashboard.rb +296 -303
- data/lib/watobo/gui/define_scope_frame.rb +0 -9
- data/lib/watobo/gui/differ_frame.rb +215 -224
- data/lib/watobo/gui/edit_comment.rb +0 -9
- data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
- data/lib/watobo/gui/export_dialog.rb +104 -113
- data/lib/watobo/gui/finding_info.rb +0 -9
- data/lib/watobo/gui/findings_tree.rb +210 -217
- data/lib/watobo/gui/full_scan_dialog.rb +0 -9
- data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
- data/lib/watobo/gui/fxsave_thread.rb +14 -0
- data/lib/watobo/gui/goto_url_dialog.rb +70 -79
- data/lib/watobo/gui/hex_viewer.rb +0 -9
- data/lib/watobo/gui/html_viewer.rb +287 -296
- data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
- data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
- data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
- data/lib/watobo/gui/json_viewer.rb +287 -0
- data/lib/watobo/gui/list_box.rb +101 -110
- data/lib/watobo/gui/log_file_viewer.rb +32 -41
- data/lib/watobo/gui/log_viewer.rb +83 -88
- data/lib/watobo/gui/login_wizzard.rb +0 -9
- data/lib/watobo/gui/main_window.rb +587 -618
- data/lib/watobo/gui/manual_request_editor.rb +620 -565
- data/lib/watobo/gui/master_pw_dialog.rb +0 -9
- data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
- data/lib/watobo/gui/page_tree.rb +217 -226
- data/lib/watobo/gui/password_policy_dialog.rb +0 -9
- data/lib/watobo/gui/plugin_board.rb +0 -9
- data/lib/watobo/gui/preferences_dialog.rb +0 -9
- data/lib/watobo/gui/progress_window.rb +17 -27
- data/lib/watobo/gui/project_wizzard.rb +0 -9
- data/lib/watobo/gui/proxy_dialog.rb +1 -10
- data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
- data/lib/watobo/gui/request_builder_frame.rb +102 -111
- data/lib/watobo/gui/request_editor.rb +181 -137
- data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
- data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
- data/lib/watobo/gui/save_chat_dialog.rb +140 -149
- data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
- data/lib/watobo/gui/select_chat_dialog.rb +0 -9
- data/lib/watobo/gui/session_management_dialog.rb +0 -9
- data/lib/watobo/gui/sites_tree.rb +0 -9
- data/lib/watobo/gui/status_bar.rb +0 -9
- data/lib/watobo/gui/table_editor.rb +0 -9
- data/lib/watobo/gui/tagless_viewer.rb +0 -9
- data/lib/watobo/gui/templates/plugin.rb +0 -9
- data/lib/watobo/gui/templates/plugin2.rb +92 -100
- data/lib/watobo/gui/templates/plugin_base.rb +144 -153
- data/lib/watobo/gui/text_viewer.rb +0 -9
- data/lib/watobo/gui/transcoder_window.rb +0 -9
- data/lib/watobo/gui/utils/gui_utils.rb +0 -9
- data/lib/watobo/gui/utils/init_icons.rb +86 -95
- data/lib/watobo/gui/utils/load_icons.rb +33 -42
- data/lib/watobo/gui/utils/load_plugins.rb +116 -119
- data/lib/watobo/gui/utils/master_password.rb +68 -77
- data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
- data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
- data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
- data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
- data/lib/watobo/gui/utils/session_history.rb +112 -121
- data/lib/watobo/gui/workspace_dialog.rb +0 -9
- data/lib/watobo/gui/www_auth_dialog.rb +0 -9
- data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
- data/lib/watobo/http.rb +4 -13
- data/lib/watobo/http/cookies/cookies.rb +26 -35
- data/lib/watobo/http/data/data.rb +45 -54
- data/lib/watobo/http/data/json.rb +47 -55
- data/lib/watobo/http/url/url.rb +38 -47
- data/lib/watobo/http/xml/xml.rb +124 -130
- data/lib/watobo/interceptor.rb +3 -12
- data/lib/watobo/interceptor/proxy.rb +742 -739
- data/lib/watobo/interceptor/transparent.rb +22 -24
- data/lib/watobo/mixins.rb +10 -19
- data/lib/watobo/mixins/check_info.rb +27 -36
- data/lib/watobo/mixins/httpparser.rb +613 -637
- data/lib/watobo/mixins/request_parser.rb +88 -97
- data/lib/watobo/mixins/shapers.rb +515 -529
- data/lib/watobo/mixins/transcoders.rb +3 -11
- data/lib/watobo/parser.rb +1 -10
- data/lib/watobo/parser/html.rb +83 -92
- data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
- data/lib/watobo/sockets.rb +3 -12
- data/lib/watobo/sockets/agent.rb +828 -837
- data/lib/watobo/sockets/client_socket.rb +308 -312
- data/lib/watobo/sockets/connection.rb +401 -410
- data/lib/watobo/sockets/http_socket.rb +11 -13
- data/lib/watobo/sockets/ntlm_auth.rb +129 -138
- data/lib/watobo/utils.rb +10 -19
- data/lib/watobo/utils/check_regex.rb +0 -9
- data/lib/watobo/utils/copy_object.rb +0 -9
- data/lib/watobo/utils/crypto.rb +0 -9
- data/lib/watobo/utils/expand_range.rb +23 -32
- data/lib/watobo/utils/export_xml.rb +97 -106
- data/lib/watobo/utils/file_management.rb +9 -11
- data/lib/watobo/utils/hexprint.rb +9 -18
- data/lib/watobo/utils/load_chat.rb +0 -9
- data/lib/watobo/utils/load_icon.rb +0 -9
- data/lib/watobo/utils/ntlm.rb +866 -875
- data/lib/watobo/utils/print_debug.rb +12 -21
- data/lib/watobo/utils/response_builder.rb +90 -99
- data/lib/watobo/utils/response_hash.rb +0 -9
- data/lib/watobo/utils/secure_eval.rb +0 -9
- data/lib/watobo/utils/strings.rb +10 -19
- data/lib/watobo/utils/text2request.rb +0 -9
- data/lib/watobo/utils/url.rb +23 -32
- data/lib/watobo/utils/utf16.rb +11 -20
- data/modules/active/Apache/mod_status.rb +0 -9
- data/modules/active/Apache/multiview.rb +151 -160
- data/modules/active/Flash/crossdomain.rb +0 -9
- data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
- data/modules/active/cq5/cq5_default_selectors.rb +106 -115
- data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
- data/modules/active/directories/dirwalker.rb +0 -9
- data/modules/active/discovery/fileextensions.rb +0 -9
- data/modules/active/discovery/http_methods.rb +0 -9
- data/modules/active/discovery/jsmapfiles.rb +79 -0
- data/modules/active/domino/domino_db.rb +68 -76
- data/modules/active/dotNET/custom_errors.rb +102 -111
- data/modules/active/dotNET/dotnet_files.rb +90 -99
- data/modules/active/fileinclusion/lfi_simple.rb +0 -9
- data/modules/active/jboss/jboss_basic.rb +0 -9
- data/modules/active/sap/business_objects.rb +51 -60
- data/modules/active/sap/its_commands.rb +0 -9
- data/modules/active/sap/its_service_parameter.rb +0 -9
- data/modules/active/sap/its_services.rb +0 -9
- data/modules/active/sap/its_xss.rb +0 -9
- data/modules/active/shell_shock/shell_shock.rb +139 -148
- data/modules/active/siebel/siebel_apps.rb +160 -169
- data/modules/active/sqlinjection/sql_boolean.rb +0 -9
- data/modules/active/sqlinjection/sql_numerical.rb +198 -0
- data/modules/active/sqlinjection/sqli_error.rb +0 -9
- data/modules/active/sqlinjection/sqli_timing.rb +220 -229
- data/modules/active/struts2/default_handler_ognl.rb +106 -115
- data/modules/active/struts2/include_params_ognl.rb +105 -114
- data/modules/active/xml/xml_xxe.rb +112 -123
- data/modules/active/xss/xss_ng.rb +214 -223
- data/modules/active/xss/xss_simple.rb +0 -9
- data/modules/passive/ajax.rb +68 -77
- data/modules/passive/autocomplete.rb +56 -65
- data/modules/passive/cookie_options.rb +0 -9
- data/modules/passive/cookie_xss.rb +0 -9
- data/modules/passive/detect_code.rb +0 -9
- data/modules/passive/detect_fileupload.rb +0 -9
- data/modules/passive/detect_infrastructure.rb +0 -9
- data/modules/passive/detect_one_time_tokens.rb +0 -9
- data/modules/passive/dirindexing.rb +0 -9
- data/modules/passive/disclosure_domino.rb +55 -64
- data/modules/passive/disclosure_emails.rb +0 -9
- data/modules/passive/disclosure_ipaddr.rb +55 -53
- data/modules/passive/filename_as_parameter.rb +0 -9
- data/modules/passive/form_spotter.rb +0 -9
- data/modules/passive/hidden_fields.rb +50 -59
- data/modules/passive/hotspots.rb +0 -9
- data/modules/passive/in_script_parameter.rb +0 -9
- data/modules/passive/json_web_token.rb +93 -0
- data/modules/passive/multiple_server_headers.rb +0 -9
- data/modules/passive/possible_login.rb +0 -9
- data/modules/passive/redirect_url.rb +0 -9
- data/modules/passive/redirectionz.rb +0 -9
- data/modules/passive/sap-headers.rb +56 -65
- data/modules/passive/xss_dom.rb +0 -9
- data/plugins/aem/aem.rb +11 -20
- data/plugins/aem/gui/main.rb +118 -127
- data/plugins/aem/gui/tree_view.rb +171 -180
- data/plugins/aem/lib/agent.rb +130 -138
- data/plugins/aem/lib/dispatcher.rb +45 -51
- data/plugins/aem/lib/engine.rb +177 -186
- data/plugins/catalog/catalog.rb +345 -355
- data/plugins/crawler/crawler.rb +4 -13
- data/plugins/crawler/gui.rb +5 -14
- data/plugins/crawler/gui/auth_frame.rb +270 -279
- data/plugins/crawler/gui/crawler_gui.rb +271 -276
- data/plugins/crawler/gui/general_settings_frame.rb +96 -105
- data/plugins/crawler/gui/hooks_frame.rb +80 -89
- data/plugins/crawler/gui/scope_frame.rb +50 -59
- data/plugins/crawler/gui/settings_tabbook.rb +38 -47
- data/plugins/crawler/gui/status_frame.rb +59 -68
- data/plugins/crawler/lib/bags.rb +18 -27
- data/plugins/crawler/lib/constants.rb +11 -20
- data/plugins/crawler/lib/engine.rb +488 -497
- data/plugins/crawler/lib/grabber.rb +68 -77
- data/plugins/crawler/lib/status.rb +71 -80
- data/plugins/crawler/lib/uri_mp.rb +12 -21
- data/plugins/filefinder/filefinder.rb +326 -333
- data/plugins/sqlmap/bin/test.rb +78 -87
- data/plugins/sqlmap/gui.rb +4 -13
- data/plugins/sqlmap/gui/main.rb +218 -227
- data/plugins/sqlmap/gui/options_frame.rb +97 -106
- data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
- data/plugins/sqlmap/sqlmap.rb +2 -11
- data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
- data/plugins/sslchecker/gui/cipher_table.rb +246 -254
- data/plugins/sslchecker/gui/gui.rb +258 -264
- data/plugins/sslchecker/gui/sslchecker.rb +4 -13
- data/plugins/sslchecker/lib/check.rb +127 -133
- data/plugins/wshell/gui/main.rb +119 -117
- data/plugins/wshell/lib/core.rb +38 -88
- data/plugins/wshell/wshell.rb +11 -20
- metadata +170 -164
data/lib/watobo/core/response.rb
CHANGED
|
@@ -1,30 +1,21 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# response.rb
|
|
3
|
-
#.
|
|
4
|
-
# Copyright 2014 by siberas, http://www.siberas.de
|
|
5
|
-
# This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
|
|
6
|
-
# WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
|
|
7
|
-
# WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
# You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
9
|
-
|
|
10
1
|
# @private
|
|
11
|
-
module Watobo#:nodoc: all
|
|
12
|
-
class Response < Array
|
|
13
|
-
def self.is_html?
|
|
14
|
-
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def self.is_json?
|
|
18
|
-
|
|
2
|
+
module Watobo#:nodoc: all
|
|
3
|
+
class Response < Array
|
|
4
|
+
def self.is_html?
|
|
5
|
+
|
|
19
6
|
end
|
|
20
7
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
response.
|
|
8
|
+
def self.is_json?
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def self.create( response )
|
|
14
|
+
raise ArgumentError, "Array Expected." unless response.is_a? Array
|
|
15
|
+
response.extend Watobo::Mixin::Parser::Url
|
|
16
|
+
response.extend Watobo::Mixin::Parser::Web10
|
|
17
|
+
response.extend Watobo::Mixin::Shaper::Web10
|
|
18
|
+
response.extend Watobo::Mixin::Shaper::HttpResponse
|
|
28
19
|
end
|
|
29
20
|
|
|
30
21
|
def to_s
|
|
@@ -37,33 +28,33 @@ module Watobo#:nodoc: all
|
|
|
37
28
|
end
|
|
38
29
|
data
|
|
39
30
|
end
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def data
|
|
43
|
-
@data
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def copy
|
|
47
|
-
c = Watobo::Utils.copyObject self
|
|
48
|
-
Watobo::Request.new c
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def initialize(r)
|
|
52
|
-
if r.respond_to? :concat
|
|
53
|
-
#puts "Create REQUEST from ARRAY"
|
|
54
|
-
self.concat r
|
|
55
|
-
elsif r.is_a? String
|
|
56
|
-
raise ArgumentError, "Need Array"
|
|
57
|
-
end
|
|
58
|
-
self.extend Watobo::Mixin::Parser::Url
|
|
59
|
-
self.extend Watobo::Mixin::Parser::Web10
|
|
60
|
-
self.extend Watobo::Mixin::Shaper::Web10
|
|
61
|
-
self.extend Watobo::Mixin::Shaper::HttpResponse
|
|
62
|
-
|
|
63
|
-
if content_type =~ /(html|text)/
|
|
64
|
-
self.extend Watobo::Parser::HTML
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
end
|
|
68
|
-
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def data
|
|
34
|
+
@data
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def copy
|
|
38
|
+
c = Watobo::Utils.copyObject self
|
|
39
|
+
Watobo::Request.new c
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def initialize(r)
|
|
43
|
+
if r.respond_to? :concat
|
|
44
|
+
#puts "Create REQUEST from ARRAY"
|
|
45
|
+
self.concat r
|
|
46
|
+
elsif r.is_a? String
|
|
47
|
+
raise ArgumentError, "Need Array"
|
|
48
|
+
end
|
|
49
|
+
self.extend Watobo::Mixin::Parser::Url
|
|
50
|
+
self.extend Watobo::Mixin::Parser::Web10
|
|
51
|
+
self.extend Watobo::Mixin::Shaper::Web10
|
|
52
|
+
self.extend Watobo::Mixin::Shaper::HttpResponse
|
|
53
|
+
|
|
54
|
+
if content_type =~ /(html|text)/
|
|
55
|
+
self.extend Watobo::Parser::HTML
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
69
60
|
end
|
data/lib/watobo/core/scanner.rb
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# scanner.rb
|
|
3
|
-
#.
|
|
4
|
-
# Copyright 2014 by siberas, http://www.siberas.de
|
|
5
|
-
# This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
|
|
6
|
-
# WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
|
|
7
|
-
# WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
# You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
9
|
-
|
|
10
1
|
# @private
|
|
11
2
|
module Watobo#:nodoc: all
|
|
12
3
|
class Scanner2
|
data/lib/watobo/core/scanner3.rb
CHANGED
|
@@ -1,102 +1,93 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# scanner3.rb
|
|
3
|
-
#.
|
|
4
|
-
# Copyright 2014 by siberas, http://www.siberas.de
|
|
5
|
-
# This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
|
|
6
|
-
# WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
|
|
7
|
-
# WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
# You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
9
|
-
|
|
10
1
|
# @private
|
|
11
|
-
module Watobo#:nodoc: all
|
|
12
|
-
class Scanner3
|
|
13
|
-
|
|
14
|
-
include Watobo::Constants
|
|
15
|
-
include Watobo::Subscriber
|
|
16
|
-
|
|
17
|
-
SCANNER_READY = 0x0000
|
|
18
|
-
SCANNER_RUNNING = 0x0001
|
|
19
|
-
|
|
20
|
-
GENERATION_STARTED = 0x0100
|
|
21
|
-
GENERATION_FINISHED = 0x0200
|
|
22
|
-
class Worker
|
|
23
|
-
include Watobo::Constants
|
|
24
|
-
include Watobo::Subscriber
|
|
25
|
-
|
|
26
|
-
attr :engine
|
|
27
|
-
|
|
28
|
-
STATE_IDLE = 0x00
|
|
29
|
-
STATE_RUNNING = 0x01
|
|
2
|
+
module Watobo#:nodoc: all
|
|
3
|
+
class Scanner3
|
|
4
|
+
|
|
5
|
+
include Watobo::Constants
|
|
6
|
+
include Watobo::Subscriber
|
|
7
|
+
|
|
8
|
+
SCANNER_READY = 0x0000
|
|
9
|
+
SCANNER_RUNNING = 0x0001
|
|
10
|
+
|
|
11
|
+
GENERATION_STARTED = 0x0100
|
|
12
|
+
GENERATION_FINISHED = 0x0200
|
|
13
|
+
class Worker
|
|
14
|
+
include Watobo::Constants
|
|
15
|
+
include Watobo::Subscriber
|
|
16
|
+
|
|
17
|
+
attr :engine
|
|
18
|
+
|
|
19
|
+
STATE_IDLE = 0x00
|
|
20
|
+
STATE_RUNNING = 0x01
|
|
30
21
|
STATE_WAIT_FOR_LOGIN = 0x02
|
|
31
|
-
def state
|
|
32
|
-
state = nil
|
|
33
|
-
@state_mutex.synchronize do
|
|
34
|
-
state = @state
|
|
35
|
-
end
|
|
36
|
-
state
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def run
|
|
40
|
-
@state_mutex.synchronize do @state = STATE_RUNNING; end
|
|
41
|
-
Thread.new{ @engine.run }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def start
|
|
45
|
-
@engine = Thread.new(@prefs){ |prefs|
|
|
46
|
-
relogin_count = 0
|
|
22
|
+
def state
|
|
23
|
+
state = nil
|
|
24
|
+
@state_mutex.synchronize do
|
|
25
|
+
state = @state
|
|
26
|
+
end
|
|
27
|
+
state
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def run
|
|
31
|
+
@state_mutex.synchronize do @state = STATE_RUNNING; end
|
|
32
|
+
Thread.new{ @engine.run }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def start
|
|
36
|
+
@engine = Thread.new(@prefs){ |prefs|
|
|
37
|
+
relogin_count = 0
|
|
47
38
|
loop do
|
|
48
|
-
Thread.current[:pos] = "wait for task"
|
|
49
|
-
task = @tasks.deq
|
|
50
|
-
begin
|
|
51
|
-
#puts "RUNNING #{task[:module]}"
|
|
52
|
-
request, response = task[:check].call()
|
|
53
|
-
|
|
39
|
+
Thread.current[:pos] = "wait for task"
|
|
40
|
+
task = @tasks.deq
|
|
41
|
+
begin
|
|
42
|
+
#puts "RUNNING #{task[:module]}"
|
|
43
|
+
request, response = task[:check].call()
|
|
44
|
+
|
|
54
45
|
next if response.nil?
|
|
55
|
-
|
|
56
|
-
unless prefs[:logout_signatures].empty? or prefs[:auto_login] == false
|
|
57
|
-
logged_out = false
|
|
58
|
-
prefs[:logout_signatures].each do |sig|
|
|
59
|
-
logged_out = true if response.join =~ /#{sig}/
|
|
60
|
-
end
|
|
61
|
-
|
|
46
|
+
|
|
47
|
+
unless prefs[:logout_signatures].empty? or prefs[:auto_login] == false
|
|
48
|
+
logged_out = false
|
|
49
|
+
prefs[:logout_signatures].each do |sig|
|
|
50
|
+
logged_out = true if response.join =~ /#{sig}/
|
|
51
|
+
end
|
|
52
|
+
|
|
62
53
|
if logged_out
|
|
63
|
-
Thread.current[:pos] = "logged out"
|
|
64
|
-
@state_mutex.synchronize do @state = STATE_WAIT_FOR_LOGIN; end
|
|
65
|
-
@logged_out_queue.push self
|
|
66
|
-
# stop current thread, will be waked-up by scanner
|
|
67
|
-
Thread.stop
|
|
54
|
+
Thread.current[:pos] = "logged out"
|
|
55
|
+
@state_mutex.synchronize do @state = STATE_WAIT_FOR_LOGIN; end
|
|
56
|
+
@logged_out_queue.push self
|
|
57
|
+
# stop current thread, will be waked-up by scanner
|
|
58
|
+
Thread.stop
|
|
68
59
|
relogin_count += 1
|
|
69
|
-
Thread.current[:pos] = "set state"
|
|
70
|
-
@state_mutex.synchronize do @state = STATE_RUNNING; end
|
|
71
|
-
unless relogin_count > 5
|
|
72
|
-
request, response = task[:check].call()
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
unless prefs[:scanlog_name].nil? or prefs[:scanlog_name].empty?
|
|
78
|
-
chat = Chat.new(request, response, :id => 0, :chat_source => prefs[:chat_source])
|
|
79
|
-
Watobo::DataStore.add_scan_log(chat, prefs[:scanlog_name])
|
|
80
|
-
end
|
|
81
|
-
rescue => bang
|
|
82
|
-
puts "!!! #{task[:module]} !!!"
|
|
83
|
-
puts bang
|
|
84
|
-
puts bang.backtrace if $DEBUG
|
|
85
|
-
ensure
|
|
60
|
+
Thread.current[:pos] = "set state"
|
|
61
|
+
@state_mutex.synchronize do @state = STATE_RUNNING; end
|
|
62
|
+
unless relogin_count > 5
|
|
63
|
+
request, response = task[:check].call()
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
unless prefs[:scanlog_name].nil? or prefs[:scanlog_name].empty?
|
|
69
|
+
chat = Chat.new(request, response, :id => 0, :chat_source => prefs[:chat_source])
|
|
70
|
+
Watobo::DataStore.add_scan_log(chat, prefs[:scanlog_name])
|
|
71
|
+
end
|
|
72
|
+
rescue => bang
|
|
73
|
+
puts "!!! #{task[:module]} !!!"
|
|
74
|
+
puts bang
|
|
75
|
+
puts bang.backtrace if $DEBUG
|
|
76
|
+
ensure
|
|
86
77
|
#puts "FINISHED #{task[:module]}"
|
|
87
|
-
Thread.current[:pos] = "scan_finished"
|
|
88
|
-
notify(:task_finished, task[:module])
|
|
89
|
-
end
|
|
90
|
-
Thread.exit if relogin_count > 5
|
|
91
|
-
relogin_count = 0
|
|
92
|
-
end
|
|
93
|
-
}
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def stop
|
|
78
|
+
Thread.current[:pos] = "scan_finished"
|
|
79
|
+
notify(:task_finished, task[:module])
|
|
80
|
+
end
|
|
81
|
+
Thread.exit if relogin_count > 5
|
|
82
|
+
relogin_count = 0
|
|
83
|
+
end
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def stop
|
|
97
88
|
@state_mutex.synchronize{ @state = STATE_IDLE }
|
|
98
89
|
begin
|
|
99
|
-
return false if @engine.nil?
|
|
90
|
+
return false if @engine.nil?
|
|
100
91
|
if @engine.alive?
|
|
101
92
|
puts "[#{self}] got stopped"
|
|
102
93
|
Thread.kill @engine
|
|
@@ -106,83 +97,83 @@ module Watobo#:nodoc: all
|
|
|
106
97
|
puts "!!! could not stop worker !!!"
|
|
107
98
|
puts bang
|
|
108
99
|
puts bang.backtrace
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def wait_for_login?
|
|
113
|
-
state = false
|
|
114
|
-
@state_mutex.synchronize do
|
|
115
|
-
state = ( @state == STATE_WAIT_FOR_LOGIN )
|
|
116
|
-
end
|
|
117
|
-
state
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def running?
|
|
121
|
-
@state_mutex.synchronize do
|
|
122
|
-
running = ( @state == STATE_RUNNING )
|
|
123
|
-
end
|
|
124
|
-
running
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def initialize(task_queue, logged_out_queue, prefs)
|
|
128
|
-
@engine = nil
|
|
129
|
-
@tasks = task_queue
|
|
130
|
-
@logged_out_queue = logged_out_queue
|
|
131
|
-
@prefs = prefs
|
|
132
|
-
@relogin_count = 0
|
|
133
|
-
@state_mutex = Mutex.new
|
|
134
|
-
@state = STATE_IDLE
|
|
135
|
-
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
end
|
|
139
|
-
#
|
|
140
|
-
# E N D O F W O R K E R
|
|
141
|
-
|
|
142
|
-
def tasks
|
|
143
|
-
@tasks
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def status_running?
|
|
147
|
-
( status & SCANNER_RUNNING ) > 0
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def generation_finished?
|
|
151
|
-
( status & GENERATION_FINISHED ) > 0
|
|
152
|
-
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def wait_for_login?
|
|
104
|
+
state = false
|
|
105
|
+
@state_mutex.synchronize do
|
|
106
|
+
state = ( @state == STATE_WAIT_FOR_LOGIN )
|
|
107
|
+
end
|
|
108
|
+
state
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def running?
|
|
112
|
+
@state_mutex.synchronize do
|
|
113
|
+
running = ( @state == STATE_RUNNING )
|
|
114
|
+
end
|
|
115
|
+
running
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def initialize(task_queue, logged_out_queue, prefs)
|
|
119
|
+
@engine = nil
|
|
120
|
+
@tasks = task_queue
|
|
121
|
+
@logged_out_queue = logged_out_queue
|
|
122
|
+
@prefs = prefs
|
|
123
|
+
@relogin_count = 0
|
|
124
|
+
@state_mutex = Mutex.new
|
|
125
|
+
@state = STATE_IDLE
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
#
|
|
131
|
+
# E N D O F W O R K E R
|
|
132
|
+
|
|
133
|
+
def tasks
|
|
134
|
+
@tasks
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def status_running?
|
|
138
|
+
( status & SCANNER_RUNNING ) > 0
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def generation_finished?
|
|
142
|
+
( status & GENERATION_FINISHED ) > 0
|
|
143
|
+
end
|
|
153
144
|
|
|
154
145
|
def finished?
|
|
155
146
|
# puts "num_waiting: #{@tasks.num_waiting}"
|
|
156
147
|
# puts "workers: #{@workers.length}"
|
|
157
148
|
# puts "generation finished? #{generation_finished?.class}"
|
|
158
149
|
# puts "num tasks: #{@tasks.size}"
|
|
159
|
-
# puts "running workers: #{running_workers}"
|
|
160
|
-
return true if (
|
|
161
|
-
status_running? &&
|
|
162
|
-
( @tasks.num_waiting == @workers.length ) &&
|
|
163
|
-
( @tasks.size == 0 ) &&
|
|
164
|
-
generation_finished?
|
|
165
|
-
)
|
|
166
|
-
false
|
|
167
|
-
end
|
|
150
|
+
# puts "running workers: #{running_workers}"
|
|
151
|
+
return true if (
|
|
152
|
+
status_running? &&
|
|
153
|
+
( @tasks.num_waiting == @workers.length ) &&
|
|
154
|
+
( @tasks.size == 0 ) &&
|
|
155
|
+
generation_finished?
|
|
156
|
+
)
|
|
157
|
+
false
|
|
158
|
+
end
|
|
168
159
|
|
|
169
160
|
def running?()
|
|
170
|
-
|
|
171
|
-
return false if (
|
|
172
|
-
status_running? &&
|
|
173
|
-
( @tasks.num_waiting == @workers.length ) &&
|
|
174
|
-
( @tasks.size == 0 ) &&
|
|
175
|
-
generation_finished?
|
|
176
|
-
)
|
|
177
|
-
return true if status_running?
|
|
178
|
-
return false
|
|
179
|
-
end
|
|
161
|
+
|
|
162
|
+
return false if (
|
|
163
|
+
status_running? &&
|
|
164
|
+
( @tasks.num_waiting == @workers.length ) &&
|
|
165
|
+
( @tasks.size == 0 ) &&
|
|
166
|
+
generation_finished?
|
|
167
|
+
)
|
|
168
|
+
return true if status_running?
|
|
169
|
+
return false
|
|
170
|
+
end
|
|
180
171
|
|
|
181
172
|
def stop()
|
|
182
|
-
print "\n[#{self}] stopping ... "
|
|
183
|
-
begin
|
|
184
|
-
@workers.each do |w|
|
|
185
|
-
w.stop
|
|
173
|
+
print "\n[#{self}] stopping ... "
|
|
174
|
+
begin
|
|
175
|
+
@workers.each do |w|
|
|
176
|
+
w.stop
|
|
186
177
|
end
|
|
187
178
|
unless @ctrl_thread.nil?
|
|
188
179
|
if @ctrl_thread.alive?
|
|
@@ -190,274 +181,274 @@ module Watobo#:nodoc: all
|
|
|
190
181
|
Thread.kill @ctrl_thread
|
|
191
182
|
end
|
|
192
183
|
end
|
|
193
|
-
print "[OK]\n"
|
|
184
|
+
print "[OK]\n"
|
|
194
185
|
rescue => bang
|
|
195
|
-
print "[OUTCH]\n"
|
|
196
|
-
puts bang
|
|
197
|
-
puts bang.backtrace if $DEBUG
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def cancel()
|
|
202
|
-
begin
|
|
203
|
-
@workers.each do |w|
|
|
204
|
-
w.stop
|
|
205
|
-
end
|
|
206
|
-
rescue => bang
|
|
207
|
-
puts bang
|
|
208
|
-
puts bang.backtrace if $DEBUG
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def continue()
|
|
213
|
-
# TODO
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def progress
|
|
217
|
-
@task_count_lock.synchronize do
|
|
218
|
-
YAML.load(YAML.dump(@task_counter))
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
def sum_total
|
|
223
|
-
sum = 0
|
|
224
|
-
@task_count_lock.synchronize do
|
|
225
|
-
sum = @task_counter.values.inject(0){|i,v| i + v[:total] }
|
|
226
|
-
end
|
|
227
|
-
sum
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
def sum_progress
|
|
231
|
-
sum = 0
|
|
232
|
-
@task_count_lock.synchronize do
|
|
233
|
-
sum = @task_counter.values.inject(0){|i,v| i + v[:progress] }
|
|
234
|
-
end
|
|
235
|
-
sum
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
def run( check_prefs={} )
|
|
239
|
-
# @sites_online.clear
|
|
240
|
-
@uniqueRequests = Hash.new
|
|
241
|
-
set_status_running
|
|
242
|
-
|
|
243
|
-
@login_count = 0
|
|
244
|
-
@max_login_count = 20
|
|
245
|
-
|
|
246
|
-
@ctrl_thread = Thread.new{
|
|
247
|
-
size = -1
|
|
248
|
-
loop do
|
|
186
|
+
print "[OUTCH]\n"
|
|
187
|
+
puts bang
|
|
188
|
+
puts bang.backtrace if $DEBUG
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def cancel()
|
|
193
|
+
begin
|
|
194
|
+
@workers.each do |w|
|
|
195
|
+
w.stop
|
|
196
|
+
end
|
|
197
|
+
rescue => bang
|
|
198
|
+
puts bang
|
|
199
|
+
puts bang.backtrace if $DEBUG
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def continue()
|
|
204
|
+
# TODO
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def progress
|
|
208
|
+
@task_count_lock.synchronize do
|
|
209
|
+
YAML.load(YAML.dump(@task_counter))
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def sum_total
|
|
214
|
+
sum = 0
|
|
215
|
+
@task_count_lock.synchronize do
|
|
216
|
+
sum = @task_counter.values.inject(0){|i,v| i + v[:total] }
|
|
217
|
+
end
|
|
218
|
+
sum
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def sum_progress
|
|
222
|
+
sum = 0
|
|
223
|
+
@task_count_lock.synchronize do
|
|
224
|
+
sum = @task_counter.values.inject(0){|i,v| i + v[:progress] }
|
|
225
|
+
end
|
|
226
|
+
sum
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def run( check_prefs={} )
|
|
230
|
+
# @sites_online.clear
|
|
231
|
+
@uniqueRequests = Hash.new
|
|
232
|
+
set_status_running
|
|
233
|
+
|
|
234
|
+
@login_count = 0
|
|
235
|
+
@max_login_count = 20
|
|
236
|
+
|
|
237
|
+
@ctrl_thread = Thread.new{
|
|
238
|
+
size = -1
|
|
239
|
+
loop do
|
|
249
240
|
if @tasks.num_waiting == @workers.length and @tasks.size == 0 and generation_finished?
|
|
250
241
|
begin
|
|
251
|
-
puts "[#{self}] seems scan is finished. stopping workers now ..."
|
|
242
|
+
puts "[#{self}] seems scan is finished. stopping workers now ..."
|
|
252
243
|
@workers.map{|w|
|
|
253
244
|
#puts "[]#{self}] stopping worker #{w}"
|
|
254
245
|
w.stop
|
|
255
|
-
}
|
|
256
|
-
# suizide!
|
|
246
|
+
}
|
|
247
|
+
# suizide!
|
|
257
248
|
Thread.exit
|
|
258
249
|
rescue => bang
|
|
259
250
|
puts bang
|
|
260
251
|
puts bang.backtrace
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
if @logged_out.size == ( @workers.length - @tasks.num_waiting) or @tasks.num_waiting == @workers.size
|
|
265
|
-
@logged_out.clear
|
|
266
|
-
#puts "!LOGOUT DETECTED!\n#{@logged_out.size} - #{@workers.length} - #{@tasks.num_waiting}\n\n"
|
|
267
|
-
begin
|
|
268
|
-
puts "Run login ..."
|
|
269
|
-
login
|
|
270
|
-
@workers.each do |wrkr|
|
|
271
|
-
# puts "State: #{wrkr.state}"
|
|
272
|
-
if wrkr.wait_for_login?
|
|
273
|
-
wrkr.engine.run
|
|
274
|
-
end
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
rescue => bang
|
|
278
|
-
puts bang
|
|
279
|
-
puts bang.backtrace
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
sleep 1
|
|
285
|
-
end
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
@prefs.update check_prefs
|
|
289
|
-
msg = "\n[Scanner] Starting Scan ..."
|
|
290
|
-
notify(:logger, LOG_INFO, msg )
|
|
291
|
-
puts msg
|
|
292
|
-
|
|
293
|
-
# starting workers before check generation
|
|
294
|
-
start_workers( @prefs)
|
|
295
|
-
@max_tasks = 1000
|
|
296
|
-
|
|
297
|
-
# start check generation in seperate thread
|
|
298
|
-
Thread.new{
|
|
299
|
-
begin
|
|
300
|
-
set_status GENERATION_STARTED
|
|
301
|
-
@chat_list.uniq.each do |chat|
|
|
302
|
-
# puts chat.request.url.to_s
|
|
303
|
-
@active_checks.uniq.each do |ac|
|
|
304
|
-
ac.reset()
|
|
305
|
-
if site_alive?(chat) then
|
|
306
|
-
ac.generateChecks(chat){ |check|
|
|
307
|
-
while @tasks.size > @max_tasks
|
|
308
|
-
sleep 1
|
|
309
|
-
end
|
|
310
|
-
task = { :module => ac,
|
|
311
|
-
:check => check
|
|
312
|
-
}
|
|
313
|
-
@tasks.push task
|
|
314
|
-
}
|
|
315
|
-
end
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
rescue => bang
|
|
319
|
-
puts bang
|
|
320
|
-
puts bang.backtrace if $DEBUG
|
|
321
|
-
ensure
|
|
322
|
-
set_status GENERATION_FINISHED
|
|
323
|
-
end
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
def initialize(chat_list=[], active_checks=[], passive_checks=[], prefs={})
|
|
329
|
-
@chat_list = chat_list
|
|
330
|
-
@active_checks = []
|
|
331
|
-
@passive_checks = passive_checks
|
|
332
|
-
|
|
333
|
-
@tasks = Queue.new
|
|
334
|
-
@logged_out = Queue.new
|
|
335
|
-
|
|
336
|
-
@workers = []
|
|
337
|
-
|
|
338
|
-
@status_lock = Mutex.new
|
|
339
|
-
|
|
340
|
-
@task_count_lock = Mutex.new
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
if @logged_out.size == ( @workers.length - @tasks.num_waiting) or @tasks.num_waiting == @workers.size
|
|
256
|
+
@logged_out.clear
|
|
257
|
+
#puts "!LOGOUT DETECTED!\n#{@logged_out.size} - #{@workers.length} - #{@tasks.num_waiting}\n\n"
|
|
258
|
+
begin
|
|
259
|
+
puts "Run login ..."
|
|
260
|
+
login
|
|
261
|
+
@workers.each do |wrkr|
|
|
262
|
+
# puts "State: #{wrkr.state}"
|
|
263
|
+
if wrkr.wait_for_login?
|
|
264
|
+
wrkr.engine.run
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
rescue => bang
|
|
269
|
+
puts bang
|
|
270
|
+
puts bang.backtrace
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
sleep 1
|
|
276
|
+
end
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@prefs.update check_prefs
|
|
280
|
+
msg = "\n[Scanner] Starting Scan ..."
|
|
281
|
+
notify(:logger, LOG_INFO, msg )
|
|
282
|
+
puts msg
|
|
283
|
+
|
|
284
|
+
# starting workers before check generation
|
|
285
|
+
start_workers( @prefs)
|
|
286
|
+
@max_tasks = 1000
|
|
287
|
+
|
|
288
|
+
# start check generation in seperate thread
|
|
289
|
+
Thread.new{
|
|
290
|
+
begin
|
|
291
|
+
set_status GENERATION_STARTED
|
|
292
|
+
@chat_list.uniq.each do |chat|
|
|
293
|
+
# puts chat.request.url.to_s
|
|
294
|
+
@active_checks.uniq.each do |ac|
|
|
295
|
+
ac.reset()
|
|
296
|
+
if site_alive?(chat) then
|
|
297
|
+
ac.generateChecks(chat){ |check|
|
|
298
|
+
while @tasks.size > @max_tasks
|
|
299
|
+
sleep 1
|
|
300
|
+
end
|
|
301
|
+
task = { :module => ac,
|
|
302
|
+
:check => check
|
|
303
|
+
}
|
|
304
|
+
@tasks.push task
|
|
305
|
+
}
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
rescue => bang
|
|
310
|
+
puts bang
|
|
311
|
+
puts bang.backtrace if $DEBUG
|
|
312
|
+
ensure
|
|
313
|
+
set_status GENERATION_FINISHED
|
|
314
|
+
end
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def initialize(chat_list=[], active_checks=[], passive_checks=[], prefs={})
|
|
320
|
+
@chat_list = chat_list
|
|
321
|
+
@active_checks = []
|
|
322
|
+
@passive_checks = passive_checks
|
|
323
|
+
|
|
324
|
+
@tasks = Queue.new
|
|
325
|
+
@logged_out = Queue.new
|
|
326
|
+
|
|
327
|
+
@workers = []
|
|
328
|
+
|
|
329
|
+
@status_lock = Mutex.new
|
|
330
|
+
|
|
331
|
+
@task_count_lock = Mutex.new
|
|
341
332
|
@task_counter = {}
|
|
342
333
|
|
|
343
|
-
@ctrl_thread = nil
|
|
344
|
-
|
|
345
|
-
# @onlineCheck = OnlineCheck.new(@project)
|
|
346
|
-
msg = "Initializing Scanner ..."
|
|
347
|
-
notify(:logger, LOG_INFO, msg)
|
|
348
|
-
puts msg
|
|
349
|
-
|
|
350
|
-
@prefs = Watobo::Conf::Scanner.to_h
|
|
351
|
-
|
|
352
|
-
@prefs.update prefs
|
|
353
|
-
|
|
354
|
-
puts @prefs.to_yaml
|
|
355
|
-
|
|
356
|
-
unique_checks = {}
|
|
357
|
-
active_checks.each do |x|
|
|
358
|
-
if x.respond_to? :new
|
|
359
|
-
ac = x.new(self.object_id, @prefs)
|
|
360
|
-
else
|
|
361
|
-
ac = x
|
|
362
|
-
end
|
|
363
|
-
unique_checks[ac.class.to_s] = ac unless unique_checks.has_key?(ac.class.to_s)
|
|
364
|
-
end
|
|
365
|
-
unique_checks.each_value do |check|
|
|
366
|
-
@active_checks << check
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
puts "#ActiveModules: #{@active_checks.length}"
|
|
370
|
-
|
|
371
|
-
@active_checks.uniq.each do |check|
|
|
372
|
-
|
|
373
|
-
check.resetCounters()
|
|
374
|
-
@chat_list.each_with_index do |chat, index|
|
|
375
|
-
#print "."
|
|
376
|
-
check.updateCounters(chat, @prefs)
|
|
377
|
-
puts "* [#{index}] CheckCounter #{chat.id}: #{check.check_name} - #{check.numChecks}"
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
# @numTotalChecks += check.numChecks
|
|
381
|
-
# cn = check.info[:check_name]
|
|
382
|
-
# puts "+ add check: #{cn}"
|
|
383
|
-
# notify(:logger, LOG_INFO, "add check #{cn}")
|
|
384
|
-
@task_counter[check.check_name] = { :total => check.numChecks,
|
|
385
|
-
:progress => 0
|
|
386
|
-
}
|
|
387
|
-
end
|
|
388
|
-
@status = SCANNER_READY
|
|
389
|
-
msg = "Scanner Ready!"
|
|
390
|
-
notify(:logger, LOG_INFO, msg)
|
|
391
|
-
puts msg
|
|
392
|
-
end
|
|
393
|
-
|
|
394
|
-
private
|
|
395
|
-
|
|
396
|
-
def set_status_running
|
|
397
|
-
s = ( status | SCANNER_RUNNING )
|
|
398
|
-
set_status( s )
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
def set_status(s)
|
|
402
|
-
@status_lock.synchronize {
|
|
403
|
-
@status |= s
|
|
404
|
-
}
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
def status
|
|
408
|
-
@status_lock.synchronize {
|
|
409
|
-
return @status
|
|
410
|
-
}
|
|
334
|
+
@ctrl_thread = nil
|
|
335
|
+
|
|
336
|
+
# @onlineCheck = OnlineCheck.new(@project)
|
|
337
|
+
msg = "Initializing Scanner ..."
|
|
338
|
+
notify(:logger, LOG_INFO, msg)
|
|
339
|
+
puts msg
|
|
340
|
+
|
|
341
|
+
@prefs = Watobo::Conf::Scanner.to_h
|
|
342
|
+
|
|
343
|
+
@prefs.update prefs
|
|
344
|
+
|
|
345
|
+
puts @prefs.to_yaml
|
|
346
|
+
|
|
347
|
+
unique_checks = {}
|
|
348
|
+
active_checks.each do |x|
|
|
349
|
+
if x.respond_to? :new
|
|
350
|
+
ac = x.new(self.object_id, @prefs)
|
|
351
|
+
else
|
|
352
|
+
ac = x
|
|
353
|
+
end
|
|
354
|
+
unique_checks[ac.class.to_s] = ac unless unique_checks.has_key?(ac.class.to_s)
|
|
355
|
+
end
|
|
356
|
+
unique_checks.each_value do |check|
|
|
357
|
+
@active_checks << check
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
puts "#ActiveModules: #{@active_checks.length}"
|
|
361
|
+
|
|
362
|
+
@active_checks.uniq.each do |check|
|
|
363
|
+
|
|
364
|
+
check.resetCounters()
|
|
365
|
+
@chat_list.each_with_index do |chat, index|
|
|
366
|
+
#print "."
|
|
367
|
+
check.updateCounters(chat, @prefs)
|
|
368
|
+
puts "* [#{index}] CheckCounter #{chat.id}: #{check.check_name} - #{check.numChecks}"
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
# @numTotalChecks += check.numChecks
|
|
372
|
+
# cn = check.info[:check_name]
|
|
373
|
+
# puts "+ add check: #{cn}"
|
|
374
|
+
# notify(:logger, LOG_INFO, "add check #{cn}")
|
|
375
|
+
@task_counter[check.check_name] = { :total => check.numChecks,
|
|
376
|
+
:progress => 0
|
|
377
|
+
}
|
|
378
|
+
end
|
|
379
|
+
@status = SCANNER_READY
|
|
380
|
+
msg = "Scanner Ready!"
|
|
381
|
+
notify(:logger, LOG_INFO, msg)
|
|
382
|
+
puts msg
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
private
|
|
386
|
+
|
|
387
|
+
def set_status_running
|
|
388
|
+
s = ( status | SCANNER_RUNNING )
|
|
389
|
+
set_status( s )
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def set_status(s)
|
|
393
|
+
@status_lock.synchronize {
|
|
394
|
+
@status |= s
|
|
395
|
+
}
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def status
|
|
399
|
+
@status_lock.synchronize {
|
|
400
|
+
return @status
|
|
401
|
+
}
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def start_workers(check_prefs)
|
|
405
|
+
num_workers = @prefs.has_key?(:max_parallel_checks) ? @prefs[:max_parallel_checks] : Watobo::Conf::Scanner.max_parallel_checks
|
|
406
|
+
|
|
407
|
+
puts "Starting #{num_workers} Workers ..."
|
|
408
|
+
|
|
409
|
+
num_workers.times do |i|
|
|
410
|
+
print "... #{i + 1}"
|
|
411
|
+
w = Scanner3::Worker.new(@tasks, @logged_out, check_prefs)
|
|
412
|
+
|
|
413
|
+
w.subscribe(:task_finished){ |m|
|
|
414
|
+
@task_count_lock.synchronize do
|
|
415
|
+
cn = m.check_name
|
|
416
|
+
@task_counter[cn][:progress] += 1
|
|
417
|
+
end
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
@logout_count ||= 0
|
|
421
|
+
@logout_count_lock ||= Mutex.new
|
|
422
|
+
@num_waiting = 0
|
|
423
|
+
|
|
424
|
+
w.start
|
|
425
|
+
@workers << w
|
|
426
|
+
end
|
|
427
|
+
print "\n"
|
|
428
|
+
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
def login
|
|
432
|
+
puts "do relogin"
|
|
433
|
+
login_chats = Watobo::Conf::Scanner.login_chat_ids.uniq.map{|id| Watobo::Chats.get_by_id(id) }
|
|
434
|
+
# puts "running #{login_chats.length} login requests"
|
|
435
|
+
# puts login_chats.first.class
|
|
436
|
+
|
|
437
|
+
@active_checks.first.runLogin(login_chats, @prefs)
|
|
438
|
+
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
def site_alive?(chat)
|
|
442
|
+
@sites_alive ||= Hash.new
|
|
443
|
+
site = chat.request.site
|
|
444
|
+
return true if @sites_alive.has_key? site
|
|
445
|
+
|
|
446
|
+
if Watobo::HTTPSocket.siteAlive?(chat)
|
|
447
|
+
@sites_alive[site] = true
|
|
448
|
+
return true
|
|
449
|
+
end
|
|
450
|
+
return false
|
|
411
451
|
end
|
|
412
452
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
puts "Starting #{num_workers} Workers ..."
|
|
417
|
-
|
|
418
|
-
num_workers.times do |i|
|
|
419
|
-
print "... #{i + 1}"
|
|
420
|
-
w = Scanner3::Worker.new(@tasks, @logged_out, check_prefs)
|
|
421
|
-
|
|
422
|
-
w.subscribe(:task_finished){ |m|
|
|
423
|
-
@task_count_lock.synchronize do
|
|
424
|
-
cn = m.check_name
|
|
425
|
-
@task_counter[cn][:progress] += 1
|
|
426
|
-
end
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
@logout_count ||= 0
|
|
430
|
-
@logout_count_lock ||= Mutex.new
|
|
431
|
-
@num_waiting = 0
|
|
432
|
-
|
|
433
|
-
w.start
|
|
434
|
-
@workers << w
|
|
435
|
-
end
|
|
436
|
-
print "\n"
|
|
437
|
-
|
|
438
|
-
end
|
|
439
|
-
|
|
440
|
-
def login
|
|
441
|
-
puts "do relogin"
|
|
442
|
-
login_chats = Watobo::Conf::Scanner.login_chat_ids.uniq.map{|id| Watobo::Chats.get_by_id(id) }
|
|
443
|
-
# puts "running #{login_chats.length} login requests"
|
|
444
|
-
# puts login_chats.first.class
|
|
445
|
-
|
|
446
|
-
@active_checks.first.runLogin(login_chats, @prefs)
|
|
447
|
-
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
def site_alive?(chat)
|
|
451
|
-
@sites_alive ||= Hash.new
|
|
452
|
-
site = chat.request.site
|
|
453
|
-
return true if @sites_alive.has_key? site
|
|
454
|
-
|
|
455
|
-
if Watobo::HTTPSocket.siteAlive?(chat)
|
|
456
|
-
@sites_alive[site] = true
|
|
457
|
-
return true
|
|
458
|
-
end
|
|
459
|
-
return false
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
end
|
|
463
|
-
end
|
|
453
|
+
end
|
|
454
|
+
end
|