Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117738288
D1636.1775154850.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
17 KB
Referenced Files
None
Subscribers
None
D1636.1775154850.diff
View Options
diff --git a/bin/quickstart.sh b/bin/quickstart.sh
--- a/bin/quickstart.sh
+++ b/bin/quickstart.sh
@@ -78,6 +78,6 @@
rm -rf database/database.sqlite
./artisan db:ping --wait
php -dmemory_limit=512M ./artisan migrate:refresh --seed
-./artisan serve
+./artisan swoole:http start
popd
diff --git a/docker/swoole/Dockerfile b/docker/swoole/Dockerfile
new file mode 100644
--- /dev/null
+++ b/docker/swoole/Dockerfile
@@ -0,0 +1,66 @@
+FROM fedora:31
+
+MAINTAINER Jeroen van Meeuwen <vanmeeuwen@apheleia-it.ch>
+
+LABEL io.k8s.description="Platform for serving PHP applications under Swoole" \
+ io.k8s.display-name="Swoole 4.4.x" \
+ io.openshift.expose-services="8000:http" \
+ io.openshift.tags="builder,php,swoole"
+
+ENV SWOOLE_VERSION=4.4.x
+
+RUN dnf -y install \
+ composer \
+ diffutils \
+ file \
+ git \
+ make \
+ npm \
+ openssl-devel \
+ php-cli \
+ php-common \
+ php-devel \
+ php-ldap \
+ php-opcache \
+ php-pecl-apcu \
+ re2c && \
+ git clone -b v4.4.x https://github.com/swoole/swoole-src.git/ /swoole-src.git/ && \
+ cd /swoole-src.git/ && \
+ git clean -d -f -x && \
+ phpize --clean && \
+ phpize && \
+ ./configure \
+ --enable-sockets \
+ --disable-mysqlnd \
+ --enable-http2 \
+ --enable-openssl && \
+ --enable-debug \
+ --enable-debug-log \
+ --enable-trace-log && \
+ make -j4 && \
+ make install && \
+ cd / && \
+ rm -rf /swoole-src.git/ && \
+ dnf -y remove \
+ diffutils \
+ file \
+ make \
+ openssl-devel \
+ php-devel \
+ re2c && \
+ dnf clean all && \
+ echo "extension=swoole.so" >> /etc/php.d/swoole.ini && \
+ php -m 2>&1 | grep -q swoole
+
+RUN groupadd -g 1001 default && \
+ useradd -d /opt/app-root/ -u 1001 -g 1001 default
+
+USER default
+
+WORKDIR /opt/app-root/
+
+COPY /rootfs /
+
+EXPOSE 8000
+
+CMD [ "/usr/local/bin/usage" ]
diff --git a/docker/swoole/do-it-again.sh b/docker/swoole/do-it-again.sh
new file mode 100755
--- /dev/null
+++ b/docker/swoole/do-it-again.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+export APP_DEBUG="true"
+export APP_KEY=
+export APP_PUBLIC_URL=http://127.0.0.1:8000/
+export APP_SRC=src/
+export APP_URL=http://127.0.0.1:8000/
+export CACHE_DRIVER="array"
+export COMPOSER_ARGS="--no-dev"
+export DB_CONNECTION="sqlite"
+export DB_DATABASE=":memory:"
+export GIT_URI=https://git.kolab.org/source/kolab.git
+export LARAVEL_ENV=production
+export LOG_CHANNEL="stderr"
+export MAIL_DRIVER="array"
+export QUEUE_CONNECTION="sync"
+export SESSION_DRIVER="array"
+export SWOOLE_HTTP_HOST=0.0.0.0
+export SWOOLE_HTTP_PORT=8000
+export SWOOLE_HTTP_REACTOR_NUM=6
+export SWOOLE_HTTP_WORKER_NUM=6
+
+docker build -t swoole .
+
+docker kill swoole
+
+docker rm swoole
+
+docker_opts="\
+ -e APP_DEBUG=${APP_DEBUG} \
+ -e APP_KEY=${APP_KEY} \
+ -e APP_PUBLIC_URL=${APP_PUBLIC_URL} \
+ -e APP_SRC=${APP_SRC} \
+ -e APP_URL=${APP_URL} \
+ -e CACHE_DRIVER=${CACHE_DRIVER} \
+ -e COMPOSER_ARGS=${COMPOSER_ARGS} \
+ -e DB_CONNECTION=${DB_CONNECTION} \
+ -e DB_DATABASE=${DB_DATABASE} \
+ -e GIT_URI=${GIT_URI} \
+ -e LARAVEL_ENV=${LARAVEL_ENV} \
+ -e LOG_CHANNEL=${LOG_CHANNEL} \
+ -e MAIL_DRIVER=${MAIL_DRIVER} \
+ -e QUEUE_CONNECTION=${QUEUE_CONNECTION} \
+ -e SESSION_DRIVER=${SESSION_DRIVER} \
+ -e SWOOLE_HTTP_HOST=${SWOOLE_HTTP_HOST} \
+ -e SWOOLE_HTTP_PORT=${SWOOLE_HTTP_PORT} \
+ -e SWOOLE_HTTP_REACTOR_NUM=${SWOOLE_HTTP_REACTOR_NUM} \
+ -e SWOOLE_HTTP_WORKER_NUM=${SWOOLE_HTTP_WORKER_NUM}"
+
+docker run -it \
+ ${docker_opts} \
+ --name swoole swoole /usr/local/bin/build-image
+
+docker commit swoole swoole-s2i
+
+docker kill swoole-s2i
+
+docker rm swoole-s2i
+
+docker run -it -p 8000:8000 \
+ ${docker_opts} \
+ --name swoole-s2i swoole-s2i /usr/local/bin/run-container
diff --git a/docker/swoole/rootfs/usr/local/bin/build-image b/docker/swoole/rootfs/usr/local/bin/build-image
new file mode 100755
--- /dev/null
+++ b/docker/swoole/rootfs/usr/local/bin/build-image
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+set -x
+
+set -e
+
+pwd
+
+if [ -z "${GIT_URI}" ]; then
+ echo "No GIT_URI specified. Exiting."
+ exit 1
+fi
+
+git clone -b ${GIT_BRANCH:-master} ${GIT_URI}
+
+cd $(basename ${GIT_URI} .git)
+
+if [ ! -z "${APP_SRC}" ]; then
+ cd ${APP_SRC}
+fi
+
+if [ -f "composer.json" ]; then
+ echo "Detected composer.json, running install"
+ php -dmemory_limit=${COMPOSER_MEMORY_LIMIT:--1} /usr/bin/composer install ${COMPOSER_ARGS}
+ rm -rf ~/.cache/composer/
+fi
+
+if [ -z "${LARAVEL_ENV}" ]; then
+ LARAVEL_ENV=prod
+fi
+
+npm install
+
+npm run ${LARAVEL_ENV} && rm -rf ~/.npm/
diff --git a/docker/swoole/rootfs/usr/local/bin/run-container b/docker/swoole/rootfs/usr/local/bin/run-container
new file mode 100755
--- /dev/null
+++ b/docker/swoole/rootfs/usr/local/bin/run-container
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+set -x
+
+set -e
+
+if [ -z "$@" ]; then
+ cd $(basename ${GIT_URI} .git)
+
+ if [ ! -z "${APP_SRC}" ]; then
+ cd ${APP_SRC}
+ fi
+
+ if [ ! -f ".env" -a -f ".env.example" ]; then
+ mv .env.example .env
+ fi
+
+ if [ -z "${APP_KEY}" ]; then
+ ./artisan key:generate
+ unset APP_KEY
+ fi
+
+ if [ -z "${JWT_SECRET}" ]; then
+ ./artisan jwt:secret -f
+ fi
+
+ ./artisan clear-compiled
+
+ # This should not occur in production
+ #./artisan cache:clear
+
+ # A standalone environment doesn't have anything to ping
+ #timeout 10m ./artisan db:ping --wait
+
+ ./artisan migrate
+
+ env
+
+ exec ./artisan swoole:http start
+else
+ exec $@
+fi
diff --git a/src/.env.example b/src/.env.example
--- a/src/.env.example
+++ b/src/.env.example
@@ -19,7 +19,7 @@
DB_PORT=3306
DB_USERNAME=kolabdev
-BROADCAST_DRIVER=log
+BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
@@ -61,8 +61,14 @@
REDIS_PASSWORD=null
REDIS_PORT=6379
+SWOOLE_HOT_RELOAD_ENABLE=true
+SWOOLE_HTTP_ACCESS_LOG=true
SWOOLE_HTTP_HOST=127.0.0.1
SWOOLE_HTTP_PORT=8000
+SWOOLE_HTTP_REACTOR_NUM=1
+SWOOLE_HTTP_WEBSOCKET=true
+SWOOLE_HTTP_WORKER_NUM=1
+SWOOLE_OB_OUTPUT=true
PAYMENT_PROVIDER=
MOLLIE_KEY=
diff --git a/src/app/Auth/SecondFactor.php b/src/app/Auth/SecondFactor.php
--- a/src/app/Auth/SecondFactor.php
+++ b/src/app/Auth/SecondFactor.php
@@ -315,16 +315,14 @@
*/
public static function dbh()
{
- $dsn = \config('2fa.dsn');
+ $connection = '2fa';
- if (empty($dsn)) {
- \Log::warning("2-FACTOR database not configured");
+ if (!\env('MFA_DSN')) {
+ \Log::warning("2-FACTOR database not configured. Using the default connection.");
- return DB::connection(\config('database.default'));
+ $connection = \config('database.default');
}
- \Config::set('database.connections.2fa', ['url' => $dsn]);
-
- return DB::connection('2fa');
+ return DB::connection($connection);
}
}
diff --git a/src/app/Http/Controllers/WebsocketController.php b/src/app/Http/Controllers/WebsocketController.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Controllers/WebsocketController.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class WebsocketController extends Controller
+{
+ public function message($websocket, $data)
+ {
+ $websocket->emit("message", $data);
+ }
+
+ public function ping($websocket, $data)
+ {
+ $websocket->emit("pong", $data);
+ }
+}
diff --git a/src/app/Http/Middleware/RequestLogger.php b/src/app/Http/Middleware/RequestLogger.php
--- a/src/app/Http/Middleware/RequestLogger.php
+++ b/src/app/Http/Middleware/RequestLogger.php
@@ -6,8 +6,14 @@
class RequestLogger
{
+ private static $start;
+
public function handle($request, Closure $next)
{
+ // FIXME: This is not really a request start, but we can't
+ // use LARAVEL_START constant when working with swoole
+ self::$start = microtime(true);
+
return $next($request);
}
@@ -16,8 +22,8 @@
if (\App::environment('local')) {
$url = $request->fullUrl();
$method = $request->getMethod();
- $time = microtime(true) - LARAVEL_START;
$mem = round(memory_get_peak_usage() / 1024 / 1024, 1);
+ $time = microtime(true) - self::$start;
\Log::debug(sprintf("C: %s %s [%sM]: %.4f sec.", $method, $url, $mem, $time));
}
diff --git a/src/config/2fa.php b/src/config/2fa.php
--- a/src/config/2fa.php
+++ b/src/config/2fa.php
@@ -9,6 +9,5 @@
'issuer' => env('APP_NAME', 'Laravel'),
],
- 'dsn' => env('MFA_DSN'),
-
+ // The database connection is defined in config/database.php
];
diff --git a/src/config/database.php b/src/config/database.php
--- a/src/config/database.php
+++ b/src/config/database.php
@@ -90,6 +90,17 @@
'prefix' => '',
'prefix_indexes' => true,
],
+
+ '2fa' => [
+ 'url' => env('MFA_DSN'),
+ 'charset' => 'utf8',
+ 'collation' => 'utf8_unicode_ci',
+ 'strict' => true,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
],
/*
diff --git a/src/config/swoole_http.php b/src/config/swoole_http.php
--- a/src/config/swoole_http.php
+++ b/src/config/swoole_http.php
@@ -90,7 +90,7 @@
|--------------------------------------------------------------------------
*/
'instances' => [
- //
+ 'auth',
],
/*
@@ -100,6 +100,8 @@
*/
'providers' => [
Illuminate\Pagination\PaginationServiceProvider::class,
+ App\Providers\AuthServiceProvider::class,
+ Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
],
/*
diff --git a/src/config/swoole_websocket.php b/src/config/swoole_websocket.php
--- a/src/config/swoole_websocket.php
+++ b/src/config/swoole_websocket.php
@@ -30,9 +30,9 @@
|--------------------------------------------------------------------------
*/
'middleware' => [
- // SwooleTW\Http\Websocket\Middleware\DecryptCookies::class,
- // SwooleTW\Http\Websocket\Middleware\StartSession::class,
- // SwooleTW\Http\Websocket\Middleware\Authenticate::class,
+ SwooleTW\Http\Websocket\Middleware\DecryptCookies::class,
+ SwooleTW\Http\Websocket\Middleware\StartSession::class,
+ SwooleTW\Http\Websocket\Middleware\Authenticate::class,
],
/*
diff --git a/src/package-lock.json b/src/package-lock.json
--- a/src/package-lock.json
+++ b/src/package-lock.json
@@ -1083,45 +1083,45 @@
}
},
"@fortawesome/fontawesome-common-types": {
- "version": "0.2.29",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz",
- "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==",
+ "version": "0.2.30",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz",
+ "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==",
"dev": true
},
"@fortawesome/fontawesome-svg-core": {
- "version": "1.2.29",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz",
- "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==",
+ "version": "1.2.30",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.30.tgz",
+ "integrity": "sha512-E3sAXATKCSVnT17HYmZjjbcmwihrNOCkoU7dVMlasrcwiJAHxSKeZ+4WN5O+ElgO/FaYgJmASl8p9N7/B/RttA==",
"dev": true,
"requires": {
- "@fortawesome/fontawesome-common-types": "^0.2.29"
+ "@fortawesome/fontawesome-common-types": "^0.2.30"
}
},
"@fortawesome/free-brands-svg-icons": {
- "version": "5.13.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.13.1.tgz",
- "integrity": "sha512-dKwF+NpIV2LVCNBA7hibH53k+ChF4Wu59P2z35gu3zwRBZpmpLVhS9k1/RiSqUqkyXUQvA2rSv48GY6wp5axZQ==",
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.14.0.tgz",
+ "integrity": "sha512-WsqPFTvJFI7MYkcy0jeFE2zY+blC4OrnB9MJOcn1NxRXT/sSfEEhrI7CwzIkiYajLiVDBKWeErYOvpsMeodmCQ==",
"dev": true,
"requires": {
- "@fortawesome/fontawesome-common-types": "^0.2.29"
+ "@fortawesome/fontawesome-common-types": "^0.2.30"
}
},
"@fortawesome/free-regular-svg-icons": {
- "version": "5.13.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.13.1.tgz",
- "integrity": "sha512-sSeaqqmv2ovA5LKcrbh3VnEDZHVhaxijWKm4R0AdT0eG21pgxNsJbStD8lW9z6bgSuWXRNHhbhOmARuRCLS8tw==",
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.14.0.tgz",
+ "integrity": "sha512-6LCFvjGSMPoUQbn3NVlgiG4CY5iIY8fOm+to/D6QS/GvdqhDt+xZklQeERdCvVRbnFa1ITc1rJHPRXqkX5wztQ==",
"dev": true,
"requires": {
- "@fortawesome/fontawesome-common-types": "^0.2.29"
+ "@fortawesome/fontawesome-common-types": "^0.2.30"
}
},
"@fortawesome/free-solid-svg-icons": {
- "version": "5.13.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz",
- "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==",
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.14.0.tgz",
+ "integrity": "sha512-M933RDM8cecaKMWDSk3FRYdnzWGW7kBBlGNGfvqLVwcwhUPNj9gcw+xZMrqBdRqxnSXdl3zWzTCNNGEtFUq67Q==",
"dev": true,
"requires": {
- "@fortawesome/fontawesome-common-types": "^0.2.29"
+ "@fortawesome/fontawesome-common-types": "^0.2.30"
}
},
"@fortawesome/vue-fontawesome": {
diff --git a/src/resources/views/layouts/app.blade.php b/src/resources/views/layouts/app.blade.php
--- a/src/resources/views/layouts/app.blade.php
+++ b/src/resources/views/layouts/app.blade.php
@@ -10,7 +10,7 @@
{{-- TODO: PWA disabled for now: @laravelPWA --}}
<link rel="icon" type="image/x-icon" href="{{ asset('images/favicon.ico') }}">
- <link href="{{ secure_asset('css/app.css') }}" rel="stylesheet">
+ <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div class="outer-container">
@@ -18,6 +18,6 @@
</div>
<script>window.config = {!! json_encode($env) !!}</script>
- <script src="{{ secure_asset('js/' . $env['jsapp']) }}" defer></script>
+ <script src="{{ asset('js/' . $env['jsapp']) }}" defer></script>
</body>
</html>
diff --git a/src/routes/websocket.php b/src/routes/websocket.php
--- a/src/routes/websocket.php
+++ b/src/routes/websocket.php
@@ -1,6 +1,5 @@
<?php
-
use Illuminate\Http\Request;
use SwooleTW\Http\Websocket\Facades\Websocket;
@@ -13,14 +12,30 @@
|
*/
-Websocket::on('connect', function ($websocket, Request $request) {
- // called while socket on connect
-});
+Websocket::on(
+ 'connect',
+ function ($websocket, Request $request) {
+ \Log::debug("someone connected");
+ $websocket->emit(
+ 'message',
+ 'welcome'
+ );
+ }
+);
+
+Websocket::on(
+ 'open',
+ function ($websocket, Request $request) {
+ \Log::debug("socket opened");
+ }
+);
-Websocket::on('disconnect', function ($websocket) {
- // called while socket on disconnect
-});
+Websocket::on(
+ 'disconnect',
+ function ($websocket) {
+ \Log::debug("someone disconnected");
+ }
+);
-Websocket::on('example', function ($websocket, $data) {
- $websocket->emit('message', $data);
-});
+Websocket::on('message', 'App\Http\Controllers\WebsocketController@message');
+Websocket::on('ping', 'App\Http\Controllers\WebsocketController@ping');
diff --git a/src/websocket_test.py b/src/websocket_test.py
new file mode 100755
--- /dev/null
+++ b/src/websocket_test.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python3 -tt
+
+import json
+import time
+import websocket
+
+try:
+ import thread
+except ImportError:
+ import _thread as thread
+
+
+def on_message(ws, message):
+ print("message: %s" % (message))
+
+
+def on_pong(ws, message):
+ print("pong: %s" % (message))
+
+
+def on_error(ws, error):
+ print(error)
+
+
+def on_close(ws):
+ print("### closed ###")
+
+
+def on_open(ws):
+ def run(*args):
+ for i in range(3):
+ time.sleep(1)
+ ws.send(json.dumps(['ping', i]))
+ time.sleep(1)
+ ws.close()
+ print("thread terminating...")
+ thread.start_new_thread(run, ())
+
+
+if __name__ == "__main__":
+ websocket.enableTrace(True)
+ ws = websocket.WebSocketApp(
+ "ws://127.0.0.1:8000",
+ on_message=on_message,
+ on_pong=on_pong,
+ on_error=on_error,
+ on_close=on_close
+ )
+
+ ws.on_open = on_open
+ ws.run_forever()
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 2, 6:34 PM (14 h, 10 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18820290
Default Alt Text
D1636.1775154850.diff (17 KB)
Attached To
Mode
D1636: Integration of Swoole
Attached
Detach File
Event Timeline