Explorar o código

Add 对多IP/负载均衡的线路进行基础DNS设置支撑;

兔姬桑 %!s(int64=4) %!d(string=hai) anos
pai
achega
925dce7b18

+ 2 - 2
app/Http/Requests/Admin/NodeRequest.php

@@ -12,8 +12,8 @@ class NodeRequest extends FormRequest
             'is_ddns' => 'required|boolean',
             'name' => 'required|string',
             'server' => 'required_if:is_ddns,1|nullable|ends_with:'.implode(',', config('domains')),
-            'ip' => 'ipv4|required_if:is_ddns,0|nullable',
-            'ipv6' => 'nullable|ipv6',
+            'ip' => 'required_if:is_ddns,0|nullable',
+            'ipv6' => 'nullable',
             'push_port' => 'numeric|between:0,65535',
             'traffic_rate' => 'required|numeric|min:0',
             'level' => 'required|numeric|exists:level,level',

+ 7 - 0
app/Models/Node.php

@@ -72,6 +72,13 @@ class Node extends Model
         return $this->hasOne(NodeAuth::class);
     }
 
+    public function ips(int $type = 4)
+    {
+        $ip = $type === 4 ? $this->attributes['ip'] : $this->attributes['ipv6'];
+
+        return array_map('trim', explode(',', $ip));
+    }
+
     public function level_table(): HasOne
     {
         return $this->hasOne(Level::class, 'level', 'level');

+ 25 - 19
app/Observers/NodeObserver.php

@@ -24,10 +24,14 @@ class NodeObserver
 
         if ($node->is_ddns === '0' && $node->server && sysConfig('ddns_mode')) {
             if ($node->ip) {
-                DDNS::store($node->server, $node->ip);
+                foreach ($node->ips() as $ip) {
+                    DDNS::store($node->server, $ip);
+                }
             }
             if ($node->ipv6) {
-                DDNS::store($node->server, $node->ipv6, 'AAAA');
+                foreach ($node->ips(6) as $ip) {
+                    DDNS::store($node->server, $ip, 'AAAA');
+                }
             }
         }
     }
@@ -40,28 +44,30 @@ class NodeObserver
                 if (Arr::exists($changes, 'server')) { // 域名变动
                     DDNS::destroy($node->getOriginal('server')); // 删除原域名
                     if ($node->ip) { // 添加IPV4至新域名
-                        DDNS::store($node->server, $node->ip);
+                        foreach ($node->ips() as $ip) {
+                            DDNS::store($node->server, $ip);
+                        }
                     }
                     if ($node->ipv6) { // 添加IPV6至新域名
-                        DDNS::store($node->server, $node->ipv6, 'AAAA');
+                        foreach ($node->ips(6) as $ip) {
+                            DDNS::store($node->server, $ip, 'AAAA');
+                        }
                     }
-                } else {
-                    if (Arr::exists($changes, 'ip')) { // 域名未改动,IP变动
-                        if ($node->ip && $node->getOriginal('ip')) { // IPV4变动
-                            DDNS::update($node->server, $node->ip);
-                        } elseif ($node->ip) { // 新添加IPV4
-                            DDNS::store($node->server, $node->ip);
-                        } else { // 空值 删除原IPV4
-                            DDNS::destroy($node->server, 'A');
+                } else { // 域名未改动
+                    if (Arr::exists($changes, 'ip')) { // IPV4变动
+                        DDNS::destroy($node->server, 'A');
+                        if ($node->ip) { // 非空值 重新设置IPV4
+                            foreach ($node->ips() as $ip) {
+                                DDNS::store($node->server, $ip);
+                            }
                         }
                     }
-                    if (Arr::exists($changes, 'ipv6')) { // 域名未改动,IPV6变动
-                        if ($node->ipv6 && $node->getOriginal('ipv6')) { // IPV6变动
-                            DDNS::update($node->server, $node->ipv6, 'AAAA');
-                        } elseif ($node->ipv6) { // 新添加IPV6
-                            DDNS::store($node->server, $node->ipv6, 'AAAA');
-                        } else { // 空值 删除原IPV6
-                            DDNS::destroy($node->server, 'AAAA');
+                    if (Arr::exists($changes, 'ipv6')) { // IPV6变动
+                        DDNS::destroy($node->server, 'AAAA');
+                        if ($node->ipv6) { // 非空值 重新设置IPV6
+                            foreach ($node->ips(6) as $ip) {
+                                DDNS::store($node->server, $ip, 'AAAA');
+                            }
                         }
                     }
                 }

+ 37 - 0
database/migrations/2021_04_25_095012_ddns_node.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class DdnsNode extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('node', function (Blueprint $table) {
+            $table->text('ip')->nullable()->comment('服务器IPV4地址')->change();
+            $table->text('ipv6')->nullable()->comment('服务器IPV6地址')->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('node', function (Blueprint $table) {
+            $table->dropColumn('ip', 'ipv6');
+        });
+        Schema::table('node', function (Blueprint $table) {
+            $table->ipAddress('ip')->nullable()->comment('服务器IPV4地址')->after('server');
+            $table->ipAddress('ipv6')->nullable()->comment('服务器IPV6地址')->after('ip');
+        });
+    }
+}

+ 2 - 0
resources/views/admin/node/info.blade.php

@@ -49,10 +49,12 @@
                                     <div class="form-group row">
                                         <label for="ip" class="col-md-3 col-form-label"> IPv4地址 </label>
                                         <input type="text" class="form-control col-md-4" name="ip" id="ip" placeholder="服务器IPv4地址" required>
+                                        <span class="text-help offset-md-3">多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8</span>
                                     </div>
                                     <div class="form-group row">
                                         <label for="ipv6" class="col-md-3 col-form-label"> IPv6地址 </label>
                                         <input type="text" class="form-control col-md-4" name="ipv6" id="ipv6" placeholder="服务器IPv6地址,填写则用户可见,域名无效">
+                                        <span class="text-help offset-md-3">多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8</span>
                                     </div>
                                     <div class="form-group row">
                                         <label for="push_port" class="col-md-3 col-form-label"> 消息推送端口 </label>