1
0
mirror of git://f0xx.org/android_cast synced 2026-07-29 04:57:40 +03:00

small sync

This commit is contained in:
Anton Afanasyeu
2026-06-12 18:48:03 +02:00
parent 170211ef1f
commit 539341d8f1
8 changed files with 653 additions and 133 deletions

View File

@@ -0,0 +1,103 @@
#!/usr/bin/env php81
<?php
/**
* Restore url-shortener prod config after rsync/submodule deploy (config.php is gitignored).
*
* On BE (as user that can read crashes config.php):
* php81 examples/crash_reporter/backend/scripts/ensure_url_shortener_prod_config.php
*
* - Writes backend/url-shortener/config/config.php (via apps/s symlink when present)
* - Ensures crashes config.php has url_shortener.enabled + db block
*/
declare(strict_types=1);
$repoRoot = realpath(dirname(__DIR__, 3)) ?: dirname(__DIR__, 3);
$crashConfigPath = $repoRoot . '/examples/crash_reporter/backend/config/config.php';
$urlConfigDir = $repoRoot . '/backend/url-shortener/config';
$urlConfigPath = $urlConfigDir . '/config.php';
$sLink = '/var/www/localhost/htdocs/apps/s';
if (is_link($sLink)) {
$resolved = realpath($sLink);
if ($resolved !== false) {
$urlConfigDir = $resolved . '/config';
$urlConfigPath = $urlConfigDir . '/config.php';
}
}
function fail(string $msg): void {
fwrite(STDERR, "ensure_url_shortener_prod_config: $msg\n");
exit(1);
}
if (!is_readable($crashConfigPath)) {
fail("missing crashes config: $crashConfigPath");
}
/** @var array<string,mixed> $crash */
$crash = require $crashConfigPath;
$m = $crash['db']['mysql'] ?? null;
if (!is_array($m) || ($m['password'] ?? '') === '') {
fail('crashes db.mysql.password not set in config.php');
}
$user = (string) ($m['username'] ?? 'androidcast');
$pass = (string) $m['password'];
$socket = (string) ($m['socket'] ?? '/run/mysqld/mysqld.sock');
try {
$pdo = new PDO(
"mysql:unix_socket={$socket};dbname=url_shortener;charset=utf8mb4",
$user,
$pass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$pdo->query('SELECT 1');
} catch (Throwable $e) {
fail('url_shortener DB ping failed: ' . $e->getMessage());
}
$urlBlock = [
'db' => [
'driver' => 'mysql',
'mysql' => [
'host' => '127.0.0.1',
'port' => 3306,
'socket' => $socket,
'database' => 'url_shortener',
'username' => $user,
'password' => $pass,
'charset' => 'utf8mb4',
],
],
'public_base' => 'https://s.f0xx.org',
];
if (!is_dir($urlConfigDir)) {
fail("url-shortener config dir missing: $urlConfigDir");
}
file_put_contents($urlConfigPath, "<?php\nreturn " . var_export($urlBlock, true) . ";\n");
chmod($urlConfigPath, 0644);
$crashUrl = [
'enabled' => true,
'public_base' => 'https://s.f0xx.org',
'db' => [
'mysql' => [
'host' => '127.0.0.1',
'port' => 3306,
'socket' => $socket,
'database' => 'url_shortener',
'username' => $user,
'password' => $pass,
'charset' => 'utf8mb4',
],
],
];
$crash['url_shortener'] = $crashUrl;
file_put_contents($crashConfigPath, "<?php\nreturn " . var_export($crash, true) . ";\n");
echo "ok: $urlConfigPath\n";
echo "ok: crashes url_shortener.enabled=true\n";

View File

@@ -106,25 +106,7 @@ resolve_gitea_owner() {
}
resolve_push_token() {
if [ -n "${GITEA_ADMIN_TOKEN:-}" ]; then
printf '%s' "$GITEA_ADMIN_TOKEN"
return 0
fi
_token=""
_token="$(gitea_cli "admin" "user" "generate-access-token" \
"--username" "$GITEA_OWNER" \
"--token-name" "attach-$$" \
"--scopes" "all" \
"--raw" 2>/dev/null)" && [ -n "$_token" ] && printf '%s' "$_token" && return 0
_admin="$(gitea_pick_owner_username)"
if [ -n "$_admin" ] && [ "$_admin" != "$GITEA_OWNER" ]; then
_token="$(gitea_cli "admin" "user" "generate-access-token" \
"--username" "$_admin" \
"--token-name" "attach-$$" \
"--scopes" "all" \
"--raw" 2>/dev/null)" && [ -n "$_token" ] && printf '%s' "$_token" && return 0
fi
return 1
gitea_resolve_push_token
}
create_repo_via_cli() {
@@ -173,15 +155,7 @@ create_repo_via_api() {
}
gitea_owner_uid() {
need_cmd curl
_token="${GITEA_ADMIN_TOKEN:-}"
[ -n "$_token" ] || _token="$(resolve_push_token)" || return 1
_api="$(gitea_api_base)"
_uid="$(curl -sS "$_api/users/$GITEA_OWNER" \
-H "Authorization: token $_token" \
| awk -F'"' '/"id"/ { print $4; exit }')"
[ -n "$_uid" ] || return 1
printf '%s' "$_uid"
gitea_entity_uid_for "$GITEA_OWNER"
}
migrate_via_api() {

View File

@@ -66,17 +66,24 @@ for _from in $GITEA_TRANSFER_SOURCES; do
fi
done
# 3) Pull mirror (attach when missing).
# 3) Pull mirror (attach when missing). Resolve PAT once for all API calls this run.
_gitea_token="$(gitea_resolve_push_token)" || true
[ -n "$_gitea_token" ] && GITEA_ADMIN_TOKEN="$_gitea_token" && export GITEA_ADMIN_TOKEN
if gitea_repo_exists_api "$GITEA_OWNER" "$GITEA_REPO"; then
log "repo exists — trigger mirror sync"
gitea_sync_mirror_api "$GITEA_OWNER" "$GITEA_REPO" || warn "mirror sync API failed — try gitea_sync_mirror.sh"
else
log "attach pull mirror via gitea_attach_remote.sh ..."
GITEA_OWNER="$GITEA_OWNER" GITEA_REPO="$GITEA_REPO" \
GITEA_MIRROR_URL="$GITEA_MIRROR_URL" \
GITEA_MIRROR_INTERVAL="$GITEA_MIRROR_INTERVAL" \
GITEA_PRIVATE="$GITEA_PRIVATE" \
sh "$SCRIPT_DIR/gitea_attach_remote.sh" "$GITEA_MIRROR_URL" || exit 1
log "attach pull mirror (API migrate) ..."
if ! gitea_mirror_pull_repo "$GITEA_MIRROR_URL" "$GITEA_REPO" "$GITEA_OWNER" \
"$GITEA_MIRROR_INTERVAL" ""; then
warn "API migrate failed — trying gitea_attach_remote.sh fallback ..."
GITEA_OWNER="$GITEA_OWNER" GITEA_REPO="$GITEA_REPO" \
GITEA_MIRROR_URL="$GITEA_MIRROR_URL" \
GITEA_MIRROR_INTERVAL="$GITEA_MIRROR_INTERVAL" \
GITEA_PRIVATE="$GITEA_PRIVATE" \
sh "$SCRIPT_DIR/gitea_attach_remote.sh" "$GITEA_MIRROR_URL" || exit 1
fi
gitea_sync_mirror_api "$GITEA_OWNER" "$GITEA_REPO" || warn "initial sync pending — check [migrations] / git daemon"
fi

View File

@@ -42,20 +42,32 @@ gitea_rm_path() {
rm -rf "$1" 2>/dev/null || true
}
# First numeric "id" from Gitea JSON (handles "id":2 and "id":"2").
gitea_json_extract_id() {
printf '%s' "$1" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*'
}
gitea_resolve_push_token() {
if [ -n "${GITEA_ADMIN_TOKEN:-}" ]; then
printf '%s' "$GITEA_ADMIN_TOKEN"
return 0
fi
# One PAT per script run (re-generating with the same --token-name fails).
if [ -n "${_GITEA_RESOLVED_TOKEN:-}" ]; then
printf '%s' "$_GITEA_RESOLVED_TOKEN"
return 0
fi
_admin="$(gitea_pick_owner_username)"
[ -n "$_admin" ] || return 1
_token=""
_token="$(gitea_cli "admin" "user" "generate-access-token" \
"--username" "$_admin" \
"--token-name" "mirror-$$" \
"--token-name" "mirror-$$-$(date +%s)-${RANDOM:-0}" \
"--scopes" "all" \
"--raw" 2>/dev/null)" && [ -n "$_token" ] && printf '%s' "$_token" && return 0
return 1
"--raw" 2>/dev/null)" && [ -n "$_token" ] || return 1
_GITEA_RESOLVED_TOKEN="$_token"
export _GITEA_RESOLVED_TOKEN GITEA_ADMIN_TOKEN="$_token"
printf '%s' "$_token"
}
gitea_owner_uid_for() {
@@ -76,7 +88,7 @@ gitea_entity_uid_for() {
else
_json="$(curl -sS "$_api/users/$_owner" -H "Authorization: token $_token")"
fi
_uid="$(printf '%s' "$_json" | awk -F'"' '/"id":/ { print $4; exit }')"
_uid="$(gitea_json_extract_id "$_json")"
[ -n "$_uid" ] || return 1
printf '%s' "$_uid"
}