Skip to content

Commit 11cccd3

Browse files
committed
mode
0 parents  commit 11cccd3

9 files changed

+383
-0
lines changed

ArtgrisMaintenanceBundle.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Artgris\MaintenanceBundle;
4+
5+
use Symfony\Component\HttpKernel\Bundle\Bundle;
6+
7+
class ArtgrisMaintenanceBundle extends Bundle
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Artgris\MaintenanceBundle\DependencyInjection;
4+
5+
use Symfony\Component\DependencyInjection\ContainerBuilder;
6+
use Symfony\Component\Config\FileLocator;
7+
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
8+
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
9+
use Symfony\Component\DependencyInjection\Loader;
10+
11+
/**
12+
* This is the class that loads and manages your bundle configuration.
13+
*
14+
* @link http://symfony.com/doc/current/cookbook/bundles/extension.html
15+
*/
16+
class ArtgrisMaintenanceExtension extends Extension
17+
{
18+
/**
19+
* {@inheritdoc}
20+
*/
21+
public function load(array $configs, ContainerBuilder $container)
22+
{
23+
$configuration = new Configuration();
24+
$config = $this->processConfiguration($configuration, $configs);
25+
26+
$container->setParameter('artgris_maintenance', $config);
27+
28+
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
29+
$loader->load('services.yml');
30+
}
31+
}

DependencyInjection/Configuration.php

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Artgris\MaintenanceBundle\DependencyInjection;
4+
5+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
6+
use Symfony\Component\Config\Definition\ConfigurationInterface;
7+
8+
/**
9+
* This is the class that validates and merges configuration from your app/config files.
10+
*
11+
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/configuration.html}
12+
*/
13+
class Configuration implements ConfigurationInterface
14+
{
15+
/**
16+
* {@inheritdoc}
17+
*/
18+
public function getConfigTreeBuilder()
19+
{
20+
$treeBuilder = new TreeBuilder();
21+
$rootNode = $treeBuilder->root('artgris_maintenance');
22+
23+
$rootNode
24+
->children()
25+
->scalarNode("enable")->defaultValue(false)->end()
26+
->arrayNode("ips")->end()
27+
->end();
28+
29+
return $treeBuilder;
30+
}
31+
}

EventListener/MaintenanceListener.php

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
4+
namespace Artgris\MaintenanceBundle\EventListener;
5+
6+
7+
use Symfony\Bridge\Twig\TwigEngine;
8+
use Symfony\Component\HttpFoundation\Response;
9+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
10+
use Symfony\Component\HttpKernel\KernelInterface;
11+
/**
12+
* Maintenance Listener
13+
*
14+
* @author Arthur Gribet <[email protected]>
15+
*/
16+
class MaintenanceListener
17+
{
18+
/**
19+
* @var bool
20+
*/
21+
private $enable;
22+
/**
23+
* @var array
24+
*/
25+
private $ips;
26+
/**
27+
* @var KernelInterface
28+
*/
29+
private $kernel;
30+
/**
31+
* @var TwigEngine
32+
*/
33+
private $templating;
34+
/**
35+
* MaintenanceListener constructor.
36+
*
37+
* @param array $maintenance
38+
* @param KernelInterface $kernel
39+
* @param TwigEngine $templating
40+
*/
41+
public function __construct(array $maintenance, KernelInterface $kernel, TwigEngine $templating)
42+
{
43+
$this->enable = $maintenance['enable'] ? $maintenance['enable'] : false;
44+
$this->ips = $maintenance['ips'] ? $maintenance['ips'] : [];
45+
$this->kernel = $kernel;
46+
$this->templating = $templating;
47+
}
48+
public function onKernelRequest(GetResponseEvent $event)
49+
{
50+
/**
51+
* Conditions : Maintenance enable, not in dev/test mode, not in enable Ips
52+
*/
53+
if ($this->enable && !in_array($this->kernel->getEnvironment(), ['test', 'dev']) && !in_array(@$_SERVER['REMOTE_ADDR'], $this->ips)) {
54+
$content = $this->templating->render('@ArtgrisMaintenance/maintenance.html.twig');
55+
$event->setResponse(new Response($content, 503));
56+
$event->stopPropagation();
57+
}
58+
}
59+
}

README.md

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# MaintenanceBundle
2+
Symfony Bundle to place your Symfony website in maintenance mode
3+
4+
Installation
5+
============
6+
7+
### 1) Download
8+
9+
`composer require artgris/maintenance-bundle`
10+
11+
### 2) Enable Bundle
12+
13+
// app/AppKernel.php
14+
15+
// ...
16+
class AppKernel extends Kernel
17+
{
18+
// ...
19+
20+
public function registerBundles()
21+
{
22+
$bundles = array(
23+
// ...
24+
new Artgris\MaintenanceBundle\ArtgrisMaintenanceBundle(),
25+
);
26+
27+
// ...
28+
}
29+
}
30+
### 3) Configure the Bundle
31+
32+
Adds following configurations
33+
34+
to ` app/config/config.yml` :
35+
36+
```yml
37+
artgris_maintenance:
38+
enable: true # Enable|Disable maintenance
39+
ips: [127.0.0.1, ...] # IPs allow (prod)
40+
```
41+
42+
### 4) Override maintenance.html.twig
43+
44+
Create your own twig in `app/Resources/ArtgrisMaintenanceBundle/view/maintenance.html.twig`.
45+
46+
Usage
47+
=====
48+
49+
The `dev` and `test` environments were not affected by maintenance.
50+
51+
- Enable|Disable maintenance : `enable: true|false`
52+
- Add authorized IPs to prod : `ips: [127.0.0.1, ...]`
53+
54+
55+
Don't forget to clear and warm the `prod` cache :
56+
57+
php bin/console cache:clear --env=prod
58+

Resources/config/services.yml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
services:
2+
maintenance_listener:
3+
class: Artgris\MaintenanceBundle\EventListener\MaintenanceListener
4+
arguments: ['%artgris_maintenance%', '@kernel', '@templating']
5+
tags:
6+
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Resources/views/maintenance.html.twig

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport"
6+
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8+
<title>Maintenance</title>
9+
<link href="https://fonts.googleapis.com/css?family=Raleway" rel="stylesheet">
10+
<style>
11+
body, html {
12+
font-family: 'Raleway', sans-serif;
13+
width: 100%;
14+
height: 100%;
15+
margin: 0;
16+
padding: 0;
17+
overflow: hidden;
18+
position: relative;
19+
color: #4d4d4d;
20+
}
21+
22+
.content {
23+
position: absolute;
24+
top: 50%;
25+
transform: translateY(-50%);
26+
z-index: 1000;
27+
text-align: center;
28+
width: 100%;
29+
overflow: auto;
30+
margin: auto;
31+
left: 0;
32+
right: 0;
33+
}
34+
35+
.content h1 {
36+
font-size: 80px;
37+
font-weight: 100;
38+
}
39+
canvas {
40+
position: absolute;
41+
min-width: 100%;
42+
}
43+
44+
</style>
45+
</head>
46+
<body>
47+
<div class="content">
48+
<h1>Site under maintenance</h1>
49+
<h2>We'll be back soon. Sorry for inconvenience.</h2>
50+
</div>
51+
<script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.4.0/trianglify.min.js"></script>
52+
<script>
53+
54+
function generateTrianglify(withadd) {
55+
var trianglify = Trianglify({
56+
width: window.innerWidth,
57+
height: window.innerHeight,
58+
cell_size: 40,
59+
seed: 'u3c38'
60+
})
61+
62+
if (withadd) {
63+
document.body.appendChild(trianglify.canvas())
64+
}
65+
return trianglify
66+
}
67+
68+
generateTrianglify(true);
69+
70+
window.onresize = function (event) {
71+
72+
var element = document.getElementsByTagName("canvas")[0]
73+
var trianglify = generateTrianglify(false)
74+
element.parentNode.replaceChild(trianglify.canvas(), element)
75+
76+
}
77+
78+
</script>
79+
</body>
80+
</html>

composer.json

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "artgris/maintenance-bundle",
3+
"type": "symfony-bundle",
4+
"description": "maintenance bundle",
5+
"keywords": [
6+
"symfony",
7+
"maintenance",
8+
"bundle"
9+
],
10+
"homepage": "https://github.com/artgris/MaintenanceBundle",
11+
"license": "MIT",
12+
"authors": [
13+
{
14+
"name": "Arthur Gribet",
15+
"email": "[email protected]"
16+
}
17+
],
18+
"require": {
19+
"php": ">=5.3.3",
20+
"symfony/framework-bundle": "^2.3 || ^3.0",
21+
"twig/twig": "~1.12"
22+
},
23+
"autoload": {
24+
"psr-4": {
25+
"Artgris\\MaintenanceBundle": ""
26+
}
27+
},
28+
"target-dir": "Artgris/MaintenanceBundle"
29+
}

index.html

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport"
6+
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8+
<title>Maintenance</title>
9+
<link href="https://fonts.googleapis.com/css?family=Raleway" rel="stylesheet">
10+
<style>
11+
body, html {
12+
font-family: 'Raleway', sans-serif;
13+
width: 100%;
14+
height: 100%;
15+
margin: 0;
16+
padding: 0;
17+
overflow: hidden;
18+
position: relative;
19+
color: #4d4d4d;
20+
}
21+
22+
.content {
23+
position: absolute;
24+
top: 50%;
25+
transform: translateY(-50%);
26+
z-index: 1000;
27+
text-align: center;
28+
width: 100%;
29+
overflow: auto;
30+
margin: auto;
31+
left: 0;
32+
right: 0;
33+
}
34+
35+
.content h1 {
36+
font-size: 80px;
37+
font-weight: 100;
38+
}
39+
canvas {
40+
position: absolute;
41+
min-width: 100%;
42+
}
43+
44+
</style>
45+
</head>
46+
<body>
47+
<div class="content">
48+
<h1>Site under maintenance</h1>
49+
<h2>We'll be back soon. Sorry for inconvenience.</h2>
50+
</div>
51+
<script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.4.0/trianglify.min.js"></script>
52+
<script>
53+
54+
function generateTrianglify(withadd) {
55+
var trianglify = Trianglify({
56+
width: window.innerWidth,
57+
height: window.innerHeight,
58+
cell_size: 40,
59+
seed: 'u3c38'
60+
})
61+
62+
if (withadd) {
63+
document.body.appendChild(trianglify.canvas())
64+
}
65+
return trianglify
66+
}
67+
68+
generateTrianglify(true);
69+
70+
window.onresize = function (event) {
71+
72+
var element = document.getElementsByTagName("canvas")[0]
73+
var trianglify = generateTrianglify(false)
74+
element.parentNode.replaceChild(trianglify.canvas(), element)
75+
76+
}
77+
78+
</script>
79+
</body>
80+
</html>

0 commit comments

Comments
 (0)