Skip to content

Commit 67cd474

Browse files
Migrating services to OOP
1 parent 33664c2 commit 67cd474

18 files changed

Lines changed: 303 additions & 65 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDHCPdRestart extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_restart("dhcpd", []);
15+
return APIResponse\get(0, ["dhcpd" => "restarted"]);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDHCPdStart extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_start("dhcpd", []);
15+
return APIResponse\get(0, ["dhcpd" => "started"]);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDHCPdStop extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_stop("dhcpd", []);
15+
return APIResponse\get(0, ["dhcpd" => "stopped"]);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDpingerRestart extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_restart("dpinger", []);
15+
return APIResponse\get(0, ["dpinger" => "restarted"]);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDpingerStart extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_start("dpinger", []);
15+
return APIResponse\get(0, ["dpinger" => "started"]);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesDpingerStop extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-status-services"];
11+
}
12+
13+
public function action() {
14+
service_control_stop("dpinger", []);
15+
return APIResponse\get(0, ["dpinger" => "stopped"]);
16+
}
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
6+
class APIServicesUnbound extends APIBaseModel {
7+
# Create our method constructor
8+
public function __construct() {
9+
parent::__construct();
10+
$this->methods = ["GET"];
11+
$this->privileges = ["page-all", "page-services-dnsresolver"];
12+
}
13+
14+
public function action() {
15+
$unbound_array = [];
16+
if (!empty($this->config["unbound"])) {
17+
$unbound_array = $this->config["unbound"];
18+
}
19+
return APIResponse\get(0, $unbound_array);
20+
}
21+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
<?php
2+
require_once("api/framework/APIBaseModel.inc");
3+
require_once("api/framework/APIResponse.inc");
4+
5+
class APIServicesUnboundDeleteHosts extends APIBaseModel {
6+
# Create our method constructor
7+
public function __construct() {
8+
parent::__construct();
9+
$this->methods = ["POST"];
10+
$this->privileges = ["page-all", "page-services-dnsresolver-edithost"];
11+
$this->change_note = "Deleted DNS Resolver host override via API";
12+
}
13+
14+
public function action() {
15+
usort($this->validated_data["hosts_conf"], "strcmp");
16+
$this->config["unbound"]["hosts"] = $this->validated_data["hosts_conf"];
17+
$this->write_config();
18+
mark_subsystem_dirty("unbound");
19+
# If user requests immediately application
20+
if ($this->validated_data["apply"] === true) {
21+
APITools\unbound_reload_config();
22+
}
23+
// Return success if our function was successful
24+
return APIResponse\get(0, $this->validated_data["del_list"]);
25+
}
26+
27+
public function validate_payload() {
28+
if (isset($this->initial_data['host'])) {
29+
$this->validated_data["hostname"] = trim($this->initial_data['host']);
30+
$h_mode = true;
31+
}
32+
if (isset($this->initial_data['domain'])) {
33+
$this->validated_data["domain"] = trim($this->initial_data['domain']);
34+
$d_mode = true;
35+
}
36+
if (isset($this->initial_data['ip'])) {
37+
$this->validated_data["ip"] = trim($this->initial_data['ip']);
38+
$i_mode = true;
39+
}
40+
if ($this->initial_data['aliases'] === true) {
41+
$a_mode = true;
42+
}
43+
if ($this->initial_data['apply'] === true) {
44+
$this->validated_data["apply"] = $this->initial_data['apply'];
45+
}
46+
// Determine criteria for deletion
47+
if ($h_mode and !$d_mode and !$i_mode) {
48+
$del_mode = "h";
49+
} elseif ($h_mode and $d_mode and !$i_mode) {
50+
$del_mode = "hd";
51+
} elseif ($h_mode and !$d_mode and $i_mode) {
52+
$del_mode = "hi";
53+
} elseif ($h_mode and $d_mode and $i_mode) {
54+
$del_mode = "hdi";
55+
} elseif (!$h_mode and $d_mode and !$i_mode) {
56+
$del_mode = "d";
57+
} elseif (!$h_mode and $d_mode and $i_mode) {
58+
$del_mode = "di";
59+
} elseif (!$h_mode and !$d_mode and $i_mode) {
60+
$del_mode = "i";
61+
} else {
62+
$this->errors [] = APIResponse\get(2014);
63+
}
64+
65+
// Check that our configuration is a list and loop through each item, otherwise return ok resp
66+
if (array_key_exists("hosts", $this->config["unbound"]) and is_array($this->config["unbound"]["hosts"])) {
67+
$this->validated_data["del_list"] = array("hosts" => array(), "aliases" => array()); // List of deleted items
68+
$this->validated_data["hosts_conf"] = &$this->config["unbound"]["hosts"]; // Current Unbound host overrides
69+
$h_count = 0; // Define counter for our hosts loop
70+
foreach ($this->validated_data["hosts_conf"] as $he) {
71+
// Check aliases for match if alias mode
72+
if ($a_mode and is_array($he["aliases"])) {
73+
$a_count = 0; // Define counter for our aliases loop
74+
// Loop through aliases to check for matches
75+
foreach ($he["aliases"]["item"] as $ae) {
76+
if ($del_mode === "h") {
77+
if ($this->validated_data["hostname"] === $ae["host"]) {
78+
unset($this->validated_data["hosts_conf"][$h_count]["aliases"]["item"][$a_count]);
79+
$this->validated_data["del_list"]["aliases"][] = $ae["host"].".".$ae["domain"];
80+
}
81+
} elseif ($del_mode === "d") {
82+
if ($this->validated_data["domain"] === $ae["domain"]) {
83+
unset($this->validated_data["hosts_conf"][$h_count]["aliases"]["item"][$a_count]);
84+
$this->validated_data["del_list"]["aliases"][] = $ae["host"].".".$ae["domain"];
85+
}
86+
} elseif ($del_mode === "hd") {
87+
if ($this->validated_data["hostname"] === $ae["host"] and $this->validated_data["domain"] === $ae["domain"]) {
88+
unset($this->validated_data["hosts_conf"][$h_count]["aliases"]["item"][$a_count]);
89+
$this->validated_data["del_list"]["aliases"][] = $ae["host"].".".$ae["domain"];
90+
}
91+
}
92+
// If all aliases were removed, restore aliases key to empty string
93+
if (empty($this->validated_data["hosts_conf"][$h_count]["aliases"]["item"])) {
94+
$this->validated_data["hosts_conf"][$h_count]["aliases"] = "";
95+
}
96+
// Increase our alias counter
97+
$a_count++;
98+
}
99+
}
100+
// Check parent host entries
101+
if ($del_mode === "h") {
102+
if ($this->validated_data["hostname"] === $he["host"]) {
103+
unset($this->validated_data["hosts_conf"][$h_count]);
104+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
105+
}
106+
} elseif ($del_mode === "d") {
107+
if ($this->validated_data["domain"] === $he["domain"]) {
108+
unset($this->validated_data["hosts_conf"][$h_count]);
109+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
110+
}
111+
} elseif ($del_mode === "i") {
112+
if ($this->validated_data["ip"] === $he["ip"]) {
113+
unset($this->validated_data["hosts_conf"][$h_count]);
114+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
115+
}
116+
} elseif ($del_mode === "hd") {
117+
if ($this->validated_data["hostname"] === $he["host"] and $this->validated_data["domain"] === $he["domain"]) {
118+
unset($this->validated_data["hosts_conf"][$h_count]);
119+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
120+
}
121+
} elseif ($del_mode === "hi") {
122+
if ($this->validated_data["hostname"] === $he["host"] and $this->validated_data["ip"] === $he["ip"]) {
123+
unset($this->validated_data["hosts_conf"][$h_count]);
124+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
125+
}
126+
} elseif ($del_mode === "di") {
127+
if ($this->validated_data["domain"] === $he["domain"] and $this->validated_data["ip"] === $he["ip"]) {
128+
unset($this->validated_data["hosts_conf"][$h_count]);
129+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
130+
}
131+
} elseif ($del_mode === "hdi") {
132+
if ($this->validated_data["hostname"] === $he["host"] and $this->validated_data["domain"] === $he["domain"] and $this->validated_data["ip"] === $he["ip"]) {
133+
unset($this->validated_data["hosts_conf"][$h_count]);
134+
$this->validated_data["del_list"]["hosts"][] = $he["host"].".".$he["domain"];
135+
}
136+
}
137+
// Increase our host counter
138+
$h_count++;
139+
}
140+
} else {
141+
$this->errors[] = APIResponse\get(2013);
142+
}
143+
}
144+
}

pfSense-pkg-API/files/etc/inc/api/framework/APIResponse.inc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,13 @@ function get($id, $data=[]) {
217217
"return" => $id,
218218
"message" => "Unbound host override does not exist"
219219
],
220-
220+
2014 => [
221+
"status" => "bad request",
222+
"code" => 400,
223+
"return" => $id,
224+
"message" => "Host override deletion criteria not met"
225+
],
226+
// 4000-4999 reserved for /firewall API calls
221227
4000 => [
222228
"status" => "bad request",
223229
"code" => 400,

pfSense-pkg-API/files/etc/inc/api/framework/APITools.inc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,4 +659,17 @@ function is_authentication_server($name) {
659659
}
660660
}
661661
return false;
662+
}
663+
664+
// Reload our unbound configuration, restart associated services and clear config locks
665+
function unbound_reload_config() {
666+
$reload_unbound = 0;
667+
$reload_unbound |= services_unbound_configure();
668+
// Check if application was successful
669+
if ($reload_unbound === 0) {
670+
system_resolvconf_generate(); // Update resolveconf
671+
system_dhcpleases_configure(); // Update DHCPD
672+
clear_subsystem_dirty("unbound");
673+
return true;
674+
}
662675
}

0 commit comments

Comments
 (0)