ruby_clamdscan 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 761b30b0097a5134e14f00417a2c2684762dd45caaaab0308a84e35002125647
4
- data.tar.gz: 06435db3a0774fbd6810a80f28f39624ee2f592407e91fd3a57723292314dd87
3
+ metadata.gz: df6892cd797e6ec9172e3737d789ed283034b95e86ed65f5fb08651ae05c055b
4
+ data.tar.gz: 425ca033634e107fec64f0441d54c36fbbcefa56e339e698980ecff87ecbedfe
5
5
  SHA512:
6
- metadata.gz: 7854440fdeea3c7b9a979141a0fad877480d38daa6a720b282ee67e80d8437b7df4155a908e72b6492d3525dfe84262ed426a446d886b6e171af34a07a274ac3
7
- data.tar.gz: 79d47810175c6642a12a9af984bec3a7d67573bfdcf6bbacde02ffe62805ae98e4fec952207cefc4c4e872081e4c502b9b1b3ea9dd09724f5f6e7b44552385d9
6
+ metadata.gz: a20206c40cb86ceb2fbedddd57f6f5a1f4d1b434b1f455d47c8691e1805e2c7231c0e02d7b365110c8bdc369ae84794a86d84cd700af09800bca7765efb5aa87
7
+ data.tar.gz: ae755aa70063996f21e28e19bc55fdc9d741a497069712610eb265e0a7c269052cef4f05a2e8043f4b44365bd38e84b41a0dc1f76c97a571968c35006b9fb33b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Released]
2
2
 
3
+ ## [0.1.3] - 2023-03-08
4
+
5
+ - More doc fixes, also fix configuration defaulting
6
+
3
7
  ## [0.1.2] - 2023-03-08
4
8
 
5
9
  - Fix docs a bit, increase version
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby_clamdscan (0.1.2)
4
+ ruby_clamdscan (0.1.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # RubyClamdscan
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ruby_clamdscan`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Implementing most `clamdscan` commands as a Ruby Gem using socket communication.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ This is a personal project to learn more about how Ruby gem development works and may not be actively developed.
6
6
 
7
7
  ## Installation
8
8
 
@@ -16,7 +16,46 @@ If bundler is not being used to manage dependencies, install the gem by executin
16
16
 
17
17
  ## Usage
18
18
 
19
- TODO: Write usage instructions here
19
+ Set the configuration for this gem by using:
20
+
21
+ ```ruby
22
+ RubyClamdscan.configure do |conf|
23
+ conf.use_tcp_socket = true
24
+ end
25
+ ```
26
+
27
+ Scan files by using:
28
+ ```ruby
29
+ RubyClamdscan.scan_file_from_path("/path/to/local/file")
30
+ ```
31
+
32
+ or
33
+
34
+ ```ruby
35
+ RubyClamdscan.scan_contents(IO)
36
+ ```
37
+
38
+ Both return instances of `RubyClamdscan::Models::ScanResults` with information about the scan
39
+
40
+ ### Configuration options
41
+ ```ruby
42
+ RubyClamdscan.configure do |conf|
43
+ conf.use_tcp_socket = true # If using TCP socket, defaults to false to use local unix socket
44
+ conf.tcp_port = 3310 # TCP Port where ClamAV is listening
45
+ conf.tcp_host = "localhost" # Host where ClamAV is listening
46
+ conf.unix_socket = "/tmp/clamd.socket" # If using UNIX socket, what file represents the socket
47
+ conf.chunk_size = 1024 # Size of chunk in bytes to send to ClamAV for scanning
48
+ conf.raise_error_on_empty_response = true # If the socket responds empty, raise `RubyClamdscan::Errors::EmptyResponseError` instead of returning an empty string
49
+ conf.raise_error_on_virus_detected = true # If a virus is detected, raise `RubyClamdscan::Errors::VirusDetectedError` instead of just returning the result
50
+ end
51
+ ```
52
+
53
+ ### Commands
54
+ * `RubyClamdscan.ping_server` - Ping server, should respond with "PONG"
55
+ * `RubyClamdscan.server_version` - Query ClamAV for server version info - response format may change
56
+ * `RubyClamdscan.server_stats` - Query ClamAV for server stats, resources, etc - response format may change
57
+ * `RubyClamdscan.reload_server_database` - Tell ClamAV server to reload virus db
58
+ * `RubyClamdscan.shutdown_server` - Tell ClamAV server shutdown and stop listening to requests
20
59
 
21
60
  ## Development
22
61
 
@@ -26,8 +65,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
26
65
 
27
66
  ## Contributing
28
67
 
29
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ruby_clamdscan. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/ruby_clamdscan/blob/main/CODE_OF_CONDUCT.md).
68
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jacobrayschwartz/ruby_clamdscan. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/jacobrayschwartz/ruby_clamdscan/blob/main/CODE_OF_CONDUCT.md).
30
69
 
31
70
  ## Code of Conduct
32
71
 
33
- Everyone interacting in the RubyClamdscan project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/ruby_clamdscan/blob/main/CODE_OF_CONDUCT.md).
72
+ Everyone interacting in the RubyClamdscan project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/jacobrayschwartz/ruby_clamdscan/blob/main/CODE_OF_CONDUCT.md).
@@ -4,10 +4,13 @@ require "ruby_clamdscan/commands/utils"
4
4
 
5
5
  module RubyClamdscan
6
6
  module Commands
7
- # Management commands for
7
+ # Management commands for ClamAV server
8
8
  module Manage
9
9
  # Force ClamAV to reload the virus databases
10
10
  # @param configuration [RubyClamdscan::Configuration] configuration for building the ClamAV connection
11
+ # @return [String] "RELOADING"
12
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
13
+ # @raise [RubyClamdscan::Errors::EmptyResponseError] If server response is empty
11
14
  def self.reload_server_database(configuration)
12
15
  RubyClamdscan::Commands::Utils.send_single_command("RELOAD", configuration)
13
16
  end
@@ -15,8 +18,11 @@ module RubyClamdscan
15
18
  # Shutdown ClamAV server
16
19
  # Note: this will completely close socket communication. Server cannot be restarted through this library
17
20
  # @param configuration [RubyClamdscan::Configuration] configuration for building the ClamAV connection
21
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
22
+ # @return [Boolean] true if shutdown command was sent
18
23
  def self.shutdown_server(configuration)
19
- RubyClamdscan::Commands::Utils.send_single_command("SHUTDOWN", configuration)
24
+ true if RubyClamdscan::Commands::Utils.send_single_command("SHUTDOWN", configuration, ignore_empty_response: true)
25
+ false
20
26
  end
21
27
  end
22
28
  end
@@ -8,6 +8,8 @@ module RubyClamdscan
8
8
  module Status
9
9
  # Attempts to ping the ClamAV server
10
10
  # @param configuration [RubyClamdscan::Configuration] configuration for building the ClamAV connection
11
+ # @return [String] "PONG"
12
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
11
13
  # @raise [RubyClamdscan::Exceptions::EmptyResponseError] If server response is empty
12
14
  def self.ping_server(configuration)
13
15
  RubyClamdscan::Commands::Utils.send_single_command("PING", configuration)
@@ -15,6 +17,8 @@ module RubyClamdscan
15
17
 
16
18
  # Attempts to retrieve the ClamAV server's version information
17
19
  # @param configuration [RubyClamdscan::Configuration] configuration for building the ClamAV connection
20
+ # @return [String] Server information
21
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
18
22
  # @raise [RubyClamdscan::Exceptions::EmptyResponseError] If server response is empty
19
23
  def self.server_version(configuration)
20
24
  RubyClamdscan::Commands::Utils.send_single_command("VERSION", configuration)
@@ -27,6 +31,7 @@ module RubyClamdscan
27
31
  # @return [String] Format (currently):
28
32
  # "POOLS: 1\n\nSTATE: VALID PRIMARY\nTHREADS: live 1 idle 0 max 10 idle-timeout 30\nQUEUE: 0 items\n\tSTATS 0.000375 \n\n
29
33
  # MEMSTATS: heap N/A mmap N/A used N/A free N/A releasable N/A pools 1 pools_used 1281.773M pools_total 1281.827M\nEND"
34
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
30
35
  # @raise [RubyClamdscan::Errors::EmptyResponseError] If server response is empty
31
36
  def self.server_stats(configuration)
32
37
  RubyClamdscan::Commands::Utils.send_single_command("nSTATS\n", configuration)
@@ -12,7 +12,7 @@ module RubyClamdscan
12
12
  # @return [String] Response from ClamAV server
13
13
  # @raise [RubyClamdscan::Errors::EmptyResponseError] if configuration.raise_error_on_empty_response is true and server doesn't send response
14
14
  # @raise
15
- def self.send_single_command(command, configuration)
15
+ def self.send_single_command(command, configuration, ignore_empty_response: false)
16
16
  response = ""
17
17
  begin
18
18
  clam_av_stream = RubyClamdscan::Socket.open_clamav_socket(configuration)
@@ -30,7 +30,10 @@ module RubyClamdscan
30
30
  clam_av_stream&.close
31
31
  end
32
32
 
33
- raise RubyClamdscan::Errors::EmptyResponseError, command if configuration.raise_error_on_empty_response && response.empty?
33
+ if !ignore_empty_response && configuration.raise_error_on_empty_response && response.empty?
34
+ raise RubyClamdscan::Errors::EmptyResponseError,
35
+ command
36
+ end
34
37
 
35
38
  response
36
39
  end
@@ -41,6 +41,7 @@ module RubyClamdscan
41
41
  attr_accessor :raise_error_on_virus_detected
42
42
 
43
43
  def initialize
44
+ @use_tcp_socket = false
44
45
  @tcp_host = "localhost"
45
46
  @tcp_port = 3310
46
47
  @chunk_size = 1024
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyClamdscan
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
@@ -13,9 +13,6 @@ module RubyClamdscan
13
13
  # Configuration to use interacting with the ClamAV server
14
14
  def configuration
15
15
  @configuration ||= Configuration.new
16
- @configuration.use_tcp_socket = true
17
- @configuration.tcp_host = "localhost"
18
- @configuration.tcp_port = 3310
19
16
 
20
17
  @configuration
21
18
  end
@@ -28,6 +25,9 @@ module RubyClamdscan
28
25
  # Scans a file
29
26
  # @param filepath [String] Path to file in local storage
30
27
  # @return [RubyClamdscan::Models::ScanResult] Result from the scan attempt
28
+ # @return [RubyClamdscan::Models::ScanResult]
29
+ # @raise [RubyClamdscan::Errors::VirusDetectedError] if Configuration is set to raise exception and malware is detected
30
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
31
31
  def scan_file_from_path(filepath)
32
32
  RubyClamdscan::Commands::Scan.scan_file(filepath, @configuration)
33
33
  end
@@ -35,26 +35,53 @@ module RubyClamdscan
35
35
  # Scans the contents of the stream passed in
36
36
  # @param stream [IO] stream of file contents
37
37
  # @return [RubyClamdscan::Models::ScanResult] Result from the scan attempt
38
+ # @return [RubyClamdscan::Models::ScanResult]
39
+ # @raise [RubyClamdscan::Errors::VirusDetectedError] if Configuration is set to raise exception and malware is detected
40
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
38
41
  def scan_contents(stream)
39
42
  RubyClamdscan::Commands::Scan.scan(stream, @configuration)
40
43
  end
41
44
 
45
+ # Attempts to ping the ClamAV server
46
+ # @return [String] "PONG"
47
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
48
+ # @raise [RubyClamdscan::Exceptions::EmptyResponseError] If server response is empty
42
49
  def ping_server
43
50
  RubyClamdscan::Commands::Status.ping_server(@configuration)
44
51
  end
45
52
 
53
+ # Attempts to retrieve the ClamAV server's version information
54
+ # @return [String] Server information
55
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
56
+ # @raise [RubyClamdscan::Exceptions::EmptyResponseError] If server response is empty
46
57
  def server_version
47
58
  RubyClamdscan::Commands::Status.server_version(@configuration)
48
59
  end
49
60
 
61
+ # Replies with statistics about the scan queue, contents of scan queue, and memory usage
62
+ # Because the format of this response is subject to change, this method will only return the string
63
+ # Uses "nSTATS\n", blocks in the returned response will be separated by the \n character
64
+ # @return [String] Format (currently):
65
+ # "POOLS: 1\n\nSTATE: VALID PRIMARY\nTHREADS: live 1 idle 0 max 10 idle-timeout 30\nQUEUE: 0 items\n\tSTATS 0.000375 \n\n
66
+ # MEMSTATS: heap N/A mmap N/A used N/A free N/A releasable N/A pools 1 pools_used 1281.773M pools_total 1281.827M\nEND"
67
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
68
+ # @raise [RubyClamdscan::Errors::EmptyResponseError] If server response is empty
50
69
  def server_stats
51
70
  RubyClamdscan::Commands::Status.server_stats(@configuration)
52
71
  end
53
72
 
73
+ # Force ClamAV to reload the virus databases
74
+ # @return [String] "RELOADING"
75
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
76
+ # @raise [RubyClamdscan::Errors::EmptyResponseError] If server response is empty
54
77
  def reload_server_database
55
78
  RubyClamdscan::Commands::Manage.reload_server_database(@configuration)
56
79
  end
57
80
 
81
+ # Shutdown ClamAV server
82
+ # Note: this will completely close socket communication. Server cannot be restarted through this library
83
+ # @raise [RubyClamdscan::Errors::ClamAVCommunicationError] if communication with ClamAV server fails
84
+ # @return [Boolean] true if shutdown command was sent
58
85
  def shutdown_server
59
86
  RubyClamdscan::Commands::Manage.shutdown_server(@configuration)
60
87
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_clamdscan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Schwartz