Improve config system
Add pkl to generate configs
This commit is contained in:
parent
8785186dfa
commit
b2ff632e64
47 changed files with 916 additions and 277 deletions
.cargo
.env.gitignore.sqlx
query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.jsonquery-1d658709678f72291d835ef2a4183d24f993442ea05e17910f587a4c92d4e7f5.jsonquery-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.jsonquery-3b5a701d0ace12125c573680bcd5d9768b3709b347afb04c329b8fb1d3972111.jsonquery-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.jsonquery-52958684fa52b7a4753cd4356482dc6c655102a501d8aa48e03b1fb3dbbad02d.jsonquery-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.jsonquery-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.jsonquery-7bbe1a982c77194feba2ff610b01e824b99a3888adf5365619ecfed7ae6544a9.jsonquery-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.jsonquery-7e7cdf2650c08feb10a35275e693d0d3c690b4e9bccc6f0f5fed2bfd2826b480.jsonquery-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.jsonquery-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.jsonquery-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.jsonquery-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.jsonquery-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.jsonquery-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.jsonquery-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.jsonquery-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.jsonquery-cdcae4768f7b62390e5e5da850e301b502ffd56dd88485cd73b694f6559ccd4e.jsonquery-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.jsonquery-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.jsonquery-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.jsonquery-f7b90a6a0af3f7d7c96158f96f1ada06827a0e5a2d2dbd48bfb8e04f973a6131.json
Makefileconfig
emgauwa-controller.tomlemgauwa-controller/src
emgauwa-core.tomlemgauwa-core
emgauwa-lib
3
.cargo/config.toml
Normal file
3
.cargo/config.toml
Normal file
|
@ -0,0 +1,3 @@
|
|||
[alias]
|
||||
format = "+nightly fmt"
|
||||
lint = "clippy --all-targets --all-features -- -D warnings"
|
2
.env
2
.env
|
@ -1 +1 @@
|
|||
DATABASE_URL="sqlite://emgauwa-dev.sqlite"
|
||||
DATABASE_URL="sqlite://_local/emgauwa-dev.sqlite"
|
||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -4,8 +4,10 @@
|
|||
/tests/testing_bak/
|
||||
/tests/testing_latest/
|
||||
|
||||
/_local/
|
||||
emgauwa-*.sqlite
|
||||
emgauwa-*.sqlite-*
|
||||
emgauwa-*.json
|
||||
|
||||
|
||||
# Added by cargo
|
||||
|
|
38
.sqlx/query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.json
generated
Normal file
38
.sqlx/query-0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM junction_relay_schedule WHERE relay_id = ? AND weekday = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "weekday",
|
||||
"ordinal": 1,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "relay_id",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "schedule_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "0874e71c6206efc82528cc450bc86549c43e9be2f4ac3b257e836187fa9ed080"
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE controllers SET name = ?, relay_count = ?, active = ? WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 4
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "1d658709678f72291d835ef2a4183d24f993442ea05e17910f587a4c92d4e7f5"
|
||||
}
|
20
.sqlx/query-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.json
generated
Normal file
20
.sqlx/query-20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7.json
generated
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT tag FROM tags INNER JOIN junction_tag ON junction_tag.tag_id = tags.id WHERE junction_tag.relay_id = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "tag",
|
||||
"ordinal": 0,
|
||||
"type_info": "Text"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "20e99a281e5e3e9c9d7375425d93d15ccf840e9f469007d37b6eb47f96f31dc7"
|
||||
}
|
12
.sqlx/query-3b5a701d0ace12125c573680bcd5d9768b3709b347afb04c329b8fb1d3972111.json
generated
Normal file
12
.sqlx/query-3b5a701d0ace12125c573680bcd5d9768b3709b347afb04c329b8fb1d3972111.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE relays SET name = ? WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "3b5a701d0ace12125c573680bcd5d9768b3709b347afb04c329b8fb1d3972111"
|
||||
}
|
38
.sqlx/query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json
generated
Normal file
38
.sqlx/query-4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM relays WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111"
|
||||
}
|
26
.sqlx/query-52958684fa52b7a4753cd4356482dc6c655102a501d8aa48e03b1fb3dbbad02d.json
generated
Normal file
26
.sqlx/query-52958684fa52b7a4753cd4356482dc6c655102a501d8aa48e03b1fb3dbbad02d.json
generated
Normal file
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM tags",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "tag",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 0
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "52958684fa52b7a4753cd4356482dc6c655102a501d8aa48e03b1fb3dbbad02d"
|
||||
}
|
38
.sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json
generated
Normal file
38
.sqlx/query-5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?) RETURNING *",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 3
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465"
|
||||
}
|
12
.sqlx/query-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.json
generated
Normal file
12
.sqlx/query-711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE controllers SET active = ? WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "711398eb64710a25cc818167be8f3b2d03cab39116c2732c06e3c74a02fb0367"
|
||||
}
|
38
.sqlx/query-7bbe1a982c77194feba2ff610b01e824b99a3888adf5365619ecfed7ae6544a9.json
generated
Normal file
38
.sqlx/query-7bbe1a982c77194feba2ff610b01e824b99a3888adf5365619ecfed7ae6544a9.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT schedules.* FROM schedules INNER JOIN junction_relay_schedule\n\t\t\tON junction_relay_schedule.schedule_id = schedules.id\n\t\t\tWHERE junction_relay_schedule.relay_id = ? AND junction_relay_schedule.weekday = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "uid",
|
||||
"ordinal": 1,
|
||||
"type_info": "Blob"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 2,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "periods",
|
||||
"ordinal": 3,
|
||||
"type_info": "Blob"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "7bbe1a982c77194feba2ff610b01e824b99a3888adf5365619ecfed7ae6544a9"
|
||||
}
|
38
.sqlx/query-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.json
generated
Normal file
38
.sqlx/query-7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "INSERT INTO junction_relay_schedule (weekday, relay_id, schedule_id) VALUES (?, ?, ?) RETURNING *",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "weekday",
|
||||
"ordinal": 1,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "relay_id",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "schedule_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 3
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "7cd5b42013b4e6a37a670e55cd3ceb0911001eee41256f7b324edc72f5cadcba"
|
||||
}
|
12
.sqlx/query-7e7cdf2650c08feb10a35275e693d0d3c690b4e9bccc6f0f5fed2bfd2826b480.json
generated
Normal file
12
.sqlx/query-7e7cdf2650c08feb10a35275e693d0d3c690b4e9bccc6f0f5fed2bfd2826b480.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "DELETE FROM junction_tag WHERE relay_id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "7e7cdf2650c08feb10a35275e693d0d3c690b4e9bccc6f0f5fed2bfd2826b480"
|
||||
}
|
12
.sqlx/query-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.json
generated
Normal file
12
.sqlx/query-90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "DELETE FROM relays WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "90ed2cd2f8161552dae06ab2d9cfee8914e253db00e6a648a78e99ade6a4de60"
|
||||
}
|
20
.sqlx/query-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.json
generated
Normal file
20
.sqlx/query-921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56.json
generated
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT 1 FROM controllers WHERE uid = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "1",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "921a0775f75d9e2f67f604265872bf715af1e1ed4d420ac6fa132a94ff352e56"
|
||||
}
|
12
.sqlx/query-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.json
generated
Normal file
12
.sqlx/query-a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE controllers SET active = 0",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 0
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "a1f5699889cfabb3f681e6bb71a8d7c739d0cb82eea1f8289d012c37bd30c776"
|
||||
}
|
38
.sqlx/query-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.json
generated
Normal file
38
.sqlx/query-a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT schedules.* FROM schedules INNER JOIN junction_relay_schedule\n\t\t\tON junction_relay_schedule.schedule_id = schedules.id\n\t\t\tWHERE junction_relay_schedule.relay_id = ?\n\t\t\tORDER BY junction_relay_schedule.weekday",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "uid",
|
||||
"ordinal": 1,
|
||||
"type_info": "Blob"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 2,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "periods",
|
||||
"ordinal": 3,
|
||||
"type_info": "Blob"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "a64694ec1a81472a05a68b1caf64c32a261bb7d1f34577c0f4dc52e318124ecd"
|
||||
}
|
38
.sqlx/query-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.json
generated
Normal file
38
.sqlx/query-ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM junction_relay_schedule WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "weekday",
|
||||
"ordinal": 1,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "relay_id",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "schedule_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "ab8dafa95af67dc06074e83e1ec61be2fe713637f883d175f9b279f0f2f8fd87"
|
||||
}
|
38
.sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json
generated
Normal file
38
.sqlx/query-b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM relays WHERE controller_id = ? AND number = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153"
|
||||
}
|
38
.sqlx/query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json
generated
Normal file
38
.sqlx/query-c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM relays WHERE controller_id = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2"
|
||||
}
|
20
.sqlx/query-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.json
generated
Normal file
20
.sqlx/query-cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad.json
generated
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT 1 FROM schedules WHERE uid = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "1",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "cbda6fd5137f3698537262772df22a0a66064e3416e4f5c89d8d83fa6c0536ad"
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "INSERT INTO controllers (uid, name, relay_count, active) VALUES (?, ?, ?, ?) RETURNING *",
|
||||
"query": "INSERT INTO controllers (uid, name, relay_count) VALUES (?, ?, ?) RETURNING *",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
|
@ -30,7 +30,7 @@
|
|||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 4
|
||||
"Right": 3
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
|
@ -40,5 +40,5 @@
|
|||
false
|
||||
]
|
||||
},
|
||||
"hash": "acfc608095768f30a55eb0298dfe86d095af0af9545252cf06f30827e9ca502a"
|
||||
"hash": "cdcae4768f7b62390e5e5da850e301b502ffd56dd88485cd73b694f6559ccd4e"
|
||||
}
|
38
.sqlx/query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json
generated
Normal file
38
.sqlx/query-e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT relay.* FROM relays AS relay INNER JOIN junction_tag ON junction_tag.relay_id = relay.id WHERE junction_tag.tag_id = ?",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f"
|
||||
}
|
38
.sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json
generated
Normal file
38
.sqlx/query-ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d.json
generated
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "SELECT * FROM relays",
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"ordinal": 1,
|
||||
"type_info": "Text"
|
||||
},
|
||||
{
|
||||
"name": "number",
|
||||
"ordinal": 2,
|
||||
"type_info": "Int64"
|
||||
},
|
||||
{
|
||||
"name": "controller_id",
|
||||
"ordinal": 3,
|
||||
"type_info": "Int64"
|
||||
}
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 0
|
||||
},
|
||||
"nullable": [
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
]
|
||||
},
|
||||
"hash": "ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d"
|
||||
}
|
12
.sqlx/query-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.json
generated
Normal file
12
.sqlx/query-f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE junction_relay_schedule SET weekday = ?, relay_id = ?, schedule_id= ? WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 4
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "f75318134ec1facc3de6b04232cb28a92524b8f556840b76f76c8f317059e668"
|
||||
}
|
12
.sqlx/query-f7b90a6a0af3f7d7c96158f96f1ada06827a0e5a2d2dbd48bfb8e04f973a6131.json
generated
Normal file
12
.sqlx/query-f7b90a6a0af3f7d7c96158f96f1ada06827a0e5a2d2dbd48bfb8e04f973a6131.json
generated
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"db_name": "SQLite",
|
||||
"query": "UPDATE controllers SET name = ?, relay_count = ? WHERE id = ?",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 3
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "f7b90a6a0af3f7d7c96158f96f1ada06827a0e5a2d2dbd48bfb8e04f973a6131"
|
||||
}
|
23
Makefile
23
Makefile
|
@ -1,24 +1,15 @@
|
|||
|
||||
build:
|
||||
cargo build
|
||||
|
||||
sqlx-prepare:
|
||||
rm -f ./emgauwa-dev.sqlite
|
||||
sqlx:
|
||||
cargo sqlx database drop
|
||||
cargo sqlx database create
|
||||
cargo sqlx migrate run
|
||||
|
||||
sqlx: sqlx-prepare
|
||||
cargo sqlx prepare --workspace
|
||||
|
||||
build-rpi:
|
||||
cross build --target arm-unknown-linux-gnueabihf
|
||||
|
||||
clean-db:
|
||||
rm ./emgauwa-*.sqlite || true
|
||||
$(MAKE) sqlx-prepare
|
||||
_local/emgauwa-%.json: config/emgauwa-%.pkl config/lib/%.pkl config/lib/common.pkl
|
||||
pkl eval -f json -o $@ $<
|
||||
|
||||
format:
|
||||
cargo +nightly fmt
|
||||
|
||||
lint:
|
||||
cargo clippy --all-targets --all-features -- -D warnings
|
||||
configs:
|
||||
$(MAKE) _local/emgauwa-core.json
|
||||
$(MAKE) _local/emgauwa-controller.json
|
||||
|
|
71
config/emgauwa-controller.pkl
Normal file
71
config/emgauwa-controller.pkl
Normal file
|
@ -0,0 +1,71 @@
|
|||
amends "./lib/controller.pkl"
|
||||
|
||||
server {
|
||||
host = "127.0.0.1"
|
||||
port = 4419
|
||||
}
|
||||
|
||||
database = "sqlite://_local/emgauwa-controller.sqlite"
|
||||
|
||||
permissions {
|
||||
user = "emgauwa"
|
||||
group = "emgauwa"
|
||||
}
|
||||
|
||||
logging {
|
||||
level = "DEBUG"
|
||||
file = "stdout"
|
||||
}
|
||||
|
||||
relays {
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 5
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 4
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 3
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 2
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 1
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 0
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 16
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "gpio"
|
||||
pin = 15
|
||||
inverted = true
|
||||
}
|
||||
new {
|
||||
driver = "piface"
|
||||
pin = 1
|
||||
inverted = false
|
||||
}
|
||||
new {
|
||||
driver = "piface"
|
||||
pin = 0
|
||||
inverted = false
|
||||
}
|
||||
}
|
18
config/emgauwa-core.pkl
Normal file
18
config/emgauwa-core.pkl
Normal file
|
@ -0,0 +1,18 @@
|
|||
amends "./lib/core.pkl"
|
||||
|
||||
server {
|
||||
host = "127.0.0.1"
|
||||
port = 4419
|
||||
}
|
||||
|
||||
database = "sqlite://_local/emgauwa-core.sqlite"
|
||||
|
||||
permissions {
|
||||
user = "emgauwa"
|
||||
group = "emgauwa"
|
||||
}
|
||||
|
||||
logging {
|
||||
level = "DEBUG"
|
||||
file = "stdout"
|
||||
}
|
15
config/lib/common.pkl
Normal file
15
config/lib/common.pkl
Normal file
|
@ -0,0 +1,15 @@
|
|||
class ServerConfig {
|
||||
host: String
|
||||
port: UInt16
|
||||
}
|
||||
|
||||
/// Set to a user and a group to drop privileges to after binding to the port
|
||||
class PermissionsConfig {
|
||||
user: String
|
||||
group: String
|
||||
}
|
||||
|
||||
class LoggingConfig {
|
||||
level: String
|
||||
file: String
|
||||
}
|
16
config/lib/controller.pkl
Normal file
16
config/lib/controller.pkl
Normal file
|
@ -0,0 +1,16 @@
|
|||
import "./common.pkl"
|
||||
|
||||
server: common.ServerConfig
|
||||
|
||||
database: String
|
||||
|
||||
permissions: common.PermissionsConfig
|
||||
|
||||
logging: common.LoggingConfig
|
||||
|
||||
class RelayConfig {
|
||||
driver: "gpio" | "piface"
|
||||
pin: Number
|
||||
inverted: Boolean
|
||||
}
|
||||
relays: Listing<RelayConfig>
|
12
config/lib/core.pkl
Normal file
12
config/lib/core.pkl
Normal file
|
@ -0,0 +1,12 @@
|
|||
import "./common.pkl"
|
||||
|
||||
server: common.ServerConfig
|
||||
|
||||
database: String
|
||||
|
||||
permissions: common.PermissionsConfig
|
||||
|
||||
logging: common.LoggingConfig
|
||||
|
||||
/// Leave empty to allow all origins (will always respond with Origin and not "*")
|
||||
origins: Listing<String>
|
|
@ -1,60 +0,0 @@
|
|||
database = "sqlite://emgauwa-controller.sqlite"
|
||||
name = "Emgauwa Controller"
|
||||
|
||||
[core]
|
||||
port = 4419
|
||||
host = "127.0.0.1"
|
||||
|
||||
[logging]
|
||||
level = "DEBUG"
|
||||
file = "stdout"
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 5
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 4
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 3
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 2
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 1
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 0
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 16
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "gpio"
|
||||
pin = 15
|
||||
inverted = 1
|
||||
|
||||
[[relays]]
|
||||
driver = "piface"
|
||||
pin = 1
|
||||
inverted = 0
|
||||
|
||||
[[relays]]
|
||||
driver = "piface"
|
||||
pin = 0
|
||||
inverted = 0
|
|
@ -4,7 +4,7 @@ use emgauwa_lib::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule
|
|||
use emgauwa_lib::errors::EmgauwaError;
|
||||
use emgauwa_lib::models::{Controller, FromDbModel};
|
||||
use emgauwa_lib::types::ControllerUid;
|
||||
use emgauwa_lib::utils::init_logging;
|
||||
use emgauwa_lib::utils::{drop_privileges, init_logging};
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::Sqlite;
|
||||
|
||||
|
@ -59,6 +59,9 @@ async fn create_this_relay(
|
|||
#[actix::main]
|
||||
async fn main() -> Result<(), std::io::Error> {
|
||||
let settings = settings::init()?;
|
||||
|
||||
drop_privileges(&settings.permissions)?;
|
||||
|
||||
init_logging(&settings.logging.level)?;
|
||||
|
||||
let pool = db::init(&settings.database)
|
||||
|
@ -105,7 +108,7 @@ async fn main() -> Result<(), std::io::Error> {
|
|||
|
||||
let url = format!(
|
||||
"ws://{}:{}/api/v1/ws/controllers",
|
||||
settings.core.host, settings.core.port
|
||||
settings.server.host, settings.server.port
|
||||
);
|
||||
|
||||
|
||||
|
|
|
@ -1,25 +1,9 @@
|
|||
use emgauwa_lib::errors::EmgauwaError;
|
||||
use emgauwa_lib::{constants, utils};
|
||||
use emgauwa_lib::settings;
|
||||
use serde_derive::Deserialize;
|
||||
|
||||
use crate::driver::Driver;
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Core {
|
||||
pub host: String,
|
||||
pub port: u16,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Logging {
|
||||
pub level: String,
|
||||
pub file: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
|
@ -35,9 +19,11 @@ pub struct Relay {
|
|||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Settings {
|
||||
pub core: Core,
|
||||
pub server: settings::Server,
|
||||
pub database: String,
|
||||
pub logging: Logging,
|
||||
pub permissions: settings::Permissions,
|
||||
pub logging: settings::Logging,
|
||||
|
||||
pub name: String,
|
||||
pub relays: Vec<Relay>,
|
||||
}
|
||||
|
@ -45,9 +31,11 @@ pub struct Settings {
|
|||
impl Default for Settings {
|
||||
fn default() -> Self {
|
||||
Settings {
|
||||
core: Core::default(),
|
||||
database: String::from("sqlite://emgauwa-controller.sqlite"),
|
||||
logging: Logging::default(),
|
||||
server: settings::Server::default(),
|
||||
database: String::from("sqlite://_local/emgauwa-controller.sqlite"),
|
||||
permissions: settings::Permissions::default(),
|
||||
logging: settings::Logging::default(),
|
||||
|
||||
name: String::from("Emgauwa Controller"),
|
||||
relays: Vec::new(),
|
||||
}
|
||||
|
@ -66,26 +54,8 @@ impl Default for Relay {
|
|||
}
|
||||
}
|
||||
|
||||
impl Default for Core {
|
||||
fn default() -> Self {
|
||||
Core {
|
||||
host: String::from("127.0.0.1"),
|
||||
port: constants::DEFAULT_PORT,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Logging {
|
||||
fn default() -> Self {
|
||||
Logging {
|
||||
level: String::from("info"),
|
||||
file: String::from("stdout"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init() -> Result<Settings, EmgauwaError> {
|
||||
let mut settings: Settings = utils::load_settings("controller", "CONTROLLER")?;
|
||||
let mut settings: Settings = settings::load("controller", "CONTROLLER")?;
|
||||
|
||||
for (num, relay) in settings.relays.iter_mut().enumerate() {
|
||||
if relay.number.is_none() {
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
port = 4419
|
||||
host = "127.0.0.1"
|
||||
|
||||
# Set to a user and a group to drop privileges to after binding to the port
|
||||
#user = "emgauwa"
|
||||
#group = "emgauwa"
|
||||
|
||||
# Leave empty to allow all origins (will always respond with Origin and not "*")
|
||||
#origins = ["http://localhost", "https://emgauwa.app"]
|
||||
|
||||
database = "sqlite://emgauwa-core.sqlite"
|
||||
|
||||
[logging]
|
||||
level = "DEBUG"
|
||||
file = "stdout"
|
|
@ -24,4 +24,3 @@ serde_derive = "1.0"
|
|||
sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio", "macros", "chrono"] }
|
||||
|
||||
futures = "0.3.29"
|
||||
libc = "0.2"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
fn main() {
|
||||
println!("cargo:rustc-env=DATABASE_URL=sqlite://emgauwa-core.sqlite")
|
||||
println!("cargo:rustc-env=DATABASE_URL=sqlite://_local/emgauwa-core.sqlite")
|
||||
}
|
||||
|
|
|
@ -6,10 +6,9 @@ use actix_web::middleware::TrailingSlash;
|
|||
use actix_web::{middleware, web, App, HttpServer};
|
||||
use emgauwa_lib::db::DbController;
|
||||
use emgauwa_lib::errors::EmgauwaError;
|
||||
use emgauwa_lib::utils::init_logging;
|
||||
use emgauwa_lib::utils::{drop_privileges, init_logging};
|
||||
|
||||
use crate::app_state::AppState;
|
||||
use crate::utils::drop_privileges;
|
||||
|
||||
mod app_state;
|
||||
mod handlers;
|
||||
|
@ -19,12 +18,12 @@ mod utils;
|
|||
#[actix_web::main]
|
||||
async fn main() -> Result<(), std::io::Error> {
|
||||
let settings = settings::init()?;
|
||||
|
||||
let listener = TcpListener::bind(format!("{}:{}", settings.server.host, settings.server.port))?;
|
||||
drop_privileges(&settings.permissions)?;
|
||||
|
||||
init_logging(&settings.logging.level)?;
|
||||
|
||||
let listener = TcpListener::bind(format!("{}:{}", settings.host, settings.port))?;
|
||||
|
||||
drop_privileges(&settings)?;
|
||||
|
||||
let pool = emgauwa_lib::db::init(&settings.database).await?;
|
||||
|
||||
let mut conn = pool.acquire().await.map_err(EmgauwaError::from)?;
|
||||
|
@ -35,7 +34,11 @@ async fn main() -> Result<(), std::io::Error> {
|
|||
|
||||
let app_state = AppState::new(pool.clone()).start();
|
||||
|
||||
log::info!("Starting server on {}:{}", settings.host, settings.port);
|
||||
log::info!(
|
||||
"Starting server on {}:{}",
|
||||
settings.server.host,
|
||||
settings.server.port
|
||||
);
|
||||
|
||||
HttpServer::new(move || {
|
||||
let cors = Cors::default().allow_any_method().allow_any_header();
|
||||
|
|
|
@ -1,57 +1,32 @@
|
|||
use emgauwa_lib::errors::EmgauwaError;
|
||||
use emgauwa_lib::{constants, utils};
|
||||
use emgauwa_lib::settings;
|
||||
use serde_derive::Deserialize;
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Logging {
|
||||
pub level: String,
|
||||
pub file: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Settings {
|
||||
pub server: settings::Server,
|
||||
pub database: String,
|
||||
pub permissions: settings::Permissions,
|
||||
pub logging: settings::Logging,
|
||||
|
||||
pub host: String,
|
||||
pub port: u16,
|
||||
pub origins: Vec<String>,
|
||||
|
||||
pub user: String,
|
||||
pub group: String,
|
||||
|
||||
pub logging: Logging,
|
||||
}
|
||||
|
||||
impl Default for Settings {
|
||||
fn default() -> Self {
|
||||
Settings {
|
||||
database: String::from("sqlite://emgauwa-core.sqlite"),
|
||||
server: settings::Server::default(),
|
||||
database: String::from("sqlite://_local/emgauwa-core.sqlite"),
|
||||
permissions: settings::Permissions::default(),
|
||||
logging: settings::Logging::default(),
|
||||
|
||||
host: String::from("127.0.0.1"),
|
||||
port: constants::DEFAULT_PORT,
|
||||
origins: Vec::new(),
|
||||
|
||||
user: String::from(""),
|
||||
group: String::from(""),
|
||||
|
||||
logging: Logging::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Logging {
|
||||
fn default() -> Self {
|
||||
Logging {
|
||||
level: String::from("info"),
|
||||
file: String::from("stdout"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init() -> Result<Settings, EmgauwaError> {
|
||||
utils::load_settings("core", "CORE")
|
||||
settings::load("core", "CORE")
|
||||
}
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
use std::ffi::CString;
|
||||
use std::io::{Error, ErrorKind};
|
||||
|
||||
use crate::settings::Settings;
|
||||
|
||||
pub fn flatten_result<T, E>(res: Result<Result<T, E>, E>) -> Result<T, E> {
|
||||
match res {
|
||||
Ok(Ok(t)) => Ok(t),
|
||||
|
@ -10,64 +5,3 @@ pub fn flatten_result<T, E>(res: Result<Result<T, E>, E>) -> Result<T, E> {
|
|||
Err(e) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
// https://blog.lxsang.me/post/id/28.0
|
||||
pub fn drop_privileges(settings: &Settings) -> Result<(), Error> {
|
||||
log::info!(
|
||||
"Dropping privileges to {}:{}",
|
||||
settings.user,
|
||||
settings.group
|
||||
);
|
||||
|
||||
// the group id need to be set first, because, when the user privileges drop,
|
||||
// we are unable to drop the group privileges
|
||||
if !settings.group.is_empty() {
|
||||
drop_privileges_group(&settings.group)?;
|
||||
}
|
||||
if !settings.user.is_empty() {
|
||||
drop_privileges_user(&settings.user)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn drop_privileges_group(group: &str) -> Result<(), Error> {
|
||||
// get the gid from username
|
||||
if let Ok(cstr) = CString::new(group.as_bytes()) {
|
||||
let p = unsafe { libc::getgrnam(cstr.as_ptr()) };
|
||||
if p.is_null() {
|
||||
log::error!("Unable to getgrnam of group: {}", group);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
if unsafe { libc::setgid((*p).gr_gid) } != 0 {
|
||||
log::error!("Unable to setgid of group: {}", group);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
} else {
|
||||
return Err(Error::new(
|
||||
ErrorKind::Other,
|
||||
"Cannot create CString from String (group)!",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn drop_privileges_user(user: &str) -> Result<(), Error> {
|
||||
// get the uid from username
|
||||
if let Ok(cstr) = CString::new(user.as_bytes()) {
|
||||
let p = unsafe { libc::getpwnam(cstr.as_ptr()) };
|
||||
if p.is_null() {
|
||||
log::error!("Unable to getpwnam of user: {}", user);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
if unsafe { libc::setuid((*p).pw_uid) } != 0 {
|
||||
log::error!("Unable to setuid of user: {}", user);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
} else {
|
||||
return Err(Error::new(
|
||||
ErrorKind::Other,
|
||||
"Cannot create CString from String (user)!",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -25,3 +25,4 @@ sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio", "macros", "chro
|
|||
libsqlite3-sys = { version = "*", features = ["bundled"] }
|
||||
uuid = "1.6"
|
||||
futures = "0.3"
|
||||
libc = "0.2"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
fn main() {
|
||||
println!("cargo:rerun-if-changed=migrations");
|
||||
println!("cargo:rustc-env=DATABASE_URL=sqlite://emgauwa-dev.sqlite");
|
||||
println!("cargo:rustc-env=DATABASE_URL=sqlite://_local/emgauwa-dev.sqlite");
|
||||
}
|
||||
|
|
|
@ -2,5 +2,6 @@ pub mod constants;
|
|||
pub mod db;
|
||||
pub mod errors;
|
||||
pub mod models;
|
||||
pub mod settings;
|
||||
pub mod types;
|
||||
pub mod utils;
|
||||
|
|
77
emgauwa-lib/src/settings.rs
Normal file
77
emgauwa-lib/src/settings.rs
Normal file
|
@ -0,0 +1,77 @@
|
|||
use serde_derive::Deserialize;
|
||||
|
||||
use crate::constants;
|
||||
use crate::errors::EmgauwaError;
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Server {
|
||||
pub host: String,
|
||||
pub port: u16,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Logging {
|
||||
pub level: String,
|
||||
pub file: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(default)]
|
||||
#[allow(unused)]
|
||||
pub struct Permissions {
|
||||
pub user: String,
|
||||
pub group: String,
|
||||
}
|
||||
|
||||
impl Default for Server {
|
||||
fn default() -> Self {
|
||||
Server {
|
||||
host: String::from("127.0.0.1"),
|
||||
port: constants::DEFAULT_PORT,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Logging {
|
||||
fn default() -> Self {
|
||||
Logging {
|
||||
level: String::from("info"),
|
||||
file: String::from("stdout"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Permissions {
|
||||
fn default() -> Self {
|
||||
Permissions {
|
||||
user: String::from(""),
|
||||
group: String::from(""),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn load<T>(config_name: &str, env_prefix: &str) -> Result<T, EmgauwaError>
|
||||
where
|
||||
for<'de> T: serde::Deserialize<'de>,
|
||||
{
|
||||
// TODO: Add switch to only include local config if in development mode
|
||||
let dev_file =
|
||||
config::File::with_name(&format!("./_local/emgauwa-{}", config_name)).required(false);
|
||||
let local_file = config::File::with_name(&format!("./emgauwa-{}", config_name)).required(false);
|
||||
|
||||
config::Config::builder()
|
||||
.add_source(dev_file)
|
||||
.add_source(local_file)
|
||||
.add_source(
|
||||
config::Environment::with_prefix(&format!("EMGAUWA_{}", env_prefix))
|
||||
.prefix_separator("__")
|
||||
.separator("__"),
|
||||
)
|
||||
.build()?
|
||||
.try_deserialize::<T>()
|
||||
.map_err(EmgauwaError::from)
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
use std::ffi::CString;
|
||||
use std::io::{Error, ErrorKind};
|
||||
use std::str::FromStr;
|
||||
|
||||
use chrono::Datelike;
|
||||
|
@ -5,25 +7,9 @@ use log::LevelFilter;
|
|||
use simple_logger::SimpleLogger;
|
||||
|
||||
use crate::errors::EmgauwaError;
|
||||
use crate::settings::Permissions;
|
||||
use crate::types::Weekday;
|
||||
|
||||
pub fn load_settings<T>(config_name: &str, env_prefix: &str) -> Result<T, EmgauwaError>
|
||||
where
|
||||
for<'de> T: serde::Deserialize<'de>,
|
||||
{
|
||||
let default_file = config::File::with_name(&format!("emgauwa-{}", config_name)).required(false);
|
||||
|
||||
config::Config::builder()
|
||||
.add_source(default_file)
|
||||
.add_source(
|
||||
config::Environment::with_prefix(&format!("EMGAUWA_{}", env_prefix))
|
||||
.prefix_separator("__")
|
||||
.separator("__"),
|
||||
)
|
||||
.build()?
|
||||
.try_deserialize::<T>()
|
||||
.map_err(EmgauwaError::from)
|
||||
}
|
||||
|
||||
pub fn init_logging(level: &str) -> Result<(), EmgauwaError> {
|
||||
let log_level: LevelFilter = LevelFilter::from_str(level)
|
||||
|
@ -38,6 +24,67 @@ pub fn init_logging(level: &str) -> Result<(), EmgauwaError> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
// https://blog.lxsang.me/post/id/28.0
|
||||
pub fn drop_privileges(permissions: &Permissions) -> Result<(), Error> {
|
||||
log::info!(
|
||||
"Dropping privileges to {}:{}",
|
||||
permissions.user,
|
||||
permissions.group
|
||||
);
|
||||
|
||||
// the group id need to be set first, because, when the user privileges drop,
|
||||
// we are unable to drop the group privileges
|
||||
if !permissions.group.is_empty() {
|
||||
drop_privileges_group(&permissions.group)?;
|
||||
}
|
||||
if !permissions.user.is_empty() {
|
||||
drop_privileges_user(&permissions.user)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn drop_privileges_group(group: &str) -> Result<(), Error> {
|
||||
// get the gid from username
|
||||
if let Ok(cstr) = CString::new(group.as_bytes()) {
|
||||
let p = unsafe { libc::getgrnam(cstr.as_ptr()) };
|
||||
if p.is_null() {
|
||||
log::error!("Unable to getgrnam of group: {}", group);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
if unsafe { libc::setgid((*p).gr_gid) } != 0 {
|
||||
log::error!("Unable to setgid of group: {}", group);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
} else {
|
||||
return Err(Error::new(
|
||||
ErrorKind::Other,
|
||||
"Cannot create CString from String (group)!",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn drop_privileges_user(user: &str) -> Result<(), Error> {
|
||||
// get the uid from username
|
||||
if let Ok(cstr) = CString::new(user.as_bytes()) {
|
||||
let p = unsafe { libc::getpwnam(cstr.as_ptr()) };
|
||||
if p.is_null() {
|
||||
log::error!("Unable to getpwnam of user: {}", user);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
if unsafe { libc::setuid((*p).pw_uid) } != 0 {
|
||||
log::error!("Unable to setuid of user: {}", user);
|
||||
return Err(Error::last_os_error());
|
||||
}
|
||||
} else {
|
||||
return Err(Error::new(
|
||||
ErrorKind::Other,
|
||||
"Cannot create CString from String (user)!",
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn get_weekday() -> Weekday {
|
||||
(chrono::offset::Local::now()
|
||||
.date_naive()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue