201 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Filament\Resources\NodeResource\Pages;
 | |
| 
 | |
| use App\Filament\Resources\NodeResource;
 | |
| use Filament\Forms;
 | |
| use Filament\Resources\Pages\CreateRecord;
 | |
| use Illuminate\Support\HtmlString;
 | |
| 
 | |
| class CreateNode extends CreateRecord
 | |
| {
 | |
|     protected static string $resource = NodeResource::class;
 | |
| 
 | |
|     protected static bool $canCreateAnother = false;
 | |
| 
 | |
|     protected ?string $subheading = 'which is a machine that runs your Servers';
 | |
| 
 | |
|     public function form(Forms\Form $form): Forms\Form
 | |
|     {
 | |
|         return $form
 | |
|             ->columns([
 | |
|                 'default' => 2,
 | |
|                 'sm' => 3,
 | |
|                 'md' => 3,
 | |
|                 'lg' => 4,
 | |
|             ])
 | |
|             ->schema([
 | |
|                 Forms\Components\TextInput::make('fqdn')
 | |
|                     ->columnSpan(2)
 | |
|                     ->required()
 | |
|                     ->autofocus()
 | |
|                     ->live(debounce: 1500)
 | |
|                     ->rule('prohibited', fn ($state) => is_ip($state) && request()->isSecure())
 | |
|                     ->label(fn ($state) => is_ip($state) ? 'IP Address' : 'Domain Name')
 | |
|                     ->placeholder(fn ($state) => is_ip($state) ? '192.168.1.1' : 'node.example.com')
 | |
|                     ->helperText(function ($state) {
 | |
|                         if (is_ip($state)) {
 | |
|                             if (request()->isSecure()) {
 | |
|                                 return '
 | |
|                                     Your panel is currently secured via an SSL certificate and that means your nodes require one too.
 | |
|                                     You must use a domain name, because you cannot get SSL certificates for IP Addresses
 | |
|                                 ';
 | |
|                             }
 | |
| 
 | |
|                             return '';
 | |
|                         }
 | |
| 
 | |
|                         return "
 | |
|                             This is the domain name that points to your node's IP Address.
 | |
|                             If you've already set up this, you can verify it by checking the next field!
 | |
|                         ";
 | |
|                     })
 | |
|                     ->hintColor('danger')
 | |
|                     ->hint(function ($state) {
 | |
|                         if (is_ip($state) && request()->isSecure()) {
 | |
|                             return 'You cannot connect to an IP Address over SSL';
 | |
|                         }
 | |
| 
 | |
|                         return '';
 | |
|                     })
 | |
|                     ->afterStateUpdated(function (Forms\Set $set, ?string $state) {
 | |
|                         $set('dns', null);
 | |
|                         $set('ip', null);
 | |
| 
 | |
|                         [$subdomain] = str($state)->explode('.', 2);
 | |
|                         if (!is_numeric($subdomain)) {
 | |
|                             $set('name', $subdomain);
 | |
|                         }
 | |
| 
 | |
|                         if (!$state || is_ip($state)) {
 | |
|                             $set('dns', null);
 | |
| 
 | |
|                             return;
 | |
|                         }
 | |
| 
 | |
|                         $validRecords = gethostbynamel($state);
 | |
|                         if ($validRecords) {
 | |
|                             $set('dns', true);
 | |
| 
 | |
|                             $set('ip', collect($validRecords)->first());
 | |
| 
 | |
|                             return;
 | |
|                         }
 | |
| 
 | |
|                         $set('dns', false);
 | |
|                     })
 | |
|                     ->maxLength(191),
 | |
| 
 | |
|                 Forms\Components\TextInput::make('ip')
 | |
|                     ->disabled()
 | |
|                     ->hidden(),
 | |
| 
 | |
|                 Forms\Components\ToggleButtons::make('dns')
 | |
|                     ->label('DNS Record Check')
 | |
|                     ->helperText('This lets you know if your DNS record correctly points to an IP Address.')
 | |
|                     ->disabled()
 | |
|                     ->inline()
 | |
|                     ->default(null)
 | |
|                     ->hint(fn (Forms\Get $get) => $get('ip'))
 | |
|                     ->hintColor('success')
 | |
|                     ->options([
 | |
|                         true => 'Valid',
 | |
|                         false => 'Invalid',
 | |
|                     ])
 | |
|                     ->colors([
 | |
|                         true => 'success',
 | |
|                         false => 'danger',
 | |
|                     ])
 | |
|                     ->columnSpan([
 | |
|                         'default' => 1,
 | |
|                         'sm' => 1,
 | |
|                         'md' => 1,
 | |
|                         'lg' => 1,
 | |
|                     ]),
 | |
| 
 | |
|                 Forms\Components\TextInput::make('daemonListen')
 | |
|                     ->columnSpan([
 | |
|                         'default' => 1,
 | |
|                         'sm' => 1,
 | |
|                         'md' => 1,
 | |
|                         'lg' => 1,
 | |
|                     ])
 | |
|                     ->label('Port')
 | |
|                     ->helperText('If you are running the daemon behind Cloudflare you should set the daemon port to 8443 to allow websocket proxying over SSL.')
 | |
|                     ->minValue(0)
 | |
|                     ->maxValue(65536)
 | |
|                     ->default(8080)
 | |
|                     ->required()
 | |
|                     ->integer(),
 | |
| 
 | |
|                 Forms\Components\TextInput::make('name')
 | |
|                     ->label('Display Name')
 | |
|                     ->columnSpan([
 | |
|                         'default' => 1,
 | |
|                         'sm' => 1,
 | |
|                         'md' => 1,
 | |
|                         'lg' => 2,
 | |
|                     ])
 | |
|                     ->required()
 | |
|                     ->regex('/[a-zA-Z0-9_\.\- ]+/')
 | |
|                     ->helperText('This name is for display only and can be changed later.')
 | |
|                     ->maxLength(100),
 | |
| 
 | |
|                 Forms\Components\ToggleButtons::make('scheme')
 | |
|                     ->label('Communicate over SSL')
 | |
|                     ->columnSpan([
 | |
|                         'default' => 1,
 | |
|                         'sm' => 1,
 | |
|                         'md' => 1,
 | |
|                         'lg' => 1,
 | |
|                     ])
 | |
|                     ->required()
 | |
|                     ->inline()
 | |
|                     ->helperText(function (Forms\Get $get) {
 | |
|                         if (request()->isSecure()) {
 | |
|                             return new HtmlString('Your Panel is using a secure SSL connection,<br>so your Daemon must too.');
 | |
|                         }
 | |
| 
 | |
|                         if (is_ip($get('fqdn'))) {
 | |
|                             return 'An IP address cannot use SSL.';
 | |
|                         }
 | |
| 
 | |
|                         return '';
 | |
|                     })
 | |
|                     ->disableOptionWhen(fn (string $value): bool => $value === 'http' && request()->isSecure())
 | |
|                     ->options([
 | |
|                         'http' => 'HTTP',
 | |
|                         'https' => 'HTTPS (SSL)',
 | |
|                     ])
 | |
|                     ->colors([
 | |
|                         'http' => 'warning',
 | |
|                         'https' => 'success',
 | |
|                     ])
 | |
|                     ->icons([
 | |
|                         'http' => 'tabler-lock-open-off',
 | |
|                         'https' => 'tabler-lock',
 | |
|                     ])
 | |
|                     ->default(fn () => request()->isSecure() ? 'https' : 'http'),
 | |
| 
 | |
|                 Forms\Components\Textarea::make('description')
 | |
|                     ->hidden()
 | |
|                     ->columnSpan([
 | |
|                         'default' => 1,
 | |
|                         'sm' => 1,
 | |
|                         'md' => 2,
 | |
|                         'lg' => 4,
 | |
|                     ])
 | |
|                     ->rows(5),
 | |
| 
 | |
|                 Forms\Components\Hidden::make('skipValidation')->default(true),
 | |
|             ]);
 | |
|     }
 | |
| 
 | |
|     protected function getRedirectUrlParameters(): array
 | |
|     {
 | |
|         return [
 | |
|             'tab' => '-configuration-tab',
 | |
|         ];
 | |
|     }
 | |
| }
 | 
