pihole-api 0.0.4 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 969171190d388a3b5fe68032344c4ab88022b2a2a2deceb03209ddbe8b83dd01
4
- data.tar.gz: 9dcbe97d905946646c02bf56da36a8eac6bd76adaae033c70aed81cc990e84b8
3
+ metadata.gz: 72274b476c945fb672d06332375555bc2aec2defb464238619f263e1aa3de808
4
+ data.tar.gz: 4b033a3662517060589a5203cd03c75ad28b7a662f72932339fe4582ef3abe81
5
5
  SHA512:
6
- metadata.gz: f1a541c23de20a1f29cb897c785fd5b43e48837b327e31a5592156e224702e8ab4cefc0d2c7d31ad2e34b6545f5a133ea858dd2371064450f7844695a7ad321e
7
- data.tar.gz: 61705316cec6e332e505f4117f061c0daaf64d170c86cd22e777047e2a45a5353af951bfe3638a20f3127f9b22ed4c4b29985557fca254a10cdd242449682ef5
6
+ metadata.gz: bc1f224963cc84e0ac8f2574fd83667aec056e224b1d8d884d943460f5cc740adbf24059f8ddb6fbdbf74e3f5512f006c64687281a5ea21e13152a9f806d03ec
7
+ data.tar.gz: 76a8fe962a747f5ec7e138f7e394441f0ecbf32a93ca1aa4946058f3ea5f5b9041d156f24f5ff4bd64767c077fc3fc9559a018a85483fae30cdc131ff8ea81c4
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.0
1
+ 3.3.4
data/Gemfile.lock CHANGED
@@ -1,112 +1,148 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pihole-api (0.0.4)
4
+ pihole-api (0.0.6)
5
5
  active_attr (~> 0.16.0)
6
- httparty (~> 0.21.0)
7
- nokogiri (~> 1.16.0)
6
+ httparty (~> 0.22.0)
7
+ nokogiri (~> 1.16.7)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- actionpack (7.0.4.2)
13
- actionview (= 7.0.4.2)
14
- activesupport (= 7.0.4.2)
15
- rack (~> 2.0, >= 2.2.0)
12
+ actionpack (7.1.3.3)
13
+ actionview (= 7.1.3.3)
14
+ activesupport (= 7.1.3.3)
15
+ nokogiri (>= 1.8.5)
16
+ racc
17
+ rack (>= 2.2.4)
18
+ rack-session (>= 1.0.1)
16
19
  rack-test (>= 0.6.3)
17
- rails-dom-testing (~> 2.0)
18
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
19
- actionview (7.0.4.2)
20
- activesupport (= 7.0.4.2)
20
+ rails-dom-testing (~> 2.2)
21
+ rails-html-sanitizer (~> 1.6)
22
+ actionview (7.1.3.3)
23
+ activesupport (= 7.1.3.3)
21
24
  builder (~> 3.1)
22
- erubi (~> 1.4)
23
- rails-dom-testing (~> 2.0)
24
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
25
+ erubi (~> 1.11)
26
+ rails-dom-testing (~> 2.2)
27
+ rails-html-sanitizer (~> 1.6)
25
28
  active_attr (0.16.0)
26
29
  actionpack (>= 3.0.2, < 7.2)
27
30
  activemodel (>= 3.0.2, < 7.2)
28
31
  activesupport (>= 3.0.2, < 7.2)
29
- activemodel (7.0.4.2)
30
- activesupport (= 7.0.4.2)
31
- activesupport (7.0.4.2)
32
+ activemodel (7.1.3.3)
33
+ activesupport (= 7.1.3.3)
34
+ activesupport (7.1.3.3)
35
+ base64
36
+ bigdecimal
32
37
  concurrent-ruby (~> 1.0, >= 1.0.2)
38
+ connection_pool (>= 2.2.5)
39
+ drb
33
40
  i18n (>= 1.6, < 2)
34
41
  minitest (>= 5.1)
42
+ mutex_m
35
43
  tzinfo (~> 2.0)
36
- addressable (2.8.5)
37
- public_suffix (>= 2.0.2, < 6.0)
44
+ addressable (2.8.7)
45
+ public_suffix (>= 2.0.2, < 7.0)
38
46
  ansi (1.5.0)
47
+ base64 (0.2.0)
48
+ bigdecimal (3.1.8)
39
49
  builder (3.2.4)
40
50
  coderay (1.1.3)
41
- concurrent-ruby (1.2.0)
42
- crack (0.4.5)
51
+ concurrent-ruby (1.2.3)
52
+ connection_pool (2.4.1)
53
+ crack (1.0.0)
54
+ bigdecimal
43
55
  rexml
44
56
  crass (1.0.6)
57
+ csv (3.3.0)
58
+ drb (2.2.1)
45
59
  erubi (1.12.0)
46
- hashdiff (1.0.1)
47
- httparty (0.21.0)
60
+ hashdiff (1.1.1)
61
+ httparty (0.22.0)
62
+ csv
48
63
  mini_mime (>= 1.0.0)
49
64
  multi_xml (>= 0.5.2)
50
- i18n (1.12.0)
65
+ i18n (1.14.5)
51
66
  concurrent-ruby (~> 1.0)
52
- loofah (2.19.1)
67
+ loofah (2.22.0)
53
68
  crass (~> 1.0.2)
54
- nokogiri (>= 1.5.9)
55
- method_source (1.0.0)
56
- mini_mime (1.1.2)
57
- minitest (5.21.2)
69
+ nokogiri (>= 1.12.0)
70
+ method_source (1.1.0)
71
+ mini_mime (1.1.5)
72
+ minitest (5.25.1)
58
73
  minitest-focus (1.4.0)
59
74
  minitest (>= 4, < 6)
60
- minitest-reporters (1.6.1)
75
+ minitest-reporters (1.7.1)
61
76
  ansi
62
77
  builder
63
78
  minitest (>= 5.0)
64
79
  ruby-progressbar
65
- mocha (2.1.0)
80
+ mocha (2.4.5)
66
81
  ruby2_keywords (>= 0.0.5)
67
- multi_xml (0.6.0)
68
- nokogiri (1.16.0-arm64-darwin)
82
+ multi_xml (0.7.1)
83
+ bigdecimal (~> 3.1)
84
+ mutex_m (0.2.0)
85
+ nokogiri (1.16.7-aarch64-linux)
86
+ racc (~> 1.4)
87
+ nokogiri (1.16.7-arm-linux)
88
+ racc (~> 1.4)
89
+ nokogiri (1.16.7-arm64-darwin)
90
+ racc (~> 1.4)
91
+ nokogiri (1.16.7-x86-linux)
92
+ racc (~> 1.4)
93
+ nokogiri (1.16.7-x86_64-darwin)
94
+ racc (~> 1.4)
95
+ nokogiri (1.16.7-x86_64-linux)
69
96
  racc (~> 1.4)
70
97
  pry (0.14.2)
71
98
  coderay (~> 1.1)
72
99
  method_source (~> 1.0)
73
- public_suffix (5.0.3)
74
- racc (1.6.2)
75
- rack (2.2.6.2)
76
- rack-test (2.0.2)
100
+ public_suffix (6.0.1)
101
+ racc (1.8.0)
102
+ rack (3.0.11)
103
+ rack-session (2.0.0)
104
+ rack (>= 3.0.0)
105
+ rack-test (2.1.0)
77
106
  rack (>= 1.3)
78
- rails-dom-testing (2.0.3)
79
- activesupport (>= 4.2.0)
107
+ rails-dom-testing (2.2.0)
108
+ activesupport (>= 5.0.0)
109
+ minitest
80
110
  nokogiri (>= 1.6)
81
- rails-html-sanitizer (1.5.0)
82
- loofah (~> 2.19, >= 2.19.1)
83
- rake (13.1.0)
84
- rexml (3.2.6)
111
+ rails-html-sanitizer (1.6.0)
112
+ loofah (~> 2.21)
113
+ nokogiri (~> 1.14)
114
+ rake (13.2.1)
115
+ rexml (3.3.5)
116
+ strscan
85
117
  ruby-progressbar (1.13.0)
86
118
  ruby2_keywords (0.0.5)
87
- timecop (0.9.8)
88
- tzinfo (2.0.5)
119
+ strscan (3.1.0)
120
+ timecop (0.9.10)
121
+ tzinfo (2.0.6)
89
122
  concurrent-ruby (~> 1.0)
90
- webmock (3.19.1)
123
+ webmock (3.23.1)
91
124
  addressable (>= 2.8.0)
92
125
  crack (>= 0.3.2)
93
126
  hashdiff (>= 0.4.0, < 2.0.0)
94
127
 
95
128
  PLATFORMS
96
- arm64-darwin-20
97
- arm64-darwin-22
98
- arm64-darwin-23
129
+ aarch64-linux
130
+ arm-linux
131
+ arm64-darwin
132
+ x86-linux
133
+ x86_64-darwin
134
+ x86_64-linux
99
135
 
100
136
  DEPENDENCIES
101
- minitest (~> 5.21.2)
137
+ minitest (~> 5.25.1)
102
138
  minitest-focus (~> 1.4.0)
103
- minitest-reporters (~> 1.6.1)
104
- mocha (~> 2.1.0)
139
+ minitest-reporters (~> 1.7.1)
140
+ mocha (~> 2.4.5)
105
141
  pihole-api!
106
142
  pry (~> 0.14.2)
107
- rake (~> 13.1.0)
108
- timecop (~> 0.9.8)
109
- webmock (~> 3.19.1)
143
+ rake (~> 13.2.1)
144
+ timecop (~> 0.9.10)
145
+ webmock (~> 3.23.1)
110
146
 
111
147
  BUNDLED WITH
112
- 2.5.5
148
+ 2.5.17
data/README.md CHANGED
@@ -45,13 +45,16 @@ Or install it yourself as:
45
45
  client.type
46
46
  ```
47
47
 
48
- Double hash web password to get the api_token. A helper method exists on the client to do this:
48
+ Double hash web password to get the api_token.
49
+ A helper method exists on the client to do this:
49
50
  ```ruby
50
51
  require 'pihole-api'
51
52
  api_token = PiholeApi::Client.hash_password(password)
52
53
  end
53
54
  ```
54
55
 
56
+ However the client now generates the API token automatically from the given password
57
+
55
58
  ### Endpoints
56
59
  #### Authorised
57
60
  - `summary_raw`
@@ -66,6 +69,9 @@ end
66
69
  - `recent_blocked`
67
70
  - `enable`
68
71
  - `disable`
72
+ #### Authorised Non API
73
+ - auth_form_token
74
+ - `teleport(whitelist: true, regex_whitelist: true, blacklist: true, regexlist: true, adlist: true, client: true, group: true, auditlog: true, staticdhcpleases: true, localdnsrecords: true, localcnamerecords: true, flushtables: true)`
69
75
 
70
76
  #### Unauthorised
71
77
  - `type`
@@ -0,0 +1,67 @@
1
+ module PiholeApi
2
+ module AuthorisedFormEndpoints
3
+ include ::PiholeApi::Constants
4
+
5
+ # These endpoints need to be authorised
6
+ # They are non API backed endpoints the require separate auth
7
+ # https://discourse.pi-hole.net/t/pi-hole-api/1863
8
+
9
+ def auth_form_token
10
+ # Login
11
+ login_response = HTTParty.post(
12
+ "#{base_path}/#{LOGIN_PATH}",
13
+ body: { pw: password }
14
+ )
15
+
16
+ @cookie = login_response.headers["set-cookie"].split(TOKEN_SEPERATOR).first
17
+
18
+ # Index
19
+ index_response = HTTParty.get(
20
+ "#{base_path}/#{INDEX_PATH}",
21
+ headers: { "Cookie": @cookie }
22
+ )
23
+
24
+ # Get form token
25
+ @form_token = TOKEN_REGEX.match(index_response.body)[1]
26
+ end
27
+
28
+ # This does not use the API
29
+ def teleport(whitelist: true,
30
+ regex_whitelist: true,
31
+ blacklist: true,
32
+ regexlist: true,
33
+ adlist: true,
34
+ client: true,
35
+ group: true,
36
+ auditlog: true,
37
+ staticdhcpleases: true,
38
+ localdnsrecords: true,
39
+ localcnamerecords: true,
40
+ flushtables: true)
41
+
42
+ auth_form_token unless @form_token
43
+
44
+ # authorise_and_send(http_method:, command:, payload: {}, params: {}, custom_path: nil)
45
+ # Content-Type: application/octet-stream
46
+ # zip_file ; filename=""
47
+ custom_path = "#{base_path}/#{TELEPORTER_PATH}"
48
+ payload = {
49
+ "token": @form_token,
50
+ "whitelist": whitelist,
51
+ "regex_whitelist": regex_whitelist,
52
+ "blacklist": blacklist,
53
+ "regexlist": regexlist,
54
+ "adlist": adlist,
55
+ "client": client,
56
+ "group": group,
57
+ "auditlog": auditlog,
58
+ "staticdhcpleases": staticdhcpleases,
59
+ "localdnsrecords": localdnsrecords,
60
+ "localcnamerecords": localcnamerecords,
61
+ "flushtables": flushtables
62
+ }
63
+
64
+ HTTParty.post(custom_path, body: payload, headers: { "Cookie": @cookie })
65
+ end
66
+ end
67
+ end
@@ -5,11 +5,14 @@ module PiholeApi
5
5
  # Endpoints
6
6
  include ::PiholeApi::UnauthorisedEndpoints
7
7
  include ::PiholeApi::AuthorisedEndpoints
8
+ include ::PiholeApi::AuthorisedFormEndpoints
8
9
 
9
- attr_reader :api_token, :base_path, :port
10
+ attr_reader :password, :api_token, :form_token, :cookie, :base_path, :port
11
+
12
+ def initialize(base_path:, password:, port: 80)
13
+ @password = password
14
+ @api_token = PiholeApi::Client.hash_password(password)
10
15
 
11
- def initialize(base_path:, api_token:, port: 80)
12
- @api_token = api_token
13
16
  @base_path = base_path
14
17
  @port = port
15
18
  end
@@ -25,6 +28,7 @@ module PiholeApi
25
28
 
26
29
  def self.hash_password(password)
27
30
  require 'digest'
31
+
28
32
  hash1 = Digest::SHA256.hexdigest(password)
29
33
  Digest::SHA256.hexdigest(hash1) # Use as hash password for client
30
34
  end
@@ -1,5 +1,11 @@
1
1
  module PiholeApi
2
2
  module Constants
3
3
  API_PATH = 'admin/api.php'
4
+ LOGIN_PATH = 'admin/login.php'
5
+ INDEX_PATH = 'admin'
6
+ TELEPORTER_PATH = 'admin/scripts/pi-hole/php/teleporter.php'
7
+
8
+ TOKEN_REGEX = /div\s+id="token"\s+hidden>([^<]+)<\/div>/
9
+ TOKEN_SEPERATOR = ";"
4
10
  end
5
11
  end
@@ -1,3 +1,3 @@
1
1
  module PiholeApi
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.6'
3
3
  end
data/lib/pihole-api.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'httparty'
2
2
  require 'nokogiri'
3
+ # require 'oj'
3
4
 
4
5
  require 'pihole-api/version'
5
6
  require 'pihole-api/constants'
@@ -7,6 +8,7 @@ require 'pihole-api/constants'
7
8
  # Endpoints
8
9
  require 'pihole-api/unauthorised_endpoints'
9
10
  require 'pihole-api/authorised_endpoints'
11
+ require 'pihole-api/authorised_form_endpoints'
10
12
 
11
13
  require 'pihole-api/client'
12
14
 
data/pihole-api.gemspec CHANGED
@@ -22,17 +22,18 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_dependency "httparty", "~> 0.21.0"
25
+ spec.add_dependency "httparty", "~> 0.22.0"
26
26
  spec.add_dependency "active_attr", "~> 0.16.0"
27
- spec.add_dependency "nokogiri", "~> 1.16.0"
27
+ spec.add_dependency "nokogiri", "~> 1.16.7"
28
+ # spec.add_dependency "oj", "~> 3.16.3"
28
29
 
29
30
  # Development dependancies
30
- spec.add_development_dependency "rake", "~> 13.1.0"
31
- spec.add_development_dependency "minitest", "~> 5.21.2"
31
+ spec.add_development_dependency "rake", "~> 13.2.1"
32
+ spec.add_development_dependency "minitest", "~> 5.25.1"
32
33
  spec.add_development_dependency "minitest-focus", "~> 1.4.0"
33
- spec.add_development_dependency "minitest-reporters", "~> 1.6.1"
34
- spec.add_development_dependency "timecop", "~> 0.9.8"
35
- spec.add_development_dependency "mocha", "~> 2.1.0"
34
+ spec.add_development_dependency "minitest-reporters", "~> 1.7.1"
35
+ spec.add_development_dependency "timecop", "~> 0.9.10"
36
+ spec.add_development_dependency "mocha", "~> 2.4.5"
36
37
  spec.add_development_dependency "pry", "~> 0.14.2"
37
- spec.add_development_dependency "webmock", "~> 3.19.1"
38
+ spec.add_development_dependency "webmock", "~> 3.23.1"
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pihole-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - trex22
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-23 00:00:00.000000000 Z
11
+ date: 2024-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.21.0
19
+ version: 0.22.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.21.0
26
+ version: 0.22.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: active_attr
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,42 +44,42 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.16.0
47
+ version: 1.16.7
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.16.0
54
+ version: 1.16.7
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 13.1.0
61
+ version: 13.2.1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 13.1.0
68
+ version: 13.2.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 5.21.2
75
+ version: 5.25.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 5.21.2
82
+ version: 5.25.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest-focus
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -100,42 +100,42 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.6.1
103
+ version: 1.7.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.6.1
110
+ version: 1.7.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: timecop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.9.8
117
+ version: 0.9.10
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.9.8
124
+ version: 0.9.10
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: mocha
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 2.1.0
131
+ version: 2.4.5
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 2.1.0
138
+ version: 2.4.5
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: pry
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 3.19.1
159
+ version: 3.23.1
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 3.19.1
166
+ version: 3.23.1
167
167
  description: A client for using the PiholeApi API in Ruby. Built form their api documentation.
168
168
  https://discourse.pi-hole.net/t/using-the-api/976/6. This is an unofficial project.
169
169
  email:
@@ -186,6 +186,7 @@ files:
186
186
  - bin/setup
187
187
  - lib/pihole-api.rb
188
188
  - lib/pihole-api/authorised_endpoints.rb
189
+ - lib/pihole-api/authorised_form_endpoints.rb
189
190
  - lib/pihole-api/client.rb
190
191
  - lib/pihole-api/constants.rb
191
192
  - lib/pihole-api/unauthorised_endpoints.rb
@@ -210,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
211
  - !ruby/object:Gem::Version
211
212
  version: '0'
212
213
  requirements: []
213
- rubygems_version: 3.5.3
214
+ rubygems_version: 3.5.11
214
215
  signing_key:
215
216
  specification_version: 4
216
217
  summary: A client for using the PiholeApi API in Ruby.