read a value from meta table

This commit is contained in:
naskya 2024-06-20 03:19:20 +09:00
parent 1b281d7b36
commit ad6b7d0c1b
Signed by: naskya
GPG key ID: 712D413B3A9FED5C
7 changed files with 1376 additions and 197 deletions

View file

@ -1,181 +1,16 @@
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Firefish configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# After starting your server, please don't change the URL! Doing so will break federation.
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
url: https://example.com/
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
#
# Firefish requires a reverse proxy to support HTTPS connections.
#
# +----- https://example.com/ ------------+
# +------+ |+-------------+ +----------------+|
# | User | ---> || Proxy (443) | ---> | Firefish (3000) ||
# +------+ |+-------------+ +----------------+|
# +---------------------------------------+
#
# You need to set up a reverse proxy. (e.g. nginx, caddy)
# An encrypted connection with HTTPS is highly recommended
# because tokens may be transferred in GET requests.
# The port that your Firefish server should listen on.
port: 3000
# The bind host your Firefish server should listen on.
# If unspecified, the wildcard address will be used.
bind: 127.0.0.1
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
url: http://localhost:3030
port: 3030
db:
host: localhost
port: 5432
#ssl: false
# Database name
db: firefish_db
port: 25432
# Auth
db: firefish_db
user: firefish
pass: password
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl:
# host: localhost
# rejectUnauthorized: false
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
host: localhost
port: 6379
#tls:
# host: localhost
# rejectUnauthorized: false
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
#user: default
port: 26379
# ┌─────────────────────────────┐
#───┘ Cache server configuration └─────────────────────────────────────
# A Redis-compatible server (DragonflyDB, Keydb, Redis) for caching
# If left blank, it will use the Redis server from above
#cacheServer:
#host: localhost
#port: 6379
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
# ┌───────────────┐
#───┘ ID generation └───────────────────────────────────────────
# No need to uncomment in most cases, but you may want to change
# these settings if you plan to run a large and/or distributed server.
cuid:
# Min 16, Max 24
length: 16
# # Set this to a unique string across workers (e.g., machine's hostname)
# # if your workers are running in multiple hosts.
fingerprint: my-fingerprint
# ┌─────────────────────┐
#───┘ Other configuration └─────────────────────────────────────
# Maximum length of a post (default 3000, max 100000)
maxNoteLength: 3000
# Maximum length of an image caption (default 1500, max 8192)
maxCaptionLength: 1500
# Reserved usernames that only the administrator can register with
reservedUsernames: [
'root',
'admin',
'administrator',
'me',
'system'
]
# Whether disable HSTS
#disableHsts: true
# Number of worker processes by type.
# The sum must not exceed the number of available cores.
clusterLimits:
web: 1
queue: 1
# Job concurrency per worker
deliverJobConcurrency: 128
inboxJobConcurrency: 16
# Job rate limiter
deliverJobPerSec: 128
inboxJobPerSec: 16
# Job attempts
deliverJobMaxAttempts: 12
inboxJobMaxAttempts: 8
# Local address used for outgoing requests
outgoingAddress: 127.0.0.1
# IP address family used for outgoing request (ipv4, ipv6 or dual)
outgoingAddressFamily: ipv4
# Log level (error, warning, info, debug, trace)
# Production env: info
# Production env whose storage space or IO is tight: warning
# Debug/Test env or Troubleshooting: debug (or trace)
maxLogLevel: info
# Syslog option
#syslog:
# host: localhost
# port: 514
# Proxy for HTTP/HTTPS
proxy: http://127.0.0.1:3128
proxyBypassHosts: [
'web.kaiteki.app',
'example.com',
'192.0.2.8'
]
# Proxy for SMTP/SMTPS
proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
proxyRemoteFiles: true
allowedPrivateNetworks: [
'127.0.0.1/32'
]
# Upload or download file size limits (bytes)
maxFileSize: 262144000
maxLogLevel: 'debug'

1319
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -10,6 +10,8 @@ clap = { version = "4.5", features = ["derive"] }
color-print = "0.3"
thiserror = "1.0"
serde = { version = "1.0", features = ["derive"] }
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }
tokio = { version = "1.38", features = ["full"] }
toml = "0.8"
validator = { version = "0.18", features = ["derive"] }
yaml-rust = "0.4"

View file

@ -26,9 +26,9 @@ pub(crate) enum Error {
Validate(#[from] validate::ConfigValidateError),
}
pub(crate) fn run(command: Commands) -> Result<(), Error> {
pub(crate) async fn run(command: Commands) -> Result<(), Error> {
match command {
Commands::Migrate { version } => migrate::run(version)?,
Commands::Migrate { version } => migrate::run(version).await?,
Commands::Validate => validate::run()?,
}

View file

@ -4,13 +4,13 @@ use super::ConfigVersion;
#[derive(thiserror::Error, Debug)]
pub(crate) enum ConfigMigrateError {
#[error("failed to parse the old config file (.config/default.yml)")]
ReadOldConfig(#[from] v20240701::ReadYamlConfigError),
#[error(transparent)]
V20240701(#[from] v20240701::Error),
}
pub(super) fn run(version: ConfigVersion) -> Result<(), ConfigMigrateError> {
pub(super) async fn run(version: ConfigVersion) -> Result<(), ConfigMigrateError> {
match version {
ConfigVersion::V20240701 => v20240701::run()?,
ConfigVersion::V20240701 => v20240701::run().await?,
}
Ok(())

View file

@ -1,6 +1,15 @@
use sqlx::{postgres::PgConnectOptions, ConnectOptions};
use std::{collections::HashMap, env, fs, io::Read};
use yaml_rust::{Yaml, YamlLoader};
#[derive(thiserror::Error, Debug)]
pub(crate) enum Error {
#[error("failed to parse the old config file (.config/default.yml)")]
ReadYaml(#[from] ReadYamlConfigError),
#[error("failed to read the meta table")]
ReadMeta(#[from] sqlx::Error),
}
#[derive(thiserror::Error, Debug)]
pub(crate) enum ReadYamlConfigError {
#[error(transparent)]
@ -53,12 +62,47 @@ fn read_default_yml() -> Result<HashMap<String, Yaml>, ReadYamlConfigError> {
Ok(res)
}
pub(super) fn run() -> Result<(), ReadYamlConfigError> {
let old_config = read_default_yml()?;
async fn read_meta_table(
host: &str,
port: u16,
username: &str,
password: &str,
database: &str,
) -> Result<(), sqlx::Error> {
let mut conn = PgConnectOptions::new()
.host(host)
.port(port)
.username(username)
.password(password)
.database(database)
.connect()
.await?;
for (k, v) in old_config {
println!("{}:\n {:?}", k, v);
}
let (disable_local_timeline,): (bool,) =
sqlx::query_as(r#"SELECT "disableLocalTimeline" FROM "meta""#)
.fetch_one(&mut conn)
.await?;
println!("enable_local_timeline: {}", !disable_local_timeline);
Ok(())
}
pub(super) async fn run() -> Result<(), Error> {
let old_config = read_default_yml()?;
for (k, v) in &old_config {
println!("{}:\n {:?}", k, v);
}
read_meta_table(
old_config["db"]["host"].as_str().unwrap(),
old_config["db"]["port"].as_i64().unwrap() as u16,
old_config["db"]["user"].as_str().unwrap(),
old_config["db"]["pass"].as_str().unwrap(),
old_config["db"]["db"].as_str().unwrap(),
)
.await?;
Ok(())
}

View file

@ -20,19 +20,20 @@ enum Commands {
Config(command::config::Commands),
}
fn run() -> Result<(), command::Error> {
async fn run() -> Result<(), command::Error> {
let args = Args::parse();
match args.command {
Commands::Version => command::version::run(),
Commands::Config(subcommand) => command::config::run(subcommand)?,
Commands::Config(subcommand) => command::config::run(subcommand).await?,
}
Ok(())
}
fn main() {
let res = run();
#[tokio::main]
async fn main() {
let res = run().await;
if let Err(err) = res {
println!("An error occurred!");