rbzk 0.1.5 → 0.1.7
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 +4 -4
- data/README.md +304 -254
- data/bin/console +3 -3
- data/lib/rbzk/attendance.rb +19 -0
- data/lib/rbzk/cli/commands.rb +223 -233
- data/lib/rbzk/cli/config.rb +2 -2
- data/lib/rbzk/constants.rb +3 -3
- data/lib/rbzk/exceptions.rb +3 -3
- data/lib/rbzk/finger.rb +1 -1
- data/lib/rbzk/user.rb +11 -11
- data/lib/rbzk/version.rb +1 -1
- data/lib/rbzk/zk.rb +4 -2
- data/lib/rbzk.rb +7 -7
- metadata +8 -8
data/lib/rbzk/cli/config.rb
CHANGED
|
@@ -42,7 +42,7 @@ module RBZK
|
|
|
42
42
|
def save
|
|
43
43
|
# Create the directory if it doesn't exist
|
|
44
44
|
FileUtils.mkdir_p(File.dirname(@config_file))
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
# Save the configuration
|
|
47
47
|
File.open(@config_file, 'w') do |f|
|
|
48
48
|
f.write(YAML.dump(@config))
|
|
@@ -68,7 +68,7 @@ module RBZK
|
|
|
68
68
|
begin
|
|
69
69
|
config = YAML.load_file(@config_file)
|
|
70
70
|
return DEFAULT_CONFIG.merge(config) if config.is_a?(Hash)
|
|
71
|
-
rescue => e
|
|
71
|
+
rescue StandardError => e
|
|
72
72
|
warn "Error loading configuration file: #{e.message}"
|
|
73
73
|
end
|
|
74
74
|
end
|
data/lib/rbzk/constants.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module RBZK
|
|
4
4
|
module Constants
|
|
5
|
-
USHRT_MAX =
|
|
5
|
+
USHRT_MAX = 65_535
|
|
6
6
|
|
|
7
7
|
# Command codes
|
|
8
8
|
CMD_DB_RRQ = 7 # Read in some kind of data from the machine
|
|
@@ -121,8 +121,8 @@ module RBZK
|
|
|
121
121
|
# Machine constants
|
|
122
122
|
# These values are in little-endian format when packed
|
|
123
123
|
# 0x5050 = 'PP' in ASCII when packed as '<H'
|
|
124
|
-
MACHINE_PREPARE_DATA_1 =
|
|
124
|
+
MACHINE_PREPARE_DATA_1 = 20_560 # 0x5050 = 'P' + 'P'*256 in little-endian
|
|
125
125
|
# 0x7D82 = 0x827D in little-endian format
|
|
126
|
-
MACHINE_PREPARE_DATA_2 =
|
|
126
|
+
MACHINE_PREPARE_DATA_2 = 32_130 # 0x7D82
|
|
127
127
|
end
|
|
128
128
|
end
|
data/lib/rbzk/exceptions.rb
CHANGED
|
@@ -4,19 +4,19 @@ module RBZK
|
|
|
4
4
|
class ZKError < StandardError; end
|
|
5
5
|
|
|
6
6
|
class ZKNetworkError < ZKError
|
|
7
|
-
def initialize(msg =
|
|
7
|
+
def initialize(msg = 'Network error')
|
|
8
8
|
super
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
class ZKErrorConnection < ZKError
|
|
13
|
-
def initialize(msg =
|
|
13
|
+
def initialize(msg = 'Connection error')
|
|
14
14
|
super
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
class ZKErrorResponse < ZKError
|
|
19
|
-
def initialize(msg =
|
|
19
|
+
def initialize(msg = 'Invalid response')
|
|
20
20
|
super
|
|
21
21
|
end
|
|
22
22
|
end
|
data/lib/rbzk/finger.rb
CHANGED
data/lib/rbzk/user.rb
CHANGED
|
@@ -4,7 +4,7 @@ module RBZK
|
|
|
4
4
|
class User
|
|
5
5
|
attr_accessor :uid, :user_id, :name, :privilege, :password, :group_id, :card
|
|
6
6
|
|
|
7
|
-
@@encoding =
|
|
7
|
+
@@encoding = 'UTF-8'
|
|
8
8
|
|
|
9
9
|
def self.encoding=(encoding)
|
|
10
10
|
@@encoding = encoding
|
|
@@ -17,7 +17,7 @@ module RBZK
|
|
|
17
17
|
# Match Python's User constructor exactly
|
|
18
18
|
# In Python:
|
|
19
19
|
# def __init__(self, uid, name, privilege, password='', group_id='', user_id='', card=0):
|
|
20
|
-
def initialize(uid = 0, name =
|
|
20
|
+
def initialize(uid = 0, name = '', privilege = 0, password = '', group_id = '', user_id = '', card = 0)
|
|
21
21
|
@uid = uid
|
|
22
22
|
@name = name
|
|
23
23
|
@privilege = privilege
|
|
@@ -30,20 +30,20 @@ module RBZK
|
|
|
30
30
|
# Pack the user data into a binary string for ZK6 devices (size 29)
|
|
31
31
|
def repack29
|
|
32
32
|
[2, @uid, @privilege].pack('CS<C') +
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
@password.encode(@@encoding, invalid: :replace, undef: :replace).ljust(5, "\x00")[0...5] +
|
|
34
|
+
@name.encode(@@encoding, invalid: :replace, undef: :replace).ljust(8, "\x00")[0...8] +
|
|
35
|
+
[@card, 0, @group_id.to_i, 0, @user_id.to_i].pack('L<CS<S<L<')
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
# Pack the user data into a binary string for ZK8 devices (size 73)
|
|
39
39
|
def repack73
|
|
40
40
|
[2, @uid, @privilege].pack('CS<C') +
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
@password.encode(@@encoding, invalid: :replace, undef: :replace).ljust(8, "\x00")[0...8] +
|
|
42
|
+
@name.encode(@@encoding, invalid: :replace, undef: :replace).ljust(24, "\x00")[0...24] +
|
|
43
|
+
[@card, 1].pack('L<C') +
|
|
44
|
+
@group_id.to_s.encode(@@encoding, invalid: :replace, undef: :replace).ljust(7, "\x00")[0...7] +
|
|
45
|
+
"\x00" +
|
|
46
|
+
@user_id.to_s.encode(@@encoding, invalid: :replace, undef: :replace).ljust(24, "\x00")[0...24]
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
# Check if the user is disabled
|
data/lib/rbzk/version.rb
CHANGED
data/lib/rbzk/zk.rb
CHANGED
|
@@ -39,13 +39,15 @@ module RBZK
|
|
|
39
39
|
rescue Errno::EISCONN
|
|
40
40
|
result = 0 # Already connected
|
|
41
41
|
rescue => e
|
|
42
|
-
|
|
42
|
+
# Some exceptions (e.g., Socket::ResolutionError) don't provide errno
|
|
43
|
+
result = e.respond_to?(:errno) ? e.errno : 1 # Connection failed
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
client.close
|
|
46
47
|
return result
|
|
47
48
|
rescue => e
|
|
48
|
-
|
|
49
|
+
# Some exceptions (e.g., Socket::ResolutionError) don't provide errno
|
|
50
|
+
return e.respond_to?(:errno) ? e.errno : 1
|
|
49
51
|
end
|
|
50
52
|
end
|
|
51
53
|
end
|
data/lib/rbzk.rb
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
require 'bytes'
|
|
5
5
|
|
|
6
6
|
# Internal dependencies
|
|
7
|
-
require_relative
|
|
8
|
-
require_relative
|
|
9
|
-
require_relative
|
|
10
|
-
require_relative
|
|
11
|
-
require_relative
|
|
12
|
-
require_relative
|
|
13
|
-
require_relative
|
|
7
|
+
require_relative 'rbzk/version'
|
|
8
|
+
require_relative 'rbzk/constants'
|
|
9
|
+
require_relative 'rbzk/exceptions'
|
|
10
|
+
require_relative 'rbzk/user'
|
|
11
|
+
require_relative 'rbzk/attendance'
|
|
12
|
+
require_relative 'rbzk/finger'
|
|
13
|
+
require_relative 'rbzk/zk'
|
|
14
14
|
|
|
15
15
|
module RBZK
|
|
16
16
|
class Error < StandardError; end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbzk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Khaled AbuShqear
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2025-
|
|
10
|
+
date: 2025-10-20 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: bytes
|
|
@@ -24,33 +24,33 @@ dependencies:
|
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: '0.1'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
|
-
name:
|
|
27
|
+
name: terminal-table
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '3.0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '3.0'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
|
-
name:
|
|
41
|
+
name: thor
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '1.2'
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
53
|
+
version: '1.2'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
55
|
name: bundler
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|