Gnuxie/appservice logging (#441)

* upgrade to matrix-appservice-bridge 8.0.0

this is so we can use their new logger

* Configure and use matrix-appservice-bridge's `Logger`

https://github.com/matrix-org/mjolnir/issues/422
Haven't changed all of the mjolnir components to use this,
just the appservice.
The fact that we've configured this properly means we get
logging from matrix-appservice-bridge components too (we didn't before).

* use try/catch instead
This commit is contained in:
Gnuxie 2022-11-30 13:30:38 +00:00 committed by GitHub
parent 38c5714027
commit e35b855744
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 66 additions and 31 deletions

View File

@ -53,7 +53,7 @@
"humanize-duration-ts": "^2.1.1", "humanize-duration-ts": "^2.1.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"jsdom": "^16.6.0", "jsdom": "^16.6.0",
"matrix-appservice-bridge": "^5.0.0", "matrix-appservice-bridge": "8.0.0",
"parse-duration": "^1.0.2", "parse-duration": "^1.0.2",
"pg": "^8.8.0", "pg": "^8.8.0",
"shell-quote": "^1.7.3", "shell-quote": "^1.7.3",

View File

@ -3,7 +3,9 @@ import express from "express";
import * as bodyParser from "body-parser"; import * as bodyParser from "body-parser";
import { MjolnirManager } from "./MjolnirManager"; import { MjolnirManager } from "./MjolnirManager";
import * as http from "http"; import * as http from "http";
import { Logger } from "matrix-appservice-bridge";
const log = new Logger("Api");
/** /**
* This provides a web api that is designed to power the mjolnir widget https://github.com/matrix-org/mjolnir-widget. * This provides a web api that is designed to power the mjolnir widget https://github.com/matrix-org/mjolnir-widget.
*/ */
@ -28,7 +30,7 @@ export class Api {
qs: { access_token: accessToken }, qs: { access_token: accessToken },
}, (err, homeserver_response, body) => { }, (err, homeserver_response, body) => {
if (err) { if (err) {
console.error(`Error resolving openID token from ${this.homeserver}`, err); log.error(`Error resolving openID token from ${this.homeserver}`, err);
reject(null); reject(null);
} }
@ -36,7 +38,7 @@ export class Api {
try { try {
response = JSON.parse(body); response = JSON.parse(body);
} catch (e) { } catch (e) {
console.error(`Received ill formed response from ${this.homeserver} when resolving an openID token`, e); log.error(`Received ill formed response from ${this.homeserver} when resolving an openID token`, e);
reject(null); reject(null);
return; return;
} }

View File

@ -14,13 +14,14 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import { AppServiceRegistration, Bridge, Request, WeakEvent, BridgeContext, MatrixUser } from "matrix-appservice-bridge"; import { AppServiceRegistration, Bridge, Request, WeakEvent, BridgeContext, MatrixUser, Logger } from "matrix-appservice-bridge";
import { MjolnirManager } from ".//MjolnirManager"; import { MjolnirManager } from ".//MjolnirManager";
import { DataStore, PgDataStore } from ".//datastore"; import { DataStore, PgDataStore } from ".//datastore";
import { Api } from "./Api"; import { Api } from "./Api";
import { IConfig } from "./config/config"; import { IConfig } from "./config/config";
import { AccessControl } from "./AccessControl"; import { AccessControl } from "./AccessControl";
const log = new Logger("AppService");
/** /**
* Responsible for setting up listeners and delegating functionality to a matrix-appservice-bridge `Bridge` for * Responsible for setting up listeners and delegating functionality to a matrix-appservice-bridge `Bridge` for
* the entrypoint of the application. * the entrypoint of the application.
@ -64,7 +65,7 @@ export class MjolnirAppService {
}, },
suppressEcho: false, suppressEcho: false,
}); });
await bridge.initalise(); await bridge.initialise();
const accessControlListId = await bridge.getBot().getClient().resolveRoom(config.accessControlList); const accessControlListId = await bridge.getBot().getClient().resolveRoom(config.accessControlList);
const accessControl = await AccessControl.setupAccessControl(accessControlListId, bridge); const accessControl = await AccessControl.setupAccessControl(accessControlListId, bridge);
const mjolnirManager = await MjolnirManager.makeMjolnirManager(dataStore, bridge, accessControl); const mjolnirManager = await MjolnirManager.makeMjolnirManager(dataStore, bridge, accessControl);
@ -89,6 +90,7 @@ export class MjolnirAppService {
* @param registrationFilePath A path to their homeserver registration file. * @param registrationFilePath A path to their homeserver registration file.
*/ */
public static async run(port: number, config: IConfig, registrationFilePath: string): Promise<MjolnirAppService> { public static async run(port: number, config: IConfig, registrationFilePath: string): Promise<MjolnirAppService> {
Logger.configure(config.logging ?? { console: "debug" });
const dataStore = new PgDataStore(config.db.connectionString); const dataStore = new PgDataStore(config.db.connectionString);
await dataStore.init(); await dataStore.init();
const service = await MjolnirAppService.makeMjolnirAppService(config, dataStore, registrationFilePath); const service = await MjolnirAppService.makeMjolnirAppService(config, dataStore, registrationFilePath);
@ -114,11 +116,19 @@ export class MjolnirAppService {
// Acts as an alternative to the web api provided for the widget. // Acts as an alternative to the web api provided for the widget.
if ('m.room.member' === mxEvent.type) { if ('m.room.member' === mxEvent.type) {
if ('invite' === mxEvent.content['membership'] && mxEvent.state_key === this.bridge.botUserId) { if ('invite' === mxEvent.content['membership'] && mxEvent.state_key === this.bridge.botUserId) {
await this.mjolnirManager.provisionNewMjolnir(mxEvent.sender); log.info(`${mxEvent.sender} has sent an invitation to the appservice bot ${this.bridge.botUserId}, attempting to provision them a mjolnir`);
try {
await this.mjolnirManager.provisionNewMjolnir(mxEvent.sender)
} catch (e: any) {
log.error(`Failed to provision a mjolnir for ${mxEvent.sender} after they invited ${this.bridge.botUserId}:`, e);
// continue, we still want to reject this invitation.
}
try {
// reject the invite to keep the room clean and make sure the invetee doesn't get confused and think this is their mjolnir. // reject the invite to keep the room clean and make sure the invetee doesn't get confused and think this is their mjolnir.
this.bridge.getBot().getClient().leaveRoom(mxEvent.room_id).catch(e => { await this.bridge.getBot().getClient().leaveRoom(mxEvent.room_id);
console.warn("Unable to reject an invite to a room", e) } catch (e: any) {
}); log.warn("Unable to reject an invite to a room", e);
}
} }
} }
this.accessControl.handleEvent(mxEvent['room_id'], mxEvent); this.accessControl.handleEvent(mxEvent['room_id'], mxEvent);
@ -130,10 +140,10 @@ export class MjolnirAppService {
* @param port The port that the appservice should listen on to receive transactions from the homeserver. * @param port The port that the appservice should listen on to receive transactions from the homeserver.
*/ */
private async start(port: number) { private async start(port: number) {
console.log("Starting MjolnirAppService, Matrix-side to listen on port %s", port); log.info("Starting MjolnirAppService, Matrix-side to listen on port", port);
this.api.start(this.config.webAPI.port); this.api.start(this.config.webAPI.port);
await this.bridge.listen(port); await this.bridge.listen(port);
console.log("MjolnirAppService started successfully"); log.info("MjolnirAppService started successfully");
} }
/** /**

View File

@ -16,6 +16,7 @@ limitations under the License.
import * as fs from "fs"; import * as fs from "fs";
import { load } from "js-yaml"; import { load } from "js-yaml";
import { LoggingOpts } from "matrix-appservice-bridge";
export interface IConfig { export interface IConfig {
/** Details for the homeserver the appservice will be serving */ /** Details for the homeserver the appservice will be serving */
@ -36,6 +37,8 @@ export interface IConfig {
}, },
/** A policy room for controlling access to the appservice */ /** A policy room for controlling access to the appservice */
accessControlList: string, accessControlList: string,
/** configuration for matrix-appservice-bridge's Logger */
logging?: LoggingOpts,
} }
export function read(configPath: string): IConfig { export function read(configPath: string): IConfig {

View File

@ -247,6 +247,13 @@
pg-protocol "*" pg-protocol "*"
pg-types "^2.2.0" pg-types "^2.2.0"
"@types/pkginfo@^0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@types/pkginfo/-/pkginfo-0.4.0.tgz#00143b97e98aa7c9391943266d2e4aebd8f44c35"
integrity sha512-4DGKkOlWkMuVDZQvytWzzWWAjyqDmlLKRYE4lzeA8t0s7fK0aF25uPbX9eBVermUjLJdeLHu9k1WmNiAssqCcg==
dependencies:
"@types/node" "*"
"@types/qs@*": "@types/qs@*":
version "6.9.7" version "6.9.7"
resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz"
@ -2201,12 +2208,13 @@ make-error@^1.1.1:
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
matrix-appservice-bridge@^5.0.0: matrix-appservice-bridge@8.0.0:
version "5.0.0" version "8.0.0"
resolved "https://registry.yarnpkg.com/matrix-appservice-bridge/-/matrix-appservice-bridge-5.0.0.tgz#e3b42f9c1bef9c2a5fe51c47e2232ea3040852d0" resolved "https://registry.yarnpkg.com/matrix-appservice-bridge/-/matrix-appservice-bridge-8.0.0.tgz#6849ac05c281399b2c2b35daba784f8291d3b35d"
integrity sha512-d+F2RN/6o4TtBHOgcNECXX/UGjqM4zuWK14hmnzHHdrQi/Xuq9GSO14jMKsl1Jc0Kbkpv9cFMfhy27yo/Ju7/w== integrity sha512-XFo3avVfKb34d7kalXcsi0vThlnqmrwvewcfhjintmpbFlwu54/lvdbykFSyu2kT8BY1zUtDz7iQ3Q3RAyaN1g==
dependencies: dependencies:
"@alloc/quick-lru" "^5.2.0" "@alloc/quick-lru" "^5.2.0"
"@types/pkginfo" "^0.4.0"
axios "^0.27.2" axios "^0.27.2"
chalk "^4.1.0" chalk "^4.1.0"
express "^4.18.1" express "^4.18.1"
@ -2215,20 +2223,22 @@ matrix-appservice-bridge@^5.0.0:
ip-cidr "^3.0.4" ip-cidr "^3.0.4"
is-my-json-valid "^2.20.5" is-my-json-valid "^2.20.5"
js-yaml "^4.0.0" js-yaml "^4.0.0"
matrix-appservice "^1.0.0" matrix-appservice "^1.1.0"
matrix-bot-sdk "^0.6.1" matrix-bot-sdk "^0.6.2"
nedb "^1.8.0" nedb "^1.8.0"
nopt "^5.0.0" nopt "^5.0.0"
p-queue "^6.6.2" p-queue "^6.6.2"
prom-client "^14.0.0" pkginfo "^0.4.1"
postgres "^3.3.1"
prom-client "^14.1.0"
uuid "^8.3.2" uuid "^8.3.2"
winston "^3.3.3" winston "^3.3.3"
winston-daily-rotate-file "^4.5.1" winston-daily-rotate-file "^4.5.1"
matrix-appservice@^1.0.0: matrix-appservice@^1.1.0:
version "1.0.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/matrix-appservice/-/matrix-appservice-1.0.0.tgz#8a1225b248131eb8d37618bd88f76d705c647c28" resolved "https://registry.yarnpkg.com/matrix-appservice/-/matrix-appservice-1.1.0.tgz#e567945042000485e4ea4bfeef92246e93296f01"
integrity sha512-SoWTp92xKsKiC6T8147gTxChyp0aNisxLWtX15vGMIeIdV3ZsUzoQsLVhABzuVzW1ExZ5FAoD1HpYz1Du9lk6A== integrity sha512-6hJdmo9YIbh6dS9MfMHCpHMhklN/+NOcfGQ/3UbbEEfIE8dt0bHqi1nnIiias5IqDFl6ED9y+YQdtyqnIXx+Ww==
dependencies: dependencies:
"@types/express" "^4.17.8" "@types/express" "^4.17.8"
body-parser "^1.19.0" body-parser "^1.19.0"
@ -2236,10 +2246,10 @@ matrix-appservice@^1.0.0:
js-yaml "^4.1.0" js-yaml "^4.1.0"
morgan "^1.10.0" morgan "^1.10.0"
matrix-bot-sdk@^0.6.1: matrix-bot-sdk@^0.6.2:
version "0.6.1" version "0.6.2"
resolved "https://registry.yarnpkg.com/matrix-bot-sdk/-/matrix-bot-sdk-0.6.1.tgz#29c5d92fd6bc2eb0f6be2540ed133d8ffadaed93" resolved "https://registry.yarnpkg.com/matrix-bot-sdk/-/matrix-bot-sdk-0.6.2.tgz#c9334b39f62a9742d74e46312def566429dfef26"
integrity sha512-xbSQUpbuQq9Oj5f5GeprKndJZqdB9N9majg+VwIEcBGBscpWCskX32kTaoNhTHAE92XlM+qnwFME45TYElf4tA== integrity sha512-+kXlXkQBQgWC6oUwYEosJlXjceaj7jQUnPlALFhGeAabgVm8tmuvFNVKqClwvrrjj+0Gzsmt+rcJHmkvqymFXA==
dependencies: dependencies:
"@matrix-org/matrix-sdk-crypto-nodejs" "^0.1.0-beta.1" "@matrix-org/matrix-sdk-crypto-nodejs" "^0.1.0-beta.1"
"@types/express" "^4.17.13" "@types/express" "^4.17.13"
@ -2718,6 +2728,11 @@ pify@^3.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
pkginfo@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==
postcss@^8.3.11: postcss@^8.3.11:
version "8.4.16" version "8.4.16"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
@ -2749,6 +2764,11 @@ postgres-interval@^1.1.0:
dependencies: dependencies:
xtend "^4.0.0" xtend "^4.0.0"
postgres@^3.3.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.3.2.tgz#91f2e209e4a08ca7101eb7178734e4c0e4d23eb3"
integrity sha512-NaPqFpUC6C7aCQkJXLvuO/3RKNKL4en8opY53YrcXK3//xXra6CZ2qX6290lxuQ1dW1LbRGYCmsawRlCxSBonQ==
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@ -2774,10 +2794,10 @@ progress@^2.0.0:
resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
prom-client@^14.0.0: prom-client@^14.1.0:
version "14.0.1" version "14.1.0"
resolved "https://registry.npmjs.org/prom-client/-/prom-client-14.0.1.tgz" resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-14.1.0.tgz#049609859483d900844924df740722c76ed1fdbb"
integrity sha512-HxTArb6fkOntQHoRGvv4qd/BkorjliiuO2uSWC2KC17MUTKYttWdDoXX/vxOhQdkoECEM9BBH0pj2l8G8kev6w== integrity sha512-iFWCchQmi4170omLpFXbzz62SQTmPhtBL35v0qGEVRHKcqIeiexaoYeP0vfZTujxEq3tA87iqOdRbC9svS1B9A==
dependencies: dependencies:
tdigest "^0.1.1" tdigest "^0.1.1"