1 // SoftEther UT-VPN SourceCode
\r
3 // Copyright (C) 2004-2010 SoftEther Corporation.
\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.
\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.
\r
6 // All Rights Reserved.
\r
8 // http://utvpn.tsukuba.ac.jp/
\r
10 // This program is free software; you can redistribute it and/or
\r
11 // modify it under the terms of the GNU General Public License
\r
12 // version 2 as published by the Free Software Foundation.
\r
14 // This program is distributed in the hope that it will be useful,
\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 // GNU General Public License for more details.
\r
19 // You should have received a copy of the GNU General Public License version 2
\r
20 // along with this program; if not, write to the Free Software
\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
81 #include "CedarPch.h"
\r
83 static SERVER *server = NULL;
\r
84 static LOCK *server_lock = NULL;
\r
85 char *SERVER_CONFIG_FILE_NAME = "@vpn_server.config";
\r
86 char *BRIDGE_CONFIG_FILE_NAME = "@vpn_bridge.config";
\r
88 static bool server_reset_setting = false;
\r
90 // VPN Server に登録されているユーザーオブジェクト数が多すぎるかどうか取得
\r
91 bool SiTooManyUserObjectsInServer(SERVER *s, bool oneMore)
\r
101 num = SiGetServerNumUserObjects(s);
\r
103 Zero(&st, sizeof(st));
\r
105 LiParseCurrentLicenseStatus(s->LicenseSystem, &st);
\r
107 if (st.NumUserLicense == INFINITE)
\r
114 st.NumUserLicense++;
\r
117 if (st.NumUserLicense <= num)
\r
125 // VPN Server に登録されているユーザーオブジェクト数を取得
\r
126 UINT SiGetServerNumUserObjects(SERVER *s)
\r
138 LockList(c->HubList);
\r
141 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
143 HUB *h = LIST_DATA(c->HubList, i);
\r
145 if (h->HubDb != NULL)
\r
147 ret += LIST_NUM(h->HubDb->UserList);
\r
151 UnlockList(c->HubList);
\r
157 typedef struct SI_DEBUG_PROC_LIST
\r
162 SI_DEBUG_PROC *Proc;
\r
163 } SI_DEBUG_PROC_LIST;
\r
166 UINT SiDebug(SERVER *s, RPC_TEST *ret, UINT i, char *str)
\r
168 SI_DEBUG_PROC_LIST proc_list[] =
\r
170 {1, "Hello World", "<test string>", SiDebugProcHelloWorld},
\r
171 {2, "Terminate process now", "", SiDebugProcExit},
\r
172 {3, "Write memory dumpfile", "", SiDebugProcDump},
\r
173 {4, "Restore process priority", "", SiDebugProcRestorePriority},
\r
174 {5, "Set the process priority high", "", SiDebugProcSetHighPriority},
\r
175 {6, "Get the .exe filename of the process", "", SiDebugProcGetExeFileName},
\r
176 {7, "Crash the process", "", SiDebugProcCrash},
\r
178 UINT num_proc_list = sizeof(proc_list) / sizeof(proc_list[0]);
\r
180 UINT ret_value = ERR_NO_ERROR;
\r
182 if (s == NULL || ret == NULL)
\r
184 return ERR_INVALID_PARAMETER;
\r
189 char tmp[MAX_SIZE];
\r
190 Zero(ret, sizeof(RPC_TEST));
\r
192 StrCat(ret->StrValue, sizeof(ret->StrValue),
\r
193 "\n--- Debug Functions List --\n");
\r
195 for (j = 0;j < num_proc_list;j++)
\r
197 SI_DEBUG_PROC_LIST *p = &proc_list[j];
\r
199 if (IsEmptyStr(p->Args) == false)
\r
201 Format(tmp, sizeof(tmp),
\r
202 " %u: %s - Usage: %u /ARGS:\"%s\"\n",
\r
203 p->Id, p->Description, p->Id, p->Args);
\r
207 Format(tmp, sizeof(tmp),
\r
208 " %u: %s - Usage: %u\n",
\r
209 p->Id, p->Description, p->Id);
\r
212 StrCat(ret->StrValue, sizeof(ret->StrValue), tmp);
\r
217 ret_value = ERR_NOT_SUPPORTED;
\r
219 for (j = 0;j < num_proc_list;j++)
\r
221 SI_DEBUG_PROC_LIST *p = &proc_list[j];
\r
225 ret_value = p->Proc(s, str, ret->StrValue, sizeof(ret->StrValue));
\r
227 if (ret_value == ERR_NO_ERROR && IsEmptyStr(ret->StrValue))
\r
229 StrCpy(ret->StrValue, sizeof(ret->StrValue), "Ok.");
\r
238 UINT SiDebugProcHelloWorld(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
241 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
243 return ERR_INVALID_PARAMETER;
\r
246 Format(ret_str, ret_str_size, "Hello World %s\n", in_str);
\r
248 return ERR_NO_ERROR;
\r
250 UINT SiDebugProcExit(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
253 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
255 return ERR_INVALID_PARAMETER;
\r
260 return ERR_NO_ERROR;
\r
262 UINT SiDebugProcDump(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
265 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
267 return ERR_INVALID_PARAMETER;
\r
271 MsWriteMinidump(NULL, NULL);
\r
273 return ERR_NOT_SUPPORTED;
\r
276 return ERR_NO_ERROR;
\r
278 UINT SiDebugProcRestorePriority(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
281 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
283 return ERR_INVALID_PARAMETER;
\r
286 OSRestorePriority();
\r
288 return ERR_NO_ERROR;
\r
290 UINT SiDebugProcSetHighPriority(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
293 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
295 return ERR_INVALID_PARAMETER;
\r
298 OSSetHighPriority();
\r
300 return ERR_NO_ERROR;
\r
302 UINT SiDebugProcGetExeFileName(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
305 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
307 return ERR_INVALID_PARAMETER;
\r
310 GetExeName(ret_str, ret_str_size);
\r
312 return ERR_NO_ERROR;
\r
314 UINT SiDebugProcCrash(SERVER *s, char *in_str, char *ret_str, UINT ret_str_size)
\r
317 if (s == NULL || in_str == NULL || ret_str == NULL)
\r
319 return ERR_INVALID_PARAMETER;
\r
324 return ERR_NO_ERROR;
\r
328 void SiDebugLog(SERVER *s, char *msg)
\r
331 if (s == NULL || msg == NULL)
\r
336 if (s->DebugLog != NULL)
\r
338 WriteTinyLog(s->DebugLog, msg);
\r
343 void SiCheckDeadLockMain(SERVER *s, UINT timeout)
\r
352 Debug("SiCheckDeadLockMain Start.\n");
\r
356 if (s->ServerListenerList != NULL)
\r
358 CheckDeadLock(s->ServerListenerList->lock, timeout, "s->ServerListenerList->lock");
\r
361 CheckDeadLock(s->lock, timeout, "s->lock");
\r
363 if (s->FarmMemberList != NULL)
\r
365 CheckDeadLock(s->FarmMemberList->lock, timeout, "s->FarmMemberList->lock");
\r
368 if (s->HubCreateHistoryList != NULL)
\r
370 CheckDeadLock(s->HubCreateHistoryList->lock, timeout, "s->HubCreateHistoryList->lock");
\r
373 CheckDeadLock(s->CapsCacheLock, timeout, "s->CapsCacheLock");
\r
375 CheckDeadLock(s->TasksFromFarmControllerLock, timeout, "s->TasksFromFarmControllerLock");
\r
379 if (cedar->HubList != NULL)
\r
381 CheckDeadLock(cedar->HubList->lock, timeout, "cedar->HubList->lock");
\r
384 if (cedar->ListenerList != NULL)
\r
387 LIST *o = NewListFast(NULL);
\r
389 CheckDeadLock(cedar->ListenerList->lock, timeout, "cedar->ListenerList->lock");
\r
391 LockList(cedar->ListenerList);
\r
393 for (i = 0;i < LIST_NUM(cedar->ListenerList);i++)
\r
395 LISTENER *r = LIST_DATA(cedar->ListenerList, i);
\r
402 UnlockList(cedar->ListenerList);
\r
404 for (i = 0;i < LIST_NUM(o);i++)
\r
406 LISTENER *r = LIST_DATA(o, i);
\r
408 ReleaseListener(r);
\r
414 if (cedar->ConnectionList != NULL)
\r
416 CheckDeadLock(cedar->ConnectionList->lock, timeout, "cedar->ConnectionList->lock");
\r
419 if (cedar->CaList != NULL)
\r
421 CheckDeadLock(cedar->CaList->lock, timeout, "cedar->CaList->lock");
\r
424 if (cedar->TrafficLock != NULL)
\r
426 CheckDeadLock(cedar->TrafficLock, timeout, "cedar->TrafficLock");
\r
429 if (cedar->TrafficDiffList != NULL)
\r
431 CheckDeadLock(cedar->TrafficDiffList->lock, timeout, "cedar->TrafficDiffList->lock");
\r
434 if (cedar->LocalBridgeList != NULL)
\r
436 CheckDeadLock(cedar->LocalBridgeList->lock, timeout, "cedar->LocalBridgeList->lock");
\r
439 if (cedar->L3SwList != NULL)
\r
441 CheckDeadLock(cedar->L3SwList->lock, timeout, "cedar->L3SwList->lock");
\r
445 Debug("SiCheckDeadLockMain Finish.\n");
\r
449 void SiDeadLockCheckThread(THREAD *t, void *param)
\r
451 SERVER *s = (SERVER *)param;
\r
453 if (s == NULL || t == NULL)
\r
460 Wait(s->DeadLockWaitEvent, SERVER_DEADLOCK_CHECK_SPAN);
\r
462 if (s->HaltDeadLockThread)
\r
467 SiCheckDeadLockMain(s, SERVER_DEADLOCK_CHECK_TIMEOUT);
\r
472 void SiInitDeadLockCheck(SERVER *s)
\r
479 if (s->DisableDeadLockCheck)
\r
484 s->HaltDeadLockThread = false;
\r
485 s->DeadLockWaitEvent = NewEvent();
\r
486 s->DeadLockCheckThread = NewThread(SiDeadLockCheckThread, s);
\r
490 void SiFreeDeadLockCheck(SERVER *s)
\r
498 if (s->DeadLockCheckThread == NULL)
\r
503 s->HaltDeadLockThread = true;
\r
504 Set(s->DeadLockWaitEvent);
\r
506 WaitThread(s->DeadLockCheckThread, INFINITE);
\r
508 ReleaseThread(s->DeadLockCheckThread);
\r
509 s->DeadLockCheckThread = NULL;
\r
511 ReleaseEvent(s->DeadLockWaitEvent);
\r
512 s->DeadLockWaitEvent = NULL;
\r
514 s->HaltDeadLockThread = false;
\r
517 // 指定した仮想 HUB が作成履歴に登録されているかどうか調べる
\r
518 bool SiIsHubRegistedOnCreateHistory(SERVER *s, char *name)
\r
523 if (s == NULL || name == NULL)
\r
528 SiDeleteOldHubCreateHistory(s);
\r
530 LockList(s->HubCreateHistoryList);
\r
532 for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
\r
534 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
\r
536 if (StrCmpi(h->HubName, name) == 0)
\r
543 UnlockList(s->HubCreateHistoryList);
\r
549 void SiDelHubCreateHistory(SERVER *s, char *name)
\r
553 if (s == NULL || name == NULL)
\r
558 LockList(s->HubCreateHistoryList);
\r
560 SERVER_HUB_CREATE_HISTORY *hh = NULL;
\r
561 for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
\r
563 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
\r
565 if (StrCmpi(h->HubName, name) == 0)
\r
567 Delete(s->HubCreateHistoryList, h);
\r
573 UnlockList(s->HubCreateHistoryList);
\r
575 SiDeleteOldHubCreateHistory(s);
\r
579 void SiAddHubCreateHistory(SERVER *s, char *name)
\r
583 if (s == NULL || name == NULL)
\r
588 LockList(s->HubCreateHistoryList);
\r
590 SERVER_HUB_CREATE_HISTORY *hh = NULL;
\r
591 for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
\r
593 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
\r
595 if (StrCmpi(h->HubName, name) == 0)
\r
604 hh = ZeroMalloc(sizeof(SERVER_HUB_CREATE_HISTORY));
\r
605 StrCpy(hh->HubName, sizeof(hh->HubName), name);
\r
607 Add(s->HubCreateHistoryList, hh);
\r
610 hh->CreatedTime = Tick64();
\r
612 UnlockList(s->HubCreateHistoryList);
\r
614 SiDeleteOldHubCreateHistory(s);
\r
617 // 古くなった仮想 HUB 作成履歴の削除
\r
618 void SiDeleteOldHubCreateHistory(SERVER *s)
\r
628 LockList(s->HubCreateHistoryList);
\r
630 o = NewListFast(NULL);
\r
632 for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
\r
634 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
\r
636 if ((h->CreatedTime + ((UINT64)TICKET_EXPIRES)) <= Tick64())
\r
643 for (i = 0;i < LIST_NUM(o);i++)
\r
645 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(o, i);
\r
647 Delete(s->HubCreateHistoryList, h);
\r
654 UnlockList(s->HubCreateHistoryList);
\r
658 void SiInitHubCreateHistory(SERVER *s)
\r
666 s->HubCreateHistoryList = NewList(NULL);
\r
670 void SiFreeHubCreateHistory(SERVER *s)
\r
679 for (i = 0;i < LIST_NUM(s->HubCreateHistoryList);i++)
\r
681 SERVER_HUB_CREATE_HISTORY *h = LIST_DATA(s->HubCreateHistoryList, i);
\r
686 ReleaseList(s->HubCreateHistoryList);
\r
688 s->HubCreateHistoryList = NULL;
\r
691 // Admin Pack のインストーラ作成キットで作成した VPN Client が
\r
693 bool IsAdminPackSupportedServerProduct(char *name)
\r
704 // SoftEther UT-VPN ではこの制限はなくなった
\r
705 if (SearchStrEx(name, "home", 0, false) != INFINITE)
\r
710 if (SearchStrEx(name, "soho", 0, false) != INFINITE)
\r
715 if (SearchStrEx(name, "small business", 0, false) != INFINITE)
\r
720 if (SearchStrEx(name, "standard", 0, false) != INFINITE)
\r
730 // Server スナップショットの初期化
\r
731 void InitServerSnapshot(SERVER *s)
\r
739 if (s->Cedar->Bridge)
\r
744 if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
\r
749 s->SnapshotLogger = NewLog(CE_SNAPSHOT_DIR_NAME, CE_SNAPSHOT_PREFIX, LOG_SWITCH_MONTH);
\r
750 s->LastSnapshotTime = SystemTime64();
\r
751 s->HaltSnapshot = false;
\r
752 s->SnapshotHaltEvent = NewEvent();
\r
753 s->SnapshotThread = NewThread(ServerSnapshotThread, s);
\r
754 s->SnapshotInited = true;
\r
757 // Server スナップショットの解放
\r
758 void FreeServerSnapshot(SERVER *s)
\r
765 if (s->SnapshotInited == false)
\r
770 s->HaltSnapshot = true;
\r
771 Set(s->SnapshotHaltEvent);
\r
773 WaitThread(s->SnapshotThread, INFINITE);
\r
774 ReleaseThread(s->SnapshotThread);
\r
776 FreeLog(s->SnapshotLogger);
\r
777 ReleaseEvent(s->SnapshotHaltEvent);
\r
780 // スナップショットをバッファに書き出す
\r
781 BUF *ServerSnapshotToBuf(SERVER_SNAPSHOT *t)
\r
784 char tmp[MAX_SIZE * 3];
\r
785 char tmp2[MAX_SIZE];
\r
786 UCHAR hash[SHA1_SIZE];
\r
787 UCHAR hash2[SHA1_SIZE];
\r
795 WriteBufLine(b, "------------------------------------------------------");
\r
796 WriteBufLine(b, "[RECORD_INFO]");
\r
798 GetDateTimeStr64(tmp2, sizeof(tmp2), SystemToLocal64(t->DateTime));
\r
799 Format(tmp, sizeof(tmp), "DATETIME: %s", tmp2);
\r
800 WriteBufLine(b, tmp);
\r
802 IPToStr(tmp2, sizeof(tmp2), &t->ServerIp);
\r
803 Format(tmp, sizeof(tmp), "SERVER_IP: %s", tmp2);
\r
804 WriteBufLine(b, tmp);
\r
806 Format(tmp, sizeof(tmp), "SERVER_HOSTNAME: %s", t->ServerHostname);
\r
807 WriteBufLine(b, tmp);
\r
809 Format(tmp, sizeof(tmp), "SERVER_PRODUCT: %s", t->ServerProduct);
\r
810 WriteBufLine(b, tmp);
\r
812 Format(tmp, sizeof(tmp), "SERVER_VERSION: %s", t->ServerVersion);
\r
813 WriteBufLine(b, tmp);
\r
815 Format(tmp, sizeof(tmp), "SERVER_BUILD: %s", t->ServerBuild);
\r
816 WriteBufLine(b, tmp);
\r
818 Format(tmp, sizeof(tmp), "SERVER_OS: %s", t->ServerOs);
\r
819 WriteBufLine(b, tmp);
\r
821 Format(tmp, sizeof(tmp), "SERVER_LICENSE_ID: %I64u", t->ServerLicenseId);
\r
822 WriteBufLine(b, tmp);
\r
824 if (t->ServerLicenseExpires != 0)
\r
826 GetDateTimeStr64(tmp2, sizeof(tmp2), SystemToLocal64(t->ServerLicenseExpires));
\r
830 StrCpy(tmp2, sizeof(tmp2), "None");
\r
832 Format(tmp, sizeof(tmp), "SERVER_LICENSE_EXPIRES: %s", tmp2);
\r
833 WriteBufLine(b, tmp);
\r
835 Format(tmp, sizeof(tmp), "SERVER_TYPE: %u", t->ServerType);
\r
836 WriteBufLine(b, tmp);
\r
838 GetDateTimeStr64(tmp2, sizeof(tmp), SystemToLocal64(t->ServerStartupDatetime));
\r
839 Format(tmp, sizeof(tmp), "SERVER_STARTUP_DATETIME: %s", tmp2);
\r
840 WriteBufLine(b, tmp);
\r
842 Format(tmp, sizeof(tmp), "NUMBER_OF_CLUSTER_NODES: %u", t->NumClusterNodes);
\r
843 WriteBufLine(b, tmp);
\r
845 Format(tmp, sizeof(tmp), "NUMBER_OF_HUBS: %u", LIST_NUM(t->HubList));
\r
846 WriteBufLine(b, tmp);
\r
848 for (i = 0;i < LIST_NUM(t->HubList);i++)
\r
850 HUB_SNAPSHOT *h = LIST_DATA(t->HubList, i);
\r
851 Format(tmp, sizeof(tmp), "[HUB%u]", i);
\r
852 WriteBufLine(b, tmp);
\r
854 Format(tmp, sizeof(tmp), "HUB_NAME: %s", h->HubName);
\r
855 WriteBufLine(b, tmp);
\r
857 Format(tmp, sizeof(tmp), "HUB_STATUS: %s",
\r
858 h->HubStatus ? "Online" : "Offline");
\r
859 WriteBufLine(b, tmp);
\r
861 Format(tmp, sizeof(tmp), "HUB_MAX_SESSIONS_CLIENT: %u",
\r
862 h->HubMaxSessionsClient);
\r
863 WriteBufLine(b, tmp);
\r
865 Format(tmp, sizeof(tmp), "HUB_MAX_SESSIONS_BRIDGE: %u",
\r
866 h->HubMaxSessionsBridge);
\r
867 WriteBufLine(b, tmp);
\r
871 HashSha1(hash, b->Buf, b->Size);
\r
872 HashSha1(hash2, hash, sizeof(hash));
\r
874 WriteBufLine(b, "[DIGITAL_SIGNATURE]");
\r
875 BinToStr(tmp2, sizeof(tmp2), hash2, sizeof(hash2));
\r
876 Format(tmp, sizeof(tmp), "SIGNATURE: %s", tmp2);
\r
877 WriteBufLine(b, tmp);
\r
884 // スナップショットのログを書き込む
\r
885 void WriteServerSnapshotLog(SERVER *s, SERVER_SNAPSHOT *t)
\r
890 if (s == NULL || t == NULL)
\r
895 b = ServerSnapshotToBuf(t);
\r
901 g = s->SnapshotLogger;
\r
903 WriteMultiLineLog(g, b);
\r
908 // Server スナップショットスレッド
\r
909 void ServerSnapshotThread(THREAD *t, void *param)
\r
912 UINT64 last_check_license = 0;
\r
913 LICENSE_STATUS license;
\r
915 if (t == NULL || param == NULL)
\r
920 s = (SERVER *)param;
\r
922 Zero(&license, sizeof(license));
\r
927 if (s->HaltSnapshot)
\r
932 if (last_check_license == 0 || (last_check_license + (UINT64)(CE_SNAPSHOT_POLLING_INTERVAL_LICENSE)) <= Tick64())
\r
934 last_check_license = Tick64();
\r
936 LiParseCurrentLicenseStatus(s->LicenseSystem, &license);
\r
939 if (license.CarrierEdition)
\r
941 now = SystemTime64();
\r
943 if ((s->LastSnapshotTime / CE_SNAPSHOT_INTERVAL) !=
\r
944 (now / CE_SNAPSHOT_INTERVAL))
\r
947 if (MakeServerSnapshot(s, 0, &t))
\r
949 s->LastSnapshotTime = now;
\r
950 WriteServerSnapshotLog(s, &t);
\r
957 Wait(s->SnapshotHaltEvent, CE_SNAPSHOT_POLLING_INTERVAL);
\r
961 // Server のスナップショットの保存
\r
962 bool MakeServerSnapshot(SERVER *s, UINT64 now, SERVER_SNAPSHOT *t)
\r
964 LICENSE_STATUS license;
\r
965 OS_INFO *os = GetOsInfo();
\r
970 if (s == NULL || t == NULL)
\r
976 now = SystemTime64();
\r
981 if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
\r
986 Zero(&license, sizeof(license));
\r
987 LiParseCurrentLicenseStatus(s->LicenseSystem, &license);
\r
989 if (license.CarrierEdition == false)
\r
994 now = (now / CE_SNAPSHOT_INTERVAL) * CE_SNAPSHOT_INTERVAL;
\r
997 GetMachineIp(&t->ServerIp);
\r
998 GetMachineName(t->ServerHostname, sizeof(t->ServerHostname));
\r
999 StrCpy(t->ServerProduct, sizeof(t->ServerProduct), license.EditionStr);
\r
1000 t->ServerLicenseId = license.SystemId;
\r
1001 t->ServerLicenseExpires = license.Expires;
\r
1002 t->ServerType = s->ServerType;
\r
1003 if (t->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
1005 LockList(s->FarmMemberList);
\r
1007 t->NumClusterNodes = LIST_NUM(s->FarmMemberList);
\r
1009 UnlockList(s->FarmMemberList);
\r
1012 StrCpy(t->ServerVersion, sizeof(t->ServerVersion), s->Cedar->VerString);
\r
1013 StrCpy(t->ServerBuild, sizeof(t->ServerBuild), s->Cedar->BuildInfo);
\r
1014 Format(t->ServerOs, sizeof(t->ServerOs),
\r
1016 os->OsVendorName, os->OsProductName, os->OsVersion);
\r
1018 t->ServerStartupDatetime = s->StartTime;
\r
1020 LockList(cedar->HubList);
\r
1022 num_hubs = LIST_NUM(cedar->HubList);
\r
1023 hubs = ZeroMalloc(sizeof(HUB *) * num_hubs);
\r
1025 for (i = 0;i < num_hubs;i++)
\r
1027 HUB *h = LIST_DATA(cedar->HubList, i);
\r
1033 UnlockList(cedar->HubList);
\r
1035 t->HubList = NewListFast(NULL);
\r
1037 for (i = 0;i < num_hubs;i++)
\r
1040 UINT client, bridge;
\r
1043 client = GetHubAdminOption(h, "max_sessions_client");
\r
1044 bridge = GetHubAdminOption(h, "max_sessions_bridge");
\r
1046 sn = ZeroMalloc(sizeof(HUB_SNAPSHOT));
\r
1047 sn->HubMaxSessionsClient = client;
\r
1048 sn->HubMaxSessionsBridge = bridge;
\r
1049 StrCpy(sn->HubName, sizeof(sn->HubName), h->Name);
\r
1050 sn->HubStatus = h->Offline ? false : true;
\r
1052 Insert(t->HubList, sn);
\r
1063 void FreeSnapshot(SERVER_SNAPSHOT *t)
\r
1072 for (i = 0;i < LIST_NUM(t->HubList);i++)
\r
1074 HUB_SNAPSHOT *h = LIST_DATA(t->HubList, i);
\r
1079 ReleaseList(t->HubList);
\r
1081 Zero(t, sizeof(SERVER_SNAPSHOT));
\r
1084 // サーバーの現在のライセンスステータスを取得する
\r
1085 void SiGetServerLicenseStatus(SERVER *s, LICENSE_STATUS *st)
\r
1088 if (s == NULL || st == NULL)
\r
1093 if (s->LicenseSystem == NULL || s->LicenseSystem->Status == NULL)
\r
1095 Zero(st, sizeof(LICENSE_STATUS));
\r
1099 Copy(st, s->LicenseSystem->Status, sizeof(LICENSE_STATUS));
\r
1103 void GetServerProductName(SERVER *s, char *name, UINT size)
\r
1107 if (s == NULL || name == NULL)
\r
1112 GetServerProductNameInternal(s, name, size);
\r
1115 cpu = " (64 bit)";
\r
1117 cpu = " (32 bit)";
\r
1120 StrCat(name, size, cpu);
\r
1122 void GetServerProductNameInternal(SERVER *s, char *name, UINT size)
\r
1125 if (s == NULL || name == NULL)
\r
1130 #ifdef BETA_NUMBER
\r
1131 if (s->Cedar->Bridge)
\r
1133 StrCpy(name, size, CEDAR_BRIDGE_STR);
\r
1137 StrCpy(name, size, CEDAR_BETA_SERVER);
\r
1140 #else // BETA_NUMBER
\r
1141 if (s->Cedar->Bridge)
\r
1143 StrCpy(name, size, CEDAR_BRIDGE_STR);
\r
1147 LICENSE_STATUS st;
\r
1149 LiParseCurrentLicenseStatus(s->LicenseSystem, &st);
\r
1151 StrCpy(name, size, st.EditionStr);
\r
1153 #endif // BETA_NUMBER
\r
1157 void AdjoinEnumLogFile(LIST *o, LIST *src)
\r
1161 if (o == NULL || src == NULL)
\r
1166 for (i = 0;i < LIST_NUM(src);i++)
\r
1168 LOG_FILE *f = LIST_DATA(src, i);
\r
1170 Insert(o, Clone(f, sizeof(LOG_FILE)));
\r
1174 // 指定した名前のログファイルが列挙リストに入っているかどうか確認する
\r
1175 bool CheckLogFileNameFromEnumList(LIST *o, char *name, char *server_name)
\r
1179 if (o == NULL || name == NULL || server_name == NULL)
\r
1184 Zero(&t, sizeof(t));
\r
1185 StrCpy(t.Path, sizeof(t.Path), name);
\r
1186 StrCpy(t.ServerName, sizeof(t.ServerName), server_name);
\r
1188 if (Search(o, &t) == NULL)
\r
1197 void FreeEnumLogFile(LIST *o)
\r
1206 for (i = 0;i < LIST_NUM(o);i++)
\r
1208 LOG_FILE *f = LIST_DATA(o, i);
\r
1216 // 仮想 HUB に関連するログファイルを列挙する (サーバー管理者の場合はすべて列挙する)
\r
1217 LIST *EnumLogFile(char *hubname)
\r
1219 char exe_dir[MAX_PATH];
\r
1220 char tmp[MAX_PATH];
\r
1221 LIST *o = NewListFast(CmpLogFile);
\r
1224 if (StrLen(hubname) == 0)
\r
1229 GetExeDir(exe_dir, sizeof(exe_dir));
\r
1231 // server_log の下を列挙する
\r
1232 if (hubname == NULL)
\r
1234 EnumLogFileDir(o, "server_log");
\r
1237 // packet_log の下を列挙する
\r
1238 Format(tmp, sizeof(tmp), "%s/packet_log", exe_dir);
\r
1239 dir = EnumDir(tmp);
\r
1243 for (i = 0;i < dir->NumFiles;i++)
\r
1245 DIRENT *e = dir->File[i];
\r
1249 char dir_name[MAX_PATH];
\r
1251 if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
\r
1253 Format(dir_name, sizeof(dir_name), "packet_log/%s", e->FileName);
\r
1254 EnumLogFileDir(o, dir_name);
\r
1262 // security_log の下を列挙する
\r
1263 Format(tmp, sizeof(tmp), "%s/security_log", exe_dir);
\r
1264 dir = EnumDir(tmp);
\r
1268 for (i = 0;i < dir->NumFiles;i++)
\r
1270 DIRENT *e = dir->File[i];
\r
1274 char dir_name[MAX_PATH];
\r
1276 if (hubname == NULL || StrCmpi(hubname, e->FileName) == 0)
\r
1278 Format(dir_name, sizeof(dir_name), "security_log/%s", e->FileName);
\r
1279 EnumLogFileDir(o, dir_name);
\r
1290 // 指定した名前のディレクトリのログファイルを列挙する
\r
1291 void EnumLogFileDir(LIST *o, char *dirname)
\r
1294 char exe_dir[MAX_PATH];
\r
1295 char dir_full_path[MAX_PATH];
\r
1298 if (o == NULL || dirname == NULL)
\r
1303 GetExeDir(exe_dir, sizeof(exe_dir));
\r
1304 Format(dir_full_path, sizeof(dir_full_path), "%s/%s", exe_dir, dirname);
\r
1306 dir = EnumDir(dir_full_path);
\r
1312 for (i = 0;i < dir->NumFiles;i++)
\r
1314 DIRENT *e = dir->File[i];
\r
1316 if (e->Folder == false && e->FileSize > 0)
\r
1318 char full_path[MAX_PATH];
\r
1319 char file_path[MAX_PATH];
\r
1321 Format(file_path, sizeof(file_path), "%s/%s", dirname, e->FileName);
\r
1322 Format(full_path, sizeof(full_path), "%s/%s", exe_dir, file_path);
\r
1324 if (EndWith(file_path, ".log"))
\r
1326 LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
\r
1328 StrCpy(f->Path, sizeof(f->Path), file_path);
\r
1329 f->FileSize = (UINT)(MIN(e->FileSize, 0xffffffffUL));
\r
1330 f->UpdatedTime = e->UpdateDate;
\r
1332 GetMachineName(f->ServerName, sizeof(f->ServerName));
\r
1342 // ログファイルリストエントリ比較
\r
1343 int CmpLogFile(void *p1, void *p2)
\r
1345 LOG_FILE *f1, *f2;
\r
1347 if (p1 == NULL || p2 == NULL)
\r
1351 f1 = *(LOG_FILE **)p1;
\r
1352 f2 = *(LOG_FILE **)p2;
\r
1353 if (f1 == NULL || f2 == NULL)
\r
1358 i = StrCmpi(f1->Path, f2->Path);
\r
1364 return StrCmpi(f1->ServerName, f2->ServerName);
\r
1367 // サーバーの Caps を取得する
\r
1368 UINT GetServerCapsInt(SERVER *s, char *name)
\r
1373 if (s == NULL || name == NULL)
\r
1378 Zero(&t, sizeof(t));
\r
1379 GetServerCaps(s, &t);
\r
1381 ret = GetCapsInt(&t, name);
\r
1385 bool GetServerCapsBool(SERVER *s, char *name)
\r
1387 return (GetServerCapsInt(s, name) == 0) ? false : true;
\r
1390 // サーバーの Caps キャッシュの初期化
\r
1391 void InitServerCapsCache(SERVER *s)
\r
1399 s->CapsCacheLock = NewLock();
\r
1400 s->CapsListCache = NULL;
\r
1403 // サーバーの Caps キャッシュの解放
\r
1404 void FreeServerCapsCache(SERVER *s)
\r
1412 if (s->CapsListCache != NULL)
\r
1414 FreeCapsList(s->CapsListCache);
\r
1415 s->CapsListCache = NULL;
\r
1417 DeleteLock(s->CapsCacheLock);
\r
1420 // サーバーの Caps キャッシュの廃棄
\r
1421 void DestroyServerCapsCache(SERVER *s)
\r
1429 Lock(s->CapsCacheLock);
\r
1431 if (s->CapsListCache != NULL)
\r
1433 FreeCapsList(s->CapsListCache);
\r
1434 s->CapsListCache = NULL;
\r
1437 Unlock(s->CapsCacheLock);
\r
1440 // このサーバーの Caps リストを取得する
\r
1441 void GetServerCaps(SERVER *s, CAPSLIST *t)
\r
1444 if (s == NULL || t == NULL)
\r
1449 Lock(s->CapsCacheLock);
\r
1451 if (s->CapsListCache == NULL)
\r
1453 s->CapsListCache = ZeroMalloc(sizeof(CAPSLIST));
\r
1454 GetServerCapsMain(s, s->CapsListCache);
\r
1457 Copy(t, s->CapsListCache, sizeof(s->CapsListCache));
\r
1459 Unlock(s->CapsCacheLock);
\r
1462 // サーバーの Caps 取得メイン
\r
1463 void GetServerCapsMain(SERVER *s, CAPSLIST *t)
\r
1466 if (s == NULL || t == NULL)
\r
1474 // 最大 Ethernet パケットサイズ
\r
1475 AddCapsInt(t, "i_max_packet_size", MAX_PACKET_SIZE);
\r
1477 if (s->Cedar->Bridge == false)
\r
1479 LICENSE_STATUS st;
\r
1480 UINT max_sessions, max_clients, max_bridges, max_user_creations;
\r
1482 LiParseCurrentLicenseStatus(s->LicenseSystem, &st);
\r
1484 max_clients = st.NumClientLicense;
\r
1485 max_bridges = st.NumBridgeLicense;
\r
1486 max_sessions = st.MaxSessions;
\r
1487 max_user_creations = st.NumUserLicense;
\r
1490 AddCapsInt(t, "i_max_hubs", st.MaxHubs);
\r
1493 AddCapsInt(t, "i_max_sessions", max_sessions);
\r
1496 AddCapsInt(t, "i_max_user_creation", max_user_creations);
\r
1499 AddCapsInt(t, "i_max_clients", max_clients);
\r
1502 AddCapsInt(t, "i_max_bridges", max_bridges);
\r
1504 if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
\r
1506 // 登録可能な最大ユーザー数 / 仮想 HUB
\r
1507 AddCapsInt(t, "i_max_users_per_hub", MAX_USERS);
\r
1509 // 登録可能な最大グループ数 / 仮想 HUB
\r
1510 AddCapsInt(t, "i_max_groups_per_hub", MAX_GROUPS);
\r
1512 // 登録可能な最大アクセスリスト数 / 仮想 HUB
\r
1513 AddCapsInt(t, "i_max_access_lists", MAX_ACCESSLISTS);
\r
1517 // 登録可能な最大ユーザー数 / 仮想 HUB
\r
1518 AddCapsInt(t, "i_max_users_per_hub", 0);
\r
1520 // 登録可能な最大グループ数 / 仮想 HUB
\r
1521 AddCapsInt(t, "i_max_groups_per_hub", 0);
\r
1523 // 登録可能な最大アクセスリスト数 / 仮想 HUB
\r
1524 AddCapsInt(t, "i_max_access_lists", 0);
\r
1528 AddCapsBool(t, "b_support_limit_multilogin", true);
\r
1531 AddCapsBool(t, "b_support_qos", true);
\r
1536 AddCapsInt(t, "i_max_hubs", 0);
\r
1539 AddCapsInt(t, "i_max_sessions", 0);
\r
1542 AddCapsInt(t, "i_max_clients", 0);
\r
1545 AddCapsInt(t, "i_max_bridges", 0);
\r
1547 // 登録可能な最大ユーザー数 / 仮想 HUB
\r
1548 AddCapsInt(t, "i_max_users_per_hub", 0);
\r
1550 // 登録可能な最大グループ数 / 仮想 HUB
\r
1551 AddCapsInt(t, "i_max_groups_per_hub", 0);
\r
1553 // 登録可能な最大アクセスリスト数 / 仮想 HUB
\r
1554 AddCapsInt(t, "i_max_access_lists", 0);
\r
1557 AddCapsBool(t, "b_support_qos", true);
\r
1560 AddCapsBool(t, "b_support_syslog", true);
\r
1564 AddCapsBool(t, "b_support_syslog", false);
\r
1566 // クラスタ内仮想 HUB の種類の変更が禁止されている
\r
1567 AddCapsBool(t, "b_cluster_hub_type_fixed", true);
\r
1569 // MAC アドレステーブル最大サイズ / 仮想 HUB
\r
1570 AddCapsInt(t, "i_max_mac_tables", MAX_MAC_TABLES);
\r
1572 // IP アドレステーブル最大サイズ / 仮想 HUB
\r
1573 AddCapsInt(t, "i_max_ip_tables", MAX_IP_TABLES);
\r
1575 // SecureNAT 機能が使用できる
\r
1576 AddCapsBool(t, "b_support_securenat", true);
\r
1578 if (s->ServerType != SERVER_TYPE_STANDALONE)
\r
1580 AddCapsBool(t, "b_virtual_nat_disabled", true);
\r
1583 // NAT テーブル最大サイズ / 仮想 HUB
\r
1584 AddCapsInt(t, "i_max_secnat_tables", NAT_MAX_SESSIONS);
\r
1587 if (s->ServerType == SERVER_TYPE_STANDALONE)
\r
1589 AddCapsBool(t, "b_support_cascade", true);
\r
1593 AddCapsBool(t, "b_support_cascade", false);
\r
1596 if (s->Cedar->Bridge)
\r
1599 AddCapsBool(t, "b_bridge", true);
\r
1601 else if (s->ServerType == SERVER_TYPE_STANDALONE)
\r
1604 AddCapsBool(t, "b_standalone", true);
\r
1606 else if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
1608 // クラスタ コントローラ モード
\r
1609 AddCapsBool(t, "b_cluster_controller", true);
\r
1614 AddCapsBool(t, "b_cluster_member", true);
\r
1617 // 仮想 HUB の設定変更が可能である
\r
1618 AddCapsBool(t, "b_support_config_hub", s->ServerType != SERVER_TYPE_FARM_MEMBER &&
\r
1619 s->Cedar->Bridge == false);
\r
1621 // VPN クライアントが接続可能である
\r
1622 AddCapsBool(t, "b_vpn_client_connect", s->Cedar->Bridge == false ? true : false);
\r
1625 AddCapsBool(t, "b_support_radius", false);
\r
1627 // ローカル ブリッジ機能が使用できる
\r
1628 AddCapsBool(t, "b_local_bridge", IsBridgeSupported());
\r
1630 if (OS_IS_WINDOWS(GetOsInfo()->OsType))
\r
1632 // パケットキャプチャドライバが未インストール
\r
1633 AddCapsBool(t, "b_must_install_pcap", IsEthSupported() == false ? true : false);
\r
1637 // Linux 版ではドライバはインストール済みとする
\r
1638 AddCapsBool(t, "b_must_install_pcap", false);
\r
1641 if (IsBridgeSupported())
\r
1643 // tun/tap が使用可能 (Linux のみ)
\r
1644 AddCapsBool(t, "b_tap_supported", GetOsInfo()->OsType == OSTYPE_LINUX ? true : false);
\r
1648 if (s->ServerType == SERVER_TYPE_STANDALONE)
\r
1650 AddCapsBool(t, "b_support_cascade", true);
\r
1654 AddCapsBool(t, "b_support_cascade", false);
\r
1657 // カスケード接続時のサーバー認証が使用できる
\r
1658 AddCapsBool(t, "b_support_cascade_cert", true);
\r
1660 // ログファイル設定の変更ができる
\r
1661 AddCapsBool(t, "b_support_config_log", s->ServerType != SERVER_TYPE_FARM_MEMBER);
\r
1663 // ログファイルの自動削除が使用可能である
\r
1664 AddCapsBool(t, "b_support_autodelete", true);
\r
1666 // config 操作が使用可能である
\r
1667 AddCapsBool(t, "b_support_config_rw", true);
\r
1669 // 仮想 HUB ごとの属性が設定可能である
\r
1670 AddCapsBool(t, "b_support_hub_admin_option", true);
\r
1672 // カスケード接続でクライアント証明書が設定可能である
\r
1673 AddCapsBool(t, "b_support_cascade_client_cert", true);
\r
1675 // 仮想 HUB を隠すことができる
\r
1676 AddCapsBool(t, "b_support_hide_hub", true);
\r
1679 AddCapsBool(t, "b_support_cluster_admin", true);
\r
1681 if (s->Cedar->Bridge == false)
\r
1683 LICENSE_STATUS status;
\r
1684 // 仮想レイヤ 3 スイッチ機能が使える
\r
1685 AddCapsBool(t, "b_support_layer3", true);
\r
1687 AddCapsInt(t, "i_max_l3_sw", MAX_NUM_L3_SWITCH);
\r
1688 AddCapsInt(t, "i_max_l3_if", MAX_NUM_L3_IF);
\r
1689 AddCapsInt(t, "i_max_l3_table", MAX_NUM_L3_TABLE);
\r
1691 LiParseCurrentLicenseStatus(s->LicenseSystem, &status);
\r
1693 if (status.AllowEnterpriseFunction || s->ServerType != SERVER_TYPE_STANDALONE)
\r
1695 // クラスタの一部として動作できる
\r
1696 AddCapsBool(t, "b_support_cluster", true);
\r
1701 AddCapsBool(t, "b_support_cluster", false);
\r
1706 AddCapsBool(t, "b_support_layer3", false);
\r
1708 AddCapsInt(t, "i_max_l3_sw", 0);
\r
1709 AddCapsInt(t, "i_max_l3_if", 0);
\r
1710 AddCapsInt(t, "i_max_l3_table", 0);
\r
1712 AddCapsBool(t, "b_support_cluster", false);
\r
1715 if (s->ServerType != SERVER_TYPE_FARM_MEMBER && s->Cedar->Bridge == false)
\r
1718 AddCapsBool(t, "b_support_crl", true);
\r
1722 AddCapsBool(t, "b_support_ac", false);
\r
1724 // ログ ファイルのダウンロードをサポート
\r
1725 AddCapsBool(t, "b_support_read_log", true);
\r
1727 // カスケード接続の名前の変更が可能である
\r
1728 AddCapsBool(t, "b_support_rename_cascade", true);
\r
1731 AddCapsBool(t, "b_support_license", false);
\r
1733 if (s->Cedar->Beta)
\r
1736 AddCapsBool(t, "b_beta_version", true);
\r
1739 // ローカルブリッジにネットワーク接続の名前表示をサポート
\r
1741 if (IsBridgeSupported() && IsNt() && GetOsInfo()->OsType >= OSTYPE_WINDOWS_2000_PROFESSIONAL)
\r
1743 AddCapsBool(t, "b_support_network_connection_name", true);
\r
1746 if (IsBridgeSupported() && EthIsInterfaceDescriptionSupportedUnix())
\r
1748 AddCapsBool(t, "b_support_network_connection_name", true);
\r
1750 #endif // OS_WIN32
\r
1752 // MAC アドレスフィルタリングをサポート
\r
1753 AddCapsBool(t, "b_support_check_mac", true);
\r
1755 // TCP コネクションの状態チェックをサポート
\r
1756 AddCapsBool(t, "b_support_check_tcp_state", true);
\r
1759 AddCapsBool(t, "b_support_radius_retry_interval_and_several_servers", false);
\r
1761 // MAC アドレステーブルでタグ付き VLAN の ID を管理できる
\r
1762 AddCapsBool(t, "b_support_vlan", true);
\r
1764 // 仮想 HUB 拡張オプションをサポート
\r
1765 if ((s->Cedar->Bridge == false) &&
\r
1766 (s->ServerType == SERVER_TYPE_STANDALONE || s->ServerType == SERVER_TYPE_FARM_CONTROLLER))
\r
1768 AddCapsBool(t, "b_support_hub_ext_options", true);
\r
1772 AddCapsBool(t, "b_support_hub_ext_options", false);
\r
1775 // セキュリティポリシー バージョン 3.0 をサポート
\r
1776 AddCapsBool(t, "b_support_policy_ver_3", true);
\r
1778 // IPv6 アクセスリストをサポート
\r
1779 AddCapsBool(t, "b_support_ipv6_acl", true);
\r
1781 // アクセスリストで遅延・ジッタ・パケットロスの設定をサポート
\r
1782 AddCapsBool(t, "b_support_ex_acl", true);
\r
1784 // アクセスリストでグループ名による指定をサポート
\r
1785 AddCapsBool(t, "b_support_acl_group", true);
\r
1787 // IPv6 接続元 IP 制限リストをサポート
\r
1788 AddCapsBool(t, "b_support_ipv6_ac", true);
\r
1790 // タグ付き VLAN パケット透過設定ツールをサポート
\r
1791 AddCapsBool(t, "b_support_eth_vlan", (OS_IS_WINDOWS_NT(GetOsType()) && GET_KETA(GetOsType(), 100) >= 2));
\r
1793 // 仮想 HUB への VPN 接続時のメッセージ表示機能をサポート
\r
1794 AddCapsBool(t, "b_support_msg", true);
\r
1797 AddCapsBool(t, "b_vpn3", true);
\r
1800 AddCapsBool(t, "b_gpl", true);
\r
1804 void InRpcSysLogSetting(SYSLOG_SETTING *t, PACK *p)
\r
1807 if (t == NULL || p == NULL)
\r
1812 Zero(t, sizeof(SYSLOG_SETTING));
\r
1813 t->SaveType = PackGetInt(p, "SaveType");
\r
1814 t->Port = PackGetInt(p, "Port");
\r
1815 PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
\r
1817 void OutRpcSysLogSetting(PACK *p, SYSLOG_SETTING *t)
\r
1820 if (t == NULL || p == NULL)
\r
1825 PackAddInt(p, "SaveType", t->SaveType);
\r
1826 PackAddInt(p, "Port", t->Port);
\r
1827 PackAddStr(p, "Hostname", t->Hostname);
\r
1831 void InitCapsList(CAPSLIST *t)
\r
1839 Zero(t, sizeof(CAPSLIST));
\r
1840 t->CapsList = NewListFast(NULL);
\r
1842 void InRpcCapsList(CAPSLIST *t, PACK *p)
\r
1846 if (t == NULL || p == NULL)
\r
1851 Zero(t, sizeof(CAPSLIST));
\r
1852 t->CapsList = NewListFast(CompareCaps);
\r
1854 for (i = 0;i < LIST_NUM(p->elements);i++)
\r
1856 ELEMENT *e = LIST_DATA(p->elements, i);
\r
1858 if (StartWith(e->name, "caps_") && e->type == VALUE_INT && e->num_value == 1)
\r
1860 CAPS *c = NewCaps(e->name + 5, e->values[0]->IntValue);
\r
1861 Insert(t->CapsList, c);
\r
1865 void OutRpcCapsList(PACK *p, CAPSLIST *t)
\r
1869 if (t == NULL || p == NULL)
\r
1874 for (i = 0;i < LIST_NUM(t->CapsList);i++)
\r
1876 char tmp[MAX_SIZE];
\r
1877 CAPS *c = LIST_DATA(t->CapsList, i);
\r
1879 Format(tmp, sizeof(tmp), "caps_%s", c->Name);
\r
1880 PackAddInt(p, tmp, c->Value);
\r
1883 void FreeRpcCapsList(CAPSLIST *t)
\r
1892 for (i = 0;i < LIST_NUM(t->CapsList);i++)
\r
1894 CAPS *c = LIST_DATA(t->CapsList, i);
\r
1899 ReleaseList(t->CapsList);
\r
1902 // Caps リストに bool 型を追加
\r
1903 void AddCapsBool(CAPSLIST *caps, char *name, bool b)
\r
1907 if (caps == NULL || name == NULL)
\r
1912 c = NewCaps(name, b == false ? 0 : 1);
\r
1916 // Caps リストに int 型を追加
\r
1917 void AddCapsInt(CAPSLIST *caps, char *name, UINT i)
\r
1921 if (caps == NULL || name == NULL)
\r
1926 c = NewCaps(name, i);
\r
1930 // Caps リストから int 型を取得
\r
1931 UINT GetCapsInt(CAPSLIST *caps, char *name)
\r
1935 if (caps == NULL || name == NULL)
\r
1940 c = GetCaps(caps, name);
\r
1949 // Caps リストから bool 型を取得
\r
1950 bool GetCapsBool(CAPSLIST *caps, char *name)
\r
1954 if (caps == NULL || name == NULL)
\r
1959 c = GetCaps(caps, name);
\r
1965 return c->Value == 0 ? false : true;
\r
1969 void FreeCapsList(CAPSLIST *caps)
\r
1978 for (i = 0;i < LIST_NUM(caps->CapsList);i++)
\r
1980 CAPS *c = LIST_DATA(caps->CapsList, i);
\r
1985 ReleaseList(caps->CapsList);
\r
1990 CAPS *GetCaps(CAPSLIST *caps, char *name)
\r
1994 if (caps == NULL || name == NULL)
\r
1999 for (i = 0;i < LIST_NUM(caps->CapsList);i++)
\r
2001 CAPS *c = LIST_DATA(caps->CapsList, i);
\r
2003 if (StrCmpi(c->Name, name) == 0)
\r
2013 void AddCaps(CAPSLIST *caps, CAPS *c)
\r
2016 if (caps == NULL || c == NULL)
\r
2021 Insert(caps->CapsList, c);
\r
2025 int CompareCaps(void *p1, void *p2)
\r
2028 if (p1 == NULL || p2 == NULL)
\r
2032 c1 = *(CAPS **)p1;
\r
2033 c2 = *(CAPS **)p2;
\r
2034 if (c1 == NULL || c2 == NULL)
\r
2039 return StrCmpi(c1->Name, c2->Name);
\r
2043 CAPSLIST *NewCapsList()
\r
2045 CAPSLIST *caps = ZeroMalloc(sizeof(CAPSLIST));
\r
2047 caps->CapsList = NewListFast(CompareCaps);
\r
2053 void FreeCaps(CAPS *c)
\r
2066 CAPS *NewCaps(char *name, UINT value)
\r
2075 c = ZeroMalloc(sizeof(CAPS));
\r
2076 c->Name = CopyStr(name);
\r
2082 // 現在の接続数と重みから得点を計算する
\r
2083 UINT SiCalcPoint(SERVER *s, UINT num, UINT weight)
\r
2085 UINT server_max_sessions = SERVER_MAX_SESSIONS;
\r
2095 server_max_sessions = GetServerCapsInt(s, "i_max_sessions");
\r
2097 return (UINT)(((double)server_max_sessions -
\r
2098 MIN((double)num * 100.0 / (double)weight, (double)server_max_sessions))
\r
2099 * (double)FARM_BASE_POINT / (double)server_max_sessions);
\r
2103 UINT SiGetPoint(SERVER *s)
\r
2112 num_session = Count(s->Cedar->CurrentSessions);
\r
2114 return SiCalcPoint(s, num_session, s->Weight);
\r
2118 void SiGenerateDefualtCert(X **server_x, K **server_k)
\r
2121 K *private_key, *public_key;
\r
2123 char tmp[MAX_SIZE];
\r
2124 wchar_t cn[MAX_SIZE];
\r
2126 if (server_x == NULL || server_k == NULL)
\r
2132 RsaGen(&private_key, &public_key, 1024);
\r
2135 StrCpy(tmp, sizeof(tmp), "server.softether.vpn");
\r
2136 GetMachineName(tmp, sizeof(tmp));
\r
2138 StrToUni(cn, sizeof(cn), tmp);
\r
2139 name = NewName(cn, L"Default Random Certification", L"VPN Server",
\r
2140 L"JP", NULL, NULL);
\r
2141 x = NewRootX(public_key, private_key, name, MAX(GetDaysUntil2038(), SERVER_DEFAULT_CERT_DAYS), NULL);
\r
2144 *server_k = private_key;
\r
2148 FreeK(public_key);
\r
2151 // サーバー証明書をデフォルトにする
\r
2152 void SiInitDefaultServerCert(SERVER *s)
\r
2162 // サーバー証明書と秘密鍵を生成する
\r
2163 SiGenerateDefualtCert(&x, &k);
\r
2166 SetCedarCert(s->Cedar, x, k);
\r
2172 // 暗号化アルゴリズム名をデフォルトにする
\r
2173 void SiInitCipherName(SERVER *s)
\r
2181 SetCedarCipherList(s->Cedar, SERVER_DEFAULT_CIPHER_NAME);
\r
2185 void SiInitListenerList(SERVER *s)
\r
2193 SiLockListenerList(s);
\r
2195 // デフォルト ポートとして 443, 992, 5555 の 3 つのポートを登録する
\r
2196 SiAddListener(s, 443, true);
\r
2197 SiAddListener(s, 992, true);
\r
2198 SiAddListener(s, 5555, true);
\r
2200 SiUnlockListenerList(s);
\r
2204 bool SiDeleteListener(SERVER *s, UINT port)
\r
2206 SERVER_LISTENER *e;
\r
2208 if (s == NULL || port == 0)
\r
2213 e = SiGetListener(s, port);
\r
2220 SiDisableListener(s, port);
\r
2222 if (e->Listener != NULL)
\r
2224 ReleaseListener(e->Listener);
\r
2227 Delete(s->ServerListenerList, e);
\r
2233 // SERVER_LISTENER を比較する
\r
2234 int CompareServerListener(void *p1, void *p2)
\r
2236 SERVER_LISTENER *s1, *s2;
\r
2237 if (p1 == NULL || p2 == NULL)
\r
2241 s1 = *(SERVER_LISTENER **)p1;
\r
2242 s2 = *(SERVER_LISTENER **)p2;
\r
2243 if (s1 == NULL || s2 == NULL)
\r
2248 if (s1->Port > s2->Port)
\r
2252 else if (s1->Port < s2->Port)
\r
2263 bool SiDisableListener(SERVER *s, UINT port)
\r
2265 SERVER_LISTENER *e;
\r
2267 if (s == NULL || port == 0)
\r
2273 e = SiGetListener(s, port);
\r
2279 if (e->Enabled == false || e->Listener == NULL)
\r
2286 StopListener(e->Listener);
\r
2289 ReleaseListener(e->Listener);
\r
2290 e->Listener = NULL;
\r
2292 e->Enabled = false;
\r
2298 bool SiEnableListener(SERVER *s, UINT port)
\r
2300 SERVER_LISTENER *e;
\r
2302 if (s == NULL || port == 0)
\r
2308 e = SiGetListener(s, port);
\r
2321 e->Listener = NewListener(s->Cedar, LISTENER_TCP, e->Port);
\r
2322 if (e->Listener == NULL)
\r
2328 e->Enabled = true;
\r
2334 SERVER_LISTENER *SiGetListener(SERVER *s, UINT port)
\r
2338 if (s == NULL || port == 0)
\r
2343 for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
\r
2345 SERVER_LISTENER *e = LIST_DATA(s->ServerListenerList, i);
\r
2346 if (e->Port == port)
\r
2356 bool SiAddListener(SERVER *s, UINT port, bool enabled)
\r
2358 SERVER_LISTENER *e;
\r
2361 if (s == NULL || port == 0)
\r
2366 // 既存のリスナーが存在していないかどうかチェックする
\r
2367 for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
\r
2369 e = LIST_DATA(s->ServerListenerList, i);
\r
2370 if (e->Port == port)
\r
2377 // 新しいリスナーを初期化して登録する
\r
2378 e = ZeroMalloc(sizeof(SERVER_LISTENER));
\r
2379 e->Enabled = enabled;
\r
2385 e->Listener = NewListener(s->Cedar, LISTENER_TCP, e->Port);
\r
2388 Insert(s->ServerListenerList, e);
\r
2394 void SiLockListenerList(SERVER *s)
\r
2402 LockList(s->ServerListenerList);
\r
2405 // リスナーリストのロックを解除する
\r
2406 void SiUnlockListenerList(SERVER *s)
\r
2414 UnlockList(s->ServerListenerList);
\r
2418 void SiInitBridge(SERVER *s)
\r
2429 Zero(&o, sizeof(o));
\r
2432 h = NewHub(s->Cedar, SERVER_DEFAULT_BRIDGE_NAME, &o);
\r
2433 AddHub(s->Cedar, h);
\r
2435 h->Offline = true;
\r
2439 SiSetDefaultLogSetting(&g);
\r
2440 SetHubLogSetting(h, &g);
\r
2445 // デフォルトの仮想 HUB を作成する
\r
2446 void SiInitDefaultHubList(SERVER *s)
\r
2457 Zero(&o, sizeof(o));
\r
2459 o.VlanTypeId = MAC_PROTO_TAGVLAN;
\r
2460 o.NoIPv6DefaultRouterInRAWhenIPv6 = true;
\r
2461 o.ManageOnlyPrivateIP = true;
\r
2462 o.ManageOnlyLocalUnicastIPv6 = true;
\r
2463 o.NoMacAddressLog = true;
\r
2465 h = NewHub(s->Cedar, s->Cedar->Bridge == false ? SERVER_DEFAULT_HUB_NAME : SERVER_DEFAULT_BRIDGE_NAME, &o);
\r
2466 h->CreatedTime = SystemTime64();
\r
2467 AddHub(s->Cedar, h);
\r
2469 if (s->Cedar->Bridge)
\r
2472 Rand(h->HashedPassword, sizeof(h->HashedPassword));
\r
2473 Rand(h->SecurePassword, sizeof(h->SecurePassword));
\r
2476 h->Offline = true;
\r
2480 SiSetDefaultLogSetting(&g);
\r
2481 SetHubLogSetting(h, &g);
\r
2485 for (i = 0;i < 0;i++)
\r
2487 char tmp[MAX_SIZE];
\r
2489 sprintf(tmp, "user%u", i);
\r
2491 u = NewUser(tmp, L"test", L"", AUTHTYPE_ANONYMOUS, NULL);
\r
2502 void SiSetDefaultLogSetting(HUB_LOG *g)
\r
2510 Zero(g, sizeof(HUB_LOG));
\r
2511 g->SaveSecurityLog = true;
\r
2512 g->SecurityLogSwitchType = LOG_SWITCH_DAY;
\r
2513 g->SavePacketLog = false;
\r
2514 g->PacketLogSwitchType = LOG_SWITCH_DAY;
\r
2515 g->PacketLogConfig[PACKET_LOG_TCP_CONN] =
\r
2516 g->PacketLogConfig[PACKET_LOG_DHCP] = PACKET_LOG_HEADER;
\r
2520 void SiTest(SERVER *s)
\r
2537 h = GetHub(s->Cedar, SERVER_DEFAULT_HUB_NAME);
\r
2544 g = NewGroup("test_group", L"テスト グループ", L"テストです。");
\r
2547 u = NewUser("test", L"テスト", L"はむです", AUTHTYPE_ANONYMOUS, NULL);
\r
2549 JoinUserToGroup(u, g);
\r
2552 u = NewUser("anonymous", L"匿名ユーザー", L"ソフトイーサ株式会社", AUTHTYPE_ANONYMOUS, NULL);
\r
2554 JoinUserToGroup(u, g);
\r
2557 u = NewUser("password", L"パスワードユーザー", L"ソフトイーサ株式会社", AUTHTYPE_PASSWORD, NewPasswordAuthData("password", "microsoft"));
\r
2561 x = FileToX("mayaqua.cer");
\r
2562 u = NewUser("usercert", L"ユーザー証明書テストユーザー", L"ソフトイーサ株式会社", AUTHTYPE_USERCERT, NewUserCertAuthData(x));
\r
2567 u = NewUser("rootcert", L"ルート証明書テストユーザー", L"ソフトイーサ株式会社", AUTHTYPE_ROOTCERT, NewRootCertAuthData(NULL, NULL));
\r
2571 u = NewUser("*", L"*", L"すべて", AUTHTYPE_RADIUS, NewRadiusAuthData(L""));
\r
2577 // Radius サーバーを設定する
\r
2578 SetRadiusServer(h, "dc.sec.softether.co.jp", RADIUS_DEFAULT_PORT, "microsoft");
\r
2581 Zero(&o, sizeof(o));
\r
2582 UniStrCpy(o.AccountName, sizeof(o.AccountName), L"テスト リンク");
\r
2583 o.MaxConnection = 8;
\r
2584 o.NumRetry = INFINITE;
\r
2585 o.UseEncrypt = true;
\r
2586 StrCpy(o.HubName, sizeof(o.HubName), "TEST_HUB");
\r
2588 StrCpy(o.Hostname, sizeof(o.Hostname), "ts.softether.co.jp");
\r
2590 Zero(&a, sizeof(a));
\r
2591 a.AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
\r
2592 StrCpy(a.Username, sizeof(a.Username), "anonymous_test");
\r
2594 k = NewLink(s->Cedar, h, &o, &a, GetDefaultPolicy());
\r
2600 x = FileToX("root.cer");
\r
2601 AddRootCert(h, x);
\r
2605 ac = ZeroMalloc(sizeof(ACCESS));
\r
2607 UniStrCpy(ac->Note, sizeof(ac->Note), L"アクセスリストのテスト");
\r
2608 ac->Active = true;
\r
2610 ac->Discard = true;
\r
2611 ac->SrcIpAddress = 0x12345678;
\r
2612 ac->SrcSubnetMask = 0xffffffff;
\r
2613 ac->DestIpAddress = 0x36547894;
\r
2614 ac->DestSubnetMask = 0xffffffff;
\r
2615 ac->Protocol = IP_PROTO_TCP;
\r
2616 StrCpy(ac->SrcUsername, 0, "yagi");
\r
2617 StrCpy(ac->DestUsername, 0, "neko");
\r
2618 AddAccessList(h, ac);
\r
2625 // 初期コンフィグレーションを設定する
\r
2626 void SiLoadInitialConfiguration(SERVER *s)
\r
2636 s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
\r
2638 s->Weight = FARM_DEFAULT_WEIGHT;
\r
2641 Zero(&k, sizeof(k));
\r
2642 k.UseKeepConnect = true;
\r
2643 k.KeepConnectPort = 80;
\r
2644 StrCpy(k.KeepConnectHost, sizeof(k.KeepConnectHost), CLIENT_DEFAULT_KEEPALIVE_HOST);
\r
2645 k.KeepConnectInterval = KEEP_INTERVAL_DEFAULT * 1000;
\r
2646 k.KeepConnectProtocol = CONNECTION_UDP;
\r
2648 Lock(s->Keep->lock);
\r
2650 KEEP *keep = s->Keep;
\r
2651 keep->Enable = k.UseKeepConnect;
\r
2652 keep->Server = true;
\r
2653 StrCpy(keep->ServerName, sizeof(keep->ServerName), k.KeepConnectHost);
\r
2654 keep->ServerPort = k.KeepConnectPort;
\r
2655 keep->UdpMode = k.KeepConnectProtocol;
\r
2656 keep->Interval = k.KeepConnectInterval;
\r
2658 Unlock(s->Keep->lock);
\r
2661 Hash(s->HashedPassword, "", 0, true);
\r
2663 // 暗号化アルゴリズム名をデフォルトにする
\r
2664 SiInitCipherName(s);
\r
2666 // サーバー証明書をデフォルトにする
\r
2667 SiInitDefaultServerCert(s);
\r
2669 // リスナーリストをデフォルト設定する
\r
2670 SiInitListenerList(s);
\r
2673 SiInitDefaultHubList(s);
\r
2675 s->Eraser = NewEraser(s->Logger, 0);
\r
2678 // コンフィグレーションファイルを読み込む (メイン)
\r
2679 bool SiLoadConfigurationFileMain(SERVER *s, FOLDER *root)
\r
2682 if (s == NULL || root == NULL)
\r
2687 return SiLoadConfigurationCfg(s, root);
\r
2690 // コンフィグレーションファイルを読み込む
\r
2691 bool SiLoadConfigurationFile(SERVER *s)
\r
2701 s->CfgRw = NewCfgRw(&root,
\r
2702 s->Cedar->Bridge == false ? SERVER_CONFIG_FILE_NAME : BRIDGE_CONFIG_FILE_NAME);
\r
2704 if (server_reset_setting)
\r
2706 CfgDeleteFolder(root);
\r
2708 server_reset_setting = false;
\r
2716 ret = SiLoadConfigurationFileMain(s, root);
\r
2718 CfgDeleteFolder(root);
\r
2724 void SiInitConfiguration(SERVER *s)
\r
2735 s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
\r
2737 SLog(s->Cedar, "LS_LOAD_CONFIG_1");
\r
2738 if (SiLoadConfigurationFile(s) == false)
\r
2740 SLog(s->Cedar, "LS_LOAD_CONFIG_3");
\r
2741 SiLoadInitialConfiguration(s);
\r
2743 server_reset_setting = false;
\r
2747 SLog(s->Cedar, "LS_LOAD_CONFIG_2");
\r
2750 // Linux における arp_filter
\r
2751 if (GetOsInfo()->OsType == OSTYPE_LINUX)
\r
2753 if (s->NoLinuxArpFilter == false)
\r
2755 SetLinuxArpFilter();
\r
2760 SLog(s->Cedar, "LS_INIT_SAVE_THREAD", s->AutoSaveConfigSpan / 1000);
\r
2761 s->SaveHaltEvent = NewEvent();
\r
2762 s->SaveThread = NewThread(SiSaverThread, s);
\r
2765 // サーバー設定を CFG から読み込む
\r
2766 bool SiLoadConfigurationCfg(SERVER *s, FOLDER *root)
\r
2768 FOLDER *f1, *f2, *f3, *f4, *f5, *f6;
\r
2770 if (s == NULL || root == NULL)
\r
2775 f1 = CfgGetFolder(root, "ServerConfiguration");
\r
2776 f2 = CfgGetFolder(root, "VirtualHUB");
\r
2777 f3 = CfgGetFolder(root, "ListenerList");
\r
2778 f4 = CfgGetFolder(root, "LocalBridgeList");
\r
2779 f5 = CfgGetFolder(root, "VirtualLayer3SwitchList");
\r
2780 f6 = CfgGetFolder(root, "LicenseManager");
\r
2784 SLog(s->Cedar, "LS_BAD_CONFIG");
\r
2788 s->ConfigRevision = CfgGetInt(root, "ConfigRevision");
\r
2790 if (s->Cedar->Bridge == false && f6 != NULL)
\r
2792 if (GetServerCapsBool(s, "b_support_license"))
\r
2794 SiLoadLicenseManager(s, f6);
\r
2798 DestroyServerCapsCache(s);
\r
2800 SiLoadServerCfg(s, f1);
\r
2802 if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
\r
2804 SiLoadHubs(s, f2);
\r
2807 SiLoadListeners(s, f3);
\r
2811 SiLoadLocalBridges(s, f4);
\r
2814 if (s->Cedar->Bridge == false && f5 != NULL)
\r
2816 SiLoadL3Switchs(s, f5);
\r
2823 void SiWriteListenerCfg(FOLDER *f, SERVER_LISTENER *r)
\r
2826 if (f == NULL || r == NULL)
\r
2831 CfgAddBool(f, "Enabled", r->Enabled);
\r
2832 CfgAddInt(f, "Port", r->Port);
\r
2836 void SiLoadListenerCfg(SERVER *s, FOLDER *f)
\r
2841 if (s == NULL || f == NULL)
\r
2846 enable = CfgGetBool(f, "Enabled");
\r
2847 port = CfgGetInt(f, "Port");
\r
2854 SiAddListener(s, port, enable);
\r
2858 void SiLoadListeners(SERVER *s, FOLDER *f)
\r
2863 if (s == NULL || f == NULL)
\r
2868 t = CfgEnumFolderToTokenList(f);
\r
2869 for (i = 0;i < t->NumTokens;i++)
\r
2871 FOLDER *ff = CfgGetFolder(f, t->Token[i]);
\r
2874 SiLoadListenerCfg(s, ff);
\r
2881 void SiWriteListeners(FOLDER *f, SERVER *s)
\r
2884 if (f == NULL || s == NULL)
\r
2889 LockList(s->ServerListenerList);
\r
2892 for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
\r
2894 SERVER_LISTENER *r = LIST_DATA(s->ServerListenerList, i);
\r
2895 char name[MAX_SIZE];
\r
2896 Format(name, sizeof(name), "Listener%u", i);
\r
2897 SiWriteListenerCfg(CfgCreateFolder(f, name), r);
\r
2900 UnlockList(s->ServerListenerList);
\r
2904 void SiWriteLocalBridgeCfg(FOLDER *f, LOCALBRIDGE *br)
\r
2907 if (f == NULL || br == NULL)
\r
2912 CfgAddStr(f, "DeviceName", br->DeviceName);
\r
2913 CfgAddStr(f, "HubName", br->HubName);
\r
2914 CfgAddBool(f, "NoPromiscuousMode", br->Local);
\r
2915 CfgAddBool(f, "MonitorMode", br->Monitor);
\r
2916 CfgAddBool(f, "FullBroadcastMode", br->FullBroadcast);
\r
2918 if (OS_IS_UNIX(GetOsInfo()->OsType))
\r
2920 CfgAddBool(f, "TapMode", br->TapMode);
\r
2924 char tmp[MAX_SIZE];
\r
2925 MacToStr(tmp, sizeof(tmp), br->TapMacAddress);
\r
2926 CfgAddStr(f, "TapMacAddress", tmp);
\r
2932 void SiWriteLocalBridges(FOLDER *f, SERVER *s)
\r
2935 if (s == NULL || f == NULL)
\r
2940 LockList(s->Cedar->LocalBridgeList);
\r
2943 for (i = 0;i < LIST_NUM(s->Cedar->LocalBridgeList);i++)
\r
2945 LOCALBRIDGE *br = LIST_DATA(s->Cedar->LocalBridgeList, i);
\r
2946 char name[MAX_SIZE];
\r
2948 Format(name, sizeof(name), "LocalBridge%u", i);
\r
2949 SiWriteLocalBridgeCfg(CfgCreateFolder(f, name), br);
\r
2952 UnlockList(s->Cedar->LocalBridgeList);
\r
2956 void SiLoadLocalBridgeCfg(SERVER *s, FOLDER *f)
\r
2958 char hub[MAX_SIZE];
\r
2959 char nic[MAX_SIZE];
\r
2960 bool tapmode = false;
\r
2963 if (s == NULL || f == NULL)
\r
2968 Zero(hub, sizeof(hub));
\r
2969 Zero(nic, sizeof(nic));
\r
2971 CfgGetStr(f, "HubName", hub, sizeof(hub));
\r
2972 CfgGetStr(f, "DeviceName", nic, sizeof(nic));
\r
2974 if (IsEmptyStr(hub) || IsEmptyStr(nic))
\r
2979 if (OS_IS_UNIX(GetOsInfo()->OsType))
\r
2981 if (CfgGetBool(f, "TapMode"))
\r
2983 char tmp[MAX_SIZE];
\r
2985 Zero(tapaddr, sizeof(tapaddr));
\r
2986 if (CfgGetStr(f, "TapMacAddress", tmp, sizeof(tmp)))
\r
2989 b = StrToBin(tmp);
\r
2990 if (b != NULL && b->Size == 6)
\r
2992 Copy(tapaddr, b->Buf, sizeof(tapaddr));
\r
2999 AddLocalBridge(s->Cedar, hub, nic, CfgGetBool(f, "NoPromiscuousMode"), CfgGetBool(f, "MonitorMode"),
\r
3000 tapmode, tapaddr, CfgGetBool(f, "FullBroadcastMode"));
\r
3004 void SiLoadLocalBridges(SERVER *s, FOLDER *f)
\r
3009 if (s == NULL || f == NULL)
\r
3014 t = CfgEnumFolderToTokenList(f);
\r
3016 for (i = 0;i < t->NumTokens;i++)
\r
3018 char *name = t->Token[i];
\r
3020 SiLoadLocalBridgeCfg(s, CfgGetFolder(f, name));
\r
3026 // サーバーの設定リビジョンをインクリメントする
\r
3027 void IncrementServerConfigRevision(SERVER *s)
\r
3035 s->ConfigRevision++;
\r
3038 // サーバー設定を CFG に書き出す
\r
3039 FOLDER *SiWriteConfigurationToCfg(SERVER *s)
\r
3048 root = CfgCreateFolder(NULL, TAG_ROOT);
\r
3050 CfgAddInt(root, "ConfigRevision", s->ConfigRevision);
\r
3052 SiWriteListeners(CfgCreateFolder(root, "ListenerList"), s);
\r
3054 SiWriteLocalBridges(CfgCreateFolder(root, "LocalBridgeList"), s);
\r
3056 SiWriteServerCfg(CfgCreateFolder(root, "ServerConfiguration"), s);
\r
3058 if (s->UpdatedServerType != SERVER_TYPE_FARM_MEMBER)
\r
3060 SiWriteHubs(CfgCreateFolder(root, "VirtualHUB"), s);
\r
3063 if (s->Cedar->Bridge == false)
\r
3065 SiWriteL3Switchs(CfgCreateFolder(root, "VirtualLayer3SwitchList"), s);
\r
3067 if (GetServerCapsBool(s, "b_support_license"))
\r
3069 SiWriteLicenseManager(CfgCreateFolder(root, "LicenseManager"), s);
\r
3077 void SiLoadPolicyCfg(POLICY *p, FOLDER *f)
\r
3080 if (f == NULL || p == NULL)
\r
3085 Zero(p, sizeof(POLICY));
\r
3088 p->Access = CfgGetBool(f, "Access");
\r
3089 p->DHCPFilter = CfgGetBool(f, "DHCPFilter");
\r
3090 p->DHCPNoServer = CfgGetBool(f, "DHCPNoServer");
\r
3091 p->DHCPForce = CfgGetBool(f, "DHCPForce");
\r
3092 p->NoBridge = CfgGetBool(f, "NoBridge");
\r
3093 p->NoRouting = CfgGetBool(f, "NoRouting");
\r
3094 p->CheckMac = CfgGetBool(f, "CheckMac");
\r
3095 p->CheckIP = CfgGetBool(f, "CheckIP");
\r
3096 p->ArpDhcpOnly = CfgGetBool(f, "ArpDhcpOnly");
\r
3097 p->PrivacyFilter = CfgGetBool(f, "PrivacyFilter");
\r
3098 p->NoServer = CfgGetBool(f, "NoServer");
\r
3099 p->NoBroadcastLimiter = CfgGetBool(f, "NoBroadcastLimiter");
\r
3100 p->MonitorPort = CfgGetBool(f, "MonitorPort");
\r
3101 p->MaxConnection = CfgGetInt(f, "MaxConnection");
\r
3102 p->TimeOut = CfgGetInt(f, "TimeOut");
\r
3103 p->MaxMac = CfgGetInt(f, "MaxMac");
\r
3104 p->MaxIP = CfgGetInt(f, "MaxIP");
\r
3105 p->MaxUpload = CfgGetInt(f, "MaxUpload");
\r
3106 p->MaxDownload = CfgGetInt(f, "MaxDownload");
\r
3107 p->FixPassword = CfgGetBool(f, "FixPassword");
\r
3108 p->MultiLogins = CfgGetInt(f, "MultiLogins");
\r
3109 p->NoQoS = CfgGetBool(f, "NoQoS");
\r
3112 p->RSandRAFilter = CfgGetBool(f, "RSandRAFilter");
\r
3113 p->RAFilter = CfgGetBool(f, "RAFilter");
\r
3114 p->DHCPv6Filter = CfgGetBool(f, "DHCPv6Filter");
\r
3115 p->DHCPv6NoServer = CfgGetBool(f, "DHCPv6NoServer");
\r
3116 p->NoRoutingV6 = CfgGetBool(f, "NoRoutingV6");
\r
3117 p->CheckIPv6 = CfgGetBool(f, "CheckIPv6");
\r
3118 p->NoServerV6 = CfgGetBool(f, "NoServerV6");
\r
3119 p->MaxIPv6 = CfgGetInt(f, "MaxIPv6");
\r
3120 p->NoSavePassword = CfgGetBool(f, "NoSavePassword");
\r
3121 p->AutoDisconnect = CfgGetInt(f, "AutoDisconnect");
\r
3122 p->FilterIPv4 = CfgGetBool(f, "FilterIPv4");
\r
3123 p->FilterIPv6 = CfgGetBool(f, "FilterIPv6");
\r
3124 p->FilterNonIP = CfgGetBool(f, "FilterNonIP");
\r
3125 p->NoIPv6DefaultRouterInRA = CfgGetBool(f, "NoIPv6DefaultRouterInRA");
\r
3126 p->NoIPv6DefaultRouterInRAWhenIPv6 = CfgGetBool(f, "NoIPv6DefaultRouterInRAWhenIPv6");
\r
3127 p->VLanId = CfgGetInt(f, "VLanId");
\r
3131 void SiWritePolicyCfg(FOLDER *f, POLICY *p, bool cascade_mode)
\r
3134 if (f == NULL || p == NULL)
\r
3140 if (cascade_mode == false)
\r
3142 CfgAddBool(f, "Access", p->Access);
\r
3145 CfgAddBool(f, "DHCPFilter", p->DHCPFilter);
\r
3146 CfgAddBool(f, "DHCPNoServer", p->DHCPNoServer);
\r
3147 CfgAddBool(f, "DHCPForce", p->DHCPForce);
\r
3149 if (cascade_mode == false)
\r
3151 CfgAddBool(f, "NoBridge", p->NoBridge);
\r
3152 CfgAddBool(f, "NoRouting", p->NoRouting);
\r
3155 CfgAddBool(f, "CheckMac", p->CheckMac);
\r
3156 CfgAddBool(f, "CheckIP", p->CheckIP);
\r
3157 CfgAddBool(f, "ArpDhcpOnly", p->ArpDhcpOnly);
\r
3159 if (cascade_mode == false)
\r
3161 CfgAddBool(f, "PrivacyFilter", p->PrivacyFilter);
\r
3164 CfgAddBool(f, "NoServer", p->NoServer);
\r
3165 CfgAddBool(f, "NoBroadcastLimiter", p->NoBroadcastLimiter);
\r
3167 if (cascade_mode == false)
\r
3169 CfgAddBool(f, "MonitorPort", p->MonitorPort);
\r
3170 CfgAddInt(f, "MaxConnection", p->MaxConnection);
\r
3171 CfgAddInt(f, "TimeOut", p->TimeOut);
\r
3174 CfgAddInt(f, "MaxMac", p->MaxMac);
\r
3175 CfgAddInt(f, "MaxIP", p->MaxIP);
\r
3176 CfgAddInt(f, "MaxUpload", p->MaxUpload);
\r
3177 CfgAddInt(f, "MaxDownload", p->MaxDownload);
\r
3179 if (cascade_mode == false)
\r
3181 CfgAddBool(f, "FixPassword", p->FixPassword);
\r
3182 CfgAddInt(f, "MultiLogins", p->MultiLogins);
\r
3183 CfgAddBool(f, "NoQoS", p->NoQoS);
\r
3187 CfgAddBool(f, "RSandRAFilter", p->RSandRAFilter);
\r
3188 CfgAddBool(f, "RAFilter", p->RAFilter);
\r
3189 CfgAddBool(f, "DHCPv6Filter", p->DHCPv6Filter);
\r
3190 CfgAddBool(f, "DHCPv6NoServer", p->DHCPv6NoServer);
\r
3192 if (cascade_mode == false)
\r
3194 CfgAddBool(f, "NoRoutingV6", p->NoRoutingV6);
\r
3197 CfgAddBool(f, "CheckIPv6", p->CheckIPv6);
\r
3198 CfgAddBool(f, "NoServerV6", p->NoServerV6);
\r
3199 CfgAddInt(f, "MaxIPv6", p->MaxIPv6);
\r
3201 if (cascade_mode == false)
\r
3203 CfgAddBool(f, "NoSavePassword", p->NoSavePassword);
\r
3204 CfgAddInt(f, "AutoDisconnect", p->AutoDisconnect);
\r
3207 CfgAddBool(f, "FilterIPv4", p->FilterIPv4);
\r
3208 CfgAddBool(f, "FilterIPv6", p->FilterIPv6);
\r
3209 CfgAddBool(f, "FilterNonIP", p->FilterNonIP);
\r
3210 CfgAddBool(f, "NoIPv6DefaultRouterInRA", p->NoIPv6DefaultRouterInRA);
\r
3211 CfgAddBool(f, "NoIPv6DefaultRouterInRAWhenIPv6", p->NoIPv6DefaultRouterInRAWhenIPv6);
\r
3212 CfgAddInt(f, "VLanId", p->VLanId);
\r
3215 // 仮想 HUB のリンク情報の書き込み
\r
3216 void SiWriteHubLinkCfg(FOLDER *f, LINK *k)
\r
3219 if (f == NULL || k == NULL)
\r
3227 CfgAddBool(f, "Online", k->Offline ? false : true);
\r
3230 CiWriteClientOption(CfgCreateFolder(f, "ClientOption"), k->Option);
\r
3233 CiWriteClientAuth(CfgCreateFolder(f, "ClientAuth"), k->Auth);
\r
3236 if (k->Policy != NULL)
\r
3238 SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), k->Policy, true);
\r
3241 CfgAddBool(f, "CheckServerCert", k->CheckServerCert);
\r
3243 if (k->ServerCert != NULL)
\r
3245 BUF *b = XToBuf(k->ServerCert, false);
\r
3246 CfgAddBuf(f, "ServerCert", b);
\r
3254 void SiLoadHubLinkCfg(FOLDER *f, HUB *h)
\r
3263 if (f == NULL || h == NULL)
\r
3268 pf = CfgGetFolder(f, "Policy");
\r
3274 SiLoadPolicyCfg(&p, pf);
\r
3276 online = CfgGetBool(f, "Online");
\r
3278 o = CiLoadClientOption(CfgGetFolder(f, "ClientOption"));
\r
3279 a = CiLoadClientAuth(CfgGetFolder(f, "ClientAuth"));
\r
3280 if (o == NULL || a == NULL)
\r
3283 CiFreeClientAuth(a);
\r
3287 k = NewLink(h->Cedar, h, o, a, &p);
\r
3291 k->CheckServerCert = CfgGetBool(f, "CheckServerCert");
\r
3292 b = CfgGetBuf(f, "ServerCert");
\r
3295 k->ServerCert = BufToX(b, false);
\r
3301 k->Offline = true;
\r
3306 k->Offline = false;
\r
3307 SetLinkOffline(k);
\r
3313 CiFreeClientAuth(a);
\r
3316 // 仮想 HUB の SecureNAT の書き込み
\r
3317 void SiWriteSecureNAT(HUB *h, FOLDER *f)
\r
3320 if (h == NULL || f == NULL)
\r
3325 CfgAddBool(f, "Disabled", h->EnableSecureNAT ? false : true);
\r
3327 NiWriteVhOptionEx(h->SecureNATOption, f);
\r
3330 // 仮想 HUB の管理オプションの読み込み
\r
3331 void SiLoadHubAdminOptions(HUB *h, FOLDER *f)
\r
3335 if (h == NULL || f == NULL)
\r
3340 t = CfgEnumItemToTokenList(f);
\r
3345 LockList(h->AdminOptionList);
\r
3347 DeleteAllHubAdminOption(h, false);
\r
3349 for (i = 0;i < t->NumTokens;i++)
\r
3351 char *name = t->Token[i];
\r
3353 UINT value = CfgGetInt(f, name);;
\r
3357 a = ZeroMalloc(sizeof(ADMIN_OPTION));
\r
3358 StrCpy(a->Name, sizeof(a->Name), name);
\r
3361 Insert(h->AdminOptionList, a);
\r
3364 AddHubAdminOptionsDefaults(h, false);
\r
3366 UnlockList(h->AdminOptionList);
\r
3372 // 仮想 HUB の管理オプションの書き込み
\r
3373 void SiWriteHubAdminOptions(FOLDER *f, HUB *h)
\r
3376 if (f == NULL || h == NULL)
\r
3381 LockList(h->AdminOptionList);
\r
3384 for (i = 0;i < LIST_NUM(h->AdminOptionList);i++)
\r
3386 ADMIN_OPTION *a = LIST_DATA(h->AdminOptionList, i);
\r
3388 CfgAddInt(f, a->Name, a->Value);
\r
3391 UnlockList(h->AdminOptionList);
\r
3394 // 仮想 HUB のリンクリストの書き込み
\r
3395 void SiWriteHubLinks(FOLDER *f, HUB *h)
\r
3398 if (f == NULL || h == NULL)
\r
3403 LockList(h->LinkList);
\r
3406 for (i = 0;i < LIST_NUM(h->LinkList);i++)
\r
3408 LINK *k = LIST_DATA(h->LinkList, i);
\r
3409 char name[MAX_SIZE];
\r
3410 Format(name, sizeof(name), "Cascade%u", i);
\r
3411 SiWriteHubLinkCfg(CfgCreateFolder(f, name), k);
\r
3414 UnlockList(h->LinkList);
\r
3418 void SiLoadHubLinks(HUB *h, FOLDER *f)
\r
3423 if (h == NULL || f == NULL)
\r
3428 t = CfgEnumFolderToTokenList(f);
\r
3430 for (i = 0;i < t->NumTokens;i++)
\r
3432 char *name = t->Token[i];
\r
3433 SiLoadHubLinkCfg(CfgGetFolder(f, name), h);
\r
3440 void SiWriteHubAccessCfg(FOLDER *f, ACCESS *a)
\r
3443 if (f == NULL || a == NULL)
\r
3448 CfgAddUniStr(f, "Note", a->Note);
\r
3449 CfgAddBool(f, "Active", a->Active);
\r
3450 CfgAddInt(f, "Priority", a->Priority);
\r
3451 CfgAddBool(f, "Discard", a->Discard);
\r
3452 CfgAddBool(f, "IsIPv6", a->IsIPv6);
\r
3454 if (a->IsIPv6 == false)
\r
3456 CfgAddIp32(f, "SrcIpAddress", a->SrcIpAddress);
\r
3457 CfgAddIp32(f, "SrcSubnetMask", a->SrcSubnetMask);
\r
3458 CfgAddIp32(f, "DestIpAddress", a->DestIpAddress);
\r
3459 CfgAddIp32(f, "DestSubnetMask", a->DestSubnetMask);
\r
3463 CfgAddIp6Addr(f, "SrcIpAddress6", &a->SrcIpAddress6);
\r
3464 CfgAddIp6Addr(f, "SrcSubnetMask6", &a->SrcSubnetMask6);
\r
3465 CfgAddIp6Addr(f, "DestIpAddress6", &a->DestIpAddress6);
\r
3466 CfgAddIp6Addr(f, "DestSubnetMask6", &a->DestSubnetMask6);
\r
3469 CfgAddInt(f, "Protocol", a->Protocol);
\r
3470 CfgAddInt(f, "SrcPortStart", a->SrcPortStart);
\r
3471 CfgAddInt(f, "SrcPortEnd", a->SrcPortEnd);
\r
3472 CfgAddInt(f, "DestPortStart", a->DestPortStart);
\r
3473 CfgAddInt(f, "DestPortEnd", a->DestPortEnd);
\r
3474 CfgAddStr(f, "SrcUsername", a->SrcUsername);
\r
3475 CfgAddStr(f, "DestUsername", a->DestUsername);
\r
3476 CfgAddBool(f, "CheckSrcMac", a->CheckSrcMac);
\r
3478 if (a->CheckSrcMac)
\r
3480 char tmp[MAX_PATH];
\r
3482 MacToStr(tmp, sizeof(tmp), a->SrcMacAddress);
\r
3483 CfgAddStr(f, "SrcMacAddress", tmp);
\r
3485 MacToStr(tmp, sizeof(tmp), a->SrcMacMask);
\r
3486 CfgAddStr(f, "SrcMacMask", tmp);
\r
3489 CfgAddBool(f, "CheckDstMac", a->CheckDstMac);
\r
3491 if (a->CheckDstMac)
\r
3493 char tmp[MAX_PATH];
\r
3495 MacToStr(tmp, sizeof(tmp), a->DstMacAddress);
\r
3496 CfgAddStr(f, "DstMacAddress", tmp);
\r
3498 MacToStr(tmp, sizeof(tmp), a->DstMacMask);
\r
3499 CfgAddStr(f, "DstMacMask", tmp);
\r
3502 CfgAddBool(f, "CheckTcpState", a->CheckTcpState);
\r
3503 CfgAddBool(f, "Established", a->Established);
\r
3505 CfgAddInt(f, "Delay", a->Delay);
\r
3506 CfgAddInt(f, "Jitter", a->Jitter);
\r
3507 CfgAddInt(f, "Loss", a->Loss);
\r
3511 void SiLoadHubAccessCfg(HUB *h, FOLDER *f)
\r
3514 char tmp[MAX_PATH];
\r
3516 if (h == NULL || f == NULL)
\r
3521 Zero(&a, sizeof(a));
\r
3523 CfgGetUniStr(f, "Note", a.Note, sizeof(a.Note));
\r
3524 a.Active = CfgGetBool(f, "Active");
\r
3525 a.Priority = CfgGetInt(f, "Priority");
\r
3526 a.Discard = CfgGetBool(f, "Discard");
\r
3527 a.IsIPv6 = CfgGetBool(f, "IsIPv6");
\r
3529 if (a.IsIPv6 == false)
\r
3531 a.SrcIpAddress = CfgGetIp32(f, "SrcIpAddress");
\r
3532 a.SrcSubnetMask = CfgGetIp32(f, "SrcSubnetMask");
\r
3533 a.DestIpAddress = CfgGetIp32(f, "DestIpAddress");
\r
3534 a.DestSubnetMask = CfgGetIp32(f, "DestSubnetMask");
\r
3538 CfgGetIp6Addr(f, "SrcIpAddress6", &a.SrcIpAddress6);
\r
3539 CfgGetIp6Addr(f, "SrcSubnetMask6", &a.SrcSubnetMask6);
\r
3540 CfgGetIp6Addr(f, "DestIpAddress6", &a.DestIpAddress6);
\r
3541 CfgGetIp6Addr(f, "DestSubnetMask6", &a.DestSubnetMask6);
\r
3544 a.Protocol = CfgGetInt(f, "Protocol");
\r
3545 a.SrcPortStart = CfgGetInt(f, "SrcPortStart");
\r
3546 a.SrcPortEnd = CfgGetInt(f, "SrcPortEnd");
\r
3547 a.DestPortStart = CfgGetInt(f, "DestPortStart");
\r
3548 a.DestPortEnd = CfgGetInt(f, "DestPortEnd");
\r
3549 CfgGetStr(f, "SrcUsername", a.SrcUsername, sizeof(a.SrcUsername));
\r
3550 CfgGetStr(f, "DestUsername", a.DestUsername, sizeof(a.DestUsername));
\r
3551 a.CheckSrcMac = CfgGetBool(f, "CheckSrcMac");
\r
3553 if (CfgGetByte(f, "SrcMacAddress", a.SrcMacAddress, sizeof(a.SrcMacAddress)) == 0)
\r
3555 CfgGetStr(f, "SrcMacAddress", tmp, sizeof(tmp));
\r
3556 if (StrToMac(a.SrcMacAddress, tmp) == false)
\r
3558 a.CheckSrcMac = false;
\r
3562 if (CfgGetByte(f, "SrcMacMask", a.SrcMacMask, sizeof(a.SrcMacMask)) == 0)
\r
3564 CfgGetStr(f, "SrcMacMask", tmp, sizeof(tmp));
\r
3565 if (StrToMac(a.SrcMacMask, tmp) == false)
\r
3567 a.CheckSrcMac = false;
\r
3571 a.CheckDstMac = CfgGetBool(f, "CheckDstMac");
\r
3573 if (CfgGetByte(f, "DstMacAddress", a.DstMacAddress, sizeof(a.DstMacAddress)) == 0)
\r
3575 CfgGetStr(f, "DstMacAddress", tmp, sizeof(tmp));
\r
3576 if (StrToMac(a.DstMacAddress, tmp) == false)
\r
3578 a.CheckDstMac = false;
\r
3582 if (CfgGetByte(f, "DstMacMask", a.DstMacMask, sizeof(a.DstMacMask)) == 0)
\r
3584 CfgGetStr(f, "DstMacMask", tmp, sizeof(tmp));
\r
3585 if (StrToMac(a.DstMacMask, tmp) == false)
\r
3587 a.CheckDstMac = false;
\r
3591 a.CheckTcpState = CfgGetBool(f, "CheckTcpState");
\r
3592 a.Established = CfgGetBool(f, "Established");
\r
3593 a.Delay = MAKESURE(CfgGetInt(f, "Delay"), 0, HUB_ACCESSLIST_DELAY_MAX);
\r
3594 a.Jitter = MAKESURE(CfgGetInt(f, "Jitter"), 0, HUB_ACCESSLIST_JITTER_MAX);
\r
3595 a.Loss = MAKESURE(CfgGetInt(f, "Loss"), 0, HUB_ACCESSLIST_LOSS_MAX);
\r
3597 AddAccessList(h, &a);
\r
3601 void SiWriteHubAccessLists(FOLDER *f, HUB *h)
\r
3604 if (f == NULL || h == NULL)
\r
3609 LockList(h->AccessList);
\r
3612 for (i = 0;i < LIST_NUM(h->AccessList);i++)
\r
3614 ACCESS *a = LIST_DATA(h->AccessList, i);
\r
3615 char name[MAX_SIZE];
\r
3616 ToStr(name, a->Id);
\r
3617 SiWriteHubAccessCfg(CfgCreateFolder(f, name), a);
\r
3620 UnlockList(h->AccessList);
\r
3624 void SiLoadHubAccessLists(HUB *h, FOLDER *f)
\r
3629 if (f == NULL || h == NULL)
\r
3634 t = CfgEnumFolderToTokenList(f);
\r
3636 for (i = 0;i < t->NumTokens;i++)
\r
3638 char *name = t->Token[i];
\r
3639 UINT id = ToInt(name);
\r
3640 SiLoadHubAccessCfg(h, CfgGetFolder(f, name));
\r
3646 // HUB_OPTION の読み込み
\r
3647 void SiLoadHubOptionCfg(FOLDER *f, HUB_OPTION *o)
\r
3649 char tmp[MAX_SIZE];
\r
3651 if (f == NULL || o == NULL)
\r
3656 o->MaxSession = CfgGetInt(f, "MaxSession");
\r
3657 o->NoArpPolling = CfgGetBool(f, "NoArpPolling");
\r
3658 o->NoIPv6AddrPolling = CfgGetBool(f, "NoIPv6AddrPolling");
\r
3659 o->NoIpTable = CfgGetBool(f, "NoIpTable");
\r
3660 o->NoEnum = CfgGetBool(f, "NoEnum");
\r
3661 o->FilterPPPoE = CfgGetBool(f, "FilterPPPoE");
\r
3662 o->FilterOSPF = CfgGetBool(f, "FilterOSPF");
\r
3663 o->FilterIPv4 = CfgGetBool(f, "FilterIPv4");
\r
3664 o->FilterIPv6 = CfgGetBool(f, "FilterIPv6");
\r
3665 o->FilterNonIP = CfgGetBool(f, "FilterNonIP");
\r
3666 o->FilterBPDU = CfgGetBool(f, "FilterBPDU");
\r
3667 o->NoIPv4PacketLog = CfgGetBool(f, "NoIPv4PacketLog");
\r
3668 o->NoIPv6PacketLog = CfgGetBool(f, "NoIPv6PacketLog");
\r
3669 o->NoIPv6DefaultRouterInRAWhenIPv6 = CfgGetBool(f, "NoIPv6DefaultRouterInRAWhenIPv6");
\r
3670 o->DisableIPParsing = CfgGetBool(f, "DisableIPParsing");
\r
3671 o->YieldAfterStorePacket = CfgGetBool(f, "YieldAfterStorePacket");
\r
3672 o->NoSpinLockForPacketDelay = CfgGetBool(f, "NoSpinLockForPacketDelay");
\r
3673 o->BroadcastStormDetectionThreshold = CfgGetInt(f, "BroadcastStormDetectionThreshold");
\r
3674 o->ClientMinimumRequiredBuild = CfgGetInt(f, "ClientMinimumRequiredBuild");
\r
3675 o->RequiredClientId = CfgGetInt(f, "RequiredClientId");
\r
3676 o->NoManageVlanId = CfgGetBool(f, "NoManageVlanId");
\r
3677 o->VlanTypeId = 0;
\r
3678 if (CfgGetStr(f, "VlanTypeId", tmp, sizeof(tmp)))
\r
3680 o->VlanTypeId = HexToInt(tmp);
\r
3682 if (o->VlanTypeId == 0)
\r
3684 o->VlanTypeId = MAC_PROTO_TAGVLAN;
\r
3686 o->FixForDLinkBPDU = CfgGetBool(f, "FixForDLinkBPDU");
\r
3687 o->NoLookBPDUBridgeId = CfgGetBool(f, "NoLookBPDUBridgeId");
\r
3690 if (CfgIsItem(f, "ManageOnlyPrivateIP"))
\r
3692 o->ManageOnlyPrivateIP = CfgGetBool(f, "ManageOnlyPrivateIP");
\r
3696 o->ManageOnlyPrivateIP = true;
\r
3698 if (CfgIsItem(f, "ManageOnlyLocalUnicastIPv6"))
\r
3700 o->ManageOnlyLocalUnicastIPv6 = CfgGetBool(f, "ManageOnlyLocalUnicastIPv6");
\r
3704 o->ManageOnlyLocalUnicastIPv6 = true;
\r
3706 if (CfgIsItem(f, "NoMacAddressLog"))
\r
3708 o->NoMacAddressLog = CfgGetBool(f, "NoMacAddressLog");
\r
3712 o->NoMacAddressLog = true;
\r
3716 // HUB_OPTION の書き込み
\r
3717 void SiWriteHubOptionCfg(FOLDER *f, HUB_OPTION *o)
\r
3719 char tmp[MAX_SIZE];
\r
3721 if (f == NULL || o == NULL)
\r
3726 CfgAddInt(f, "MaxSession", o->MaxSession);
\r
3727 CfgAddBool(f, "NoArpPolling", o->NoArpPolling);
\r
3728 CfgAddBool(f, "NoIPv6AddrPolling", o->NoIPv6AddrPolling);
\r
3729 CfgAddBool(f, "NoIpTable", o->NoIpTable);
\r
3730 CfgAddBool(f, "NoEnum", o->NoEnum);
\r
3731 CfgAddBool(f, "FilterPPPoE", o->FilterPPPoE);
\r
3732 CfgAddBool(f, "FilterOSPF", o->FilterOSPF);
\r
3733 CfgAddBool(f, "FilterIPv4", o->FilterIPv4);
\r
3734 CfgAddBool(f, "FilterIPv6", o->FilterIPv6);
\r
3735 CfgAddBool(f, "FilterNonIP", o->FilterNonIP);
\r
3736 CfgAddBool(f, "NoIPv4PacketLog", o->NoIPv4PacketLog);
\r
3737 CfgAddBool(f, "NoIPv6PacketLog", o->NoIPv6PacketLog);
\r
3738 CfgAddBool(f, "FilterBPDU", o->FilterBPDU);
\r
3739 CfgAddBool(f, "NoIPv6DefaultRouterInRAWhenIPv6", o->NoIPv6DefaultRouterInRAWhenIPv6);
\r
3740 CfgAddBool(f, "NoMacAddressLog", o->NoMacAddressLog);
\r
3741 CfgAddBool(f, "ManageOnlyPrivateIP", o->ManageOnlyPrivateIP);
\r
3742 CfgAddBool(f, "ManageOnlyLocalUnicastIPv6", o->ManageOnlyLocalUnicastIPv6);
\r
3743 CfgAddBool(f, "DisableIPParsing", o->DisableIPParsing);
\r
3744 CfgAddBool(f, "YieldAfterStorePacket", o->YieldAfterStorePacket);
\r
3745 CfgAddBool(f, "NoSpinLockForPacketDelay", o->NoSpinLockForPacketDelay);
\r
3746 CfgAddInt(f, "BroadcastStormDetectionThreshold", o->BroadcastStormDetectionThreshold);
\r
3747 CfgAddInt(f, "ClientMinimumRequiredBuild", o->ClientMinimumRequiredBuild);
\r
3748 CfgAddInt(f, "RequiredClientId", o->RequiredClientId);
\r
3749 CfgAddBool(f, "NoManageVlanId", o->NoManageVlanId);
\r
3750 Format(tmp, sizeof(tmp), "0x%x", o->VlanTypeId);
\r
3751 CfgAddStr(f, "VlanTypeId", tmp);
\r
3752 if (o->FixForDLinkBPDU)
\r
3754 CfgAddBool(f, "FixForDLinkBPDU", o->FixForDLinkBPDU);
\r
3756 CfgAddBool(f, "NoLookBPDUBridgeId", o->NoLookBPDUBridgeId);
\r
3760 void SiWriteUserCfg(FOLDER *f, USER *u)
\r
3762 AUTHPASSWORD *password;
\r
3764 if (f == NULL || u == NULL)
\r
3771 CfgAddUniStr(f, "RealName", u->RealName);
\r
3772 CfgAddUniStr(f, "Note", u->Note);
\r
3773 if (u->Group != NULL)
\r
3775 CfgAddStr(f, "GroupName", u->GroupName);
\r
3777 CfgAddInt64(f, "CreatedTime", u->CreatedTime);
\r
3778 CfgAddInt64(f, "UpdatedTime", u->UpdatedTime);
\r
3779 CfgAddInt64(f, "ExpireTime", u->ExpireTime);
\r
3780 CfgAddInt64(f, "LastLoginTime", u->LastLoginTime);
\r
3781 CfgAddInt(f, "NumLogin", u->NumLogin);
\r
3782 if (u->Policy != NULL)
\r
3784 SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), u->Policy, false);
\r
3786 SiWriteTraffic(f, "Traffic", u->Traffic);
\r
3788 CfgAddInt(f, "AuthType", u->AuthType);
\r
3789 if (u->AuthData != NULL)
\r
3791 switch (u->AuthType)
\r
3793 case AUTHTYPE_ANONYMOUS:
\r
3796 case AUTHTYPE_PASSWORD:
\r
3797 password = (AUTHPASSWORD *)u->AuthData;
\r
3798 CfgAddByte(f, "AuthPassword", password->HashedKey, sizeof(password->HashedKey));
\r
3807 void SiLoadUserCfg(HUB *h, FOLDER *f)
\r
3810 wchar_t realname[MAX_SIZE];
\r
3811 wchar_t note[MAX_SIZE];
\r
3812 char groupname[MAX_SIZE];
\r
3814 UINT64 created_time;
\r
3815 UINT64 updated_time;
\r
3816 UINT64 expire_time;
\r
3817 UINT64 last_login_time;
\r
3823 X_SERIAL *serial = NULL;
\r
3824 UCHAR hashed_password[SHA1_SIZE];
\r
3828 if (h == NULL || f == NULL)
\r
3833 username = f->Name;
\r
3834 CfgGetUniStr(f, "RealName", realname, sizeof(realname));
\r
3835 CfgGetUniStr(f, "Note", note, sizeof(note));
\r
3836 CfgGetStr(f, "GroupName", groupname, sizeof(groupname));
\r
3838 created_time = CfgGetInt64(f, "CreatedTime");
\r
3839 updated_time = CfgGetInt64(f, "UpdatedTime");
\r
3840 expire_time = CfgGetInt64(f, "ExpireTime");
\r
3841 last_login_time = CfgGetInt64(f, "LastLoginTime");
\r
3842 num_login = CfgGetInt(f, "NumLogin");
\r
3843 pf = CfgGetFolder(f, "Policy");
\r
3846 SiLoadPolicyCfg(&p, pf);
\r
3848 SiLoadTraffic(f, "Traffic", &t);
\r
3850 authtype = CfgGetInt(f, "AuthType");
\r
3855 case AUTHTYPE_PASSWORD:
\r
3857 CfgGetByte(f, "AuthPassword", hashed_password, sizeof(hashed_password));
\r
3858 authdata = NewPasswordAuthDataRaw(hashed_password);
\r
3862 // それ以外の認証方法が指定された
\r
3863 authtype = AUTHTYPE_ANONYMOUS;
\r
3871 if (StrLen(groupname) > 0)
\r
3873 g = AcGetGroup(h, groupname);
\r
3880 u = NewUser(username, realname, note, authtype, authdata);
\r
3885 JoinUserToGroup(u, g);
\r
3888 SetUserTraffic(u, &t);
\r
3892 SetUserPolicy(u, &p);
\r
3897 u->CreatedTime = created_time;
\r
3898 u->UpdatedTime = updated_time;
\r
3899 u->ExpireTime = expire_time;
\r
3900 u->LastLoginTime = last_login_time;
\r
3901 u->NumLogin = num_login;
\r
3917 if (serial != NULL)
\r
3919 FreeXSerial(serial);
\r
3924 void SiWriteUserList(FOLDER *f, LIST *o)
\r
3927 if (f == NULL || o == NULL)
\r
3935 for (i = 0;i < LIST_NUM(o);i++)
\r
3937 USER *u = LIST_DATA(o, i);
\r
3938 SiWriteUserCfg(CfgCreateFolder(f, u->Name), u);
\r
3945 void SiLoadUserList(HUB *h, FOLDER *f)
\r
3951 if (f == NULL || h == NULL)
\r
3956 t = CfgEnumFolderToTokenList(f);
\r
3958 for (i = 0;i < t->NumTokens;i++)
\r
3961 name = t->Token[i];
\r
3962 ff = CfgGetFolder(f, name);
\r
3963 SiLoadUserCfg(h, ff);
\r
3970 void SiWriteGroupCfg(FOLDER *f, USERGROUP *g)
\r
3973 if (f == NULL || g == NULL)
\r
3980 CfgAddUniStr(f, "RealName", g->RealName);
\r
3981 CfgAddUniStr(f, "Note", g->Note);
\r
3982 if (g->Policy != NULL)
\r
3984 SiWritePolicyCfg(CfgCreateFolder(f, "Policy"), g->Policy, false);
\r
3986 SiWriteTraffic(f, "Traffic", g->Traffic);
\r
3992 void SiLoadGroupCfg(HUB *h, FOLDER *f)
\r
3994 wchar_t realname[MAX_SIZE];
\r
3995 wchar_t note[MAX_SIZE];
\r
4002 if (h == NULL || f == NULL)
\r
4009 CfgGetUniStr(f, "RealName", realname, sizeof(realname));
\r
4010 CfgGetUniStr(f, "Note", note, sizeof(note));
\r
4012 pf = CfgGetFolder(f, "Policy");
\r
4015 SiLoadPolicyCfg(&p, pf);
\r
4018 SiLoadTraffic(f, "Traffic", &t);
\r
4020 g = NewGroup(name, realname, note);
\r
4028 SetGroupPolicy(g, &p);
\r
4031 SetGroupTraffic(g, &t);
\r
4043 void SiWriteGroupList(FOLDER *f, LIST *o)
\r
4046 if (f == NULL || o == NULL)
\r
4054 for (i = 0;i < LIST_NUM(o);i++)
\r
4056 USERGROUP *g = LIST_DATA(o, i);
\r
4057 SiWriteGroupCfg(CfgCreateFolder(f, g->Name), g);
\r
4064 void SiLoadGroupList(HUB *h, FOLDER *f)
\r
4070 if (f == NULL || h == NULL)
\r
4075 t = CfgEnumFolderToTokenList(f);
\r
4077 for (i = 0;i < t->NumTokens;i++)
\r
4079 name = t->Token[i];
\r
4080 SiLoadGroupCfg(h, CfgGetFolder(f, name));
\r
4087 void SiWriteCrlList(FOLDER *f, LIST *o)
\r
4090 if (f == NULL || o == NULL)
\r
4098 for (i = 0;i < LIST_NUM(o);i++)
\r
4100 char name[MAX_SIZE];
\r
4101 CRL *crl = LIST_DATA(o, i);
\r
4105 Format(name, sizeof(name), "Crl%u", i);
\r
4107 ff = CfgCreateFolder(f, name);
\r
4110 if (UniIsEmptyStr(n->CommonName) == false)
\r
4112 CfgAddUniStr(ff, "CommonName", n->CommonName);
\r
4115 if (UniIsEmptyStr(n->Organization) == false)
\r
4117 CfgAddUniStr(ff, "Organization", n->Organization);
\r
4120 if (UniIsEmptyStr(n->Unit) == false)
\r
4122 CfgAddUniStr(ff, "Unit", n->Unit);
\r
4125 if (UniIsEmptyStr(n->Country) == false)
\r
4127 CfgAddUniStr(ff, "Country", n->Country);
\r
4130 if (UniIsEmptyStr(n->State) == false)
\r
4132 CfgAddUniStr(ff, "State", n->State);
\r
4135 if (UniIsEmptyStr(n->Local) == false)
\r
4137 CfgAddUniStr(ff, "Local", n->Local);
\r
4140 if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
\r
4142 char tmp[MAX_SIZE];
\r
4144 BinToStr(tmp, sizeof(tmp), crl->DigestMD5, MD5_SIZE);
\r
4145 CfgAddStr(ff, "DigestMD5", tmp);
\r
4148 if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
\r
4150 char tmp[MAX_SIZE];
\r
4152 BinToStr(tmp, sizeof(tmp), crl->DigestSHA1, SHA1_SIZE);
\r
4153 CfgAddStr(ff, "DigestSHA1", tmp);
\r
4156 if (crl->Serial != NULL)
\r
4158 char tmp[MAX_SIZE];
\r
4160 BinToStr(tmp, sizeof(tmp), crl->Serial->data, crl->Serial->size);
\r
4161 CfgAddStr(ff, "Serial", tmp);
\r
4169 void SiLoadCrlList(LIST *o, FOLDER *f)
\r
4172 if (o == NULL || f == NULL)
\r
4182 t = CfgEnumFolderToTokenList(f);
\r
4184 for (i = 0;i < t->NumTokens;i++)
\r
4187 FOLDER *ff = CfgGetFolder(f, t->Token[i]);
\r
4188 wchar_t cn[MAX_SIZE], org[MAX_SIZE], u[MAX_SIZE], c[MAX_SIZE],
\r
4189 st[MAX_SIZE], l[MAX_SIZE];
\r
4190 char tmp[MAX_SIZE];
\r
4196 crl = ZeroMalloc(sizeof(CRL));
\r
4198 CfgGetUniStr(ff, "CommonName", cn, sizeof(cn));
\r
4199 CfgGetUniStr(ff, "Organization", org, sizeof(org));
\r
4200 CfgGetUniStr(ff, "Unit", u, sizeof(u));
\r
4201 CfgGetUniStr(ff, "Country", c, sizeof(c));
\r
4202 CfgGetUniStr(ff, "State", st, sizeof(st));
\r
4203 CfgGetUniStr(ff, "Local", l, sizeof(l));
\r
4205 crl->Name = NewName(cn, org, u, c, st, l);
\r
4207 if (CfgGetStr(ff, "Serial", tmp, sizeof(tmp)))
\r
4209 b = StrToBin(tmp);
\r
4215 crl->Serial = NewXSerial(b->Buf, b->Size);
\r
4222 if (CfgGetStr(ff, "DigestMD5", tmp, sizeof(tmp)))
\r
4224 b = StrToBin(tmp);
\r
4228 if (b->Size == MD5_SIZE)
\r
4230 Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
\r
4237 if (CfgGetStr(ff, "DigestSHA1", tmp, sizeof(tmp)))
\r
4239 b = StrToBin(tmp);
\r
4243 if (b->Size == SHA1_SIZE)
\r
4245 Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
\r
4262 void SiWriteCertList(FOLDER *f, LIST *o)
\r
4265 if (f == NULL || o == NULL)
\r
4274 for (i = 0;i < LIST_NUM(o);i++)
\r
4276 char name[MAX_SIZE];
\r
4278 x = LIST_DATA(o, i);
\r
4279 Format(name, sizeof(name), "Cert%u", i);
\r
4280 b = XToBuf(x, false);
\r
4283 CfgAddBuf(CfgCreateFolder(f, name), "X509", b);
\r
4292 void SiLoadCertList(LIST *o, FOLDER *f)
\r
4295 if (o == NULL || f == NULL)
\r
4305 t = CfgEnumFolderToTokenList(f);
\r
4307 for (i = 0;i < t->NumTokens;i++)
\r
4309 FOLDER *ff = CfgGetFolder(f, t->Token[i]);
\r
4312 b = CfgGetBuf(ff, "X509");
\r
4315 X *x = BufToX(b, false);
\r
4330 void SiWriteHubDb(FOLDER *f, HUBDB *db)
\r
4333 if (f == NULL || db == NULL)
\r
4338 SiWriteUserList(CfgCreateFolder(f, "UserList"), db->UserList);
\r
4339 SiWriteGroupList(CfgCreateFolder(f, "GroupList"), db->GroupList);
\r
4340 SiWriteCertList(CfgCreateFolder(f, "CertList"), db->RootCertList);
\r
4341 SiWriteCrlList(CfgCreateFolder(f, "CrlList"), db->CrlList);
\r
4345 void SiLoadHubDb(HUB *h, FOLDER *f)
\r
4348 if (f == NULL || h == NULL)
\r
4353 SiLoadGroupList(h, CfgGetFolder(f, "GroupList"));
\r
4354 SiLoadUserList(h, CfgGetFolder(f, "UserList"));
\r
4356 if (h->HubDb != NULL)
\r
4358 SiLoadCertList(h->HubDb->RootCertList, CfgGetFolder(f, "CertList"));
\r
4359 SiLoadCrlList(h->HubDb->CrlList, CfgGetFolder(f, "CrlList"));
\r
4364 void SiWriteHubCfg(FOLDER *f, HUB *h)
\r
4367 if (f == NULL || h == NULL)
\r
4373 CfgAddByte(f, "HashedPassword", h->HashedPassword, sizeof(h->HashedPassword));
\r
4374 CfgAddByte(f, "SecurePassword", h->SecurePassword, sizeof(h->SecurePassword));
\r
4376 // Online / Offline フラグ
\r
4377 if (h->Cedar->Bridge == false)
\r
4379 CfgAddBool(f, "Online", (h->Offline && (h->HubIsOnlineButHalting == false)) ? false : true);
\r
4383 SiWriteTraffic(f, "Traffic", h->Traffic);
\r
4386 SiWriteHubOptionCfg(CfgCreateFolder(f, "Option"), h->Option);
\r
4390 FOLDER *folder = CfgCreateFolder(f, "Message");
\r
4392 if (IsEmptyUniStr(h->Msg) == false)
\r
4394 CfgAddUniStr(folder, "MessageText", h->Msg);
\r
4399 SiWriteHubLogCfg(CfgCreateFolder(f, "LogSetting"), &h->LogSetting);
\r
4401 if (h->Type == HUB_TYPE_STANDALONE)
\r
4404 SiWriteHubLinks(CfgCreateFolder(f, "CascadeList"), h);
\r
4407 if (h->Type != HUB_TYPE_FARM_STATIC)
\r
4409 if (GetServerCapsBool(h->Cedar->Server, "b_support_securenat"))
\r
4412 SiWriteSecureNAT(h, CfgCreateFolder(f, "SecureNAT"));
\r
4417 SiWriteHubAccessLists(CfgCreateFolder(f, "AccessList"), h);
\r
4420 SiWriteHubAdminOptions(CfgCreateFolder(f, "AdminOption"), h);
\r
4423 CfgAddInt(f, "Type", h->Type);
\r
4426 if (h->Cedar->Bridge == false)
\r
4428 SiWriteHubDb(CfgCreateFolder(f, "SecurityAccountDatabase"), h->HubDb);
\r
4432 CfgAddInt64(f, "LastCommTime", h->LastCommTime);
\r
4433 CfgAddInt64(f, "LastLoginTime", h->LastLoginTime);
\r
4434 CfgAddInt64(f, "CreatedTime", h->CreatedTime);
\r
4435 CfgAddInt(f, "NumLogin", h->NumLogin);
\r
4439 void SiLoadHubLogCfg(HUB_LOG *g, FOLDER *f)
\r
4442 if (f == NULL || g == NULL)
\r
4447 Zero(g, sizeof(HUB_LOG));
\r
4448 g->SaveSecurityLog = CfgGetBool(f, "SaveSecurityLog");
\r
4449 g->SecurityLogSwitchType = CfgGetInt(f, "SecurityLogSwitchType");
\r
4450 g->SavePacketLog = CfgGetBool(f, "SavePacketLog");
\r
4451 g->PacketLogSwitchType = CfgGetInt(f, "PacketLogSwitchType");
\r
4453 g->PacketLogConfig[PACKET_LOG_TCP_CONN] = CfgGetInt(f, "PACKET_LOG_TCP_CONN");
\r
4454 g->PacketLogConfig[PACKET_LOG_TCP] = CfgGetInt(f, "PACKET_LOG_TCP");
\r
4455 g->PacketLogConfig[PACKET_LOG_DHCP] = CfgGetInt(f, "PACKET_LOG_DHCP");
\r
4456 g->PacketLogConfig[PACKET_LOG_UDP] = CfgGetInt(f, "PACKET_LOG_UDP");
\r
4457 g->PacketLogConfig[PACKET_LOG_ICMP] = CfgGetInt(f, "PACKET_LOG_ICMP");
\r
4458 g->PacketLogConfig[PACKET_LOG_IP] = CfgGetInt(f, "PACKET_LOG_IP");
\r
4459 g->PacketLogConfig[PACKET_LOG_ARP] = CfgGetInt(f, "PACKET_LOG_ARP");
\r
4460 g->PacketLogConfig[PACKET_LOG_ETHERNET] = CfgGetInt(f, "PACKET_LOG_ETHERNET");
\r
4464 void SiWriteHubLogCfg(FOLDER *f, HUB_LOG *g)
\r
4466 SiWriteHubLogCfgEx(f, g, false);
\r
4468 void SiWriteHubLogCfgEx(FOLDER *f, HUB_LOG *g, bool el_mode)
\r
4471 if (f == NULL || g == NULL)
\r
4476 if (el_mode == false)
\r
4478 CfgAddBool(f, "SaveSecurityLog", g->SaveSecurityLog);
\r
4479 CfgAddInt(f, "SecurityLogSwitchType", g->SecurityLogSwitchType);
\r
4480 CfgAddBool(f, "SavePacketLog", g->SavePacketLog);
\r
4483 CfgAddInt(f, "PacketLogSwitchType", g->PacketLogSwitchType);
\r
4485 CfgAddInt(f, "PACKET_LOG_TCP_CONN", g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
\r
4486 CfgAddInt(f, "PACKET_LOG_TCP", g->PacketLogConfig[PACKET_LOG_TCP]);
\r
4487 CfgAddInt(f, "PACKET_LOG_DHCP", g->PacketLogConfig[PACKET_LOG_DHCP]);
\r
4488 CfgAddInt(f, "PACKET_LOG_UDP", g->PacketLogConfig[PACKET_LOG_UDP]);
\r
4489 CfgAddInt(f, "PACKET_LOG_ICMP", g->PacketLogConfig[PACKET_LOG_ICMP]);
\r
4490 CfgAddInt(f, "PACKET_LOG_IP", g->PacketLogConfig[PACKET_LOG_IP]);
\r
4491 CfgAddInt(f, "PACKET_LOG_ARP", g->PacketLogConfig[PACKET_LOG_ARP]);
\r
4492 CfgAddInt(f, "PACKET_LOG_ETHERNET", g->PacketLogConfig[PACKET_LOG_ETHERNET]);
\r
4496 void SiLoadHubCfg(SERVER *s, FOLDER *f, char *name)
\r
4502 UINT hub_old_type = 0;
\r
4504 if (s == NULL || f == NULL || name == NULL)
\r
4512 Zero(&o, sizeof(o));
\r
4513 SiLoadHubOptionCfg(CfgGetFolder(f, "Option"), &o);
\r
4516 h = NewHub(c, name, &o);
\r
4522 if (CfgGetByte(f, "HashedPassword", h->HashedPassword, sizeof(h->HashedPassword)) != sizeof(h->HashedPassword))
\r
4524 Hash(h->HashedPassword, "", 0, true);
\r
4526 if (CfgGetByte(f, "SecurePassword", h->SecurePassword, sizeof(h->SecurePassword)) != sizeof(h->SecurePassword))
\r
4528 HashPassword(h->SecurePassword, ADMINISTRATOR_USERNAME, "");
\r
4532 Zero(&g, sizeof(g));
\r
4533 SiLoadHubLogCfg(&g, CfgGetFolder(f, "LogSetting"));
\r
4534 SetHubLogSetting(h, &g);
\r
4536 // Online / Offline フラグ
\r
4537 if (h->Cedar->Bridge == false)
\r
4539 online = CfgGetBool(f, "Online");
\r
4547 SiLoadTraffic(f, "Traffic", h->Traffic);
\r
4550 SiLoadHubAccessLists(h, CfgGetFolder(f, "AccessList"));
\r
4553 hub_old_type = h->Type = CfgGetInt(f, "Type");
\r
4554 if (s->ServerType == SERVER_TYPE_STANDALONE)
\r
4556 if (h->Type != HUB_TYPE_STANDALONE)
\r
4558 // サーバーがスタンドアロンの場合は HUB の種類をスタンドアロンに変換する
\r
4559 h->Type = HUB_TYPE_STANDALONE;
\r
4564 if (h->Type == HUB_TYPE_STANDALONE)
\r
4566 // サーバーがファームコントローラの場合は HUB の種類をファーム対応にする
\r
4567 h->Type = HUB_TYPE_FARM_DYNAMIC;
\r
4573 FOLDER *folder = CfgGetFolder(f, "Message");
\r
4574 if (folder != NULL)
\r
4576 wchar_t *tmp = Malloc(sizeof(wchar_t) * (HUB_MAXMSG_LEN + 1));
\r
4577 if (CfgGetUniStr(folder, "MessageText", tmp, sizeof(wchar_t) * (HUB_MAXMSG_LEN + 1)))
\r
4579 SetHubMsg(h, tmp);
\r
4586 if (h->Type == HUB_TYPE_STANDALONE)
\r
4588 // リンクリストはスタンドアロン HUB の場合しか使用しない
\r
4589 SiLoadHubLinks(h, CfgGetFolder(f, "CascadeList"));
\r
4593 if (GetServerCapsBool(h->Cedar->Server, "b_support_securenat"))
\r
4595 if (h->Type == HUB_TYPE_STANDALONE || h->Type == HUB_TYPE_FARM_DYNAMIC)
\r
4597 // SecureNAT はスタンドアロン HUB かダイナミック HUB の場合しか使用しない
\r
4598 SiLoadSecureNAT(h, CfgGetFolder(f, "SecureNAT"));
\r
4600 if (h->Type != HUB_TYPE_STANDALONE && h->Cedar != NULL && h->Cedar->Server != NULL &&
\r
4601 h->Cedar->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
4603 NiClearUnsupportedVhOptionForDynamicHub(h->SecureNATOption,
\r
4604 hub_old_type == HUB_TYPE_STANDALONE);
\r
4611 SiLoadHubAdminOptions(h, CfgGetFolder(f, "AdminOption"));
\r
4614 if (h->Cedar->Bridge == false)
\r
4616 SiLoadHubDb(h, CfgGetFolder(f, "SecurityAccountDatabase"));
\r
4620 h->LastCommTime = CfgGetInt64(f, "LastCommTime");
\r
4621 if (h->LastCommTime == 0)
\r
4623 h->LastCommTime = SystemTime64();
\r
4625 h->LastLoginTime = CfgGetInt64(f, "LastLoginTime");
\r
4626 if (h->LastLoginTime == 0)
\r
4628 h->LastLoginTime = SystemTime64();
\r
4630 h->CreatedTime = CfgGetInt64(f, "CreatedTime");
\r
4631 h->NumLogin = CfgGetInt(f, "NumLogin");
\r
4638 h->Offline = true;
\r
4643 h->Offline = false;
\r
4647 WaitLogFlush(h->SecurityLogger);
\r
4648 WaitLogFlush(h->PacketLogger);
\r
4654 // SecureNAT 設定の読み込み
\r
4655 void SiLoadSecureNAT(HUB *h, FOLDER *f)
\r
4659 if (h == NULL || f == NULL)
\r
4664 // VH_OPTION を読み込む
\r
4665 NiLoadVhOptionEx(&o, f);
\r
4668 Copy(h->SecureNATOption, &o, sizeof(VH_OPTION));
\r
4670 EnableSecureNAT(h, CfgGetBool(f, "Disabled") ? false : true);
\r
4673 // 仮想レイヤ 3 スイッチ設定の読み込み
\r
4674 void SiLoadL3SwitchCfg(L3SW *sw, FOLDER *f)
\r
4677 FOLDER *if_folder, *table_folder;
\r
4679 bool active = false;
\r
4681 if (sw == NULL || f == NULL)
\r
4686 active = CfgGetBool(f, "Active");
\r
4689 if_folder = CfgGetFolder(f, "InterfaceList");
\r
4690 if (if_folder != NULL)
\r
4692 t = CfgEnumFolderToTokenList(if_folder);
\r
4695 for (i = 0;i < t->NumTokens;i++)
\r
4697 FOLDER *ff = CfgGetFolder(if_folder, t->Token[i]);
\r
4698 char name[MAX_HUBNAME_LEN + 1];
\r
4701 CfgGetStr(ff, "HubName", name, sizeof(name));
\r
4702 ip = CfgGetIp32(ff, "IpAddress");
\r
4703 subnet = CfgGetIp32(ff, "SubnetMask");
\r
4705 L3AddIf(sw, name, ip, subnet);
\r
4712 table_folder = CfgGetFolder(f, "RoutingTable");
\r
4713 if (table_folder != NULL)
\r
4715 t = CfgEnumFolderToTokenList(table_folder);
\r
4718 for (i = 0;i < t->NumTokens;i++)
\r
4720 FOLDER *ff = CfgGetFolder(table_folder, t->Token[i]);
\r
4723 Zero(&tbl, sizeof(tbl));
\r
4724 tbl.NetworkAddress = CfgGetIp32(ff, "NetworkAddress");
\r
4725 tbl.SubnetMask = CfgGetIp32(ff, "SubnetMask");
\r
4726 tbl.GatewayAddress = CfgGetIp32(ff, "GatewayAddress");
\r
4727 tbl.Metric = CfgGetInt(ff, "Metric");
\r
4729 L3AddTable(sw, &tbl);
\r
4741 // 仮想レイヤ 3 スイッチ設定の書き込み
\r
4742 void SiWriteL3SwitchCfg(FOLDER *f, L3SW *sw)
\r
4745 FOLDER *if_folder, *table_folder;
\r
4746 char tmp[MAX_SIZE];
\r
4748 if (f == NULL || sw == NULL)
\r
4754 CfgAddBool(f, "Active", sw->Active);
\r
4757 if_folder = CfgCreateFolder(f, "InterfaceList");
\r
4758 for (i = 0;i < LIST_NUM(sw->IfList);i++)
\r
4760 L3IF *e = LIST_DATA(sw->IfList, i);
\r
4763 Format(tmp, sizeof(tmp), "Interface%u", i);
\r
4764 ff = CfgCreateFolder(if_folder, tmp);
\r
4766 CfgAddStr(ff, "HubName", e->HubName);
\r
4767 CfgAddIp32(ff, "IpAddress", e->IpAddress);
\r
4768 CfgAddIp32(ff, "SubnetMask", e->SubnetMask);
\r
4772 table_folder = CfgCreateFolder(f, "RoutingTable");
\r
4773 for (i = 0;i < LIST_NUM(sw->TableList);i++)
\r
4775 L3TABLE *e = LIST_DATA(sw->TableList, i);
\r
4778 Format(tmp, sizeof(tmp), "Entry%u", i);
\r
4779 ff = CfgCreateFolder(table_folder, tmp);
\r
4781 CfgAddIp32(ff, "NetworkAddress", e->NetworkAddress);
\r
4782 CfgAddIp32(ff, "SubnetMask", e->SubnetMask);
\r
4783 CfgAddIp32(ff, "GatewayAddress", e->GatewayAddress);
\r
4784 CfgAddInt(ff, "Metric", e->Metric);
\r
4788 // 仮想レイヤ 3 スイッチ一覧の読み込み
\r
4789 void SiLoadL3Switchs(SERVER *s, FOLDER *f)
\r
4795 if (s == NULL || f == NULL)
\r
4801 t = CfgEnumFolderToTokenList(f);
\r
4804 for (i = 0;i < t->NumTokens;i++)
\r
4806 char *name = t->Token[i];
\r
4807 L3SW *sw = L3AddSw(c, name);
\r
4809 SiLoadL3SwitchCfg(sw, CfgGetFolder(f, name));
\r
4817 // 仮想レイヤ 3 スイッチ一覧の書き込み
\r
4818 void SiWriteL3Switchs(FOLDER *f, SERVER *s)
\r
4824 if (f == NULL || s == NULL)
\r
4830 LockList(c->L3SwList);
\r
4832 for (i = 0;i < LIST_NUM(c->L3SwList);i++)
\r
4834 L3SW *sw = LIST_DATA(c->L3SwList, i);
\r
4838 folder = CfgCreateFolder(f, sw->Name);
\r
4840 SiWriteL3SwitchCfg(folder, sw);
\r
4845 UnlockList(c->L3SwList);
\r
4849 void SiWriteLicenseManager(FOLDER *f, SERVER *s)
\r
4851 LICENSE_SYSTEM *ss;
\r
4853 if (f == NULL || s == NULL)
\r
4858 ss = s->LicenseSystem;
\r
4864 LockList(ss->LicenseList);
\r
4867 for (i = 0;i < LIST_NUM(ss->LicenseList);i++)
\r
4869 LICENSE *e = LIST_DATA(ss->LicenseList, i);
\r
4870 char name[MAX_SIZE];
\r
4873 Format(name, sizeof(name), "License%u", i);
\r
4874 ff = CfgCreateFolder(f, name);
\r
4875 CfgAddStr(ff, "LicenseKey", e->LicenseKeyStr);
\r
4876 CfgAddInt(ff, "LicenseType", e->ProductId);
\r
4879 UnlockList(ss->LicenseList);
\r
4883 void SiLoadLicenseManager(SERVER *s, FOLDER *f)
\r
4889 if (s == NULL || f == NULL)
\r
4895 t = CfgEnumFolderToTokenList(f);
\r
4898 for (i = 0;i < t->NumTokens;i++)
\r
4900 char *str = t->Token[i];
\r
4901 FOLDER *ff = CfgGetFolder(f, str);
\r
4905 UINT product_id = CfgGetInt(ff, "LicenseType");
\r
4906 char key[MAX_SIZE];
\r
4908 if (CfgGetStr(ff, "LicenseKey", key, sizeof(key)))
\r
4911 //LiInputLicenseKeyEx(c, s->LicenseSystem, key, product_id, NULL);
\r
4918 DestroyServerCapsCache(s);
\r
4922 void SiWriteHubs(FOLDER *f, SERVER *s)
\r
4925 FOLDER *hub_folder;
\r
4930 if (f == NULL || s == NULL)
\r
4936 LockList(c->HubList);
\r
4938 hubs = ToArray(c->HubList);
\r
4939 num = LIST_NUM(c->HubList);
\r
4941 for (i = 0;i < num;i++)
\r
4943 AddRef(hubs[i]->ref);
\r
4946 UnlockList(c->HubList);
\r
4948 for (i = 0;i < num;i++)
\r
4954 hub_folder = CfgCreateFolder(f, h->Name);
\r
4955 SiWriteHubCfg(hub_folder, h);
\r
4961 if ((i % 30) == 1)
\r
4971 void SiLoadHubs(SERVER *s, FOLDER *f)
\r
4974 FOLDER *hub_folder;
\r
4979 if (f == NULL || s == NULL)
\r
4985 t = CfgEnumFolderToTokenList(f);
\r
4986 for (i = 0;i < t->NumTokens;i++)
\r
4988 char *name = t->Token[i];
\r
4989 if (s->Cedar->Bridge)
\r
4991 if (StrCmpi(name, SERVER_DEFAULT_BRIDGE_NAME) == 0)
\r
4993 // Bridge の場合は "BRIDGE" という名前の仮想 HUB の設定
\r
5002 hub_folder = CfgGetFolder(f, name);
\r
5003 if (hub_folder != NULL)
\r
5005 SiLoadHubCfg(s, hub_folder, name);
\r
5010 if (s->Cedar->Bridge && b == false)
\r
5012 // "BRIDGE" という名前の仮想 HUB の設定が存在しない場合は新たに作成する
\r
5013 SiInitDefaultHubList(s);
\r
5018 void SiLoadServerCfg(SERVER *s, FOLDER *f)
\r
5022 char tmp[MAX_SIZE];
\r
5025 bool cluster_allowed = false;
\r
5026 UINT num_connections_per_ip = 0;
\r
5028 if (s == NULL || f == NULL)
\r
5034 s->AutoSaveConfigSpan = CfgGetInt(f, "AutoSaveConfigSpan") * 1000;
\r
5035 if (s->AutoSaveConfigSpan == 0)
\r
5037 s->AutoSaveConfigSpan = SERVER_FILE_SAVE_INTERVAL_DEFAULT;
\r
5041 s->AutoSaveConfigSpan = MAKESURE(s->AutoSaveConfigSpan, SERVER_FILE_SAVE_INTERVAL_MIN, SERVER_FILE_SAVE_INTERVAL_MAX);
\r
5051 Zero(&k, sizeof(k));
\r
5052 k.UseKeepConnect = CfgGetBool(f, "UseKeepConnect");
\r
5053 CfgGetStr(f, "KeepConnectHost", k.KeepConnectHost, sizeof(k.KeepConnectHost));
\r
5054 k.KeepConnectPort = CfgGetInt(f, "KeepConnectPort");
\r
5055 k.KeepConnectProtocol = CfgGetInt(f, "KeepConnectProtocol");
\r
5056 k.KeepConnectInterval = CfgGetInt(f, "KeepConnectInterval") * 1000;
\r
5057 if (k.KeepConnectPort == 0)
\r
5059 k.KeepConnectPort = 80;
\r
5061 if (StrLen(k.KeepConnectHost) == 0)
\r
5063 StrCpy(k.KeepConnectHost, sizeof(k.KeepConnectHost), CLIENT_DEFAULT_KEEPALIVE_HOST);
\r
5065 if (k.KeepConnectInterval == 0)
\r
5067 k.KeepConnectInterval = KEEP_INTERVAL_DEFAULT * 1000;
\r
5069 if (k.KeepConnectInterval < 5000)
\r
5071 k.KeepConnectInterval = 5000;
\r
5073 if (k.KeepConnectInterval > 600000)
\r
5075 k.KeepConnectInterval = 600000;
\r
5078 Lock(s->Keep->lock);
\r
5080 KEEP *keep = s->Keep;
\r
5081 keep->Enable = k.UseKeepConnect;
\r
5082 keep->Server = true;
\r
5083 StrCpy(keep->ServerName, sizeof(keep->ServerName), k.KeepConnectHost);
\r
5084 keep->ServerPort = k.KeepConnectPort;
\r
5085 keep->UdpMode = k.KeepConnectProtocol;
\r
5086 keep->Interval = k.KeepConnectInterval;
\r
5088 Unlock(s->Keep->lock);
\r
5091 // IPv6 リスナーを無効にするかどうか
\r
5092 s->Cedar->DisableIPv6Listener = CfgGetBool(f, "DisableIPv6Listener");
\r
5095 s->DisableDeadLockCheck = CfgGetBool(f, "DisableDeadLockCheck");
\r
5098 s->Eraser = NewEraser(s->Logger, CfgGetInt64(f, "AutoDeleteCheckDiskFreeSpaceMin"));
\r
5100 // NoLinuxArpFilter
\r
5101 s->NoLinuxArpFilter = CfgGetBool(f, "NoLinuxArpFilter");
\r
5103 // NoHighPriorityProcess
\r
5104 s->NoHighPriorityProcess = CfgGetBool(f, "NoHighPriorityProcess");
\r
5107 s->NoDebugDump = CfgGetBool(f, "NoDebugDump");
\r
5108 if (s->NoDebugDump)
\r
5111 MsSetEnableMinidump(false);
\r
5112 #endif // OS_WIN32
\r
5115 // クライアントにシグネチャを送信させない
\r
5116 s->NoSendSignature = CfgGetBool(f, "NoSendSignature");
\r
5119 s->SaveDebugLog = CfgGetBool(f, "SaveDebugLog");
\r
5120 if (s->SaveDebugLog)
\r
5122 s->DebugLog = NewTinyLog();
\r
5126 b = CfgGetBuf(f, "ServerCert");
\r
5129 x = BufToX(b, false);
\r
5134 b = CfgGetBuf(f, "ServerKey");
\r
5137 k = BufToK(b, true, false, NULL);
\r
5141 if (x == NULL || k == NULL || CheckXandK(x, k) == false)
\r
5145 SiGenerateDefualtCert(&x, &k);
\r
5147 SetCedarCert(c, x, k);
\r
5154 SetCedarCert(c, x, k);
\r
5161 if (CfgGetStr(f, "CipherName", tmp, sizeof(tmp)))
\r
5164 if (CheckCipherListName(tmp))
\r
5166 SetCedarCipherList(c, tmp);
\r
5171 Lock(c->TrafficLock);
\r
5173 SiLoadTraffic(f, "ServerTraffic", c->Traffic);
\r
5175 Unlock(c->TrafficLock);
\r
5177 // 現在のライセンスでクラスタモードが許可されているかどうかを取得する
\r
5178 cluster_allowed = false;
\r
5179 if (s->Cedar->Bridge == false)
\r
5181 LICENSE_STATUS status;
\r
5183 LiParseCurrentLicenseStatus(s->LicenseSystem, &status);
\r
5185 if (status.AllowEnterpriseFunction)
\r
5187 cluster_allowed = true;
\r
5192 s->UpdatedServerType = s->ServerType =
\r
5193 cluster_allowed ? CfgGetInt(f, "ServerType") : SERVER_TYPE_STANDALONE;
\r
5196 if (CfgGetByte(f, "HashedPassword", s->HashedPassword, sizeof(s->HashedPassword)) != sizeof(s->HashedPassword))
\r
5198 Hash(s->HashedPassword, "", 0, true);
\r
5201 if (s->ServerType != SERVER_TYPE_STANDALONE)
\r
5204 s->Weight = CfgGetInt(f, "ClusterMemberWeight");
\r
5205 if (s->Weight == 0)
\r
5207 s->Weight = FARM_DEFAULT_WEIGHT;
\r
5212 s->Weight = FARM_DEFAULT_WEIGHT;
\r
5215 if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
5217 s->ControllerOnly = CfgGetBool(f, "ControllerOnly");
\r
5220 if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
\r
5222 char tmp[6 * MAX_PUBLIC_PORT_NUM + 1];
\r
5223 // ファームメンバの場合の設定項目の読み込み
\r
5224 CfgGetStr(f, "ControllerName", s->ControllerName, sizeof(s->ControllerName));
\r
5225 s->ControllerPort = CfgGetInt(f, "ControllerPort");
\r
5226 CfgGetByte(f, "MemberPassword", s->MemberPassword, SHA1_SIZE);
\r
5227 s->PublicIp = CfgGetIp32(f, "PublicIp");
\r
5228 if (CfgGetStr(f, "PublicPorts", tmp, sizeof(tmp)))
\r
5230 TOKEN_LIST *t = ParseToken(tmp, ", ");
\r
5232 s->NumPublicPort = t->NumTokens;
\r
5233 s->PublicPorts = ZeroMalloc(s->NumPublicPort * sizeof(UINT));
\r
5234 for (i = 0;i < s->NumPublicPort;i++)
\r
5236 s->PublicPorts[i] = ToInt(t->Token[i]);
\r
5246 void SiWriteServerCfg(FOLDER *f, SERVER *s)
\r
5251 if (f == NULL || s == NULL)
\r
5256 CfgAddInt(f, "AutoSaveConfigSpan", s->AutoSaveConfigSpan / 1000);
\r
5262 Lock(s->Keep->lock);
\r
5264 KEEP *k = s->Keep;
\r
5265 CfgAddBool(f, "UseKeepConnect", k->Enable);
\r
5266 CfgAddStr(f, "KeepConnectHost", k->ServerName);
\r
5267 CfgAddInt(f, "KeepConnectPort", k->ServerPort);
\r
5268 CfgAddInt(f, "KeepConnectProtocol", k->UdpMode);
\r
5269 CfgAddInt(f, "KeepConnectInterval", k->Interval / 1000);
\r
5271 Unlock(s->Keep->lock);
\r
5274 CfgAddBool(f, "DisableIPv6Listener", s->Cedar->DisableIPv6Listener);
\r
5277 CfgAddBool(f, "DisableDeadLockCheck", s->DisableDeadLockCheck);
\r
5280 CfgAddInt64(f, "AutoDeleteCheckDiskFreeSpaceMin", s->Eraser->MinFreeSpace);
\r
5282 // NoLinuxArpFilter
\r
5283 if (GetOsInfo()->OsType == OSTYPE_LINUX)
\r
5285 CfgAddBool(f, "NoLinuxArpFilter", s->NoLinuxArpFilter);
\r
5288 // NoHighPriorityProcess
\r
5289 CfgAddBool(f, "NoHighPriorityProcess", s->NoHighPriorityProcess);
\r
5292 CfgAddBool(f, "NoDebugDump", s->NoDebugDump);
\r
5293 #endif // OS_WIN32
\r
5296 CfgAddBool(f, "SaveDebugLog", s->SaveDebugLog);
\r
5298 // クライアントにシグネチャを送信させない
\r
5299 CfgAddBool(f, "NoSendSignature", s->NoSendSignature);
\r
5302 b = XToBuf(c->ServerX, false);
\r
5303 CfgAddBuf(f, "ServerCert", b);
\r
5307 b = KToBuf(c->ServerK, false, NULL);
\r
5308 CfgAddBuf(f, "ServerKey", b);
\r
5312 Lock(c->TrafficLock);
\r
5314 SiWriteTraffic(f, "ServerTraffic", c->Traffic);
\r
5316 Unlock(c->TrafficLock);
\r
5319 if (s->Cedar->Bridge == false)
\r
5321 CfgAddInt(f, "ServerType", s->UpdatedServerType);
\r
5325 CfgAddStr(f, "CipherName", s->Cedar->CipherList);
\r
5328 CfgAddByte(f, "HashedPassword", s->HashedPassword, sizeof(s->HashedPassword));
\r
5330 if (s->UpdatedServerType == SERVER_TYPE_FARM_MEMBER)
\r
5332 char tmp[6 * MAX_PUBLIC_PORT_NUM + 1];
\r
5334 // ファームメンバの場合の設定項目
\r
5335 CfgAddStr(f, "ControllerName", s->ControllerName);
\r
5336 CfgAddInt(f, "ControllerPort", s->ControllerPort);
\r
5337 CfgAddByte(f, "MemberPassword", s->MemberPassword, SHA1_SIZE);
\r
5338 CfgAddIp32(f, "PublicIp", s->PublicIp);
\r
5340 for (i = 0;i < s->NumPublicPort;i++)
\r
5342 char tmp2[MAX_SIZE];
\r
5343 ToStr(tmp2, s->PublicPorts[i]);
\r
5344 StrCat(tmp, sizeof(tmp), tmp2);
\r
5345 StrCat(tmp, sizeof(tmp), ",");
\r
5347 if (StrLen(tmp) >= 1)
\r
5349 if (tmp[StrLen(tmp) - 1] == ',')
\r
5351 tmp[StrLen(tmp) - 1] = 0;
\r
5354 CfgAddStr(f, "PublicPorts", tmp);
\r
5357 if (s->UpdatedServerType != SERVER_TYPE_STANDALONE)
\r
5359 CfgAddInt(f, "ClusterMemberWeight", s->Weight);
\r
5362 if (s->UpdatedServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
5364 CfgAddBool(f, "ControllerOnly", s->ControllerOnly);
\r
5371 void SiLoadTraffic(FOLDER *parent, char *name, TRAFFIC *t)
\r
5377 Zero(t, sizeof(TRAFFIC));
\r
5379 if (parent == NULL || name == NULL || t == NULL)
\r
5384 f = CfgGetFolder(parent, name);
\r
5391 SiLoadTrafficInner(f, "SendTraffic", &t->Send);
\r
5392 SiLoadTrafficInner(f, "RecvTraffic", &t->Recv);
\r
5394 void SiLoadTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e)
\r
5400 Zero(e, sizeof(TRAFFIC_ENTRY));
\r
5402 if (parent == NULL || name == NULL || e == NULL)
\r
5407 f = CfgGetFolder(parent, name);
\r
5413 e->BroadcastCount = CfgGetInt64(f, "BroadcastCount");
\r
5414 e->BroadcastBytes = CfgGetInt64(f, "BroadcastBytes");
\r
5415 e->UnicastCount = CfgGetInt64(f, "UnicastCount");
\r
5416 e->UnicastBytes = CfgGetInt64(f, "UnicastBytes");
\r
5420 void SiWriteTraffic(FOLDER *parent, char *name, TRAFFIC *t)
\r
5424 if (parent == NULL || name == NULL || t == NULL)
\r
5429 f = CfgCreateFolder(parent, name);
\r
5431 SiWriteTrafficInner(f, "SendTraffic", &t->Send);
\r
5432 SiWriteTrafficInner(f, "RecvTraffic", &t->Recv);
\r
5434 void SiWriteTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e)
\r
5438 if (parent == NULL || name == NULL || e == NULL)
\r
5443 f = CfgCreateFolder(parent, name);
\r
5444 CfgAddInt64(f, "BroadcastCount", e->BroadcastCount);
\r
5445 CfgAddInt64(f, "BroadcastBytes", e->BroadcastBytes);
\r
5446 CfgAddInt64(f, "UnicastCount", e->UnicastCount);
\r
5447 CfgAddInt64(f, "UnicastBytes", e->UnicastBytes);
\r
5450 // 設定ファイル書き込み用スレッド
\r
5451 void SiSaverThread(THREAD *thread, void *param)
\r
5453 SERVER *s = (SERVER *)param;
\r
5455 if (thread == NULL || param == NULL)
\r
5460 while (s->Halt == false)
\r
5463 SiWriteConfigurationFile(s);
\r
5465 Wait(s->SaveHaltEvent, s->AutoSaveConfigSpan);
\r
5470 UINT SiWriteConfigurationFile(SERVER *s)
\r
5479 if (s->CfgRw == NULL)
\r
5484 Lock(s->SaveCfgLock);
\r
5488 Debug("save: SiWriteConfigurationToCfg() start.\n");
\r
5489 f = SiWriteConfigurationToCfg(s);
\r
5490 Debug("save: SiWriteConfigurationToCfg() finished.\n");
\r
5492 Debug("save: SaveCfgRw() start.\n");
\r
5493 ret = SaveCfgRw(s->CfgRw, f);
\r
5494 Debug("save: SaveCfgRw() finished.\n");
\r
5496 Debug("save: CfgDeleteFolder() start.\n");
\r
5497 CfgDeleteFolder(f);
\r
5498 Debug("save: CfgDeleteFolder() finished.\n");
\r
5500 Unlock(s->SaveCfgLock);
\r
5506 void SiFreeConfiguration(SERVER *s)
\r
5515 SiWriteConfigurationFile(s);
\r
5517 // 設定ファイル保存スレッドの終了
\r
5519 Set(s->SaveHaltEvent);
\r
5520 WaitThread(s->SaveThread, INFINITE);
\r
5522 ReleaseEvent(s->SaveHaltEvent);
\r
5523 ReleaseThread(s->SaveThread);
\r
5525 FreeCfgRw(s->CfgRw);
\r
5535 if (server_lock != NULL)
\r
5540 server_lock = NewLock();
\r
5546 DeleteLock(server_lock);
\r
5547 server_lock = NULL;
\r
5551 void StStartServer(bool bridge)
\r
5553 Lock(server_lock);
\r
5555 if (server != NULL)
\r
5558 Unlock(server_lock);
\r
5563 server = SiNewServer(bridge);
\r
5565 Unlock(server_lock);
\r
5567 // StartCedarLog();
\r
5571 SERVER *StGetServer()
\r
5573 if (server == NULL)
\r
5581 void StStopServer()
\r
5583 Lock(server_lock);
\r
5585 if (server == NULL)
\r
5588 Unlock(server_lock);
\r
5593 SiReleaseServer(server);
\r
5596 Unlock(server_lock);
\r
5602 void SiSetServerType(SERVER *s, UINT type,
\r
5603 UINT ip, UINT num_port, UINT *ports,
\r
5604 char *controller_name, UINT controller_port, UCHAR *password, UINT weight, bool controller_only)
\r
5612 if (type == SERVER_TYPE_FARM_MEMBER &&
\r
5613 (num_port == 0 || ports == NULL || controller_name == NULL ||
\r
5614 controller_port == 0 || password == NULL || num_port > MAX_PUBLIC_PORT_NUM))
\r
5620 weight = FARM_DEFAULT_WEIGHT;
\r
5623 bridge = s->Cedar->Bridge;
\r
5628 s->UpdatedServerType = type;
\r
5630 s->Weight = weight;
\r
5633 if (type == SERVER_TYPE_FARM_MEMBER)
\r
5635 StrCpy(s->ControllerName, sizeof(s->ControllerName), controller_name);
\r
5636 s->ControllerPort = controller_port;
\r
5637 if (IsZero(password, SHA1_SIZE) == false)
\r
5639 Copy(s->MemberPassword, password, SHA1_SIZE);
\r
5642 s->NumPublicPort = num_port;
\r
5643 if (s->PublicPorts != NULL)
\r
5645 Free(s->PublicPorts);
\r
5647 s->PublicPorts = ZeroMalloc(num_port * sizeof(UINT));
\r
5648 Copy(s->PublicPorts, ports, num_port * sizeof(UINT));
\r
5651 if (type == SERVER_TYPE_FARM_CONTROLLER)
\r
5653 s->ControllerOnly = controller_only;
\r
5659 SiRebootServer(bridge);
\r
5663 void SiRebootServerThread(THREAD *thread, void *param)
\r
5666 if (thread == NULL)
\r
5671 if (server == NULL)
\r
5680 StStartServer((bool)param);
\r
5684 void SiRebootServer(bool bridge)
\r
5686 SiRebootServerEx(bridge, false);
\r
5688 void SiRebootServerEx(bool bridge, bool reset_setting)
\r
5692 server_reset_setting = reset_setting;
\r
5694 t = NewThread(SiRebootServerThread, (void *)bridge);
\r
5699 void SiStopAllListener(SERVER *s)
\r
5707 SiLockListenerList(s);
\r
5710 LIST *o = NewListFast(NULL);
\r
5711 for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
\r
5713 SERVER_LISTENER *e = LIST_DATA(s->ServerListenerList, i);
\r
5717 for (i = 0;i < LIST_NUM(o);i++)
\r
5719 SERVER_LISTENER *e = LIST_DATA(o, i);
\r
5720 SiDeleteListener(s, e->Port);
\r
5725 SiUnlockListenerList(s);
\r
5727 ReleaseList(s->ServerListenerList);
\r
5731 void SiCleanupServer(SERVER *s)
\r
5735 LISTENER **listener_list;
\r
5736 UINT num_listener;
\r
5745 SiFreeDeadLockCheck(s);
\r
5747 FreeServerSnapshot(s);
\r
5751 if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
\r
5753 // ファームメンバの場合、ファームコントローラへの接続を停止
\r
5754 SLog(c, "LS_STOP_FARM_MEMBER");
\r
5755 SiStopConnectToController(s->FarmController);
\r
5756 s->FarmController = NULL;
\r
5757 SLog(c, "LS_STOP_FARM_MEMBER_2");
\r
5760 IncrementServerConfigRevision(s);
\r
5762 SLog(c, "LS_END_2");
\r
5764 SLog(c, "LS_STOP_ALL_LISTENER");
\r
5766 LockList(c->ListenerList);
\r
5768 listener_list = ToArray(c->ListenerList);
\r
5769 num_listener = LIST_NUM(c->ListenerList);
\r
5770 for (i = 0;i < num_listener;i++)
\r
5772 AddRef(listener_list[i]->ref);
\r
5775 UnlockList(c->ListenerList);
\r
5777 for (i = 0;i < num_listener;i++)
\r
5779 StopListener(listener_list[i]);
\r
5780 ReleaseListener(listener_list[i]);
\r
5782 Free(listener_list);
\r
5783 SLog(c, "LS_STOP_ALL_LISTENER_2");
\r
5785 SLog(c, "LS_STOP_ALL_HUB");
\r
5787 LockList(c->HubList);
\r
5789 hub_list = ToArray(c->HubList);
\r
5790 num_hub = LIST_NUM(c->HubList);
\r
5791 for (i = 0;i < num_hub;i++)
\r
5793 AddRef(hub_list[i]->ref);
\r
5796 UnlockList(c->HubList);
\r
5798 for (i = 0;i < num_hub;i++)
\r
5800 StopHub(hub_list[i]);
\r
5801 ReleaseHub(hub_list[i]);
\r
5804 SLog(c, "LS_STOP_ALL_HUB_2");
\r
5807 SiFreeConfiguration(s);
\r
5810 SLog(c, "LS_STOP_CEDAR");
\r
5811 StopCedar(s->Cedar);
\r
5812 SLog(c, "LS_STOP_CEDAR_2");
\r
5815 SiStopAllListener(s);
\r
5817 if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
5822 SLog(c, "LS_STOP_FARM_CONTROL");
\r
5825 SiStopFarmControl(s);
\r
5828 ReleaseList(s->FarmMemberList);
\r
5829 s->FarmMemberList = NULL;
\r
5831 for (i = 0;i < LIST_NUM(s->Me->HubList);i++)
\r
5833 Free(LIST_DATA(s->Me->HubList, i));
\r
5835 ReleaseList(s->Me->HubList);
\r
5839 SLog(c, "LS_STOP_FARM_CONTROL_2");
\r
5842 if (s->PublicPorts != NULL)
\r
5844 Free(s->PublicPorts);
\r
5847 SLog(s->Cedar, "LS_END_1");
\r
5848 SLog(s->Cedar, "L_LINE");
\r
5850 ReleaseCedar(s->Cedar);
\r
5851 DeleteLock(s->lock);
\r
5852 DeleteLock(s->SaveCfgLock);
\r
5854 StopKeep(s->Keep);
\r
5856 FreeEraser(s->Eraser);
\r
5859 if (s->LicenseSystem != NULL)
\r
5861 LiFreeLicenseSystem(s->LicenseSystem);
\r
5864 FreeLog(s->Logger);
\r
5866 FreeServerCapsCache(s);
\r
5868 SiFreeHubCreateHistory(s);
\r
5871 FreeTinyLog(s->DebugLog);
\r
5873 DeleteLock(s->TasksFromFarmControllerLock);
\r
5879 void SiReleaseServer(SERVER *s)
\r
5887 if (Release(s->ref) == 0)
\r
5889 SiCleanupServer(s);
\r
5893 // 次に処理をさせるファームメンバーを指定する
\r
5894 FARM_MEMBER *SiGetNextFarmMember(SERVER *s)
\r
5897 UINT min_point = 0;
\r
5898 FARM_MEMBER *ret = NULL;
\r
5900 if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
5905 num = LIST_NUM(s->FarmMemberList);
\r
5911 for (i = 0;i < num;i++)
\r
5913 UINT num_sessions;
\r
5914 UINT max_sessions;
\r
5915 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
5916 if (s->ControllerOnly)
\r
5920 // ControllerOnly のとき自分自身は選定しない
\r
5925 if (f->Me == false)
\r
5927 num_sessions = f->NumSessions;
\r
5928 max_sessions = f->MaxSessions;
\r
5932 num_sessions = Count(s->Cedar->CurrentSessions);
\r
5933 max_sessions = GetServerCapsInt(s, "i_max_sessions");
\r
5936 if (max_sessions == 0)
\r
5938 max_sessions = GetServerCapsInt(s, "i_max_sessions");
\r
5941 if (num_sessions < max_sessions)
\r
5943 if (f->Point >= min_point)
\r
5945 min_point = f->Point;
\r
5955 void SiCalledEnumHub(SERVER *s, PACK *p, PACK *req)
\r
5959 LICENSE_STATUS st;
\r
5962 if (s == NULL || p == NULL || req == NULL)
\r
5967 LiParseCurrentLicenseStatus(s->LicenseSystem, &st);
\r
5971 LockList(c->HubList);
\r
5973 UINT num = LIST_NUM(c->HubList);
\r
5974 for (i = 0;i < num;i++)
\r
5976 HUB *h = LIST_DATA(c->HubList, i);
\r
5979 PackAddStrEx(p, "HubName", h->Name, i, num);
\r
5980 PackAddIntEx(p, "HubType", h->Type, i, num);
\r
5981 PackAddIntEx(p, "NumSession", Count(h->NumSessions), i, num);
\r
5983 PackAddIntEx(p, "NumSessions", LIST_NUM(h->SessionList), i, num);
\r
5984 PackAddIntEx(p, "NumSessionsClient", Count(h->NumSessionsClient), i, num);
\r
5985 PackAddIntEx(p, "NumSessionsBridge", Count(h->NumSessionsBridge), i, num);
\r
5987 PackAddIntEx(p, "NumMacTables", LIST_NUM(h->MacTable), i, num);
\r
5989 PackAddIntEx(p, "NumIpTables", LIST_NUM(h->IpTable), i, num);
\r
5991 PackAddInt64Ex(p, "LastCommTime", h->LastCommTime, i, num);
\r
5992 PackAddInt64Ex(p, "CreatedTime", h->CreatedTime, i, num);
\r
5997 UnlockList(c->HubList);
\r
5999 PackAddInt(p, "Point", SiGetPoint(s));
\r
6000 PackAddInt(p, "NumTcpConnections", Count(s->Cedar->CurrentTcpConnections));
\r
6001 PackAddInt(p, "NumTotalSessions", Count(s->Cedar->CurrentSessions));
\r
6002 PackAddInt(p, "MaxSessions", GetServerCapsInt(s, "i_max_sessions"));
\r
6004 PackAddInt(p, "AssignedClientLicense", Count(s->Cedar->AssignedClientLicense));
\r
6005 PackAddInt(p, "AssignedBridgeLicense", Count(s->Cedar->AssignedBridgeLicense));
\r
6007 PackAddData(p, "RandomKey", s->MyRandomKey, SHA1_SIZE);
\r
6008 PackAddInt64(p, "SystemId", st.SystemId);
\r
6010 Lock(c->TrafficLock);
\r
6012 OutRpcTraffic(p, c->Traffic);
\r
6014 Unlock(c->TrafficLock);
\r
6016 LockList(c->TrafficDiffList);
\r
6018 UINT num = LIST_NUM(c->TrafficDiffList);
\r
6021 for (i = 0;i < num;i++)
\r
6023 TRAFFIC_DIFF *d = LIST_DATA(c->TrafficDiffList, i);
\r
6025 PackAddIntEx(p, "TdType", d->Type, i, num);
\r
6026 PackAddStrEx(p, "TdHubName", d->HubName, i, num);
\r
6027 PackAddStrEx(p, "TdName", d->Name, i, num);
\r
6029 OutRpcTrafficEx(&d->Traffic, p, i, num);
\r
6036 DeleteAll(c->TrafficDiffList);
\r
6038 UnlockList(c->TrafficDiffList);
\r
6042 void SiCalledDeleteHub(SERVER *s, PACK *p)
\r
6044 char name[MAX_SIZE];
\r
6047 if (s == NULL || p == NULL)
\r
6052 if (PackGetStr(p, "HubName", name, sizeof(name)) == false)
\r
6057 LockHubList(s->Cedar);
\r
6059 h = GetHub(s->Cedar, name);
\r
6062 UnlockHubList(s->Cedar);
\r
6065 UnlockHubList(s->Cedar);
\r
6069 LockHubList(s->Cedar);
\r
6071 DelHubEx(s->Cedar, h, true);
\r
6073 UnlockHubList(s->Cedar);
\r
6079 void SiCalledUpdateHub(SERVER *s, PACK *p)
\r
6081 char name[MAX_SIZE];
\r
6085 bool save_packet_log;
\r
6086 UINT packet_log_switch_type;
\r
6087 UINT packet_log_config[NUM_PACKET_LOG];
\r
6088 bool save_security_log;
\r
6089 bool type_changed = false;
\r
6090 UINT security_log_switch_type;
\r
6094 if (s == NULL || p == NULL)
\r
6099 PackGetStr(p, "HubName", name, sizeof(name));
\r
6100 type = PackGetInt(p, "HubType");
\r
6101 Zero(&o, sizeof(o));
\r
6102 o.MaxSession = PackGetInt(p, "MaxSession");
\r
6103 o.NoArpPolling = PackGetBool(p, "NoArpPolling");
\r
6104 o.NoIPv6AddrPolling = PackGetBool(p, "NoIPv6AddrPolling");
\r
6105 o.FilterPPPoE = PackGetBool(p, "FilterPPPoE");
\r
6106 o.YieldAfterStorePacket = PackGetBool(p, "YieldAfterStorePacket");
\r
6107 o.NoSpinLockForPacketDelay = PackGetBool(p, "NoSpinLockForPacketDelay");
\r
6108 o.BroadcastStormDetectionThreshold = PackGetInt(p, "BroadcastStormDetectionThreshold");
\r
6109 o.ClientMinimumRequiredBuild = PackGetInt(p, "ClientMinimumRequiredBuild");
\r
6110 o.FixForDLinkBPDU = PackGetBool(p, "FixForDLinkBPDU");
\r
6111 o.NoLookBPDUBridgeId = PackGetBool(p, "NoLookBPDUBridgeId");
\r
6112 o.NoManageVlanId = PackGetBool(p, "NoManageVlanId");
\r
6113 o.VlanTypeId = PackGetInt(p, "VlanTypeId");
\r
6114 if (o.VlanTypeId == 0)
\r
6116 o.VlanTypeId = MAC_PROTO_TAGVLAN;
\r
6118 o.FilterOSPF = PackGetBool(p, "FilterOSPF");
\r
6119 o.FilterIPv4 = PackGetBool(p, "FilterIPv4");
\r
6120 o.FilterIPv6 = PackGetBool(p, "FilterIPv6");
\r
6121 o.FilterNonIP = PackGetBool(p, "FilterNonIP");
\r
6122 o.NoIPv4PacketLog = PackGetBool(p, "NoIPv4PacketLog");
\r
6123 o.NoIPv6PacketLog = PackGetBool(p, "NoIPv6PacketLog");
\r
6124 o.FilterBPDU = PackGetBool(p, "FilterBPDU");
\r
6125 o.NoIPv6DefaultRouterInRAWhenIPv6 = PackGetBool(p, "NoIPv6DefaultRouterInRAWhenIPv6");
\r
6126 o.NoMacAddressLog = PackGetBool(p, "NoMacAddressLog");
\r
6127 o.ManageOnlyPrivateIP = PackGetBool(p, "ManageOnlyPrivateIP");
\r
6128 o.ManageOnlyLocalUnicastIPv6 = PackGetBool(p, "ManageOnlyLocalUnicastIPv6");
\r
6129 o.DisableIPParsing = PackGetBool(p, "DisableIPParsing");
\r
6130 o.NoIpTable = PackGetBool(p, "NoIpTable");
\r
6131 o.NoEnum = PackGetBool(p, "NoEnum");
\r
6132 save_packet_log = PackGetInt(p, "SavePacketLog");
\r
6133 packet_log_switch_type = PackGetInt(p, "PacketLogSwitchType");
\r
6134 for (i = 0;i < NUM_PACKET_LOG;i++)
\r
6136 packet_log_config[i] = PackGetIntEx(p, "PacketLogConfig", i);
\r
6138 save_security_log = PackGetInt(p, "SaveSecurityLog");
\r
6139 security_log_switch_type = PackGetInt(p, "SecurityLogSwitchType");
\r
6141 Zero(&log, sizeof(log));
\r
6142 log.SavePacketLog = save_packet_log;
\r
6143 log.PacketLogSwitchType = packet_log_switch_type;
\r
6144 Copy(log.PacketLogConfig, packet_log_config, sizeof(log.PacketLogConfig));
\r
6145 log.SaveSecurityLog = save_security_log;
\r
6146 log.SecurityLogSwitchType = security_log_switch_type;
\r
6148 h = GetHub(s->Cedar, name);
\r
6154 h->FarmMember_MaxSessionClient = PackGetInt(p, "MaxSessionClient");
\r
6155 h->FarmMember_MaxSessionBridge = PackGetInt(p, "MaxSessionBridge");
\r
6156 h->FarmMember_MaxSessionClientBridgeApply = PackGetBool(p, "MaxSessionClientBridgeApply");
\r
6158 if (h->FarmMember_MaxSessionClientBridgeApply == false)
\r
6160 h->FarmMember_MaxSessionClient = INFINITE;
\r
6161 h->FarmMember_MaxSessionBridge = INFINITE;
\r
6166 Copy(h->Option, &o, sizeof(HUB_OPTION));
\r
6167 PackGetData2(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
\r
6168 PackGetData2(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
\r
6172 SetHubLogSetting(h, &log);
\r
6174 if (h->Type != type)
\r
6177 type_changed = true;
\r
6180 LockList(h->AccessList);
\r
6183 for (i = 0;i < LIST_NUM(h->AccessList);i++)
\r
6185 ACCESS *a = LIST_DATA(h->AccessList, i);
\r
6188 DeleteAll(h->AccessList);
\r
6190 UnlockList(h->AccessList);
\r
6192 for (i = 0;i < SiNumAccessFromPack(p);i++)
\r
6194 ACCESS *a = SiPackToAccess(p, i);
\r
6195 AddAccessList(h, a);
\r
6199 if (PackGetBool(p, "EnableSecureNAT"))
\r
6204 InVhOption(&t, p);
\r
6206 changed = Cmp(h->SecureNATOption, &t, sizeof(VH_OPTION)) == 0 ? false : true;
\r
6207 Copy(h->SecureNATOption, &t, sizeof(VH_OPTION));
\r
6209 EnableSecureNAT(h, true);
\r
6213 Lock(h->lock_online);
\r
6215 if (h->SecureNAT != NULL)
\r
6217 SetVirtualHostOption(h->SecureNAT->Nat->Virtual, &t);
\r
6218 Debug("SiCalledUpdateHub: SecureNAT Updated.\n");
\r
6221 Unlock(h->lock_online);
\r
6226 EnableSecureNAT(h, false);
\r
6227 Debug("SiCalledUpdateHub: SecureNAT Disabled.\n");
\r
6232 // HUB の種類が変更されたのですべてのセッションを削除する
\r
6233 if (h->Offline == false)
\r
6244 bool SiCheckTicket(HUB *h, UCHAR *ticket, char *username, UINT username_size, char *usernamereal, UINT usernamereal_size, POLICY *policy, char *sessionname, UINT sessionname_size, char *groupname, UINT groupname_size)
\r
6248 if (h == NULL || ticket == NULL || username == NULL || usernamereal == NULL || policy == NULL || sessionname == NULL)
\r
6253 LockList(h->TicketList);
\r
6256 for (i = 0;i < LIST_NUM(h->TicketList);i++)
\r
6258 TICKET *t = LIST_DATA(h->TicketList, i);
\r
6259 if (Cmp(t->Ticket, ticket, SHA1_SIZE) == 0)
\r
6262 StrCpy(username, username_size, t->Username);
\r
6263 StrCpy(usernamereal, usernamereal_size, t->UsernameReal);
\r
6264 StrCpy(sessionname, sessionname_size, t->SessionName);
\r
6265 StrCpy(groupname, groupname_size, t->GroupName);
\r
6266 Copy(policy, &t->Policy, sizeof(POLICY));
\r
6267 Delete(h->TicketList, t);
\r
6273 UnlockList(h->TicketList);
\r
6279 void SiCalledDeleteMacTable(SERVER *s, PACK *p)
\r
6282 char hubname[MAX_HUBNAME_LEN + 1];
\r
6285 if (s == NULL || p == NULL)
\r
6290 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6294 key = PackGetInt(p, "Key");
\r
6296 LockHubList(s->Cedar);
\r
6298 h = GetHub(s->Cedar, hubname);
\r
6300 UnlockHubList(s->Cedar);
\r
6307 LockList(h->MacTable);
\r
6309 if (IsInList(h->MacTable, (void *)key))
\r
6311 MAC_TABLE_ENTRY *e = (MAC_TABLE_ENTRY *)key;
\r
6312 Delete(h->MacTable, e);
\r
6316 UnlockList(h->MacTable);
\r
6322 void SiCalledDeleteIpTable(SERVER *s, PACK *p)
\r
6325 char hubname[MAX_HUBNAME_LEN + 1];
\r
6328 if (s == NULL || p == NULL)
\r
6333 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6337 key = PackGetInt(p, "Key");
\r
6339 LockHubList(s->Cedar);
\r
6341 h = GetHub(s->Cedar, hubname);
\r
6343 UnlockHubList(s->Cedar);
\r
6350 LockList(h->IpTable);
\r
6352 if (IsInList(h->IpTable, (void *)key))
\r
6354 IP_TABLE_ENTRY *e = (IP_TABLE_ENTRY *)key;
\r
6355 Delete(h->IpTable, e);
\r
6359 UnlockList(h->IpTable);
\r
6365 void SiCalledDeleteSession(SERVER *s, PACK *p)
\r
6367 char name[MAX_SESSION_NAME_LEN + 1];
\r
6368 char hubname[MAX_HUBNAME_LEN + 1];
\r
6372 if (s == NULL || p == NULL)
\r
6377 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6381 if (PackGetStr(p, "SessionName", name, sizeof(name)) == false)
\r
6386 LockHubList(s->Cedar);
\r
6388 h = GetHub(s->Cedar, hubname);
\r
6390 UnlockHubList(s->Cedar);
\r
6397 sess = GetSessionByName(h, name);
\r
6401 if (sess->BridgeMode == false && sess->LinkModeServer == false && sess->SecureNATMode == false)
\r
6403 StopSession(sess);
\r
6405 ReleaseSession(sess);
\r
6412 PACK *SiCalledReadLogFile(SERVER *s, PACK *p)
\r
6414 RPC_READ_LOG_FILE t;
\r
6416 char filepath[MAX_PATH];
\r
6419 if (s == NULL || p == NULL)
\r
6424 PackGetStr(p, "FilePath", filepath, sizeof(filepath));
\r
6425 offset = PackGetInt(p, "Offset");
\r
6427 Zero(&t, sizeof(t));
\r
6429 SiReadLocalLogFile(s, filepath, offset, &t);
\r
6433 OutRpcReadLogFile(ret, &t);
\r
6434 FreeRpcReadLogFile(&t);
\r
6440 PACK *SiCalledEnumLogFileList(SERVER *s, PACK *p)
\r
6442 RPC_ENUM_LOG_FILE t;
\r
6444 char hubname[MAX_HUBNAME_LEN + 1];
\r
6446 if (s == NULL || p == NULL)
\r
6451 PackGetStr(p, "HubName", hubname, sizeof(hubname));
\r
6453 Zero(&t, sizeof(t));
\r
6455 SiEnumLocalLogFileList(s, hubname, &t);
\r
6459 OutRpcEnumLogFile(ret, &t);
\r
6460 FreeRpcEnumLogFile(&t);
\r
6466 PACK *SiCalledGetSessionStatus(SERVER *s, PACK *p)
\r
6468 RPC_SESSION_STATUS t;
\r
6472 if (s == NULL || p == NULL)
\r
6477 Zero(&t, sizeof(t));
\r
6478 InRpcSessionStatus(&t, p);
\r
6480 Zero(&a, sizeof(a));
\r
6482 a.ServerAdmin = true;
\r
6484 if (StGetSessionStatus(&a, &t) != ERR_NO_ERROR)
\r
6486 FreeRpcSessionStatus(&t);
\r
6492 OutRpcSessionStatus(ret, &t);
\r
6494 FreeRpcSessionStatus(&t);
\r
6500 PACK *SiCalledEnumIpTable(SERVER *s, PACK *p)
\r
6502 char hubname[MAX_HUBNAME_LEN + 1];
\r
6503 RPC_ENUM_IP_TABLE t;
\r
6506 if (s == NULL || p == NULL)
\r
6510 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6514 Zero(&t, sizeof(t));
\r
6516 SiEnumIpTable(s, hubname, &t);
\r
6519 OutRpcEnumIpTable(ret, &t);
\r
6520 FreeRpcEnumIpTable(&t);
\r
6526 PACK *SiCalledEnumMacTable(SERVER *s, PACK *p)
\r
6528 char hubname[MAX_HUBNAME_LEN + 1];
\r
6529 RPC_ENUM_MAC_TABLE t;
\r
6532 if (s == NULL || p == NULL)
\r
6536 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6540 Zero(&t, sizeof(t));
\r
6542 SiEnumMacTable(s, hubname, &t);
\r
6545 OutRpcEnumMacTable(ret, &t);
\r
6546 FreeRpcEnumMacTable(&t);
\r
6552 PACK *SiCalledGetNatStatus(SERVER *s, PACK *p)
\r
6554 char hubname[MAX_HUBNAME_LEN + 1];
\r
6559 if (s == NULL || p == NULL)
\r
6563 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6567 Zero(&t, sizeof(t));
\r
6569 LockHubList(s->Cedar);
\r
6571 h = GetHub(s->Cedar, hubname);
\r
6573 UnlockHubList(s->Cedar);
\r
6577 Lock(h->lock_online);
\r
6579 if (h->SecureNAT != NULL)
\r
6581 NtGetStatus(h->SecureNAT->Nat, &t);
\r
6584 Unlock(h->lock_online);
\r
6590 OutRpcNatStatus(ret, &t);
\r
6591 FreeRpcNatStatus(&t);
\r
6597 PACK *SiCalledEnumDhcp(SERVER *s, PACK *p)
\r
6599 char hubname[MAX_HUBNAME_LEN + 1];
\r
6604 if (s == NULL || p == NULL)
\r
6608 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6612 Zero(&t, sizeof(t));
\r
6614 LockHubList(s->Cedar);
\r
6616 h = GetHub(s->Cedar, hubname);
\r
6618 UnlockHubList(s->Cedar);
\r
6622 Lock(h->lock_online);
\r
6624 if (h->SecureNAT != NULL)
\r
6626 NtEnumDhcpList(h->SecureNAT->Nat, &t);
\r
6629 Unlock(h->lock_online);
\r
6635 OutRpcEnumDhcp(ret, &t);
\r
6636 FreeRpcEnumDhcp(&t);
\r
6642 PACK *SiCalledEnumNat(SERVER *s, PACK *p)
\r
6644 char hubname[MAX_HUBNAME_LEN + 1];
\r
6649 if (s == NULL || p == NULL)
\r
6653 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6657 Zero(&t, sizeof(t));
\r
6659 LockHubList(s->Cedar);
\r
6661 h = GetHub(s->Cedar, hubname);
\r
6663 UnlockHubList(s->Cedar);
\r
6667 Lock(h->lock_online);
\r
6669 if (h->SecureNAT != NULL)
\r
6671 NtEnumNatList(h->SecureNAT->Nat, &t);
\r
6674 Unlock(h->lock_online);
\r
6680 OutRpcEnumNat(ret, &t);
\r
6681 FreeRpcEnumNat(&t);
\r
6687 PACK *SiCalledEnumSession(SERVER *s, PACK *p)
\r
6689 char hubname[MAX_HUBNAME_LEN + 1];
\r
6690 RPC_ENUM_SESSION t;
\r
6693 if (s == NULL || p == NULL)
\r
6697 if (PackGetStr(p, "HubName", hubname, sizeof(hubname)) == false)
\r
6701 Zero(&t, sizeof(t));
\r
6703 SiEnumLocalSession(s, hubname, &t);
\r
6706 OutRpcEnumSession(ret, &t);
\r
6707 FreeRpcEnumSession(&t);
\r
6713 PACK *SiCalledCreateTicket(SERVER *s, PACK *p)
\r
6715 char username[MAX_SIZE];
\r
6716 char hubname[MAX_SIZE];
\r
6717 char groupname[MAX_SIZE];
\r
6718 char realusername[MAX_SIZE];
\r
6719 char sessionname[MAX_SESSION_NAME_LEN + 1];
\r
6721 UCHAR ticket[SHA1_SIZE];
\r
6722 char ticket_str[MAX_SIZE];
\r
6728 if (s == NULL || p == NULL)
\r
6733 PackGetStr(p, "UserName", username, sizeof(username));
\r
6734 PackGetStr(p, "GroupName", groupname, sizeof(groupname));
\r
6735 PackGetStr(p, "HubName", hubname, sizeof(hubname));
\r
6736 PackGetStr(p, "RealUserName", realusername, sizeof(realusername));
\r
6737 PackGetStr(p, "SessionName", sessionname, sizeof(sessionname));
\r
6739 InRpcPolicy(&policy, p);
\r
6740 if (PackGetDataSize(p, "Ticket") == SHA1_SIZE)
\r
6742 PackGetData(p, "Ticket", ticket);
\r
6745 BinToStr(ticket_str, sizeof(ticket_str), ticket, SHA1_SIZE);
\r
6747 SLog(s->Cedar, "LS_TICKET_2", hubname, username, realusername, sessionname,
\r
6748 ticket_str, TICKET_EXPIRES / 1000);
\r
6751 h = GetHub(s->Cedar, hubname);
\r
6757 LockList(h->TicketList);
\r
6759 LIST *o = NewListFast(NULL);
\r
6761 for (i = 0;i < LIST_NUM(h->TicketList);i++)
\r
6763 TICKET *t = LIST_DATA(h->TicketList, i);
\r
6764 if ((t->CreatedTick + TICKET_EXPIRES) < Tick64())
\r
6769 for (i = 0;i < LIST_NUM(o);i++)
\r
6771 TICKET *t = LIST_DATA(o, i);
\r
6772 Delete(h->TicketList, t);
\r
6778 t = ZeroMalloc(sizeof(TICKET));
\r
6779 t->CreatedTick = Tick64();
\r
6780 Copy(&t->Policy, &policy, sizeof(POLICY));
\r
6781 Copy(t->Ticket, ticket, SHA1_SIZE);
\r
6782 StrCpy(t->Username, sizeof(t->Username), username);
\r
6783 StrCpy(t->UsernameReal, sizeof(t->UsernameReal), realusername);
\r
6784 StrCpy(t->GroupName, sizeof(t->GroupName), groupname);
\r
6785 StrCpy(t->SessionName, sizeof(t->SessionName), sessionname);
\r
6787 Add(h->TicketList, t);
\r
6789 UnlockList(h->TicketList);
\r
6795 PackAddInt(ret, "Point", SiGetPoint(s));
\r
6801 void SiCalledCreateHub(SERVER *s, PACK *p)
\r
6803 char name[MAX_SIZE];
\r
6807 bool save_packet_log;
\r
6808 UINT packet_log_switch_type;
\r
6809 UINT packet_log_config[NUM_PACKET_LOG];
\r
6810 bool save_security_log;
\r
6811 UINT security_log_switch_type;
\r
6815 if (s == NULL || p == NULL)
\r
6820 PackGetStr(p, "HubName", name, sizeof(name));
\r
6821 type = PackGetInt(p, "HubType");
\r
6822 Zero(&o, sizeof(o));
\r
6823 o.MaxSession = PackGetInt(p, "MaxSession");
\r
6824 save_packet_log = PackGetInt(p, "SavePacketLog");
\r
6825 packet_log_switch_type = PackGetInt(p, "PacketLogSwitchType");
\r
6826 for (i = 0;i < NUM_PACKET_LOG;i++)
\r
6828 packet_log_config[i] = PackGetIntEx(p, "PacketLogConfig", i);
\r
6830 save_security_log = PackGetInt(p, "SaveSecurityLog");
\r
6831 security_log_switch_type = PackGetInt(p, "SecurityLogSwitchType");
\r
6833 Zero(&log, sizeof(log));
\r
6834 log.SavePacketLog = save_packet_log;
\r
6835 log.PacketLogSwitchType = packet_log_switch_type;
\r
6836 Copy(log.PacketLogConfig, packet_log_config, sizeof(log.PacketLogConfig));
\r
6837 log.SaveSecurityLog = save_security_log;
\r
6838 log.SecurityLogSwitchType = security_log_switch_type;
\r
6840 h = NewHub(s->Cedar, name, &o);
\r
6841 h->LastCommTime = h->LastLoginTime = h->CreatedTime = 0;
\r
6842 SetHubLogSetting(h, &log);
\r
6844 h->FarmMember_MaxSessionClient = PackGetInt(p, "MaxSessionClient");
\r
6845 h->FarmMember_MaxSessionBridge = PackGetInt(p, "MaxSessionBridge");
\r
6846 h->FarmMember_MaxSessionClientBridgeApply = PackGetBool(p, "MaxSessionClientBridgeApply");
\r
6848 if (h->FarmMember_MaxSessionClientBridgeApply == false)
\r
6850 h->FarmMember_MaxSessionClient = INFINITE;
\r
6851 h->FarmMember_MaxSessionBridge = INFINITE;
\r
6854 PackGetData2(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
\r
6855 PackGetData2(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
\r
6857 for (i = 0;i < SiNumAccessFromPack(p);i++)
\r
6859 ACCESS *a = SiPackToAccess(p, i);
\r
6860 AddAccessList(h, a);
\r
6864 if (PackGetBool(p, "EnableSecureNAT"))
\r
6868 InVhOption(&t, p);
\r
6870 Copy(h->SecureNATOption, &t, sizeof(VH_OPTION));
\r
6871 EnableSecureNAT(h, true);
\r
6873 Debug("SiCalledCreateHub: SecureNAT Created.\n");
\r
6876 AddHub(s->Cedar, h);
\r
6877 h->Offline = true;
\r
6884 void SiFarmControlThread(THREAD *thread, void *param)
\r
6891 char tmp[MAX_PATH];
\r
6893 if (thread == NULL || param == NULL)
\r
6898 s = (SERVER *)param;
\r
6900 e = s->FarmControlThreadHaltEvent;
\r
6904 Lock(c->CedarSuperLock);
\r
6906 // 各ファームメンバーがホストしている HUB 一覧を列挙する
\r
6907 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6908 SiDebugLog(s, tmp);
\r
6910 LockList(s->FarmMemberList);
\r
6914 UINT assigned_client_license = 0;
\r
6915 UINT assigned_bridge_license = 0;
\r
6917 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6918 SiDebugLog(s, tmp);
\r
6922 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
6924 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
6925 SiCallEnumHub(s, f);
\r
6926 // サーバーファーム全体での合計セッション数を取得する
\r
6927 num += f->NumSessions;
\r
6929 assigned_client_license += f->AssignedClientLicense;
\r
6930 assigned_bridge_license += f->AssignedBridgeLicense;
\r
6933 s->CurrentTotalNumSessionsOnFarm = num;
\r
6935 // 割り当て済みライセンス数を更新する
\r
6936 s->CurrentAssignedBridgeLicense = assigned_bridge_license;
\r
6937 s->CurrentAssignedClientLicense = assigned_client_license;
\r
6939 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6940 SiDebugLog(s, tmp);
\r
6942 UnlockList(s->FarmMemberList);
\r
6944 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6945 SiDebugLog(s, tmp);
\r
6947 o = NewListFast(NULL);
\r
6949 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6950 SiDebugLog(s, tmp);
\r
6952 // 各 HUB に対して更新通知を発する
\r
6953 LockList(c->HubList);
\r
6956 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
6958 HUB *h = LIST_DATA(c->HubList, i);
\r
6963 UnlockList(c->HubList);
\r
6965 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6966 SiDebugLog(s, tmp);
\r
6968 for (i = 0;i < LIST_NUM(o);i++)
\r
6970 HUB *h = LIST_DATA(o, i);
\r
6971 SiHubUpdateProc(h);
\r
6975 Format(tmp, sizeof(tmp), "CONTROLLER: %s %u", __FILE__, __LINE__);
\r
6976 SiDebugLog(s, tmp);
\r
6980 Unlock(c->CedarSuperLock);
\r
6982 Wait(e, SERVER_FARM_CONTROL_INTERVAL);
\r
6991 void SiStartFarmControl(SERVER *s)
\r
6994 if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
6999 s->FarmControlThreadHaltEvent = NewEvent();
\r
7000 s->FarmControlThread = NewThread(SiFarmControlThread, s);
\r
7004 void SiStopFarmControl(SERVER *s)
\r
7007 if (s == NULL || s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
7012 Set(s->FarmControlThreadHaltEvent);
\r
7013 WaitThread(s->FarmControlThread, INFINITE);
\r
7014 ReleaseEvent(s->FarmControlThreadHaltEvent);
\r
7015 ReleaseThread(s->FarmControlThread);
\r
7019 void SiCallEnumHub(SERVER *s, FARM_MEMBER *f)
\r
7023 if (s == NULL || f == NULL)
\r
7032 LICENSE_STATUS st;
\r
7034 LiParseCurrentLicenseStatus(s->LicenseSystem, &st);
\r
7036 // ローカルの HUB を列挙する
\r
7037 LockList(f->HubList);
\r
7039 // ローカル HUB の場合、まず STATIC HUB リストを一旦
\r
7040 // すべて消去して再列挙を行うようにする
\r
7042 LIST *o = NewListFast(NULL);
\r
7043 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
7045 HUB_LIST *h = LIST_DATA(f->HubList, i);
\r
7046 if (h->DynamicHub == false)
\r
7052 // STATIC HUB をすべて消去
\r
7053 for (i = 0;i < LIST_NUM(o);i++)
\r
7055 HUB_LIST *h = LIST_DATA(o, i);
\r
7057 Delete(f->HubList, h);
\r
7061 // 次に DYNAMIC HUB でユーザーが 1 人もいないものを停止する
\r
7062 o = NewListFast(NULL);
\r
7063 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
7065 HUB_LIST *h = LIST_DATA(f->HubList, i);
\r
7066 if (h->DynamicHub == true)
\r
7068 LockList(c->HubList);
\r
7070 HUB *hub = GetHub(s->Cedar, h->Name);
\r
7073 if (Count(hub->NumSessions) == 0 || hub->Type != HUB_TYPE_FARM_DYNAMIC)
\r
7080 UnlockList(c->HubList);
\r
7084 for (i = 0;i < LIST_NUM(o);i++)
\r
7086 HUB_LIST *h = LIST_DATA(o, i);
\r
7087 Debug("Delete HUB: %s\n", h->Name);
\r
7089 Delete(f->HubList, h);
\r
7095 LockList(c->HubList);
\r
7097 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
7099 HUB *h = LIST_DATA(c->HubList, i);
\r
7100 if (h->Offline == false)
\r
7102 if (h->Type == HUB_TYPE_FARM_STATIC)
\r
7104 HUB_LIST *hh = ZeroMalloc(sizeof(HUB_LIST));
\r
7105 hh->FarmMember = f;
\r
7106 hh->DynamicHub = false;
\r
7107 StrCpy(hh->Name, sizeof(hh->Name), h->Name);
\r
7108 Add(f->HubList, hh);
\r
7110 LockList(h->SessionList);
\r
7112 hh->NumSessions = LIST_NUM(h->SessionList);
\r
7113 hh->NumSessionsBridge = Count(h->NumSessionsBridge);
\r
7114 hh->NumSessionsClient = Count(h->NumSessionsClient);
\r
7116 UnlockList(h->SessionList);
\r
7118 LockList(h->MacTable);
\r
7120 hh->NumMacTables = LIST_NUM(h->MacTable);
\r
7122 UnlockList(h->MacTable);
\r
7124 LockList(h->IpTable);
\r
7126 hh->NumIpTables = LIST_NUM(h->IpTable);
\r
7128 UnlockList(h->IpTable);
\r
7133 UnlockList(c->HubList);
\r
7135 UnlockList(f->HubList);
\r
7138 f->Point = SiGetPoint(s);
\r
7139 f->NumSessions = Count(s->Cedar->CurrentSessions);
\r
7140 f->MaxSessions = GetServerCapsInt(s, "i_max_sessions");
\r
7141 f->NumTcpConnections = Count(s->Cedar->CurrentTcpConnections);
\r
7143 Lock(s->Cedar->TrafficLock);
\r
7145 Copy(&f->Traffic, s->Cedar->Traffic, sizeof(TRAFFIC));
\r
7147 Unlock(s->Cedar->TrafficLock);
\r
7149 f->AssignedBridgeLicense = Count(s->Cedar->AssignedBridgeLicense);
\r
7150 f->AssignedClientLicense = Count(s->Cedar->AssignedClientLicense);
\r
7152 Copy(f->RandomKey, s->MyRandomKey, SHA1_SIZE);
\r
7153 f->SystemId = st.SystemId;
\r
7155 Debug("Server %s: Point %u\n", f->hostname, f->Point);
\r
7159 // リモートのメンバの HUB を列挙する
\r
7160 PACK *p = NewPack();
\r
7162 LIST *o = NewListFast(NULL);
\r
7166 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
7168 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
7170 if (IsZero(f->RandomKey, SHA1_SIZE) == false && f->SystemId != 0)
\r
7178 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
7180 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
7182 if (IsZero(f->RandomKey, SHA1_SIZE) == false && f->SystemId != 0)
\r
7184 PackAddDataEx(p, "MemberRandomKey", f->RandomKey, SHA1_SIZE, j, num);
\r
7185 PackAddInt64Ex(p, "MemberSystemId", f->SystemId, j, num);
\r
7189 PackAddInt(p, "MemberSystemIdNum", num);
\r
7191 p = SiCallTask(f, p, "enumhub");
\r
7194 LockList(f->HubList);
\r
7198 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
7200 HUB_LIST *hh = LIST_DATA(f->HubList, i);
\r
7203 DeleteAll(f->HubList);
\r
7205 for (i = 0;i < PackGetIndexCount(p, "HubName");i++)
\r
7207 HUB_LIST *hh = ZeroMalloc(sizeof(HUB_LIST));
\r
7209 UINT64 LastCommTime;
\r
7211 PackGetStrEx(p, "HubName", hh->Name, sizeof(hh->Name), i);
\r
7212 num = PackGetIntEx(p, "NumSession", i);
\r
7213 hh->DynamicHub = ((PackGetIntEx(p, "HubType", i) == HUB_TYPE_FARM_DYNAMIC) ? true : false);
\r
7214 hh->FarmMember = f;
\r
7215 hh->NumSessions = PackGetIntEx(p, "NumSessions", i);
\r
7216 hh->NumSessionsClient = PackGetIntEx(p, "NumSessionsClient", i);
\r
7217 hh->NumSessionsBridge = PackGetIntEx(p, "NumSessionsBridge", i);
\r
7218 hh->NumIpTables = PackGetIntEx(p, "NumIpTables", i);
\r
7219 hh->NumMacTables = PackGetIntEx(p, "NumMacTables", i);
\r
7220 LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
\r
7221 Add(f->HubList, hh);
\r
7222 Debug("%s\n", hh->Name);
\r
7224 LockList(c->HubList);
\r
7226 HUB *h = GetHub(c, hh->Name);
\r
7230 // 仮想 HUB の LastCommTime を更新する
\r
7233 if (h->LastCommTime < LastCommTime)
\r
7235 h->LastCommTime = LastCommTime;
\r
7243 UnlockList(c->HubList);
\r
7245 if (hh->DynamicHub && num >= 1)
\r
7247 // すでにユーザーセッションが 1 以上接続されているので
\r
7248 // 仮想 HUB 作成履歴リストに登録しておく必要はない
\r
7249 // 仮想 HUB 作成履歴リストから削除する
\r
7250 SiDelHubCreateHistory(s, hh->Name);
\r
7253 if (hh->DynamicHub && num == 0)
\r
7255 // 仮想 HUB 作成履歴リストを確認する
\r
7256 // 直近 60 秒以内に作成され、まだ 1 人目のユーザーが接続
\r
7257 // していない仮想 HUB の場合は、ユーザーが 1 人もいないという
\r
7259 if (SiIsHubRegistedOnCreateHistory(s, hh->Name) == false)
\r
7261 // ダイナミック HUB でユーザーが 1 人もいないので停止する
\r
7263 LockList(c->HubList);
\r
7265 h = GetHub(c, hh->Name);
\r
7267 UnlockList(c->HubList);
\r
7277 UnlockList(f->HubList);
\r
7278 f->Point = PackGetInt(p, "Point");
\r
7279 Debug("Server %s: Point %u\n", f->hostname, f->Point);
\r
7280 f->NumSessions = PackGetInt(p, "NumTotalSessions");
\r
7281 if (f->NumSessions == 0)
\r
7283 f->NumSessions = PackGetInt(p, "NumSessions");
\r
7285 f->MaxSessions = PackGetInt(p, "MaxSessions");
\r
7286 f->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
\r
7287 InRpcTraffic(&f->Traffic, p);
\r
7289 f->AssignedBridgeLicense = PackGetInt(p, "AssignedBridgeLicense");
\r
7290 f->AssignedClientLicense = PackGetInt(p, "AssignedClientLicense");
\r
7292 if (PackGetDataSize(p, "RandomKey") == SHA1_SIZE)
\r
7294 PackGetData(p, "RandomKey", f->RandomKey);
\r
7297 f->SystemId = PackGetInt64(p, "SystemId");
\r
7299 // トラフィック差分情報を適用する
\r
7300 num = PackGetIndexCount(p, "TdType");
\r
7301 for (i = 0;i < num;i++)
\r
7306 char name[MAX_SIZE];
\r
7307 char hubname[MAX_SIZE];
\r
7309 type = PackGetIntEx(p, "TdType", i);
\r
7310 PackGetStrEx(p, "TdName", name, sizeof(name), i);
\r
7311 PackGetStrEx(p, "TdHubName", hubname, sizeof(hubname), i);
\r
7312 InRpcTrafficEx(&traffic, p, i);
\r
7314 LockList(c->HubList);
\r
7316 h = GetHub(c, hubname);
\r
7319 if (type == TRAFFIC_DIFF_HUB)
\r
7321 Lock(h->TrafficLock);
\r
7323 AddTraffic(h->Traffic, &traffic);
\r
7325 Unlock(h->TrafficLock);
\r
7331 USER *u = AcGetUser(h, name);
\r
7336 AddTraffic(u->Traffic, &traffic);
\r
7339 if (u->Group != NULL)
\r
7341 Lock(u->Group->lock);
\r
7343 AddTraffic(u->Group->Traffic, &traffic);
\r
7345 Unlock(u->Group->lock);
\r
7354 UnlockList(c->HubList);
\r
7361 for (i = 0;i < LIST_NUM(o);i++)
\r
7363 HUB *h = LIST_DATA(o, i);
\r
7364 SiCallDeleteHub(s, f, h);
\r
7365 Debug("Delete HUB: %s\n", h->Name);
\r
7374 bool SiCallGetSessionStatus(SERVER *s, FARM_MEMBER *f, RPC_SESSION_STATUS *t)
\r
7378 if (s == NULL || f == NULL)
\r
7384 OutRpcSessionStatus(p, t);
\r
7385 FreeRpcSessionStatus(t);
\r
7386 Zero(t, sizeof(RPC_SESSION_STATUS));
\r
7388 p = SiCallTask(f, p, "getsessionstatus");
\r
7395 InRpcSessionStatus(t, p);
\r
7402 bool SiCallReadLogFile(SERVER *s, FARM_MEMBER *f, RPC_READ_LOG_FILE *t)
\r
7406 if (s == NULL || f == NULL)
\r
7412 OutRpcReadLogFile(p, t);
\r
7413 FreeRpcReadLogFile(t);
\r
7414 Zero(t, sizeof(RPC_READ_LOG_FILE));
\r
7416 p = SiCallTask(f, p, "readlogfile");
\r
7423 InRpcReadLogFile(t, p);
\r
7430 bool SiCallEnumLogFileList(SERVER *s, FARM_MEMBER *f, RPC_ENUM_LOG_FILE *t, char *hubname)
\r
7434 if (s == NULL || f == NULL)
\r
7440 OutRpcEnumLogFile(p, t);
\r
7441 FreeRpcEnumLogFile(t);
\r
7442 Zero(t, sizeof(RPC_ENUM_LOG_FILE));
\r
7444 PackAddStr(p, "HubName", hubname);
\r
7446 p = SiCallTask(f, p, "enumlogfilelist");
\r
7453 InRpcEnumLogFile(t, p);
\r
7460 void SiCallDeleteHub(SERVER *s, FARM_MEMBER *f, HUB *h)
\r
7465 if (s == NULL || f == NULL)
\r
7470 if (f->Me == false)
\r
7474 PackAddStr(p, "HubName", h->Name);
\r
7476 p = SiCallTask(f, p, "deletehub");
\r
7480 LockList(f->HubList);
\r
7482 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
7484 HUB_LIST *hh = LIST_DATA(f->HubList, i);
\r
7485 if (StrCmpi(hh->Name, h->Name) == 0)
\r
7488 Delete(f->HubList, hh);
\r
7492 UnlockList(f->HubList);
\r
7496 void SiCallUpdateHub(SERVER *s, FARM_MEMBER *f, HUB *h)
\r
7500 if (s == NULL || f == NULL)
\r
7505 if (f->Me == false)
\r
7509 SiPackAddCreateHub(p, h);
\r
7511 p = SiCallTask(f, p, "updatehub");
\r
7517 void SiCallCreateTicket(SERVER *s, FARM_MEMBER *f, char *hubname, char *username, char *realusername, POLICY *policy, UCHAR *ticket, UINT counter, char *groupname)
\r
7520 char name[MAX_SESSION_NAME_LEN + 1];
\r
7521 char hub_name_upper[MAX_SIZE];
\r
7522 char user_name_upper[MAX_USERNAME_LEN + 1];
\r
7523 char ticket_str[MAX_SIZE];
\r
7526 if (s == NULL || f == NULL || realusername == NULL || hubname == NULL || username == NULL || policy == NULL || ticket == NULL)
\r
7530 if (groupname == NULL)
\r
7536 PackAddStr(p, "HubName", hubname);
\r
7537 PackAddStr(p, "UserName", username);
\r
7538 PackAddStr(p, "groupname", groupname);
\r
7539 PackAddStr(p, "RealUserName", realusername);
\r
7540 OutRpcPolicy(p, policy);
\r
7541 PackAddData(p, "Ticket", ticket, SHA1_SIZE);
\r
7543 BinToStr(ticket_str, sizeof(ticket_str), ticket, SHA1_SIZE);
\r
7545 StrCpy(hub_name_upper, sizeof(hub_name_upper), hubname);
\r
7546 StrUpper(hub_name_upper);
\r
7547 StrCpy(user_name_upper, sizeof(user_name_upper), username);
\r
7548 StrUpper(user_name_upper);
\r
7549 Format(name, sizeof(name), "SID-%s-%u", user_name_upper,
\r
7551 PackAddStr(p, "SessionName", name);
\r
7553 p = SiCallTask(f, p, "createticket");
\r
7555 SLog(s->Cedar, "LS_TICKET_1", f->hostname, hubname, username, realusername, name, ticket_str);
\r
7557 point = PackGetInt(p, "Point");
\r
7568 void SiCallDeleteMacTable(SERVER *s, FARM_MEMBER *f, char *hubname, UINT key)
\r
7572 if (s == NULL || f == NULL || hubname == NULL)
\r
7578 PackAddStr(p, "HubName", hubname);
\r
7579 PackAddInt(p, "Key", key);
\r
7581 p = SiCallTask(f, p, "deletemactable");
\r
7587 void SiCallDeleteIpTable(SERVER *s, FARM_MEMBER *f, char *hubname, UINT key)
\r
7591 if (s == NULL || f == NULL || hubname == NULL)
\r
7597 PackAddStr(p, "HubName", hubname);
\r
7598 PackAddInt(p, "Key", key);
\r
7600 p = SiCallTask(f, p, "deleteiptable");
\r
7606 void SiCallDeleteSession(SERVER *s, FARM_MEMBER *f, char *hubname, char *session_name)
\r
7610 if (s == NULL || f == NULL || hubname == NULL || session_name == NULL)
\r
7616 PackAddStr(p, "HubName", hubname);
\r
7617 PackAddStr(p, "SessionName", session_name);
\r
7619 p = SiCallTask(f, p, "deletesession");
\r
7625 void SiCallEnumIpTable(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_IP_TABLE *t)
\r
7630 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7636 PackAddStr(p, "HubName", hubname);
\r
7638 p = SiCallTask(f, p, "enumiptable");
\r
7640 Zero(t, sizeof(RPC_ENUM_IP_TABLE));
\r
7641 InRpcEnumIpTable(t, p);
\r
7643 for (i = 0;i < t->NumIpTable;i++)
\r
7645 t->IpTables[i].RemoteItem = true;
\r
7646 StrCpy(t->IpTables[i].RemoteHostname, sizeof(t->IpTables[i].RemoteHostname),
\r
7654 void SiCallEnumMacTable(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_MAC_TABLE *t)
\r
7659 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7665 PackAddStr(p, "HubName", hubname);
\r
7667 p = SiCallTask(f, p, "enummactable");
\r
7669 Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
\r
7670 InRpcEnumMacTable(t, p);
\r
7672 for (i = 0;i < t->NumMacTable;i++)
\r
7674 t->MacTables[i].RemoteItem = true;
\r
7675 StrCpy(t->MacTables[i].RemoteHostname, sizeof(t->MacTables[i].RemoteHostname),
\r
7682 // SecureNAT 状況の取得指令送信
\r
7683 void SiCallGetNatStatus(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_NAT_STATUS *t)
\r
7687 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7693 PackAddStr(p, "HubName", hubname);
\r
7695 p = SiCallTask(f, p, "getnatstatus");
\r
7697 Zero(t, sizeof(RPC_NAT_STATUS));
\r
7698 InRpcNatStatus(t, p);
\r
7703 // DHCP エントリ列挙指令送信
\r
7704 void SiCallEnumDhcp(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_DHCP *t)
\r
7708 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7714 PackAddStr(p, "HubName", hubname);
\r
7716 p = SiCallTask(f, p, "enumdhcp");
\r
7718 Zero(t, sizeof(RPC_ENUM_DHCP));
\r
7719 InRpcEnumDhcp(t, p);
\r
7725 void SiCallEnumNat(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_NAT *t)
\r
7729 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7735 PackAddStr(p, "HubName", hubname);
\r
7737 p = SiCallTask(f, p, "enumnat");
\r
7739 Zero(t, sizeof(RPC_ENUM_NAT));
\r
7740 InRpcEnumNat(t, p);
\r
7746 void SiCallEnumSession(SERVER *s, FARM_MEMBER *f, char *hubname, RPC_ENUM_SESSION *t)
\r
7751 if (s == NULL || f == NULL || hubname == NULL || t == NULL)
\r
7757 PackAddStr(p, "HubName", hubname);
\r
7759 p = SiCallTask(f, p, "enumsession");
\r
7761 Zero(t, sizeof(RPC_ENUM_SESSION));
\r
7762 InRpcEnumSession(t, p);
\r
7764 for (i = 0;i < t->NumSession;i++)
\r
7766 t->Sessions[i].RemoteSession = true;
\r
7767 StrCpy(t->Sessions[i].RemoteHostname, sizeof(t->Sessions[i].RemoteHostname),
\r
7775 void SiCallCreateHub(SERVER *s, FARM_MEMBER *f, HUB *h)
\r
7780 if (s == NULL || f == NULL)
\r
7785 if (f->Me == false)
\r
7789 SiPackAddCreateHub(p, h);
\r
7791 p = SiCallTask(f, p, "createhub");
\r
7795 hh = ZeroMalloc(sizeof(HUB_LIST));
\r
7796 hh->DynamicHub = (h->Type == HUB_TYPE_FARM_DYNAMIC ? true : false);
\r
7797 StrCpy(hh->Name, sizeof(hh->Name), h->Name);
\r
7798 hh->FarmMember = f;
\r
7800 LockList(f->HubList);
\r
7802 bool exists = false;
\r
7804 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
7806 HUB_LIST *t = LIST_DATA(f->HubList, i);
\r
7807 if (StrCmpi(t->Name, hh->Name) == 0)
\r
7812 if (exists == false)
\r
7814 Add(f->HubList, hh);
\r
7821 UnlockList(f->HubList);
\r
7824 // HUB 作成用 PACK の書き込み
\r
7825 void SiPackAddCreateHub(PACK *p, HUB *h)
\r
7830 LICENSE_STATUS license;
\r
7832 if (p == NULL || h == NULL)
\r
7837 Zero(&license, sizeof(license));
\r
7838 s = h->Cedar->Server;
\r
7841 LiParseCurrentLicenseStatus(s->LicenseSystem, &license);
\r
7844 PackAddStr(p, "HubName", h->Name);
\r
7845 PackAddInt(p, "HubType", h->Type);
\r
7847 max_session = h->Option->MaxSession;
\r
7849 if (GetHubAdminOption(h, "max_sessions") != 0)
\r
7851 if (max_session == 0)
\r
7853 max_session = GetHubAdminOption(h, "max_sessions");
\r
7857 max_session = MIN(max_session, GetHubAdminOption(h, "max_sessions"));
\r
7861 PackAddInt(p, "MaxSession", max_session);
\r
7863 if (GetHubAdminOption(h, "max_sessions_client_bridge_apply") != 0 || license.CarrierEdition)
\r
7865 PackAddInt(p, "MaxSessionClient", GetHubAdminOption(h, "max_sessions_client"));
\r
7866 PackAddInt(p, "MaxSessionBridge", GetHubAdminOption(h, "max_sessions_bridge"));
\r
7867 PackAddBool(p, "MaxSessionClientBridgeApply", true);
\r
7871 PackAddInt(p, "MaxSessionClient", INFINITE);
\r
7872 PackAddInt(p, "MaxSessionBridge", INFINITE);
\r
7875 PackAddBool(p, "NoArpPolling", h->Option->NoArpPolling);
\r
7876 PackAddBool(p, "NoIPv6AddrPolling", h->Option->NoIPv6AddrPolling);
\r
7877 PackAddBool(p, "NoIpTable", h->Option->NoIpTable);
\r
7878 PackAddBool(p, "NoEnum", h->Option->NoEnum);
\r
7879 PackAddBool(p, "FilterPPPoE", h->Option->FilterPPPoE);
\r
7880 PackAddBool(p, "YieldAfterStorePacket", h->Option->YieldAfterStorePacket);
\r
7881 PackAddBool(p, "NoSpinLockForPacketDelay", h->Option->NoSpinLockForPacketDelay);
\r
7882 PackAddInt(p, "BroadcastStormDetectionThreshold", h->Option->BroadcastStormDetectionThreshold);
\r
7883 PackAddInt(p, "ClientMinimumRequiredBuild", h->Option->ClientMinimumRequiredBuild);
\r
7884 PackAddBool(p, "FixForDLinkBPDU", h->Option->FixForDLinkBPDU);
\r
7885 PackAddBool(p, "NoLookBPDUBridgeId", h->Option->NoLookBPDUBridgeId);
\r
7886 PackAddBool(p, "NoManageVlanId", h->Option->NoManageVlanId);
\r
7887 PackAddInt(p, "VlanTypeId", h->Option->VlanTypeId);
\r
7888 PackAddBool(p, "FilterOSPF", h->Option->FilterOSPF);
\r
7889 PackAddBool(p, "FilterIPv4", h->Option->FilterIPv4);
\r
7890 PackAddBool(p, "FilterIPv6", h->Option->FilterIPv6);
\r
7891 PackAddBool(p, "FilterNonIP", h->Option->FilterNonIP);
\r
7892 PackAddBool(p, "NoIPv4PacketLog", h->Option->NoIPv4PacketLog);
\r
7893 PackAddBool(p, "NoIPv6PacketLog", h->Option->NoIPv6PacketLog);
\r
7894 PackAddBool(p, "FilterBPDU", h->Option->FilterBPDU);
\r
7895 PackAddBool(p, "NoIPv6DefaultRouterInRAWhenIPv6", h->Option->NoIPv6DefaultRouterInRAWhenIPv6);
\r
7896 PackAddBool(p, "NoMacAddressLog", h->Option->NoMacAddressLog);
\r
7897 PackAddBool(p, "ManageOnlyPrivateIP", h->Option->ManageOnlyPrivateIP);
\r
7898 PackAddBool(p, "ManageOnlyLocalUnicastIPv6", h->Option->ManageOnlyLocalUnicastIPv6);
\r
7899 PackAddBool(p, "DisableIPParsing", h->Option->DisableIPParsing);
\r
7901 PackAddInt(p, "SavePacketLog", h->LogSetting.SavePacketLog);
\r
7902 PackAddInt(p, "PacketLogSwitchType", h->LogSetting.PacketLogSwitchType);
\r
7903 for (i = 0;i < NUM_PACKET_LOG;i++)
\r
7905 PackAddIntEx(p, "PacketLogConfig", h->LogSetting.PacketLogConfig[i], i, NUM_PACKET_LOG);
\r
7907 PackAddInt(p, "SaveSecurityLog", h->LogSetting.SaveSecurityLog);
\r
7908 PackAddInt(p, "SecurityLogSwitchType", h->LogSetting.SecurityLogSwitchType);
\r
7909 PackAddData(p, "HashedPassword", h->HashedPassword, SHA1_SIZE);
\r
7910 PackAddData(p, "SecurePassword", h->SecurePassword, SHA1_SIZE);
\r
7912 SiAccessListToPack(p, h->AccessList);
\r
7914 if (h->EnableSecureNAT)
\r
7916 PackAddBool(p, "EnableSecureNAT", h->EnableSecureNAT);
\r
7917 OutVhOption(p, h->SecureNATOption);
\r
7922 void SiHubUpdateProc(HUB *h)
\r
7927 if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
7932 s = h->Cedar->Server;
\r
7934 if (s->FarmMemberList == NULL)
\r
7939 if (h->LastVersion != h->CurrentVersion || h->CurrentVersion == 0)
\r
7941 if (h->CurrentVersion == 0)
\r
7943 h->CurrentVersion = 1;
\r
7945 h->LastVersion = h->CurrentVersion;
\r
7947 LockList(s->FarmMemberList);
\r
7949 // すべてのメンバで HUB を更新する
\r
7950 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
7952 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
7953 if (f->Me == false)
\r
7955 SiCallUpdateHub(s, f, h);
\r
7959 UnlockList(s->FarmMemberList);
\r
7962 if (h->Offline == false)
\r
7964 SiHubOnlineProc(h);
\r
7969 void SiHubOnlineProc(HUB *h)
\r
7974 if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
7976 // ファームコントローラ以外では処理しない
\r
7980 s = h->Cedar->Server;
\r
7982 if (s->FarmMemberList == NULL)
\r
7987 LockList(s->FarmMemberList);
\r
7989 if (h->Type == HUB_TYPE_FARM_STATIC)
\r
7992 // すべてのメンバで HUB を作成する
\r
7993 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
7996 bool exists = false;
\r
7997 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
7999 LockList(f->HubList);
\r
8001 for (j = 0;j < LIST_NUM(f->HubList);j++)
\r
8003 HUB_LIST *hh = LIST_DATA(f->HubList, j);
\r
8004 if (StrCmpi(hh->Name, h->Name) == 0)
\r
8010 UnlockList(f->HubList);
\r
8012 if (exists == false)
\r
8014 SiCallCreateHub(s, f, h);
\r
8019 UnlockList(s->FarmMemberList);
\r
8023 void SiHubOfflineProc(HUB *h)
\r
8026 char hubname[MAX_HUBNAME_LEN + 1];
\r
8029 if (h == NULL || h->Cedar->Server == NULL || h->Cedar->Server->ServerType != SERVER_TYPE_FARM_CONTROLLER)
\r
8031 // ファームコントローラ以外では処理しない
\r
8035 s = h->Cedar->Server;
\r
8037 if (s->FarmMemberList == NULL)
\r
8042 StrCpy(hubname, sizeof(hubname), h->Name);
\r
8044 LockList(s->FarmMemberList);
\r
8046 // すべてのメンバで HUB を停止する
\r
8047 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
8049 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
8050 SiCallDeleteHub(s, f, h);
\r
8053 UnlockList(s->FarmMemberList);
\r
8056 // アクセスを PACK に変換する
\r
8057 void SiAccessToPack(PACK *p, ACCESS *a, UINT i, UINT total)
\r
8060 if (p == NULL || a == NULL)
\r
8065 PackAddUniStrEx(p, "Note", a->Note, i, total);
\r
8066 PackAddIntEx(p, "Active", a->Active, i, total);
\r
8067 PackAddIntEx(p, "Priority", a->Priority, i, total);
\r
8068 PackAddIntEx(p, "Discard", a->Discard, i, total);
\r
8071 PackAddIp32Ex(p, "SrcIpAddress", 0xFDFFFFDF, i, total);
\r
8072 PackAddIp32Ex(p, "SrcSubnetMask", 0xFFFFFFFF, i, total);
\r
8073 PackAddIp32Ex(p, "DestIpAddress", 0xFDFFFFDF, i, total);
\r
8074 PackAddIp32Ex(p, "DestSubnetMask", 0xFFFFFFFF, i, total);
\r
8078 PackAddIp32Ex(p, "SrcIpAddress", a->SrcIpAddress, i, total);
\r
8079 PackAddIp32Ex(p, "SrcSubnetMask", a->SrcSubnetMask, i, total);
\r
8080 PackAddIp32Ex(p, "DestIpAddress", a->DestIpAddress, i, total);
\r
8081 PackAddIp32Ex(p, "DestSubnetMask", a->DestSubnetMask, i, total);
\r
8083 PackAddIntEx(p, "Protocol", a->Protocol, i, total);
\r
8084 PackAddIntEx(p, "SrcPortStart", a->SrcPortStart, i, total);
\r
8085 PackAddIntEx(p, "SrcPortEnd", a->SrcPortEnd, i, total);
\r
8086 PackAddIntEx(p, "DestPortStart", a->DestPortStart, i, total);
\r
8087 PackAddIntEx(p, "DestPortEnd", a->DestPortEnd, i, total);
\r
8088 PackAddStrEx(p, "SrcUsername", a->SrcUsername, i, total);
\r
8089 PackAddStrEx(p, "DestUsername", a->DestUsername, i, total);
\r
8090 PackAddBoolEx(p, "CheckSrcMac", a->CheckSrcMac, i, total);
\r
8091 PackAddDataEx(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), i, total);
\r
8092 PackAddDataEx(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), i, total);
\r
8093 PackAddBoolEx(p, "CheckDstMac", a->CheckDstMac, i, total);
\r
8094 PackAddDataEx(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), i, total);
\r
8095 PackAddDataEx(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), i, total);
\r
8096 PackAddBoolEx(p, "CheckTcpState", a->CheckTcpState, i, total);
\r
8097 PackAddBoolEx(p, "Established", a->Established, i, total);
\r
8098 PackAddIntEx(p, "Delay", a->Delay, i, total);
\r
8099 PackAddIntEx(p, "Jitter", a->Jitter, i, total);
\r
8100 PackAddIntEx(p, "Loss", a->Loss, i, total);
\r
8101 PackAddBoolEx(p, "IsIPv6", a->IsIPv6, i, total);
\r
8104 PackAddIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, i, total);
\r
8105 PackAddIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, i, total);
\r
8106 PackAddIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, i, total);
\r
8107 PackAddIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, i, total);
\r
8113 Zero(&zero, sizeof(zero));
\r
8115 PackAddIp6AddrEx(p, "SrcIpAddress6", &zero, i, total);
\r
8116 PackAddIp6AddrEx(p, "SrcSubnetMask6", &zero, i, total);
\r
8117 PackAddIp6AddrEx(p, "DestIpAddress6", &zero, i, total);
\r
8118 PackAddIp6AddrEx(p, "DestSubnetMask6", &zero, i, total);
\r
8122 // PACK に入っているアクセス個数を取得
\r
8123 UINT SiNumAccessFromPack(PACK *p)
\r
8131 return PackGetIndexCount(p, "Active");
\r
8134 // PACK をアクセスに変換する
\r
8135 ACCESS *SiPackToAccess(PACK *p, UINT i)
\r
8144 a = ZeroMalloc(sizeof(ACCESS));
\r
8146 PackGetUniStrEx(p, "Note", a->Note, sizeof(a->Note), i);
\r
8147 a->Active = PackGetIntEx(p, "Active", i);
\r
8148 a->Priority = PackGetIntEx(p, "Priority", i);
\r
8149 a->Discard = PackGetIntEx(p, "Discard", i);
\r
8150 a->SrcIpAddress = PackGetIp32Ex(p, "SrcIpAddress", i);
\r
8151 a->SrcSubnetMask = PackGetIp32Ex(p, "SrcSubnetMask", i);
\r
8152 a->DestIpAddress = PackGetIp32Ex(p, "DestIpAddress", i);
\r
8153 a->DestSubnetMask = PackGetIp32Ex(p, "DestSubnetMask", i);
\r
8154 a->Protocol = PackGetIntEx(p, "Protocol", i);
\r
8155 a->SrcPortStart = PackGetIntEx(p, "SrcPortStart", i);
\r
8156 a->SrcPortEnd = PackGetIntEx(p, "SrcPortEnd", i);
\r
8157 a->DestPortStart = PackGetIntEx(p, "DestPortStart", i);
\r
8158 a->DestPortEnd = PackGetIntEx(p, "DestPortEnd", i);
\r
8159 PackGetStrEx(p, "SrcUsername", a->SrcUsername, sizeof(a->SrcUsername), i);
\r
8160 PackGetStrEx(p, "DestUsername", a->DestUsername, sizeof(a->DestUsername), i);
\r
8161 a->CheckSrcMac = PackGetBoolEx(p, "CheckSrcMac", i);
\r
8162 PackGetDataEx2(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), i);
\r
8163 PackGetDataEx2(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), i);
\r
8164 a->CheckDstMac = PackGetBoolEx(p, "CheckDstMac", i);
\r
8165 PackGetDataEx2(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), i);
\r
8166 PackGetDataEx2(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), i);
\r
8167 a->CheckTcpState = PackGetBoolEx(p, "CheckTcpState", i);
\r
8168 a->Established = PackGetBoolEx(p, "Established", i);
\r
8169 a->Delay = PackGetIntEx(p, "Delay", i);
\r
8170 a->Jitter = PackGetIntEx(p, "Jitter", i);
\r
8171 a->Loss = PackGetIntEx(p, "Loss", i);
\r
8172 a->IsIPv6 = PackGetBoolEx(p, "IsIPv6", i);
\r
8175 PackGetIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, i);
\r
8176 PackGetIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, i);
\r
8177 PackGetIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, i);
\r
8178 PackGetIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, i);
\r
8184 // アクセスリストを PACK に変換する
\r
8185 void SiAccessListToPack(PACK *p, LIST *o)
\r
8188 if (p == NULL || o == NULL)
\r
8196 for (i = 0;i < LIST_NUM(o);i++)
\r
8198 ACCESS *a = LIST_DATA(o, i);
\r
8199 SiAccessToPack(p, a, i, LIST_NUM(o));
\r
8205 // 指定した HUB をホストしているメンバを取得する
\r
8206 FARM_MEMBER *SiGetHubHostingMember(SERVER *s, HUB *h, bool admin_mode)
\r
8208 FARM_MEMBER *ret = NULL;
\r
8209 char name[MAX_SIZE];
\r
8211 if (s == NULL || h == NULL)
\r
8216 StrCpy(name, sizeof(name), h->Name);
\r
8218 if (h->Type == HUB_TYPE_FARM_STATIC)
\r
8220 // スタティック HUB の場合 任意のメンバを選択すれば良い
\r
8221 if (admin_mode == false)
\r
8223 ret = SiGetNextFarmMember(s);
\r
8230 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
8232 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
8244 // すでに HUB をホストしているメンバがあるかどうか調べる
\r
8247 for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
\r
8249 FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
\r
8251 StrCpy(t.Name, sizeof(t.Name), name);
\r
8252 LockList(f->HubList);
\r
8254 hh = Search(f->HubList, &t);
\r
8261 UnlockList(f->HubList);
\r
8266 // 新しく HUB をホストさせる
\r
8270 ret = SiGetNextFarmMember(s);
\r
8276 SiAddHubCreateHistory(s, name);
\r
8277 SiCallCreateHub(s, f, h);
\r
8278 SiCallUpdateHub(s, f, h);
\r
8287 PACK *SiCalledTask(FARM_CONTROLLER *f, PACK *p, char *taskname)
\r
8292 if (f == NULL || p == NULL || taskname == NULL)
\r
8300 if (StrCmpi(taskname, "noop") == 0)
\r
8307 Debug("Task Called: [%s].\n", taskname);
\r
8308 if (StrCmpi(taskname, "createhub") == 0)
\r
8310 SiCalledCreateHub(s, p);
\r
8313 else if (StrCmpi(taskname, "deletehub") == 0)
\r
8315 SiCalledDeleteHub(s, p);
\r
8318 else if (StrCmpi(taskname, "enumhub") == 0)
\r
8321 SiCalledEnumHub(s, ret, p);
\r
8323 else if (StrCmpi(taskname, "updatehub") == 0)
\r
8325 SiCalledUpdateHub(s, p);
\r
8328 else if (StrCmpi(taskname, "createticket") == 0)
\r
8330 ret = SiCalledCreateTicket(s, p);
\r
8332 else if (StrCmpi(taskname, "enumnat") == 0)
\r
8334 ret = SiCalledEnumNat(s, p);
\r
8336 else if (StrCmpi(taskname, "enumdhcp") == 0)
\r
8338 ret = SiCalledEnumDhcp(s, p);
\r
8340 else if (StrCmpi(taskname, "getnatstatus") == 0)
\r
8342 ret = SiCalledGetNatStatus(s, p);
\r
8344 else if (StrCmpi(taskname, "enumsession") == 0)
\r
8346 ret = SiCalledEnumSession(s, p);
\r
8348 else if (StrCmpi(taskname, "deletesession") == 0)
\r
8350 SiCalledDeleteSession(s, p);
\r
8353 else if (StrCmpi(taskname, "deletemactable") == 0)
\r
8355 SiCalledDeleteMacTable(s, p);
\r
8358 else if (StrCmpi(taskname, "deleteiptable") == 0)
\r
8360 SiCalledDeleteIpTable(s, p);
\r
8363 else if (StrCmpi(taskname, "enummactable") == 0)
\r
8365 ret = SiCalledEnumMacTable(s, p);
\r
8367 else if (StrCmpi(taskname, "enumiptable") == 0)
\r
8369 ret = SiCalledEnumIpTable(s, p);
\r
8371 else if (StrCmpi(taskname, "getsessionstatus") == 0)
\r
8373 ret = SiCalledGetSessionStatus(s, p);
\r
8375 else if (StrCmpi(taskname, "enumlogfilelist") == 0)
\r
8377 ret = SiCalledEnumLogFileList(s, p);
\r
8379 else if (StrCmpi(taskname, "readlogfile") == 0)
\r
8381 ret = SiCalledReadLogFile(s, p);
\r
8389 PACK *SiCallTask(FARM_MEMBER *f, PACK *p, char *taskname)
\r
8392 char tmp[MAX_PATH];
\r
8394 if (f == NULL || p == NULL || taskname == NULL)
\r
8399 PackAddStr(p, "taskname", taskname);
\r
8401 Debug("Call Task [%s] (%s)\n", taskname, f->hostname);
\r
8403 Format(tmp, sizeof(tmp), "CLUSTER_CALL: Entering Call [%s] to %s", taskname, f->hostname);
\r
8404 SiDebugLog(f->Cedar->Server, tmp);
\r
8406 ret = SiExecTask(f, p);
\r
8408 Format(tmp, sizeof(tmp), "CLUSTER_CALL: Leaving Call [%s] to %s", taskname, f->hostname);
\r
8409 SiDebugLog(f->Cedar->Server, tmp);
\r
8414 // タスク待ちうけプロシージャ (メイン処理)
\r
8415 void SiAcceptTasksFromControllerMain(FARM_CONTROLLER *f, SOCK *sock)
\r
8419 char taskname[MAX_SIZE];
\r
8421 if (f == NULL || sock == NULL)
\r
8430 request = HttpClientRecv(sock);
\r
8431 if (request == NULL)
\r
8440 if (PackGetStr(request, "taskname", taskname, sizeof(taskname)))
\r
8442 Lock(f->Server->TasksFromFarmControllerLock);
\r
8444 response = SiCalledTask(f, request, taskname);
\r
8446 Unlock(f->Server->TasksFromFarmControllerLock);
\r
8449 FreePack(request);
\r
8452 if (response == NULL)
\r
8454 response = NewPack();
\r
8458 PackAddInt(response, "succeed", 1);
\r
8461 ret = HttpClientSend(sock, response);
\r
8462 FreePack(response);
\r
8473 void SiAcceptTasksFromController(FARM_CONTROLLER *f, SOCK *sock)
\r
8481 if (f == NULL || sock == NULL)
\r
8490 SiAcceptTasksFromControllerMain(f, sock);
\r
8492 // コントローラとの接続が切断されたためすべての仮想 HUB を停止する
\r
8493 LockList(c->HubList);
\r
8495 hubs = ToArray(c->HubList);
\r
8496 num_hubs = LIST_NUM(c->HubList);
\r
8497 for (i = 0;i < num_hubs;i++)
\r
8499 AddRef(hubs[i]->ref);
\r
8502 UnlockList(c->HubList);
\r
8504 for (i = 0;i < num_hubs;i++)
\r
8506 SetHubOffline(hubs[i]);
\r
8507 DelHub(c, hubs[i]);
\r
8508 ReleaseHub(hubs[i]);
\r
8515 PACK *SiExecTask(FARM_MEMBER *f, PACK *p)
\r
8519 if (f == NULL || p == NULL)
\r
8524 t = SiFarmServPostTask(f, p);
\r
8530 return SiFarmServWaitTask(t);
\r
8534 FARM_TASK *SiFarmServPostTask(FARM_MEMBER *f, PACK *request)
\r
8538 if (f == NULL || request == NULL)
\r
8543 t = ZeroMalloc(sizeof(FARM_TASK));
\r
8544 t->CompleteEvent = NewEvent();
\r
8545 t->Request = request;
\r
8547 LockQueue(f->TaskQueue);
\r
8552 UnlockQueue(f->TaskQueue);
\r
8553 ReleaseEvent(t->CompleteEvent);
\r
8558 InsertQueue(f->TaskQueue, t);
\r
8560 UnlockQueue(f->TaskQueue);
\r
8562 Set(f->TaskPostEvent);
\r
8568 PACK *SiFarmServWaitTask(FARM_TASK *t)
\r
8577 Wait(t->CompleteEvent, INFINITE);
\r
8578 ReleaseEvent(t->CompleteEvent);
\r
8579 FreePack(t->Request);
\r
8581 response = t->Response;
\r
8584 if (PackGetInt(response, "succeed") == 0)
\r
8586 // 何らかの原因でタスク呼び出しが失敗した
\r
8587 FreePack(response);
\r
8595 void SiFarmServMain(SERVER *server, SOCK *sock, FARM_MEMBER *f)
\r
8597 UINT wait_time = SERVER_CONTROL_TCP_TIMEOUT / 2;
\r
8598 bool send_noop = false;
\r
8602 if (server == NULL || sock == NULL || f == NULL)
\r
8604 Debug("SiFarmServMain Failed.\n");
\r
8608 Debug("SiFarmServMain Started.\n");
\r
8610 c = server->Cedar;
\r
8612 // メンバがコントローラに接続してきた段階で
\r
8613 // すべてのスタティック HUB の作成指令を送信する
\r
8614 LockList(c->HubList);
\r
8616 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
8618 HUB *h = LIST_DATA(c->HubList, i);
\r
8619 if (h->Offline == false)
\r
8621 if (h->Type == HUB_TYPE_FARM_STATIC)
\r
8626 SiPackAddCreateHub(p, h);
\r
8627 PackAddStr(p, "taskname", "createhub");
\r
8628 HttpServerSend(sock, p);
\r
8630 p = HttpServerRecv(sock);
\r
8634 SiPackAddCreateHub(p, h);
\r
8635 PackAddStr(p, "taskname", "updatehub");
\r
8636 HttpServerSend(sock, p);
\r
8638 p = HttpServerRecv(sock);
\r
8641 hh = ZeroMalloc(sizeof(HUB_LIST));
\r
8642 hh->DynamicHub = false;
\r
8643 hh->FarmMember = f;
\r
8644 StrCpy(hh->Name, sizeof(hh->Name), h->Name);
\r
8645 LockList(f->HubList);
\r
8647 Add(f->HubList, hh);
\r
8649 UnlockList(f->HubList);
\r
8654 UnlockList(c->HubList);
\r
8656 Debug("SiFarmServMain: while (true)\n");
\r
8665 // 新しいタスクが到着していないかどうか調べる
\r
8666 LockQueue(f->TaskQueue);
\r
8668 t = GetNext(f->TaskQueue);
\r
8670 UnlockQueue(f->TaskQueue);
\r
8675 PACK *p = t->Request;
\r
8679 ret = HttpServerSend(sock, p);
\r
8680 send_noop = false;
\r
8686 Set(t->CompleteEvent);
\r
8687 goto DISCONNECTED;
\r
8691 p = HttpServerRecv(sock);
\r
8694 Set(t->CompleteEvent);
\r
8696 send_noop = false;
\r
8699 while (t != NULL);
\r
8707 PackAddStr(p, "taskname", "noop");
\r
8709 ret = HttpServerSend(sock, p);
\r
8714 goto DISCONNECTED;
\r
8717 p = HttpServerRecv(sock);
\r
8720 goto DISCONNECTED;
\r
8731 if ((tick + wait_time) <= Tick64())
\r
8736 Wait(f->TaskPostEvent, 250);
\r
8738 break_flag = false;
\r
8739 LockQueue(f->TaskQueue);
\r
8741 if (f->TaskQueue->num_item != 0)
\r
8743 break_flag = true;
\r
8746 UnlockQueue(f->TaskQueue);
\r
8748 if (break_flag || f->Halting || server->Halt)
\r
8758 Debug("SiFarmServMain: DISCONNECTED\n");
\r
8760 f->Halting = true;
\r
8761 // すべての未処理のタスクをキャンセルする
\r
8762 LockQueue(f->TaskQueue);
\r
8766 while (t = GetNext(f->TaskQueue))
\r
8768 Set(t->CompleteEvent);
\r
8771 UnlockQueue(f->TaskQueue);
\r
8774 // ファームメンバからの接続を処理するファームサーバー関数
\r
8775 void SiFarmServ(SERVER *server, SOCK *sock, X *cert, UINT ip, UINT num_port, UINT *ports, char *hostname, UINT point, UINT weight, UINT max_sessions)
\r
8780 char tmp[MAX_SIZE];
\r
8782 if (server == NULL || sock == NULL || cert == NULL || num_port == 0 || ports == NULL || hostname == NULL)
\r
8789 weight = FARM_DEFAULT_WEIGHT;
\r
8792 if (max_sessions == 0)
\r
8794 max_sessions = SERVER_MAX_SESSIONS;
\r
8799 // 公開 IP アドレスが指定されていない場合はこのファームメンバサーバーの
\r
8800 // 接続元 IP アドレスを指定する
\r
8801 ip = IPToUINT(&sock->RemoteIP);
\r
8804 IPToStr32(tmp, sizeof(tmp), ip);
\r
8805 SLog(server->Cedar, "LS_FARM_SERV_START", tmp, hostname);
\r
8809 HttpServerSend(sock, p);
\r
8812 IPToStr32(tmp, sizeof(tmp), ip);
\r
8813 Debug("Farm Member %s Connected. IP: %s\n", hostname, tmp);
\r
8815 SetTimeout(sock, SERVER_CONTROL_TCP_TIMEOUT);
\r
8817 f = ZeroMalloc(sizeof(FARM_MEMBER));
\r
8818 f->Cedar = server->Cedar;
\r
8820 f->NumPort = num_port;
\r
8822 StrCpy(f->hostname, sizeof(f->hostname), hostname);
\r
8823 f->ServerCert = cert;
\r
8824 f->ConnectedTime = SystemTime64();
\r
8825 f->Weight = weight;
\r
8826 f->MaxSessions = max_sessions;
\r
8828 f->HubList = NewList(CompareHubList);
\r
8831 f->TaskQueue = NewQueue();
\r
8832 f->TaskPostEvent = NewEvent();
\r
8835 LockList(server->FarmMemberList);
\r
8837 Add(server->FarmMemberList, f);
\r
8839 UnlockList(server->FarmMemberList);
\r
8842 SiFarmServMain(server, sock, f);
\r
8845 LockList(server->FarmMemberList);
\r
8847 Delete(server->FarmMemberList, f);
\r
8849 UnlockList(server->FarmMemberList);
\r
8851 ReleaseQueue(f->TaskQueue);
\r
8852 ReleaseEvent(f->TaskPostEvent);
\r
8854 for (i = 0;i < LIST_NUM(f->HubList);i++)
\r
8856 HUB_LIST *hh = LIST_DATA(f->HubList, i);
\r
8860 ReleaseList(f->HubList);
\r
8864 SLog(server->Cedar, "LS_FARM_SERV_END", hostname);
\r
8868 int CompareHubList(void *p1, void *p2)
\r
8870 HUB_LIST *h1, *h2;
\r
8871 if (p1 == NULL || p2 == NULL)
\r
8875 h1 = *(HUB_LIST **)p1;
\r
8876 h2 = *(HUB_LIST **)p2;
\r
8877 if (h1 == NULL || h2 == NULL)
\r
8881 return StrCmpi(h1->Name, h2->Name);
\r
8885 void SiConnectToControllerThread(THREAD *thread, void *param)
\r
8887 FARM_CONTROLLER *f;
\r
8891 bool first_failed;
\r
8893 if (thread == NULL || param == NULL)
\r
8899 MsSetThreadPriorityRealtime();
\r
8900 #endif // OS_WIN32
\r
8902 f = (FARM_CONTROLLER *)param;
\r
8903 f->Thread = thread;
\r
8904 AddRef(f->Thread->ref);
\r
8905 NoticeThreadInit(thread);
\r
8907 f->StartedTime = SystemTime64();
\r
8909 server = f->Server;
\r
8911 f->StartedTime = SystemTime64();
\r
8913 SLog(server->Cedar, "LS_FARM_CONNECT_1", server->ControllerName);
\r
8915 first_failed = true;
\r
8922 f->LastError = ERR_TRYING_TO_CONNECT;
\r
8924 Zero(&o, sizeof(CLIENT_OPTION));
\r
8925 StrCpy(o.Hostname, sizeof(o.Hostname), server->ControllerName);
\r
8926 o.Port = server->ControllerPort;
\r
8929 Debug("Try to Connect %s (Controller).\n", server->ControllerName);
\r
8931 s = NewRpcSessionEx(server->Cedar, &o, NULL, CEDAR_SERVER_FARM_STR);
\r
8936 PACK *p = NewPack();
\r
8937 UCHAR secure_password[SHA1_SIZE];
\r
8940 c = s->Connection;
\r
8944 f->Sock = c->FirstSock;
\r
8945 AddRef(f->Sock->ref);
\r
8946 SetTimeout(f->Sock, SERVER_CONTROL_TCP_TIMEOUT);
\r
8951 PackAddStr(p, "method", "farm_connect");
\r
8952 PackAddClientVersion(p, s->Connection);
\r
8955 SecurePassword(secure_password, server->MemberPassword, s->Connection->Random);
\r
8956 PackAddData(p, "SecurePassword", secure_password, sizeof(secure_password));
\r
8958 Lock(server->Cedar->lock);
\r
8960 b = XToBuf(server->Cedar->ServerX, false);
\r
8962 Unlock(server->Cedar->lock);
\r
8966 char tmp[MAX_SIZE];
\r
8970 PackAddBuf(p, "ServerCert", b);
\r
8974 PackAddInt(p, "MaxSessions", GetServerCapsInt(server, "i_max_sessions"));
\r
8977 PackAddInt(p, "Point", SiGetPoint(server));
\r
8978 PackAddInt(p, "Weight", server->Weight);
\r
8981 GetMachineName(tmp, sizeof(tmp));
\r
8982 PackAddStr(p, "HostName", tmp);
\r
8985 PackAddIp32(p, "PublicIp", server->PublicIp);
\r
8988 for (i = 0;i < server->NumPublicPort;i++)
\r
8990 PackAddIntEx(p, "PublicPort", server->PublicPorts[i], i, server->NumPublicPort);
\r
8993 ret = HttpClientSend(c->FirstSock, p);
\r
8998 UINT err = ERR_PROTOCOL_ERROR;
\r
9000 first_failed = true;
\r
9001 p = HttpClientRecv(c->FirstSock);
\r
9002 if (p != NULL && (err = GetErrorFromPack(p)) == 0)
\r
9005 SLog(server->Cedar, "LS_FARM_START");
\r
9006 f->CurrentConnectedTime = SystemTime64();
\r
9007 if (f->FirstConnectedTime == 0)
\r
9009 f->FirstConnectedTime = SystemTime64();
\r
9011 f->NumConnected++;
\r
9012 Debug("Connect Succeed.\n");
\r
9016 SiAcceptTasksFromController(f, c->FirstSock);
\r
9018 f->Online = false;
\r
9023 f->LastError = err;
\r
9024 SLog(server->Cedar, "LS_FARM_CONNECT_2", server->ControllerName,
\r
9025 GetUniErrorStr(err), err);
\r
9031 f->LastError = ERR_DISCONNECTED;
\r
9035 SLog(server->Cedar, "LS_FARM_CONNECT_3", server->ControllerName, RETRY_CONNECT_TO_CONTROLLER_INTERVAL / 1000);
\r
9036 first_failed = false;
\r
9046 if (f->Sock != NULL)
\r
9048 ReleaseSock(f->Sock);
\r
9054 ReleaseSession(s);
\r
9057 if (f->LastError == ERR_TRYING_TO_CONNECT)
\r
9059 f->LastError = ERR_DISCONNECTED;
\r
9065 f->LastError = ERR_CONNECT_TO_FARM_CONTROLLER;
\r
9069 SLog(server->Cedar, "LS_FARM_CONNECT_3", server->ControllerName, RETRY_CONNECT_TO_CONTROLLER_INTERVAL / 1000);
\r
9070 first_failed = false;
\r
9074 Debug("Controller Disconnected. ERROR = %S\n", _E(f->LastError));
\r
9076 f->NumFailed = f->NumTry - f->NumConnected;
\r
9079 Wait(f->HaltEvent, RETRY_CONNECT_TO_CONTROLLER_INTERVAL);
\r
9088 SLog(server->Cedar, "LS_FARM_DISCONNECT");
\r
9092 void SiStopConnectToController(FARM_CONTROLLER *f)
\r
9105 Disconnect(f->Sock);
\r
9109 Set(f->HaltEvent);
\r
9112 WaitThread(f->Thread, INFINITE);
\r
9113 ReleaseThread(f->Thread);
\r
9115 DeleteLock(f->lock);
\r
9116 ReleaseEvent(f->HaltEvent);
\r
9122 FARM_CONTROLLER *SiStartConnectToController(SERVER *s)
\r
9124 FARM_CONTROLLER *f;
\r
9132 f = ZeroMalloc(sizeof(FARM_CONTROLLER));
\r
9134 f->LastError = ERR_TRYING_TO_CONNECT;
\r
9135 f->HaltEvent = NewEvent();
\r
9136 f->lock = NewLock();
\r
9138 t = NewThread(SiConnectToControllerThread, f);
\r
9139 WaitThreadInit(t);
\r
9146 SERVER *SiNewServer(bool bridge)
\r
9150 s = ZeroMalloc(sizeof(SERVER));
\r
9152 SiInitHubCreateHistory(s);
\r
9154 InitServerCapsCache(s);
\r
9156 Rand(s->MyRandomKey, sizeof(s->MyRandomKey));
\r
9158 s->lock = NewLock();
\r
9159 s->SaveCfgLock = NewLock();
\r
9160 s->ref = NewRef();
\r
9161 s->Cedar = NewCedar(NULL, NULL);
\r
9162 s->Cedar->Server = s;
\r
9163 s->Cedar->CheckExpires = true;
\r
9164 s->ServerListenerList = NewList(CompareServerListener);
\r
9165 s->StartTime = SystemTime64();
\r
9166 s->TasksFromFarmControllerLock = NewLock();
\r
9170 SetCedarVpnBridge(s->Cedar);
\r
9174 if (IsHamMode() == false)
\r
9176 RegistWindowsFirewallAll();
\r
9180 s->Keep = StartKeep();
\r
9183 MakeDir(bridge == false ? SERVER_LOG_DIR_NAME : BRIDGE_LOG_DIR_NAME);
\r
9184 s->Logger = NewLog(bridge == false ? SERVER_LOG_DIR_NAME : BRIDGE_LOG_DIR_NAME, SERVER_LOG_PERFIX, LOG_SWITCH_DAY);
\r
9186 SLog(s->Cedar, "L_LINE");
\r
9187 SLog(s->Cedar, "LS_START_2", s->Cedar->ServerStr, s->Cedar->VerString);
\r
9188 SLog(s->Cedar, "LS_START_3", s->Cedar->BuildInfo);
\r
9189 SLog(s->Cedar, "LS_START_UTF8");
\r
9190 SLog(s->Cedar, "LS_START_1");
\r
9192 if (s->Cedar->Bridge == false)
\r
9194 s->LicenseSystem = LiNewLicenseSystem();
\r
9198 SiInitConfiguration(s);
\r
9201 if (s->NoHighPriorityProcess == false)
\r
9203 OSSetHighPriority();
\r
9206 if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
\r
9208 // コントローラへの接続を開始する
\r
9209 s->FarmController = SiStartConnectToController(s);
\r
9211 else if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
\r
9214 // コントローラとしての動作を開始する
\r
9215 s->FarmMemberList = NewList(NULL);
\r
9217 f = ZeroMalloc(sizeof(FARM_MEMBER));
\r
9218 f->Cedar = s->Cedar;
\r
9219 GetMachineName(f->hostname, sizeof(f->hostname));
\r
9221 f->HubList = NewList(CompareHubList);
\r
9222 f->Weight = s->Weight;
\r
9226 Add(s->FarmMemberList, f);
\r
9228 SiStartFarmControl(s);
\r
9230 s->FarmControllerInited = true;
\r
9233 InitServerSnapshot(s);
\r
9235 SiInitDeadLockCheck(s);
\r