]> _ Git - fluidbook-toolbox.git/commitdiff
wip #6286 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 18 Sep 2023 07:18:43 +0000 (09:18 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 18 Sep 2023 07:18:43 +0000 (09:18 +0200)
.docker/dev/update.sh
.docker/update.sh
app/Models/TeamServers.php [new file with mode: 0644]
app/SubForms/TeamServer.php [new file with mode: 0644]
resources/views/vendor/backpack/base/inc/sidebar_content.blade.php

index 7c00c55e6fdce38eaba2c6cdefc034b79823ca1b..90538f346116d53b2bbb51d1a792900d32ddf769 100644 (file)
@@ -7,4 +7,4 @@ docker compose down
 docker compose up -d
 /home/toolbox/www/scripts/fixrights.sh
 docker exec -it fluidbook-toolbox /application/scripts/update.sh
-
+find /home/toolbox/dev/ -type d \( -path /home/toolbox/dev/.docker \) -prune -o -exec chown -R toolbox:www-data {} \;
index 378ae0d8a5d5749958d00a36d1f9ea9103e27a5e..6f9fe5a1705d2a9bed33472d6e0e01eb357948ae 100644 (file)
@@ -7,3 +7,4 @@ docker compose down
 docker compose  up -d
 /home/toolbox/www/scripts/fixrights.sh
 docker exec -it fluidbook-toolbox /application/scripts/update.sh
+find /home/toolbox/www/ -type d \( -path /home/toolbox/www/.docker \) -prune -o -exec chown -R toolbox:www-data {} \;
diff --git a/app/Models/TeamServers.php b/app/Models/TeamServers.php
new file mode 100644 (file)
index 0000000..de60378
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+namespace App\Models;
+
+use App\SubForms\TeamServer;
+use Cubist\Backpack\Magic\Fields\BunchOfFieldsMultiple;
+use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+use Cubist\Util\Text;
+
+class TeamServers extends CubistMagicAbstractModel
+{
+    protected $table = 'team_servers';
+
+    protected $_options = ['name' => 'team-servers',
+        'singular' => 'paramètre',
+        'plural' => 'paramètres',
+        'oneinstance' => true];
+
+    public function setFields()
+    {
+        parent::setFields();
+        $this->addField('servers', BunchOfFieldsMultiple::class, __('Serveurs Cubedesigners'), ['bunch' => TeamServer::class]);
+        $this->addField('ip', Textarea::class, __('IP Cubedesigners à autoriser'));
+        $this->addField('clients', Textarea::class, __('Serveurs des clients'));
+        $this->addField('blacklist', Textarea::class, __('Liste noire'));
+    }
+
+    public function generateFirewall($for)
+    {
+        $servers = $this->servers;
+        $found = false;
+        foreach ($servers as $k => $server) {
+            if ($server['name'] === $for) {
+                $found = true;
+                break;
+            }
+        }
+
+        if (!$found) {
+            return;
+        }
+
+        $blacklist = Text::explodeNewLines($this->blacklist);
+        $clients = Text::explodeNewLines($this->clients);
+        $ip = Text::explodeNewLines($this->ip);
+
+        $res = '#!/bin/bash' . "\n";
+
+        $res .= 'apt install bind9 dnsutils' . "\n";
+        $res .= 'service bind9 restart' . "\n";
+
+        $res .= 'blacklist=(' . implode(' ', $blacklist) . ')' . "\n";
+
+        $hosts = [];
+        foreach ($servers as $k => $s) {
+            $hosts[] = '$s' . $k;
+            $res .= 's' . $k . '=`dig +short ' . $s['name'] . '.cubedesigners.com | tail -1`' . "\n";
+            $others = Text::explodeNewLines($s['others']);
+            foreach ($others as $kk => $o) {
+                $hosts[] = '$s' . $k . '_' . $kk;
+                $res .= 's' . $k . '_' . $kk . '=`dig +short ' . $o . ' | tail -1`' . "\n";
+            }
+        }
+        foreach ($ip as $k => $i) {
+            $hosts[] = '$i' . $k;
+            $res .= 'i' . $k . '=`dig +short ' . $i . ' | tail -1`' . "\n";
+        }
+
+
+        $res .= 'auth=(' . implode(' ', $hosts) . ')' . "\n";
+
+        if ($server['backup']) {
+            $backup = [];
+            foreach ($clients as $k => $c) {
+                $backup[] = '$c' . $k;
+                $res .= 'c' . $k . '=`dig +short ' . $c . ' | tail -1`' . "\n";
+            }
+            $res .= 'backup=(' . implode(' ', $backup) . ')' . "\n";
+        }
+
+        $openPorts = explode(',',);
+        if ($server['dns']) {
+            $openPorts[] = 53;
+        }
+        if ($server['http']) {
+            $openPorts[] = 80;
+            $openPorts[] = 443;
+        }
+
+        $res .= 'for ip in "${blacklist[@]}"
+do
+        ufw deny in from $ip
+        ufw deny in to $ip
+        ufw deny out from $ip
+        ufw deny out to $ip
+done
+
+for ip in "${auth[@]}"
+do
+        ufw allow out to $ip port 22
+        ufw allow from $ip
+        ufw allow to $ip
+done' . "\n\n";
+        if (isset($backup) && count($backup)) {
+            $res .= 'for ip in "${auth[@]}"
+do
+        ufw allow in from $ip port 22
+done' . "\n\n";
+        }
+        $res .= '#SSH
+ufw deny out 22
+# Finally enable firewall
+ufw --force enable
+# Enable loging
+ufw logging on
+# Display status
+ufw status verbose
+
+rm /etc/ufw/after.rules.*
+rm /etc/ufw/after6.rules.*
+rm /etc/ufw/before.rules.*
+rm /etc/ufw/before6.rules.*
+rm /lib/ufw/user6.rules.*
+rm /lib/ufw/user.rules.*
+';
+    }
+}
diff --git a/app/SubForms/TeamServer.php b/app/SubForms/TeamServer.php
new file mode 100644 (file)
index 0000000..fcc1b84
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace App\SubForms;
+
+use Cubist\Backpack\Magic\Fields\Checkbox;
+use Cubist\Backpack\Magic\Fields\Integer;
+use Cubist\Backpack\Magic\Fields\Text;
+use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Backpack\Magic\SubForm;
+
+class TeamServer extends SubForm
+{
+    public function init()
+    {
+        parent::init();
+
+        $this->addField('name', Text::class, __('Nom du serveur'), ['suffix' => '.cubedesigners.com']);
+        $this->addField('port', Integer::class, __('Port SSH'), ['default' => 22]);
+        $this->addField('others', Textarea::class, __('Autres noms d\'hôte'));
+        $this->addField('dns', Checkbox::class, __('Serveur DNS'));
+        $this->addField('mail', Checkbox::class, __('Serveur Mail'));
+        $this->addField('http', Checkbox::class, __('Serveur HTTP'));
+        $this->addField('backup', Checkbox::class, __('Serveur de backup'));
+        $this->addField('ports', Text::class, __('Autres ports à ouvrir'));
+    }
+}
index 0b44195985f6afe771a08354df8640eead3223ff..aa5895d60f4abaed50ac022de802808ba2f2e655 100644 (file)
     </script>
 @endpush
 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('dashboard') }}"><i
-            class='nav-icon la la-dashboard'></i>{{ trans('backpack::base.dashboard') }}
+                class='nav-icon la la-dashboard'></i>{{ trans('backpack::base.dashboard') }}
     </a></li>
 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('tasks') }}"><i
-            class='nav-icon la la-bell'></i>{{ __('Notifications') }}
+                class='nav-icon la la-bell'></i>{{ __('Notifications') }}
     </a></li>
 
 @can('files:read')
     <li class="nav-item"><a class="nav-link" href="{{ backpack_url('file') }}"><i
-                class='nav-icon las la-cloud'></i>{{ __('Partage de fichiers') }}
+                    class='nav-icon las la-cloud'></i>{{ __('Partage de fichiers') }}
         </a></li>
 @endcan
 
 @canany(['quiz:read','quiztranslation:read','elearning_media:read'])
     <li {!! sidebarState('elearning',true) !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class='nav-icon la la-chalkboard-teacher'></i>{{__('e-Learning')}}</a>
+                    class='nav-icon la la-chalkboard-teacher'></i>{{__('e-Learning')}}</a>
         <ul class='nav-dropdown-items'>
             @can('quiz:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('quiz') }}"><i
-                            class="la la-question nav-icon"></i> {{__('Quiz')}}</a></li>
+                                class="la la-question nav-icon"></i> {{__('Quiz')}}</a></li>
             @endcan
             @can('elearning-media:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('elearning-media') }}"><i
-                            class="la la-photo-video nav-icon"></i> {{__('Media')}}</a></li>
+                                class="la la-photo-video nav-icon"></i> {{__('Media')}}</a></li>
             @endcan
             @can('elearning-package:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('elearning-package') }}"><i
-                            class="la la-cubes nav-icon"></i> {{__('Package')}}</a></li>
+                                class="la la-cubes nav-icon"></i> {{__('Package')}}</a></li>
             @endcan
             @can('quiztranslation:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('quiztranslation') }}"><i
-                            class="la la-language nav-icon"></i> {{__('Traductions')}}</a></li>
+                                class="la la-language nav-icon"></i> {{__('Traductions')}}</a></li>
             @endcan
         </ul>
     </li>
 
 @canany(['fluidbook-quote:read','signature:read','fluidbook-theme:read','fluidbook-iconset:read','fluibook-translate:write','fluidbook-publication:read'])
     <li {!! sidebarState('fluidbook',true) !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class="nav-icon la"><img src="/images/icons/icon-fluidbook.svg"/></i>{{__('Fluidbook')}}</a>
+                    class="nav-icon la"><img src="/images/icons/icon-fluidbook.svg"/></i>{{__('Fluidbook')}}</a>
         <ul class='nav-dropdown-items'>
             @can('fluidbook-publication:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-publication') }}"><i
-                            class="la la-book-reader nav-icon"></i> {{__('Publications')}}</a></li>
+                                class="la la-book-reader nav-icon"></i> {{__('Publications')}}</a></li>
             @endcan
             @can('fluidbook-theme:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-theme') }}"><i
-                            class="la la-palette nav-icon"></i> {{__('Thèmes')}}</a></li>
+                                class="la la-palette nav-icon"></i> {{__('Thèmes')}}</a></li>
             @endcan
             @can('fluidbook-iconset:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-iconset') }}"><i
-                            class="la la-icons nav-icon"></i> {{__('Jeux d\'icônes')}}</a></li>
+                                class="la la-icons nav-icon"></i> {{__('Jeux d\'icônes')}}</a></li>
             @endcan
             @can('fluidbook-collection:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-collection') }}"><i
-                            class="la la-university nav-icon"></i> {{__('Collections')}}</a></li>
+                                class="la la-university nav-icon"></i> {{__('Collections')}}</a></li>
             @endcan
             @can('fluidbook-translate:write')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('fluidbook-translate/1/edit/?_locale=en') }}'><i
-                            class='la la-language nav-icon'></i>
+                                class='la la-language nav-icon'></i>
                         <span> {{__('Traductions')}}</span></a>
                 </li>
             @endcan
             @can('signature:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('signature') }}"><i
-                            class="la la-signature nav-icon"></i> {{__('Signatures')}}</a></li>
+                                class="la la-signature nav-icon"></i> {{__('Signatures')}}</a></li>
             @endcan
             @can('fluidbook-external-install-server:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-external-install-server') }}"><i
-                            class="la las la-server nav-icon"></i> {{__('Serveurs externes')}}</a></li>
+                                class="la las la-server nav-icon"></i> {{__('Serveurs externes')}}</a></li>
             @endcan
             @can('fluidbook-quote:read')
                 <li class="nav-item"><a class="nav-link" href="{{ backpack_url('fluidbook-quote') }}"><i
-                            class="la la-wpforms nav-icon"></i> {{__('Demandes de devis')}}</a></li>
+                                class="la la-wpforms nav-icon"></i> {{__('Demandes de devis')}}</a></li>
             @endcan
         </ul>
     </li>
 @endcanany
 @can('tools')
     <li {!! sidebarState('tools') !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class='nav-icon la la-tools'></i>{{__('Outils')}}</a>
+                    class='nav-icon la la-tools'></i>{{__('Outils')}}</a>
         @include('tools.sidebar')
     </li>
 @endcan
 @canany(['users:read','company:read','managerolesandpersmissions'])
     <li {!! sidebarState('users') !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class='nav-icon la la-group'></i>{{__('Clients')}}</a>
+                    class='nav-icon la la-group'></i>{{__('Clients')}}</a>
         <ul class='nav-dropdown-items'>
             @can('company:read')
                 <li class='nav-item'><a class='nav-link' href='{{ backpack_url('company') }}'><i
-                            class='nav-icon la la-building'></i>
+                                class='nav-icon la la-building'></i>
                         <span>{{__('Clients')}}</span></a></li>
                 <li class='nav-item'><a class='nav-link' href='{{ backpack_url('users') }}'><i
-                            class='nav-icon la la-user-lock'></i>
+                                class='nav-icon la la-user-lock'></i>
                         <span>{{__('Utilisateurs')}}</span></a></li>
             @endcan
             @can('managerolesandpersmissions')
                 <li class='nav-item'><a class='nav-link' href='{{ backpack_url('role') }}'><i
-                            class='nav-icon la la-group'></i>
+                                class='nav-icon la la-group'></i>
                         <span>{{__('Roles')}}</span></a></li>
                 <li class='nav-item'><a class='nav-link' href='{{ backpack_url('permission') }}'><i
-                            class='nav-icon la la-key'></i><span>{{__('Permissions')}}</span></a></li>
+                                class='nav-icon la la-key'></i><span>{{__('Permissions')}}</span></a></li>
             @endcan
         </ul>
     </li>
 
 @canany(['team-leave:read','team-overtime:read','extranet:manage_emails'])
     <li {!! sidebarState('team') !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class='nav-icon la la-mug-hot'></i>{{__('Équipe')}}</a>
+                    class='nav-icon la la-mug-hot'></i>{{__('Équipe')}}</a>
         <ul class='nav-dropdown-items'>
             @can('extranet:manage_emails')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('team-emails') }}'><i
-                            class='nav-icon la la-mail-bulk'></i>
+                                class='nav-icon la la-mail-bulk'></i>
                         <span>{{__('Emails')}}</span></a>
                 </li>
             @endcan
+            @can('extranet:manage_servers')
+                <li class="nav-item"><a class="nav-link"
+                                        href='{{ backpack_url('team-servers') }}'><i
+                                class='nav-icon las la-server'></i>
+                        <span>{{__('Serveurs')}}</span></a>
+                </li>
+            @endcan
             @can('team-pay:read')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('team-pay') }}'><i
-                            class="nav-icon las la-file-invoice-dollar"></i>
+                                class="nav-icon las la-file-invoice-dollar"></i>
                         <span>{{__('Bulletins de salaire')}}</span></a>
                 </li>
             @endcan
             @can('team-leave:read')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('team-leave') }}'><i
-                            class="nav-icon las la-umbrella-beach"></i>
+                                class="nav-icon las la-umbrella-beach"></i>
                         <span>{{__('Congés et absences')}}</span></a>
                 </li>
             @endcan
             @can('team-overtime:read')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('team-overtime') }}'><i
-                            class="nav-icon las la-stopwatch"></i>
+                                class="nav-icon las la-stopwatch"></i>
                         <span>{{__('Heures supp')}}</span></a>
                 </li>
             @endcan
 
 @canany(['maintenance','toolbox-translate:admin'])
     <li {!! sidebarState('admin') !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
-                class='nav-icon la la-cogs'></i>{{__('Administration')}}</a>
+                    class='nav-icon la la-cogs'></i>{{__('Administration')}}</a>
         <ul class='nav-dropdown-items'>
             @can('toolbox-translate:admin')
                 <li class="nav-item"><a class="nav-link"
                                         href='{{ backpack_url('toolbox-translate/1/edit/?_locale=en') }}'><i
-                            class='la la-language'></i>
+                                class='la la-language'></i>
                         <span>{{__('Traduction')}}</span></a>
                 </li>
             @endcan