Compare commits
2
Commits
1be07440e3
...
fc93486367
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc93486367 | ||
|
|
98066118a6 |
@@ -94,6 +94,7 @@ let currentLockedAt = null;
|
||||
function lockMessageClass(messageType) {
|
||||
if (messageType === 'virus') return 'message-virus';
|
||||
if (messageType === 'mainframe') return 'message-mainframe';
|
||||
if (messageType === 'hint') return 'message-hint';
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
ServerRoot "/etc/apache2"
|
||||
Listen 80
|
||||
User www-data
|
||||
Group www-data
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
LogLevel warn
|
||||
IncludeOptional mods-enabled/*.load
|
||||
IncludeOptional sites-enabled/*.conf
|
||||
@@ -0,0 +1,3 @@
|
||||
deb http://deb.debian.org/debian bookworm main contrib non-free-firmware
|
||||
deb http://deb.debian.org/debian bookworm-updates main contrib non-free-firmware
|
||||
deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware
|
||||
@@ -0,0 +1,8 @@
|
||||
# /etc/crontab: system-wide crontab
|
||||
SHELL=/bin/sh
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
17 * * * * root cd / && run-parts --report /etc/cron.hourly
|
||||
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
|
||||
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
|
||||
52 6 1 * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
|
||||
@@ -0,0 +1 @@
|
||||
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
@@ -0,0 +1,4 @@
|
||||
# /etc/fstab: static file system information.
|
||||
UUID=8f14e45f-ceea-4a63-9b3f-1a2b3c4d5e6f / ext4 errors=remount-ro 0 1
|
||||
UUID=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d /boot ext4 defaults 0 2
|
||||
/swapfile none swap sw 0 0
|
||||
@@ -0,0 +1 @@
|
||||
archive-node-04
|
||||
@@ -0,0 +1,6 @@
|
||||
127.0.0.1 localhost
|
||||
127.0.1.1 archive-node-04
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
10.0.0.4 archive-node-04.internal
|
||||
@@ -0,0 +1,2 @@
|
||||
Debian GNU/Linux 12 \n \l
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Welcome to archive-node-04.
|
||||
All connections are logged and monitored for internal review purposes.
|
||||
@@ -0,0 +1,10 @@
|
||||
source /etc/network/interfaces.d/*
|
||||
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
auto eth0
|
||||
iface eth0 inet static
|
||||
address 10.0.0.4
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
@@ -0,0 +1,14 @@
|
||||
user www-data;
|
||||
worker_processes auto;
|
||||
pid /run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 768;
|
||||
}
|
||||
|
||||
http {
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
include /etc/nginx/mime.types;
|
||||
include /etc/nginx/sites-enabled/*;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
passwd: files
|
||||
group: files
|
||||
shadow: files
|
||||
hosts: files dns
|
||||
networks: files
|
||||
protocols: db files
|
||||
services: db files
|
||||
ethers: db files
|
||||
rpc: db files
|
||||
@@ -0,0 +1,8 @@
|
||||
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
|
||||
NAME="Debian GNU/Linux"
|
||||
VERSION_ID="12"
|
||||
VERSION="12 (bookworm)"
|
||||
VERSION_CODENAME=bookworm
|
||||
ID=debian
|
||||
HOME_URL="https://www.debian.org/"
|
||||
SUPPORT_URL="https://www.debian.org/support"
|
||||
@@ -0,0 +1,11 @@
|
||||
root:x:0:0:root:/root:/bin/bash
|
||||
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
|
||||
bin:x:2:2:bin:/bin:/usr/sbin/nologin
|
||||
sys:x:3:3:sys:/dev:/usr/sbin/nologin
|
||||
sync:x:4:65534:sync:/bin:/bin/sync
|
||||
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
|
||||
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
|
||||
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
|
||||
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
|
||||
admin:x:1000:1000:admin,,,:/home/admin:/bin/bash
|
||||
guest:x:1001:1001:guest,,,:/home/guest:/bin/bash
|
||||
@@ -0,0 +1,3 @@
|
||||
nameserver 1.1.1.1
|
||||
nameserver 9.9.9.9
|
||||
options edns0
|
||||
@@ -0,0 +1,7 @@
|
||||
root:$6$rounds=656000$xJ2kLQmZ$aFq9zN3vQwErTyUiOpAsDfGhJkLzXcVbNm1234567890abcdefgh:19700:0:99999:7:::
|
||||
daemon:*:19700:0:99999:7:::
|
||||
bin:*:19700:0:99999:7:::
|
||||
sys:*:19700:0:99999:7:::
|
||||
sshd:*:19700:0:99999:7:::
|
||||
admin:$6$rounds=656000$k3PqR8tW$bGr0oPqLmNbVcXzAsDfGhJkLqWeRtYuIoP0987654321zyxwvu:19700:0:99999:7:::
|
||||
guest:*:19700:0:99999:7:::
|
||||
@@ -0,0 +1,4 @@
|
||||
Host *
|
||||
SendEnv LANG LC_*
|
||||
HashKnownHosts yes
|
||||
GSSAPIAuthentication yes
|
||||
@@ -0,0 +1,7 @@
|
||||
Port 22
|
||||
PermitRootLogin no
|
||||
PasswordAuthentication yes
|
||||
PubkeyAuthentication yes
|
||||
X11Forwarding no
|
||||
PrintMotd no
|
||||
Subsystem sftp /usr/lib/openssh/sftp-server
|
||||
@@ -0,0 +1 @@
|
||||
Europe/Amsterdam
|
||||
@@ -0,0 +1,8 @@
|
||||
app:
|
||||
name: internal-archive-sync
|
||||
version: 2.3.1
|
||||
log_level: info
|
||||
port: 8080
|
||||
database:
|
||||
driver: sqlite
|
||||
path: /opt/app/data.db
|
||||
@@ -0,0 +1,5 @@
|
||||
apt update
|
||||
apt upgrade -y
|
||||
systemctl restart nginx
|
||||
df -h
|
||||
journalctl -xe
|
||||
@@ -0,0 +1,10 @@
|
||||
# ~/.bashrc: executed by bash for non-login shells
|
||||
|
||||
case $- in
|
||||
*i*) ;;
|
||||
*) return;;
|
||||
esac
|
||||
|
||||
export PS1='\u@\h:\w\$ '
|
||||
alias ll='ls -alF'
|
||||
alias la='ls -A'
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGZ8pQxT2mN0vRkLwYb6cJhU3sEoAeKdVmXpZq7tRnBs admin@archive-node-04
|
||||
@@ -0,0 +1,2 @@
|
||||
update-alternatives 2026-05-30 03:10:04: link group editor updated to point to /usr/bin/vim.basic
|
||||
update-alternatives 2026-05-30 03:10:04: link group pager updated to point to /usr/bin/less
|
||||
@@ -0,0 +1,6 @@
|
||||
Jun 12 09:41:55 archive-node-04 sshd[10233]: Accepted publickey for admin from 10.0.0.7 port 51422 ssh2
|
||||
Jun 12 09:41:55 archive-node-04 sshd[10233]: pam_unix(sshd:session): session opened for user admin by (uid=0)
|
||||
Jun 12 09:55:02 archive-node-04 sudo: admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ; COMMAND=/usr/bin/apt update
|
||||
Jun 12 10:12:40 archive-node-04 sshd[10233]: pam_unix(sshd:session): session closed for user admin
|
||||
Jun 12 22:03:11 archive-node-04 sshd[15092]: Failed password for invalid user test from 203.0.113.44 port 39102 ssh2
|
||||
Jun 12 22:03:14 archive-node-04 sshd[15092]: Connection closed by 203.0.113.44 port 39102 [preauth]
|
||||
@@ -0,0 +1,4 @@
|
||||
[ OK ] Started Network Manager.
|
||||
[ OK ] Started OpenSSH server daemon.
|
||||
[ OK ] Started Nginx HTTP server.
|
||||
[ OK ] Reached target Multi-User System.
|
||||
@@ -0,0 +1,2 @@
|
||||
Jun 12 04:00:11 archive-node-04 CRON[9021]: (root) CMD (test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily)
|
||||
Jun 12 18:30:02 archive-node-04 CRON[15544]: (root) CMD (test -x /usr/sbin/anacron || run-parts --report /etc/cron.hourly)
|
||||
@@ -0,0 +1,2 @@
|
||||
Jun 12 03:00:05 archive-node-04 systemd-udevd[512]: Using default interface naming scheme 'v252'.
|
||||
Jun 12 03:00:11 archive-node-04 dbus-daemon[601]: [system] Successfully activated service 'org.freedesktop.hostname1'
|
||||
@@ -0,0 +1,4 @@
|
||||
[ 0.000000] Linux version 6.1.0-21-amd64 (debian-kernel@lists.debian.org)
|
||||
[ 0.004211] Command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-21-amd64 root=UUID=8f14e45f
|
||||
[ 0.512033] ACPI: Core revision 20221020
|
||||
[ 1.221004] usb 1-1: new high-speed USB device number 2
|
||||
@@ -0,0 +1,4 @@
|
||||
2026-05-30 03:10:02 startup archives unpack
|
||||
2026-05-30 03:10:04 install curl:amd64 <none> 8.4.0-2
|
||||
2026-05-30 03:10:05 status installed curl:amd64 8.4.0-2
|
||||
2026-06-02 09:44:11 upgrade openssh-server:amd64 1:9.2p1-2 1:9.2p1-2+deb12u2
|
||||
@@ -0,0 +1,4 @@
|
||||
Jun 12 03:00:02 archive-node-04 kernel: [ 0.000000] Linux version 6.1.0-21-amd64
|
||||
Jun 12 03:00:02 archive-node-04 kernel: [ 0.004211] Command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-21-amd64 root=UUID=8f14e45f
|
||||
Jun 12 03:00:03 archive-node-04 kernel: [ 1.221004] usb 1-1: new high-speed USB device number 2
|
||||
Jun 12 03:00:03 archive-node-04 kernel: [ 1.552210] eth0: link up, 1000Mbps, full-duplex
|
||||
@@ -0,0 +1,2 @@
|
||||
Jun 12 05:11:02 archive-node-04 postfix/qmgr[812]: 3F2A1C0021: removed
|
||||
Jun 12 05:11:02 archive-node-04 postfix/smtp[9944]: 3F2A1C0021: to=<root@localhost>, status=sent
|
||||
@@ -0,0 +1,8 @@
|
||||
Jun 12 03:12:01 archive-node-04 systemd[1]: Starting Daily apt download activities...
|
||||
Jun 12 03:12:04 archive-node-04 systemd[1]: apt-daily.service: Deactivated successfully.
|
||||
Jun 12 04:00:11 archive-node-04 CRON[9021]: (root) CMD (test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily)
|
||||
Jun 12 06:25:00 archive-node-04 anacron[1122]: Job `cron.daily' terminated
|
||||
Jun 12 09:41:55 archive-node-04 sshd[10233]: Accepted publickey for admin from 10.0.0.7 port 51422 ssh2
|
||||
Jun 12 09:41:55 archive-node-04 sshd[10233]: pam_unix(sshd:session): session opened for user admin
|
||||
Jun 12 12:03:19 archive-node-04 systemd[1]: Reloading nginx.service
|
||||
Jun 12 18:30:02 archive-node-04 CRON[15544]: (root) CMD (test -x /usr/sbin/anacron || run-parts --report /etc/cron.hourly)
|
||||
@@ -0,0 +1,4 @@
|
||||
From cron@archive-node-04 Wed Jun 10 06:25:01 2026
|
||||
Subject: Cron <root@archive-node-04> run-parts --report /etc/cron.daily
|
||||
|
||||
Daily housekeeping completed without errors.
|
||||
@@ -66,6 +66,11 @@ div.message-mainframe {
|
||||
color: #0F0;
|
||||
}
|
||||
|
||||
div.message-hint {
|
||||
color: #FF0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#lock-banner {
|
||||
position: fixed;
|
||||
top: 68px;
|
||||
|
||||
@@ -47,6 +47,14 @@ when@prod:
|
||||
excluded_http_codes: [404, 405]
|
||||
buffer_size: 50 # How many messages should be saved? Prevent memory leaks
|
||||
nested:
|
||||
type: group
|
||||
members: [nested_file, nested_stderr]
|
||||
nested_file:
|
||||
type: stream
|
||||
path: "%kernel.logs_dir%/php/prod.log"
|
||||
level: debug
|
||||
formatter: monolog.formatter.json
|
||||
nested_stderr:
|
||||
type: stream
|
||||
path: php://stderr
|
||||
level: debug
|
||||
@@ -56,7 +64,14 @@ when@prod:
|
||||
process_psr_3_messages: false
|
||||
channels: ["!event", "!doctrine"]
|
||||
deprecation:
|
||||
type: stream
|
||||
type: group
|
||||
channels: [deprecation]
|
||||
members: [deprecation_file, deprecation_stderr]
|
||||
deprecation_file:
|
||||
type: stream
|
||||
path: "%kernel.logs_dir%/php/deprecation.log"
|
||||
formatter: monolog.formatter.json
|
||||
deprecation_stderr:
|
||||
type: stream
|
||||
path: php://stderr
|
||||
formatter: monolog.formatter.json
|
||||
|
||||
@@ -66,6 +66,39 @@ services:
|
||||
# ipv4_address: 172.23.0.11
|
||||
restart: unless-stopped
|
||||
|
||||
php-cron:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/php/Dockerfile
|
||||
args:
|
||||
USER_ID: ${USER_ID}
|
||||
GROUP_ID: ${GROUP_ID}
|
||||
container_name: escapepage-php-cron
|
||||
volumes:
|
||||
- ../:/var/www/html:delegated
|
||||
- /etc/hosts:/etc/hosts:ro
|
||||
environment:
|
||||
APP_ENV: ${APP_ENV}
|
||||
SITE_BASE_URL: ${SITE_BASE_URL}
|
||||
MAILER_DSN: ${MAILER_DSN}
|
||||
MAILER_FROM: ${MAILER_FROM}
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
MERCURE_URL: ${MERCURE_URL}
|
||||
MERCURE_PUBLIC_URL: ${MERCURE_PUBLIC_URL}
|
||||
MERCURE_JWT_SECRET: ${MERCURE_JWT_SECRET}
|
||||
MERCURE_CORS_ALLOWED_ORIGINS: ${MERCURE_CORS_ALLOWED_ORIGINS}
|
||||
MERCURE_TOPIC_BASE: ${MERCURE_TOPIC_BASE}
|
||||
RECAPTCHA3_KEY: ${RECAPTCHA3_KEY}
|
||||
RECAPTCHA3_SECRET: ${RECAPTCHA3_SECRET}
|
||||
depends_on:
|
||||
- database
|
||||
- mercure
|
||||
command: ["crond", "-f", "-l", "2"]
|
||||
# networks:
|
||||
# backend:
|
||||
# ipv4_address: 172.23.0.16
|
||||
restart: unless-stopped
|
||||
|
||||
nginx:
|
||||
image: nginx:1.29.4-alpine
|
||||
container_name: escapepage-nginx
|
||||
|
||||
+12
-2
@@ -12,7 +12,8 @@ RUN apk add --no-cache \
|
||||
make \
|
||||
nodejs \
|
||||
npm \
|
||||
shadow
|
||||
shadow \
|
||||
logrotate
|
||||
|
||||
# Install PHP extension installer
|
||||
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
|
||||
@@ -41,6 +42,15 @@ COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||
# Configure PHP
|
||||
COPY docker/php/php.ini $PHP_INI_DIR/conf.d/zz-custom.ini
|
||||
|
||||
# Cron daemon (BusyBox's built-in crond) for the php-cron container.
|
||||
# Harmless for the php/php-worker containers too, since they never invoke crond.
|
||||
COPY docker/php/crontab /etc/crontabs/root
|
||||
RUN chmod 0600 /etc/crontabs/root
|
||||
|
||||
# Log rotation for the cron hint-check and PHP error logs: 25MB per file, kept for 3 months.
|
||||
COPY docker/php/logrotate/cron-hints.conf /etc/logrotate.d/cron-hints
|
||||
COPY docker/php/logrotate/php-logs.conf /etc/logrotate.d/php-logs
|
||||
|
||||
# Adjust www-data UID/GID to match host user (default 1000)
|
||||
ARG USER_ID=1000
|
||||
ARG GROUP_ID=1000
|
||||
@@ -56,7 +66,7 @@ RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Set permissions for Symfony directories
|
||||
RUN mkdir -p var/cache var/log var/sessions && \
|
||||
RUN mkdir -p var/cache var/log/cron var/log/php var/sessions && \
|
||||
chown -R www-data:www-data var
|
||||
|
||||
# Default command
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
* * * * * php /var/www/html/bin/console app:hints:check >> /var/www/html/var/log/cron/cron.log 2>&1
|
||||
5 3 * * * logrotate -s /var/www/html/var/log/.logrotate.state /etc/logrotate.d/cron-hints /etc/logrotate.d/php-logs
|
||||
@@ -0,0 +1,11 @@
|
||||
/var/www/html/var/log/cron/cron.log {
|
||||
size 25M
|
||||
rotate 100
|
||||
maxage 90
|
||||
missingok
|
||||
notifempty
|
||||
compress
|
||||
delaycompress
|
||||
dateext
|
||||
dateformat -%Y%m%d-%s
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/var/www/html/var/log/php/*.log {
|
||||
size 25M
|
||||
rotate 100
|
||||
maxage 90
|
||||
missingok
|
||||
notifempty
|
||||
compress
|
||||
delaycompress
|
||||
dateext
|
||||
dateformat -%Y%m%d-%s
|
||||
}
|
||||
+1
-1
@@ -9,6 +9,6 @@ opcache.validate_timestamps=1
|
||||
opcache.revalidate_freq=0
|
||||
|
||||
log_errors=On
|
||||
error_log=/var/www/html/var/log/errorlog_php.log
|
||||
error_log=/var/www/html/var/log/php/error.log
|
||||
session.gc_maxlifetime=1440
|
||||
session.cookie_lifetime=0
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ echo "Stopping and removing containers..."
|
||||
docker network rm escapepage_network || true
|
||||
docker network rm $(docker network ls -q --filter name=escapepage) || true
|
||||
docker network prune -f || true
|
||||
docker rm -f escapepage-db escapepage-php escapepage-nginx escapepage-mercure escapepage-mailer escapepage-php-worker || true
|
||||
docker rm -f escapepage-db escapepage-php escapepage-nginx escapepage-mercure escapepage-mailer escapepage-php-worker escapepage-php-cron || true
|
||||
docker system prune -f || true
|
||||
|
||||
echo "Clearing Docker build cache..."
|
||||
@@ -21,7 +21,7 @@ docker builder prune -af
|
||||
echo "Setting permissions for var/volumes/db and var directories..."
|
||||
sudo chown -R 1000:1000 "$ROOT_DIR/var/volumes/db" || true
|
||||
sudo chmod -R 777 "$ROOT_DIR/var/volumes/db" || true
|
||||
sudo mkdir -p "$ROOT_DIR/var/cache" "$ROOT_DIR/var/log" "$ROOT_DIR/var/sessions"
|
||||
sudo mkdir -p "$ROOT_DIR/var/cache" "$ROOT_DIR/var/log/cron" "$ROOT_DIR/var/log/php" "$ROOT_DIR/var/sessions"
|
||||
sudo chown -R 1000:1000 "$ROOT_DIR/var" || true
|
||||
sudo chmod -R 777 "$ROOT_DIR/var" || true
|
||||
|
||||
|
||||
@@ -143,6 +143,10 @@ Common commands:
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f nginx)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f php)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f php-worker)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f php-cron) # crond scheduler activity
|
||||
tail -f "$ROOT_DIR/var/log/cron/cron.log" # hint-check command output
|
||||
tail -f "$ROOT_DIR/var/log/php/error.log" # raw PHP errors
|
||||
tail -f "$ROOT_DIR/var/log/php/prod.log" # Symfony app errors (prod only)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE exec php bash)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE exec php npm run watch)
|
||||
(cd "$DOCKER_DIR" && $DOCKER_COMPOSE down)
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Command;
|
||||
|
||||
use App\Game\Entity\Session;
|
||||
use App\Game\Enum\GameSettingType;
|
||||
use App\Game\Enum\SessionSettingType;
|
||||
use App\Game\Enum\SessionStatus;
|
||||
use App\Game\Repository\GameSettingRepository;
|
||||
use App\Game\Repository\SessionRepository;
|
||||
use App\Game\Repository\SessionSettingRepository;
|
||||
use Symfony\Component\Console\Attribute\AsCommand;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Mercure\HubInterface;
|
||||
use Symfony\Component\Mercure\Update;
|
||||
|
||||
#[AsCommand(
|
||||
name: 'app:hints:check',
|
||||
description: 'Checks running game sessions and sends mainframe hints to players who are behind schedule.'
|
||||
)]
|
||||
final class SendMainframeHintsCommand extends Command
|
||||
{
|
||||
private const DEFAULT_TOTAL_TIME = 3600;
|
||||
|
||||
public function __construct(
|
||||
private readonly SessionRepository $sessionRepository,
|
||||
private readonly SessionSettingRepository $sessionSettingRepository,
|
||||
private readonly GameSettingRepository $gameSettingRepository,
|
||||
private readonly HubInterface $hub,
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$sessions = $this->sessionRepository->findBy(['status' => SessionStatus::PLAYING]);
|
||||
$hintsSent = 0;
|
||||
|
||||
foreach ($sessions as $session) {
|
||||
if ($this->checkContactHint($session)) {
|
||||
$hintsSent++;
|
||||
}
|
||||
}
|
||||
|
||||
$output->writeln(sprintf('<info>Checked %d running session(s), sent %d hint(s).</info>', count($sessions), $hintsSent));
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* "Get in touch" hint: if 5 minutes into the game the players haven't messaged
|
||||
* everyone (a private message to each other player, plus one broadcast), nudge them.
|
||||
* Repeats every run of this command for as long as the condition still holds.
|
||||
*/
|
||||
private function checkContactHint(Session $session): bool
|
||||
{
|
||||
$elapsed = $this->getElapsedPlayingSeconds($session);
|
||||
if ($elapsed === null || $elapsed < 300) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->allPlayersHaveContactedEveryone($session)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->publishHint($session, 'Get in contact with your fellow agents to work together on defeating this AI virus.');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function getElapsedPlayingSeconds(Session $session): ?int
|
||||
{
|
||||
$timer = $session->getTimer();
|
||||
if ($timer === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$totalTimeSetting = $this->gameSettingRepository->getSetting($session->getGame(), GameSettingType::TOTAL_TIME);
|
||||
$totalTime = $totalTimeSetting ? (int)$totalTimeSetting->getValue() : self::DEFAULT_TOTAL_TIME;
|
||||
|
||||
$startedAt = $timer - $totalTime;
|
||||
|
||||
return time() - $startedAt;
|
||||
}
|
||||
|
||||
private function allPlayersHaveContactedEveryone(Session $session): bool
|
||||
{
|
||||
$players = $session->getPlayers();
|
||||
$screens = [];
|
||||
|
||||
foreach ($players as $player) {
|
||||
if ($player->getScreen() === null) {
|
||||
return false;
|
||||
}
|
||||
$screens[] = $player->getScreen();
|
||||
}
|
||||
|
||||
foreach ($players as $player) {
|
||||
$screen = $player->getScreen();
|
||||
$trackingSettingName = SessionSettingType::tryFrom('ChatTrackingForPlayer' . $screen);
|
||||
if (!$trackingSettingName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$setting = $this->sessionSettingRepository->getSetting($session, $trackingSettingName, $player);
|
||||
$tracking = $setting ? (json_decode($setting->getValue() ?? '[]', true) ?? []) : [];
|
||||
|
||||
if (!in_array(0, $tracking)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($screens as $otherScreen) {
|
||||
if ($otherScreen !== $screen && !in_array($otherScreen, $tracking)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function publishHint(Session $session, string $message): void
|
||||
{
|
||||
$topic = '/game/hub/' . $session->getId();
|
||||
try {
|
||||
$this->hub->publish(new Update($topic, json_encode([0, $message, 'hint'])));
|
||||
} catch (\Exception $e) {
|
||||
// Mercure might be down
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -998,6 +998,61 @@ class GameResponseService
|
||||
$paths[] = '/etc/handle';
|
||||
$paths[] = '/etc/freak';
|
||||
$paths[] = '/etc/host';
|
||||
$paths[] = '/etc/ssh';
|
||||
$paths[] = '/etc/nginx';
|
||||
$paths[] = '/etc/apache2';
|
||||
$paths[] = '/etc/systemd';
|
||||
$paths[] = '/etc/cron.d';
|
||||
$paths[] = '/etc/network';
|
||||
$paths[] = '/etc/apt';
|
||||
$paths[] = '/etc/default';
|
||||
$paths[] = '/etc/init.d';
|
||||
$paths[] = '/etc/security';
|
||||
$paths[] = '/etc/skel';
|
||||
$paths[] = '/etc/logrotate.d';
|
||||
|
||||
$paths[] = '/bin';
|
||||
$paths[] = '/boot';
|
||||
$paths[] = '/dev';
|
||||
$paths[] = '/home';
|
||||
$paths[] = '/home/admin';
|
||||
$paths[] = '/home/guest';
|
||||
$paths[] = '/home/backup';
|
||||
$paths[] = '/lib';
|
||||
$paths[] = '/lib64';
|
||||
$paths[] = '/media';
|
||||
$paths[] = '/mnt';
|
||||
$paths[] = '/opt';
|
||||
$paths[] = '/opt/app';
|
||||
$paths[] = '/proc';
|
||||
$paths[] = '/root';
|
||||
$paths[] = '/root/.ssh';
|
||||
$paths[] = '/run';
|
||||
$paths[] = '/sbin';
|
||||
$paths[] = '/srv';
|
||||
$paths[] = '/sys';
|
||||
$paths[] = '/tmp';
|
||||
$paths[] = '/usr';
|
||||
$paths[] = '/usr/bin';
|
||||
$paths[] = '/usr/sbin';
|
||||
$paths[] = '/usr/lib';
|
||||
$paths[] = '/usr/local';
|
||||
$paths[] = '/usr/local/bin';
|
||||
$paths[] = '/usr/local/sbin';
|
||||
$paths[] = '/usr/share';
|
||||
$paths[] = '/usr/share/doc';
|
||||
$paths[] = '/usr/share/man';
|
||||
$paths[] = '/usr/include';
|
||||
$paths[] = '/usr/src';
|
||||
|
||||
$paths[] = '/var/log';
|
||||
$paths[] = '/var/lib';
|
||||
$paths[] = '/var/cache';
|
||||
$paths[] = '/var/spool';
|
||||
$paths[] = '/var/backups';
|
||||
$paths[] = '/var/tmp';
|
||||
$paths[] = '/var/mail';
|
||||
$paths[] = '/var/run';
|
||||
|
||||
$paths[] = '/var/home';
|
||||
|
||||
@@ -1213,6 +1268,127 @@ class GameResponseService
|
||||
$files[] = '/var/rapports/011_130-62.txt';
|
||||
$files[] = '/var/rapports/index.txt';
|
||||
|
||||
$files[] = '/etc/passwd';
|
||||
$files[] = '/etc/shadow';
|
||||
$files[] = '/etc/hostname';
|
||||
$files[] = '/etc/hosts';
|
||||
$files[] = '/etc/os-release';
|
||||
$files[] = '/etc/motd';
|
||||
$files[] = '/etc/issue';
|
||||
$files[] = '/etc/timezone';
|
||||
$files[] = '/etc/resolv.conf';
|
||||
$files[] = '/etc/crontab';
|
||||
$files[] = '/etc/nsswitch.conf';
|
||||
$files[] = '/etc/environment';
|
||||
$files[] = '/etc/fstab';
|
||||
$files[] = '/etc/ssh/sshd_config';
|
||||
$files[] = '/etc/ssh/ssh_config';
|
||||
$files[] = '/etc/nginx/nginx.conf';
|
||||
$files[] = '/etc/apache2/apache2.conf';
|
||||
$files[] = '/etc/network/interfaces';
|
||||
$files[] = '/etc/apt/sources.list';
|
||||
$files[] = '/etc/cron.d/backup-cron.sh';
|
||||
$files[] = '/etc/init.d/nginx.sh';
|
||||
$files[] = '/etc/init.d/ssh.sh';
|
||||
$files[] = '/etc/init.d/cron.sh';
|
||||
$files[] = '/etc/logrotate.d/rsyslog.sh';
|
||||
$files[] = '/etc/logrotate.d/apt.sh';
|
||||
$files[] = '/etc/skel/bashrc.sh';
|
||||
$files[] = '/etc/skel/profile.sh';
|
||||
|
||||
$files[] = '/var/log/syslog';
|
||||
$files[] = '/var/log/auth.log';
|
||||
$files[] = '/var/log/kern.log';
|
||||
$files[] = '/var/log/boot.log';
|
||||
$files[] = '/var/log/dmesg';
|
||||
$files[] = '/var/log/dpkg.log';
|
||||
$files[] = '/var/log/cron.log';
|
||||
$files[] = '/var/log/mail.log';
|
||||
$files[] = '/var/log/daemon.log';
|
||||
$files[] = '/var/log/alternatives.log';
|
||||
$files[] = '/var/lib/dpkg-status.sh';
|
||||
$files[] = '/var/lib/apt-extended-states.sh';
|
||||
$files[] = '/var/cache/apt-archives.sh';
|
||||
$files[] = '/var/spool/cron-crontabs.sh';
|
||||
$files[] = '/var/spool/mail-root.sh';
|
||||
$files[] = '/var/backups/passwd.bak.sh';
|
||||
$files[] = '/var/backups/group.bak.sh';
|
||||
$files[] = '/var/mail/root';
|
||||
|
||||
$files[] = '/root/.bashrc';
|
||||
$files[] = '/root/.bash_history';
|
||||
$files[] = '/root/.ssh/authorized_keys';
|
||||
|
||||
$files[] = '/home/admin/notes.sh';
|
||||
$files[] = '/home/admin/todo.sh';
|
||||
$files[] = '/home/guest/readme.sh';
|
||||
$files[] = '/home/backup/backup.sh';
|
||||
|
||||
$files[] = '/opt/app/config.yml';
|
||||
$files[] = '/opt/app/app.sh';
|
||||
$files[] = '/opt/app/start.sh';
|
||||
|
||||
$files[] = '/usr/bin/ls.sh';
|
||||
$files[] = '/usr/bin/cat.sh';
|
||||
$files[] = '/usr/bin/grep.sh';
|
||||
$files[] = '/usr/bin/awk.sh';
|
||||
$files[] = '/usr/bin/sed.sh';
|
||||
$files[] = '/usr/bin/bash.sh';
|
||||
$files[] = '/usr/bin/python3.sh';
|
||||
$files[] = '/usr/bin/perl.sh';
|
||||
$files[] = '/usr/bin/curl.sh';
|
||||
$files[] = '/usr/bin/wget.sh';
|
||||
$files[] = '/usr/bin/ssh.sh';
|
||||
$files[] = '/usr/bin/scp.sh';
|
||||
$files[] = '/usr/bin/rsync.sh';
|
||||
$files[] = '/usr/bin/tar.sh';
|
||||
$files[] = '/usr/bin/gzip.sh';
|
||||
$files[] = '/usr/bin/vim.sh';
|
||||
$files[] = '/usr/bin/nano.sh';
|
||||
$files[] = '/usr/bin/top.sh';
|
||||
$files[] = '/usr/bin/ps.sh';
|
||||
$files[] = '/usr/bin/kill.sh';
|
||||
$files[] = '/usr/bin/chmod.sh';
|
||||
$files[] = '/usr/bin/chown.sh';
|
||||
$files[] = '/usr/bin/systemctl.sh';
|
||||
$files[] = '/usr/bin/docker.sh';
|
||||
$files[] = '/usr/bin/git.sh';
|
||||
$files[] = '/usr/bin/find.sh';
|
||||
$files[] = '/usr/bin/sort.sh';
|
||||
$files[] = '/usr/bin/uniq.sh';
|
||||
$files[] = '/usr/bin/head.sh';
|
||||
$files[] = '/usr/bin/tail.sh';
|
||||
|
||||
$files[] = '/bin/sh.sh';
|
||||
$files[] = '/bin/mount.sh';
|
||||
$files[] = '/bin/umount.sh';
|
||||
$files[] = '/bin/ping.sh';
|
||||
$files[] = '/bin/netstat.sh';
|
||||
$files[] = '/bin/ifconfig.sh';
|
||||
$files[] = '/bin/hostname.sh';
|
||||
$files[] = '/bin/date.sh';
|
||||
$files[] = '/bin/ln.sh';
|
||||
$files[] = '/bin/cp.sh';
|
||||
$files[] = '/bin/mv.sh';
|
||||
$files[] = '/bin/rm.sh';
|
||||
$files[] = '/bin/mkdir.sh';
|
||||
$files[] = '/bin/rmdir.sh';
|
||||
$files[] = '/bin/touch.sh';
|
||||
$files[] = '/bin/echo.sh';
|
||||
|
||||
$files[] = '/sbin/init.sh';
|
||||
$files[] = '/sbin/reboot.sh';
|
||||
$files[] = '/sbin/shutdown.sh';
|
||||
$files[] = '/sbin/fsck.sh';
|
||||
$files[] = '/sbin/ifup.sh';
|
||||
$files[] = '/sbin/ifdown.sh';
|
||||
$files[] = '/sbin/iptables.sh';
|
||||
$files[] = '/sbin/sysctl.sh';
|
||||
|
||||
$files[] = '/usr/local/bin/composer.sh';
|
||||
$files[] = '/usr/local/bin/node.sh';
|
||||
$files[] = '/usr/local/bin/npm.sh';
|
||||
|
||||
if ($player === null) {
|
||||
return $files;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user