feat(cloudron): add tirreno package artifacts

- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents
- Includes package manifest, Dockerfile, source code, documentation, and build artifacts
- Add tirreno-1761840148.tar.gz as a build artifact
- Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package
- Include all necessary files for the tirreno Cloudron package

This adds the complete tirreno Cloudron package artifacts to the repository.
This commit is contained in:
2025-10-30 11:43:06 -05:00
parent 0ce353ea9d
commit 91d52d2de5
1692 changed files with 202851 additions and 0 deletions

View File

@@ -0,0 +1,258 @@
<?php
/**
* Tirreno ~ Open source user analytics
* Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
*
* Licensed under GNU Affero General Public License version 3 of the or any later version.
* For full copyright and license information, please see the LICENSE
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
* @link https://www.tirreno.com Tirreno(tm)
*/
namespace Updates;
class Update002 extends Base {
public static $version = 'v0.9.6';
private static $rulesMap = [
29 => 'E20',
24 => 'B19',
19 => 'B04',
44 => 'E27',
4 => 'B07',
1 => 'I01',
9 => 'E19',
99 => 'E05',
82 => 'E10',
10 => 'D06',
15 => 'E13',
2 => 'I06',
102 => 'E08',
84 => 'P02',
23 => 'I08',
63 => 'D02',
100 => 'E06',
7 => 'E12',
87 => 'B08',
74 => 'E24',
20 => 'B05',
46 => 'C01',
8 => 'E16',
3 => 'E01',
109 => 'B23',
16 => 'A01',
25 => 'D07',
11 => 'B01',
65 => 'D03',
67 => 'A03',
54 => 'C08',
50 => 'C04',
17 => 'B02',
81 => 'D08',
47 => 'C02',
62 => 'D01',
18 => 'B03',
22 => 'B06',
14 => 'E11',
72 => 'A08',
86 => 'E15',
35 => 'C16',
12 => 'I09',
5 => 'E17',
6 => 'E02',
106 => 'R03',
48 => 'P04',
104 => 'R01',
105 => 'R02',
41 => 'B20',
45 => 'E28',
88 => 'B09',
97 => 'E03',
77 => 'B12',
78 => 'D09',
85 => 'P01',
94 => 'B16',
57 => 'I03',
40 => 'B18',
58 => 'B21',
69 => 'A05',
75 => 'E25',
89 => 'B10',
83 => 'E14',
31 => 'E22',
80 => 'B14',
73 => 'E23',
96 => 'P03',
68 => 'A04',
101 => 'E07',
64 => 'I04',
26 => 'D04',
27 => 'D05',
79 => 'E26',
95 => 'B13',
53 => 'C07',
43 => 'I11',
37 => 'E29',
71 => 'A07',
66 => 'A02',
93 => 'B15',
30 => 'E21',
60 => 'I02',
59 => 'I05',
42 => 'B17',
76 => 'B11',
38 => 'E30',
61 => 'I07',
28 => 'I10',
39 => 'D10',
70 => 'A06',
98 => 'E04',
21 => 'C11',
103 => 'E09',
49 => 'C03',
52 => 'C06',
108 => 'I12',
33 => 'C14',
55 => 'C09',
56 => 'C10',
32 => 'C13',
36 => 'C12',
107 => 'B22',
51 => 'C05',
34 => 'C15',
110 => 'B24',
];
public static function apply($db) {
$queries = [
'INSERT INTO dshb_rules (id) VALUES (109), (110)',
'CREATE INDEX event_account_lastseen_key_idx ON event_account USING btree (lastseen, key)',
'CREATE INDEX event_url_lastseen_key_idx ON event_url USING btree (lastseen, key)',
'CREATE INDEX event_time_key_idx ON event USING btree (time, key)',
'CREATE INDEX event_account_latest_decision_key_idx ON event_account USING btree (latest_decision, key)',
'CREATE INDEX event_country_lastseen_key_idx ON event_country USING btree (lastseen, key)',
'CREATE INDEX event_ip_lastseen_key_idx ON event_ip USING btree (lastseen, key)',
'ALTER TABLE dshb_rules ADD COLUMN validated BOOLEAN NOT NULL DEFAULT false',
'ALTER TABLE dshb_rules ADD COLUMN uid VARCHAR',
'ALTER TABLE dshb_rules ADD COLUMN name VARCHAR',
'ALTER TABLE dshb_rules ADD COLUMN descr VARCHAR',
'ALTER TABLE dshb_rules ADD COLUMN attributes JSONB DEFAULT \'[]\' NOT NULL',
'ALTER TABLE dshb_rules ADD COLUMN updated TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL',
'ALTER TABLE dshb_rules ADD COLUMN missing BOOLEAN',
'DELETE FROM dshb_rules WHERE id IN (13, 90, 91, 92)',
'UPDATE event_error_type SET name = \'Success\' WHERE id = 0',
'UPDATE event_error_type SET name = \'Success with warnings\' WHERE id = 1',
];
foreach ($queries as $sql) {
$db->exec($sql);
}
$sql = 'SELECT id FROM dshb_rules';
$rulesIds = array_column($db->exec($sql), 'id');
$rules = self::extendIds($rulesIds);
// extend rules data
foreach ($rules as $id => $rule) {
$params = [
':validated' => true,
':id' => $id,
':uid' => $rule['uid'],
':name' => $rule['name'],
':descr' => $rule['descr'],
':attributes' => json_encode($rule['attributes']),
];
$query = (
'INSERT INTO dshb_rules (id, uid, name, descr, validated, attributes)
VALUES (:id, :uid, :name, :descr, :validated, :attributes)
ON CONFLICT (id) DO UPDATE
SET uid = EXCLUDED.uid, name = EXCLUDED.name, descr = EXCLUDED.descr,
validated = EXCLUDED.validated, attributes = EXCLUDED.attributes'
);
$db->exec($query, $params);
}
// add uid to dshb_operators_rules
$sql = 'ALTER TABLE dshb_operators_rules ADD COLUMN rule_uid VARCHAR';
$db->exec($sql);
foreach ($rulesIds as $id) {
$sql = 'UPDATE dshb_operators_rules SET rule_uid = :uid WHERE rule_id = :id';
$db->exec($sql, [':id' => $id, ':uid' => self::$rulesMap[$id]]);
}
// update event_account score details
$sql = 'ALTER TABLE event_account ALTER COLUMN score_details TYPE JSONB USING score_details::jsonb';
$db->exec($sql);
$sql = (
'UPDATE event_account
SET score_details = (
SELECT jsonb_agg((elem - \'id\') || jsonb_build_object(\'uid\', dshb_rules.uid))
FROM jsonb_array_elements(score_details) AS elem
JOIN dshb_rules
ON (elem->>\'id\')::int = dshb_rules.id
)
WHERE event_account.score_details IS NOT NULL'
);
$db->exec($sql);
// cleanup
$queries = [
'ALTER TABLE dshb_operators_rules DROP COLUMN rule_id',
'ALTER TABLE dshb_rules ALTER COLUMN uid SET NOT NULL',
'ALTER TABLE dshb_rules ALTER COLUMN name SET NOT NULL',
'ALTER TABLE dshb_rules ALTER COLUMN descr SET NOT NULL',
'ALTER TABLE dshb_rules DROP COLUMN id',
'ALTER TABLE dshb_rules ADD CONSTRAINT dshb_rules_uid_pkey PRIMARY KEY (uid)',
'ALTER TABLE dshb_operators_rules ADD CONSTRAINT dshb_operators_rules_rule_uid_fkey FOREIGN KEY (rule_uid) REFERENCES dshb_rules(uid) ON DELETE CASCADE',
'CREATE INDEX event_account_score_details_idx ON event_account USING GIN (score_details)',
];
foreach ($queries as $sql) {
$db->exec($sql);
}
}
public static function extendIds(array $ids): array {
$results = [];
$rules = self::getCoreRulesMetadata();
foreach ($ids as $id) {
$uid = self::$rulesMap[$id];
if (isset($rules[$uid])) {
$results[$id] = $rules[$uid];
}
}
return $results;
}
private static function getCoreRulesMetadata(): array {
$rules = \Utils\RulesClasses::getRulesClasses(true);
$out = [];
foreach ($rules['imported'] as $uid => $cls) {
try {
$out[$uid] = [
'uid' => $uid,
'name' => $cls::NAME,
'descr' => $cls::DESCRIPTION,
'attributes' => $cls::ATTRIBUTES,
];
} catch (\Throwable $e) {
error_log('Fail on const call: ' . $e->getMessage());
}
}
return $out;
}
}