[0001] [0002] [0003] [0004] [0005] [0006] [0007] [0008] [0009] [0010] [0011] [0012] [0013] [0014] [0015] [0016] [0017] [0018] [0019] [0020] [0021] [0022] [0023] [0024] [0025] [0026] [0027] [0028] [0029] [0030] [0031] [0032] [0033] [0034] [0035] [0036] [0037] [0038] [0039] [0040] [0041] [0042] [0043] [0044] [0045] [0046] [0047] [0048] [0049] [0050] [0051] [0052] [0053] [0054] [0055] [0056] [0057] [0058] [0059] [0060] [0061] [0062] [0063] [0064] [0065] [0066] [0067] [0068] [0069] [0070] [0071] [0072] [0073] [0074] [0075] [0076] [0077] [0078] [0079] [0080] [0081] [0082] [0083] [0084] [0085] [0086] [0087] [0088] [0089] [0090] [0091] [0092] [0093] [0094] [0095] [0096] [0097] [0098] [0099] [0100] [0101] [0102] [0103] [0104] [0105] [0106] [0107] [0108] [0109] [0110] [0111] [0112] [0113] [0114] [0115] [0116] [0117] [0118] [0119] [0120] [0121] [0122] [0123] [0124] [0125] [0126] [0127] [0128] [0129] [0130] [0131] [0132] [0133] [0134] [0135] [0136] [0137] [0138] [0139] [0140] [0141] [0142] [0143] [0144] [0145] [0146] [0147] [0148] [0149] [0150] [0151] [0152] [0153] [0154] [0155] [0156] [0157] [0158] [0159] [0160] [0161] [0162] [0163] [0164] [0165] [0166] [0167] [0168] [0169] [0170] [0171] [0172] [0173] [0174] [0175] [0176] [0177] [0178] [0179] [0180] [0181] [0182] [0183] [0184] [0185] [0186] [0187] [0188] [0189] [0190] [0191] [0192] [0193] [0194] [0195] [0196] [0197] [0198] [0199] [0200] [0201] [0202] [0203] [0204] [0205] [0206] [0207] [0208] [0209] [0210] [0211] [0212] [0213] [0214] [0215] [0216] [0217] [0218] [0219] [0220] [0221] [0222] [0223] [0224] [0225] [0226] [0227] [0228] [0229] [0230] [0231] [0232] [0233] [0234] [0235] [0236] [0237] [0238] [0239] [0240] [0241] [0242] [0243] [0244] [0245] [0246] [0247] [0248] [0249] [0250] [0251] [0252] [0253] [0254] [0255] [0256] [0257] [0258] [0259] [0260] [0261] [0262] [0263] [0264] [0265] [0266] [0267] [0268] [0269] [0270] [0271] [0272] [0273] [0274] [0275] [0276] [0277] [0278] [0279] [0280] [0281] [0282] [0283] [0284] [0285] [0286] [0287] [0288] [0289] [0290] [0291] [0292] [0293] [0294] [0295] [0296] [0297] [0298] [0299] [0300] [0301] [0302] [0303] [0304] [0305] [0306] [0307] [0308] [0309] [0310] [0311] [0312] [0313] [0314] [0315] [0316] [0317] [0318] [0319] [0320] [0321] [0322] [0323] [0324] [0325] [0326] [0327] [0328] [0329] [0330] [0331] [0332] [0333] [0334] [0335] [0336] [0337] [0338] [0339] [0340] [0341] [0342] [0343] [0344] [0345] [0346] [0347] [0348] [0349] [0350] [0351] [0352] [0353] [0354] [0355] [0356] [0357] [0358] [0359] [0360] [0361] [0362] [0363] [0364] [0365] [0366] [0367] [0368] [0369] [0370] [0371] [0372] [0373] [0374] [0375] [0376] [0377] [0378] [0379] [0380] [0381] [0382] [0383] [0384] [0385] [0386] [0387] [0388] [0389] [0390] [0391] [0392] [0393] [0394] [0395] [0396] [0397] [0398] [0399] [0400] [0401] [0402] [0403] [0404] [0405] [0406] [0407] [0408] [0409] [0410] [0411] [0412] [0413] [0414] [0415] [0416] [0417] [0418] [0419] [0420] [0421] [0422] [0423] [0424] [0425] [0426] [0427] [0428] [0429] [0430] [0431] [0432] [0433] [0434] [0435] [0436] [0437] [0438] [0439] [0440] [0441] [0442] [0443] [0444] [0445] [0446] [0447] [0448] [0449] [0450] [0451] [0452] [0453] [0454] [0455] [0456] [0457] [0458] [0459] [0460] [0461] [0462] [0463] [0464] [0465] [0466] [0467] [0468] [0469] [0470] [0471] [0472] [0473] [0474] [0475] [0476] [0477] [0478] [0479] [0480] [0481] [0482] [0483] [0484] [0485] [0486] [0487] [0488] [0489] [0490] [0491] [0492] [0493] [0494] [0495] [0496] [0497] [0498] [0499] [0500] [0501] [0502] [0503] [0504] [0505] [0506] [0507] [0508] [0509] [0510] [0511] [0512] [0513] [0514] [0515] [0516] [0517] [0518] [0519] [0520] [0521] [0522] [0523] [0524] [0525] [0526] [0527] [0528] [0529] [0530] [0531] [0532] [0533] [0534] [0535] [0536] [0537] [0538] [0539] [0540] [0541] [0542] [0543] [0544] [0545] [0546] [0547] [0548] [0549] [0550] [0551] [0552] [0553] [0554] [0555] [0556] [0557] [0558] [0559] [0560] [0561] [0562] [0563] [0564] [0565] [0566] [0567] [0568] [0569] [0570] [0571] [0572] [0573] [0574] [0575] [0576] [0577] [0578] [0579] [0580] [0581] [0582] [0583] [0584] [0585] [0586] [0587] [0588] [0589] [0590] [0591] [0592] [0593] [0594] [0595] [0596] [0597] [0598] [0599] [0600] [0601] [0602] [0603] [0604] [0605] [0606] [0607] [0608] [0609] [0610] [0611] [0612] [0613] [0614] [0615] [0616] [0617] [0618] [0619] [0620] [0621] [0622] [0623] [0624] [0625] [0626] [0627] [0628] [0629] [0630] [0631] [0632] [0633] [0634] [0635] [0636] [0637] [0638] [0639] [0640] [0641] [0642] [0643] [0644] [0645] [0646] [0647] [0648] [0649] [0650] [0651] [0652] [0653] [0654] [0655] [0656] [0657] [0658] [0659] [0660] [0661] [0662] [0663] [0664] [0665] [0666] [0667] [0668] [0669] [0670] [0671] [0672] [0673] [0674] [0675] [0676] [0677] [0678] [0679] [0680] [0681] [0682] [0683] [0684] [0685] [0686] [0687] [0688] [0689] [0690] [0691] [0692] [0693] [0694] [0695] [0696] [0697] [0698] [0699] [0700] [0701] [0702] [0703] [0704] [0705] [0706] [0707] [0708] [0709] [0710] [0711] [0712] [0713] [0714] [0715] [0716] [0717] [0718] [0719] [0720] [0721] [0722] [0723] [0724] [0725] [0726] [0727] [0728] [0729] [0730] [0731] [0732] [0733] [0734] [0735] [0736] [0737] [0738] [0739] [0740] [0741] [0742] [0743] [0744] [0745] [0746] [0747] [0748] [0749] [0750] [0751] [0752] [0753] [0754] [0755] [0756] [0757] [0758] [0759] [0760] [0761] [0762] [0763] [0764] [0765] [0766] [0767] [0768] [0769] [0770] [0771] [0772] [0773] [0774] [0775] [0776] [0777] [0778] [0779] [0780] [0781] [0782] [0783] [0784] [0785] [0786] [0787] [0788] [0789] [0790] [0791] [0792] [0793] [0794] [0795] [0796] [0797] [0798] [0799] [0800] [0801] [0802] [0803] [0804] [0805] [0806] [0807] [0808] [0809] [0810] [0811] [0812] [0813] [0814] [0815] [0816] [0817] [0818] [0819] [0820] [0821] [0822] [0823] [0824] [0825] [0826] [0827] [0828] [0829] [0830] [0831] [0832] [0833] [0834] [0835] [0836] [0837] [0838] [0839] [0840] [0841] [0842] [0843] [0844] [0845] [0846] [0847] [0848] [0849] [0850] [0851] [0852] [0853] [0854] [0855] [0856] [0857] [0858] [0859] [0860] [0861] [0862] [0863] [0864] [0865] [0866] [0867] [0868] [0869] [0870] [0871] [0872] [0873] [0874] [0875] [0876] [0877] [0878] [0879] [0880] [0881] [0882] [0883] [0884] [0885] [0886] [0887] [0888] [0889] [0890] [0891] [0892] [0893] [0894] [0895] [0896] [0897] [0898] [0899] [0900] [0901] [0902] [0903] [0904] [0905] [0906] [0907] [0908] [0909] [0910] [0911] [0912] [0913] [0914] [0915] [0916] [0917] [0918] [0919] [0920] [0921] [0922] [0923] [0924] [0925] [0926] [0927] [0928] [0929] [0930] [0931] [0932] [0933] [0934] [0935] [0936] [0937] [0938] [0939] [0940] [0941] [0942] [0943] [0944] [0945] [0946] [0947] [0948] [0949] [0950] [0951] [0952] [0953] [0954] [0955] [0956] [0957] [0958] [0959] [0960] [0961] [0962] [0963] [0964] [0965] [0966] [0967] [0968] [0969] [0970] [0971] [0972] [0973] [0974] [0975]
/*****************************************************************************/ /* ProxyMaint.c See PROXYCACHE.C for commentary. This module implements both the ROUTINE and REACTIVE purge maintenance for the proxy file cache. See PROXYCACHE.C module for information on cache management strategy. VERSION HISTORY --------------- 20-MAR-2021 MGD reduced to a shadow of its former self (caching obsolete) 28-APR-2018 MGD refactor Admin..() AST delivery 18-JAN-2010 JPP bugfix; ProxyMaintInit() use v10orPrev10() for scan spec 19-AUG-2007 MGD use PercentOf() to avoid divide-by-zero exceptions 12-APR-2005 MGD ProxyMaintSupervisor() return if caching not enabled 04-SEP-2004 MGD PROXYCACHE.C v9.0.0 cache file header date/time usage 30-APR-2004 MGD use QIO to erase cache file (save a few cycles) 13-JAN-2004 MGD DECC 6.2 objected to '$DESCRIPTOR(name,ptr->string)' 11-JUN-2003 MGD bugfix; ProxyMaintDeviceStats() volume count (set) handling 11-MAY-2003 MGD proxy unknown request fields 29-APR-2003 MGD add proxy cache device error count statistics 02-APR-2003 MGD maintain 'ProxyXForwardedFor', modify for 'ProxyForwarded' 20-FEB-2003 MGD ProxytMaintSupervisor() used instead of timers, background purge (set with '[ProxyCacheRoutineHourOfDay] 24') 03-JUN-2002 MGD bugfix; ensure sys$search() RMS channel is released 15-MAY-2002 MGD proxy gateway statistics 11-APR-2002 MGD make a reactive purge initially more agressive, bugfix; switch return not break with next reactive scan 04-APR-2002 MGD add command-line and menu STOP to cache scans, update admin and monitor status string with scan progress, bugfix; command-line cache maintenance reporting 02-FEB-2002 MGD rework POSTed query due to request body processing changes 22-SEP-2001 MGD InstanceLock/UnLock() to control access to cache 04-AUG-2001 MGD support module WATCHing 07-MAY-2001 MGD monitor global section accounting changes 05-APR-2001 MGD add boolean to prevent ProxyMaintCacheLock() lock status block overwriting if multiple scans intiated from Admin Menu 20-DEC-2000 MGD routine proxy maintainence optionally disabled/external 13-SEP-2000 MGD ProxyMaintReport() call refined to optionally provide host name cache entries 08-JUL-2000 MGD add VMS locking around cache scan (for clusters) 04-MAR-2000 MGD use FaolToBuffer(), et.al. 03-JAN-2000 MGD no changes required for ODS-5 compliance ... it's not (see note in PROXYCACHE.C) 30-DEC-1999 MGD change $GETDVI() to $GETDVIW() (potential bugfix) 04-DEC-1999 MGD rework startup cache device and report details 22-OCT-1999 MGD inaccessable cache device non-fatal during startup 20-JUN-1999 MGD allow for cache devices >9GB in space calculations, some refinement to statistics report 19-AUG-1998 MGD initial development (recommenced DEC 1998) */ /*****************************************************************************/ #ifdef WASD_VMS_V7 #undef _VMS__V6__SOURCE #define _VMS__V6__SOURCE #undef __VMS_VER #define __VMS_VER 70000000 #undef __CRTL_VER #define __CRTL_VER 70000000 #endif /* standard C header files */ #include <ctype.h> #include <errno.h> #include <stdio.h> #include <string.h> /* VMS related header files */ #include <atrdef.h> #include <descrip.h> #include <dvidef.h> #include <fibdef.h> #include <iodef.h> #include <lkidef.h> #include <lckdef.h> #include <prvdef.h> #include <rmsdef.h> #include <ssdef.h> #include <stsdef.h> /* application-related header files */ #include "wasd.h" #define WASD_MODULE "PROXYMAINT" /******************/ /* global storage */ /******************/ char ErrorProxyMaintTooManyDevices [] = "Volume set has too many members."; BOOL ProxyMaintChangeToReactive, ProxyMaintStopScan; int ProxyMaintAllocBlocks, ProxyMaintBackgroundFileCount, ProxyMaintBackgroundInterval, ProxyMaintBackgroundPurgeCount, ProxyMaintDeletedAllocBlocks, ProxyMaintDeletedCount, ProxyMaintDeletedUsedBlocks, ProxyMaintFileAllocBlocks, ProxyMaintFileCount, ProxyMaintFileUsedBlocks, ProxyMaintPurgeAtHour, ProxyMaintPurgeHoursIndex, ProxyMaintReactivePurgeCount, ProxyMaintResultFileNameLength, ProxyMaintRoutinePurgeCount, ProxyMaintRoutineHoursIndex, ProxyMaintScanFileSpecLength, ProxyMaintScanType, ProxyMaintStatScanCount, ProxyMaintTargetPercent; ProxyMaintUsedBlocks; unsigned long ProxyMaintScanStartTime64 [2]; char *ProxyMaintScanFileSpec; char ProxyMaintEraseFileName [256], ProxyMaintExpandedFileName [256], ProxyMaintStatusStringBckGrnd [128] = "<i>none</i>", ProxyMaintStatusStringReactive [196] = "<i>none</i>", ProxyMaintStatusStringRoutine [128] = "<i>none</i>", ProxyMaintStatusStringStatScan [128] = "<i>none</i>", ProxyMaintResultFileName [256]; /********************/ /* external storage */ /********************/ extern BOOL ProxyServingEnabled, ProxyUnknownRequestFields; extern int EfnWait, EfnNoWait, HttpdTickSecond, OpcomMessages, ProxyConnectPersistMax, ProxyConnectPersistSeconds, ProxyConnectTimeoutSeconds, ProxyForwardedBy, ProxyHostLookupRetryCount, ProxyNetConnectCount, ProxyVerifyRecordMax, ProxyXForwardedFor; extern int ToLowerCase[], ToUpperCase[]; extern char CliProxyMaint[], ErrorSanityCheck[], ServerHostPort[]; extern unsigned short HttpdTime7[]; extern ACCOUNTING_STRUCT *AccountingPtr; extern CONFIG_STRUCT Config; extern MSG_STRUCT Msgs; extern PROXY_ACCOUNTING_STRUCT *ProxyAccountingPtr; extern PROXYVERIFY_GBLSEC *ProxyVerifyGblSecPtr; extern WATCH_STRUCT Watch; /*****************************************************************************/ /* Return a report and control menu related proxy serving. */ ProxyMaintReport (REQUEST_STRUCT *rqptr) { int status; /*********/ /* begin */ /*********/ if (WATCHMOD (rqptr, WATCH_MOD_PROXY)) WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintReport()"); AdminPageTitle (rqptr, "Proxy Report"); status = ProxyMaintStatsReport (rqptr, true); if (VMSnok (status)) { rqptr->rqResponse.ErrorTextPtr = "ProxyMaintStatisticsReport()"; ErrorVmsStatus (rqptr, status, FI_LI); AdminEnd (rqptr); return; } status = ProxyMaintFunctionReport (rqptr); if (VMSnok (status)) { rqptr->rqResponse.ErrorTextPtr = "ProxyMaintFunctionReport()"; ErrorVmsStatus (rqptr, status, FI_LI); AdminEnd (rqptr); return; } rqptr->rqResponse.PreExpired = PRE_EXPIRE_ADMIN; ResponseHeader200 (rqptr, "text/html", &rqptr->NetWriteBufferDsc); AdminEnd (rqptr); } /*****************************************************************************/ /* Return a report on proxy serving. */ int ProxyMaintStatsReport ( REQUEST_STRUCT *rqptr, BOOL StatisticsReport ) { static char ResponseFao [] = "<p><table class=\"ctgry\">\n\ <tr><th class=\"ctttl\" colspan=\"2\">Statistics!AZ</th></tr>\n\ <tr><td>\n\ <table class=\"rghtlft\">\n\ \ <tr><td>\n\ <table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\ <tr><th class=\"sbttl\">Proxy Total</th>\ <tr><th>Requests:</th><td>!&L</td></tr>\n\ <tr><th>Bytes:</th><td colspan=\"2\" align=\"left\">!&,@SQ</td></tr>\n\ </table>\n\ </td></tr>\n\ \ <tr><td> </td></tr>\n\ \ <tr><td>\n\ <table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\ <tr><th class=\"sbttl\">Method</th>\ <tr><th>CONNECT:</th><td>!&L</td></tr>\n\ <tr><th>DELETE:</th><td>!&L</td></tr>\n\ <tr><th>GET:</th><td>!&L</td></tr>\n\ <tr><th>HEAD:</th><td>!&L</td></tr>\n\ <tr><th>OPTIONS:</th><td>!&L</td></tr>\n\ <tr><th>POST:</th><td>!&L</td></tr>\n\ <tr><th>PUT:</th><td>!&L</td></tr>\n\ <tr><th>TRACE:</th><td>!&L</td></tr>\n\ <tr><th>WebDAV:</th><td>!&L</td></tr>\n\ <tr><th>Extension:</th><td>!&L</td></tr>\n\ <tr><th>(SSH):</th><td>!&L</td></tr>\n\ </table>\n\ </td></tr>\n\ \ <tr><td> </td></tr>\n\ \ <tr><td style=\"padding-left:1em;\">\n\ <table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\ <tr><th class=\"sbttl\">SOCKS5</th>\ <tr><th>Total:</th><td>!&L</td></tr>\n\ <tr><th>Success:</th><td>!&L</td></tr>\n\ <tr><th>Fail:</th><td>!&L</td></tr>\n\ </table>\n\ </td></tr>\n\ \ </table>\n\ </td>\ \ <td>\n\ <table class=\"rghtlft\">\n\ \ <tr><td>\n\ <table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\ <tr><th class=\"sbttl\">Network</th></tr>\n\ <tr><th>Requested:</th><td>!&L</td></tr>\n\ <tr><th>IPv4:</th><td>!&L</td><td>(!UL%)</td></tr>\n\ <tr><th>IPv6:</th><td>!&L</td><td>(!UL%)</td></tr>\n\ <tr><th>Persistent /Current</th>\ <td>!&L</td>!&@</tr>\n\ <tr><th>/Peak</th><td>!&L</td></tr>\n\ <tr><th>/Count</th><td>!&L</td><td>(!UL%)</td></tr>\n\ <tr><th>Rx:</th><td>!&,@SQ</td>\ <td rowspan=\"2\" valign=\"middle\" \ style=\"vertical-align:center;\">(!UL%)</td></tr>\n\ <tr><th>Tx:</th><td>!&,@SQ</td></tr>\n\ <tr><th>1nn:</th><td>!&L</td></tr>\n\ <tr><th>2nn:</th><td>!&L</td></tr>\n\ <tr><th>3nn:</th><td>!&L</td></tr>\n\ <tr><th>4nn:</th><td>!&L</td></tr>\n\ <tr><th>5nn:</th><td>!&L</td></tr>\n\ <tr><th><i>none</i>:</th><td>!&L</td></tr>\n\ </td></tr>\n\ \ <tr><td> </td></tr>\n\ \ <tr><td>\ <tr><th class=\"sbttl\">Host Resolution</th>\ <tr><th>Literal:</th><td>!&L</td></tr>\n\ <tr><th>DNS:</th><td>!&L</td><td>(!UL%)</td></tr>\n\ <tr><th>Cache:</th><td>!&L</td></tr>\n\ <tr><th>Error:</th><td>!&L</td></tr>\n\ </td></tr>\n\ \ </table>\n\ </td></tr>\n\ \ </table>\n\ </td></tr>\n\ </table>\n"; int status, ConnectCountNetwork, PercentBytesNetwork, PercentCountIpv4, PercentCountIpv6, PercentCountNetwork, PercentCountPersist, PercentDnsName, TotalCount; int64 BytesRaw64, BytesRawRx64, BytesRawTx64, BytesTotal64; unsigned short Length; unsigned long FaoVector [64]; unsigned long *vecptr; char Buffer [2048]; $DESCRIPTOR (BufferDsc, Buffer); /*********/ /* begin */ /*********/ if (WATCHMOD (rqptr, WATCH_MOD_PROXY)) WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintStatsReport()"); InstanceMutexLock (INSTANCE_MUTEX_HTTPD); /*********/ /* bytes */ /*********/ BytesRaw64 = ProxyAccountingPtr->BytesRawRx64 + ProxyAccountingPtr->BytesRawTx64; PercentBytesNetwork = PercentOf64 (&BytesRaw64, &BytesTotal64); /*********************/ /* counts percentage */ /*********************/ ConnectCountNetwork = ProxyAccountingPtr->ConnectIpv4Count + ProxyAccountingPtr->ConnectIpv6Count; PercentCountIpv4 = PercentOf32 (&ProxyAccountingPtr->ConnectIpv4Count, &ConnectCountNetwork); PercentCountIpv6 = PercentOf32 (&ProxyAccountingPtr->ConnectIpv6Count, &ConnectCountNetwork); PercentCountPersist = PercentOf32 (&ProxyAccountingPtr->ConnectPersistCount, &ConnectCountNetwork); /* get these values because of the locking requirements */ BytesRawRx64 = ProxyAccountingPtr->BytesRawRx64; BytesRawTx64 = ProxyAccountingPtr->BytesRawTx64; TotalCount = AccountingPtr->LookupDnsNameCount + AccountingPtr->LookupCacheNameCount; if (TotalCount) PercentDnsName = AccountingPtr->LookupDnsNameCount * 100 / TotalCount; else PercentDnsName = 0; /***********/ /* display */ /***********/ vecptr = FaoVector; if (ProxyServingEnabled) *vecptr++ = ""; else *vecptr++ = "<span style=\"color:#ff0000\"> ... DISABLED</span>"; *vecptr++ = AccountingPtr->DoProxyCount; *vecptr++ = &BytesRaw64; *vecptr++ = ProxyAccountingPtr->MethodConnectCount; *vecptr++ = ProxyAccountingPtr->MethodDeleteCount; *vecptr++ = ProxyAccountingPtr->MethodGetCount; *vecptr++ = ProxyAccountingPtr->MethodHeadCount; *vecptr++ = ProxyAccountingPtr->MethodOptionsCount; *vecptr++ = ProxyAccountingPtr->MethodPostCount; *vecptr++ = ProxyAccountingPtr->MethodPutCount; *vecptr++ = ProxyAccountingPtr->MethodTraceCount; *vecptr++ = ProxyAccountingPtr->MethodWebDavCopyCount + ProxyAccountingPtr->MethodWebDavLockCount + ProxyAccountingPtr->MethodWebDavMkColCount + ProxyAccountingPtr->MethodWebDavMoveCount + ProxyAccountingPtr->MethodWebDavPropFindCount + ProxyAccountingPtr->MethodWebDavPropPatchCount + ProxyAccountingPtr->MethodWebDavUnLockCount; *vecptr++ = ProxyAccountingPtr->MethodExtensionCount; *vecptr++ = ProxyAccountingPtr->MethodSshCount; *vecptr++ = ProxyAccountingPtr->Socks5Count; *vecptr++ = ProxyAccountingPtr->Socks5SuccessCount; *vecptr++ = ProxyAccountingPtr->Socks5FailCount; *vecptr++ = ConnectCountNetwork; *vecptr++ = ProxyAccountingPtr->ConnectIpv4Count; *vecptr++ = PercentCountIpv4; *vecptr++ = ProxyAccountingPtr->ConnectIpv6Count; *vecptr++ = PercentCountIpv6; *vecptr++ = ProxyNetConnectCount; if (StatisticsReport) { *vecptr++ = "<td colspan=\"2\">\ <a class=\"abttn bttn300\" href=\"!AZ\">Report</a></td>"; *vecptr++ = ADMIN_REPORT_PROXY_PERSISTENT; } else *vecptr++ = ""; *vecptr++ = ProxyAccountingPtr->ConnectPersistPeak; *vecptr++ = ProxyAccountingPtr->ConnectPersistCount; *vecptr++ = PercentCountPersist; *vecptr++ = &BytesRawRx64; *vecptr++ = PercentBytesNetwork; *vecptr++ = &BytesRawTx64; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[1]; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[2]; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[3]; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[4]; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[5]; *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[0]; *vecptr++ = AccountingPtr->LookupLiteralCount; *vecptr++ = AccountingPtr->LookupDnsNameCount; *vecptr++ = PercentDnsName; *vecptr++ = AccountingPtr->LookupCacheNameCount; *vecptr++ = AccountingPtr->LookupDnsNameErrorCount; InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD); *vecptr++ = AdminRefresh(); status = FaolToNet (rqptr, ResponseFao, &FaoVector); if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI); return (status); } /*****************************************************************************/ /* Return a report on proxy special functionality. */ int ProxyMaintFunctionReport (REQUEST_STRUCT *rqptr) { static char ResponseFao [] = "<p><table class=\"ctgry\">\n\ <tr><th class=\"ctttl\">Function!AZ</th></tr>\n\ <tr><td>\n\ <table class=\"rghtlft\">\n\ <tr><td>\n\ \ <table class=\"rghtlft\">\n\ <tr><th class=\"sbttl tacnt\" colspan=\"4\">Gateway</th></tr>\n\ <tr><th class=\"tacnt\">Out \\ In:</th>\ <th class=\"talft\">HTTP</th>\ <th class=\"talft\">HTTPS</th>\ </tr>\n\ <tr>\ <th>HTTP</th>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>HTTPS</th>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>FTP</th>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ \ <tr><th class=\"tacnt\">Out \\ In:</th>\ <th class=\"talft\">IPv4</th>\ <th class=\"talft\">IPv6</th>\ </tr>\n\ <tr>\ <th>IPv4</th>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>IPv6</th>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ </table>\n\ </td>\ \ <td> </td>\n\ \ <td colspan=\"3\">\n\ <table class=\"rghtlft\">\n\ <tr><th class=\"sbttl tacnt\" colspan=\"7\">Tunnel</th></tr>\n\ <tr><th class=\"tacnt\">Out \\ In:</th>\ <th class=\"talft\">CONNECT</th>\ <th class=\"talft\">Firewall</th>\ <th class=\"talft\">Raw</th>\ </tr>\n\ <tr>\ <th>CONNECT</th>\ <td>!&L</td>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>HTTP</th>\ <td>!&L</td>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>HTTPS</th>\ <td>!&L</td>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr>\ <th>Raw</th>\ <td>!&L</td>\ <td>!&L</td>\ <td>!&L</td>\ </tr>\n\ <tr><td></td></tr>\n\ <tr><th>Current:</th><td>!&L</td></tr>\n\ </table>\n\ </td>\n\ \ </tr>\n\ \ <tr><td></td></tr>\n\ \ <tr><td>\n\ \ <table class=\"rghtrght\">\n\ <tr><th class=\"sbttl tacnt\" colspan=\"6\">FTP</th></tr>\n\ <tr><th>Total:</th><td>!&L</td>\n\ <th>DELE:</th><td>!&L</td>\n\ <th>DOS:</th><td>!&L</td></tr>\n\ <tr><th>Login Fail:</th><td>!&L</td>\n\ <th>LIST:</th><td>!&L</td>\n\ <th>Unix:</th><td>!&L</td></tr>\n\ <tr><th></th><td></td>\n\ <th>RETR:</th><td>!&L</td>\n\ <th>VMS:</th><td>!&L</td></tr>\n\ <tr><th></th><td></td>\n\ <th>STOR:</th><td>!&L</td>\n\ <th>?:</th><td>!&L</td></tr>\n\ </table>\n\ </td>\ \ <td> </td>\n\ \ <td>\n\ <table class=\"rghtrght\">\n\ <tr><th class=\"sbttl tacnt\" colspan=\"4\">Verify</th></tr>\n\ <tr><th>Max:</th><td>!&L</td>\n\ <th>Full:</th><td>!&L</td></tr>\n\ <tr><th>Current:</th><td>!&L</td>\n\ <th>200:</th><td>!&L</td></tr>\n\ <tr><th>Set:</th><td>!&L</td>\n\ <th>403:</th><td>!&L</td></tr>\n\ <tr><th>Find:</th><td>!&L</td>\n\ <th>404:</th><td>!&L</td></tr>\n\ </table>\n\ </td>\n\ \ <td> </td>\n\ \ <td>\n\ <table class=\"rghtrght\">\n\ <tr><th class=\"sbttl tacnt\" colspan=\"4\">Rework</th></tr>\n\ <tr><th>Count:</th><td>!&L</td></tr>\n\ <tr><th>No Type:</th><td>!&L</td></tr>\n\ <tr><th>Search:</th><td>!&L</td></tr>\n\ <tr><th>Replace:</th><td>!&L</td></tr>\n\ <tr><th>Too Big:</th><td>!&L</td></tr>\n\ </table>\n\ \ </td></tr>\n\ </table>\n\ </td></tr>\n\ </table>\n"; int in, out, status; unsigned short Length; unsigned long FaoVector [64]; unsigned long *vecptr; char Buffer [2048]; $DESCRIPTOR (BufferDsc, Buffer); /*********/ /* begin */ /*********/ if (WATCHMOD (rqptr, WATCH_MOD_PROXY)) WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintFunctionReport()"); InstanceMutexLock (INSTANCE_MUTEX_HTTPD); vecptr = FaoVector; if (ProxyServingEnabled) *vecptr++ = ""; else *vecptr++ = "<span style=\"color:#ff0000\"> ... DISABLED</span>"; /* [http=0,https=1,ftp=2][http=0,https=1] */ *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][0]; *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][0]; *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][1]; *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][1]; *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][2]; *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][2]; /* [ipv4=0,ipv6=1][ipv4=0,ipv6=1] */ *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[0][0]; *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[1][0]; *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[0][1]; *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[1][1]; for (out = 0; out < TUNNEL_COUNT_MAX; out++) { if (out+1 == PROXY_TUNNEL_FIREWALL) continue; for (in = 0; in < TUNNEL_COUNT_MAX; in++) { if (in+1 == PROXY_TUNNEL_HTTP || in+1 == PROXY_TUNNEL_HTTPS) continue; *vecptr++ = ProxyAccountingPtr->TunnelCount[in][out]; } } *vecptr++ = ProxyAccountingPtr->TunnelCurrent; *vecptr++ = ProxyAccountingPtr->FtpCount; *vecptr++ = ProxyAccountingPtr->FtpDeleCount; *vecptr++ = ProxyAccountingPtr->FtpDosCount; *vecptr++ = ProxyAccountingPtr->FtpLoginFailCount; *vecptr++ = ProxyAccountingPtr->FtpListCount; *vecptr++ = ProxyAccountingPtr->FtpUnixCount; *vecptr++ = ProxyAccountingPtr->FtpRetrCount; *vecptr++ = ProxyAccountingPtr->FtpVmsCount; *vecptr++ = ProxyAccountingPtr->FtpStorCount; *vecptr++ = ProxyAccountingPtr->FtpUnknownCount; *vecptr++ = ProxyVerifyRecordMax; *vecptr++ = ProxyAccountingPtr->VerifyFullCount; *vecptr++ = ProxyAccountingPtr->VerifyCurrentCount; *vecptr++ = ProxyAccountingPtr->Verify200Count; *vecptr++ = ProxyAccountingPtr->VerifySetRecordCount; *vecptr++ = ProxyAccountingPtr->Verify403Count; *vecptr++ = ProxyAccountingPtr->VerifyFindRecordCount; *vecptr++ = ProxyAccountingPtr->Verify404Count; *vecptr++ = ProxyAccountingPtr->ReworkCount; *vecptr++ = ProxyAccountingPtr->ReworkNoType; *vecptr++ = ProxyAccountingPtr->ReworkReplaceSearch; *vecptr++ = ProxyAccountingPtr->ReworkReplaceCount; *vecptr++ = ProxyAccountingPtr->ReworkTooBig; InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD); status = FaolToNet (rqptr, ResponseFao, &FaoVector); if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI); return (status); } /*****************************************************************************/ /* Return a ontrol menu for dynamically adjusting proxy serving. */ ProxyMaintAdjust (REQUEST_STRUCT *rqptr) { static char ResponseFao [] = "!AZ\ <html>\n\ <head>\n\ !AZ\ !AZ\ <title>WASD !AZ ... Proxy Report/Maintenance</title>\n\ </head>\n\ !AZ\n\ <div class=\"wasd\">\n\ <h2><nobr>WASD !AZ</nobr></h2>\n\ <h3>Proxy Report/Maintenance</h3>\n\ !20&W\n\ \ <form method=\"POST\" action=\"!AZ\">\n\ \ <p><table class=\"ctgry\">\n\ <tr><th class=\"ctttl\">Adjust Executing Server</th></tr>\n\ <tr><td>\n\ <table class=\"rghtlft\">\n\ <tr><th>Serving:</th><td>\n\ <input type=\"radio\" name=\"ProxyServingEnabled\" value=\"enabled\"!AZ>enabled\n\ <input type=\"radio\" name=\"ProxyServingEnabled\" value=\"disabled\"!AZ>disabled\n\ </td></tr>\n\ <tr><th>Unknown Request Fields:</th><td>\n\ <input type=\"radio\" name=\"ProxyUnknownRequestFields\" value=\"enabled\"!AZ>enabled\n\ <input type=\"radio\" name=\"ProxyUnknownRequestFields\" value=\"disabled\"!AZ>disabled\n\ </td></tr>\n\ <tr><th>Add "Forwarded: by":</th><td>\n\ <input type=\"text\" size=\"10\" name=\"ProxyForwarded\" value=\"!AZ\">\n\ </td></tr>\n\ <tr><th>Add "X-Forwarded-For:":</th><td>\n\ <input type=\"text\" size=\"10\" name=\"ProxyXForwardedFor\" value=\"!AZ\">\n\ </td></tr>\n\ <tr><th>Host Name Lookup Retry:</th><td>\n\ <input type=\"text\" size=\"3\" name=\"ProxyHostLookupRetryCount\" value=\"!UL\">\n\ attempts</td></tr>\n\ <tr><th>Connect Timeout Seconds:</th><td>\n\ <input type=\"text\" size=\"7\" name=\"ProxyConnectTimeoutSeconds\" value=\"!AZ\">\n\ hh:mm:ss</td></tr>\n\ <tr><th>Connect Persist Max:</th><td>\n\ <input type=\"text\" size=\"3\" name=\"ProxyConnectPersistMax\" value=\"!UL\">\n\ connections</td></tr>\n\ <tr><th>Connect Persist Seconds:</th><td>\n\ <input type=\"text\" size=\"7\" name=\"ProxyConnectPersistSeconds\" value=\"!AZ\">\n\ hh:mm:ss</td></tr>\n\ <tr><td colspan=\"3\"><br>\n\ <input type=\"submit\" name=\"makechanges\" value=\" Make Changes \">\n\ <input type=reset value=\" Reset \">\n\ </td></tr>\n\ </table>\n\ </td></tr>\n\ </table>\n\ \ </form>\n\ \ </body>\n\ </html>\n"; #define REPBOOL(b)\ if (b)\ {\ *vecptr++ = RadioButtonChecked;\ *vecptr++ = RadioButtonUnchecked;\ }\ else\ {\ *vecptr++ = RadioButtonUnchecked;\ *vecptr++ = RadioButtonChecked;\ } static char RadioButtonChecked [] = " CHECKED", RadioButtonUnchecked [] = ""; int status; unsigned long FaoVector [64]; unsigned long *vecptr; /*********/ /* begin */ /*********/ if (WATCHMOD (rqptr, WATCH_MOD_PROXY)) WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintAdjustMenu()"); vecptr = FaoVector; *vecptr++ = WASD_DOCTYPE; *vecptr++ = HtmlMetaInfo (rqptr, NULL); *vecptr++ = AdminWasdCss (); *vecptr++ = ServerHostPort; *vecptr++ = ADMIN_BODY_TAG; *vecptr++ = ServerHostPort; *vecptr++ = &rqptr->rqTime.BeginTime64; *vecptr++ = ADMIN_CONTROL_PROXY_ADJUST_NOW; REPBOOL (ProxyServingEnabled) REPBOOL (ProxyUnknownRequestFields) if (ProxyForwardedBy == PROXY_FORWARDED_BY) *vecptr++ = "BY"; else if (ProxyForwardedBy == PROXY_FORWARDED_FOR) *vecptr++ = "FOR"; else *vecptr++ = "disabled"; if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_ENABLED) *vecptr++ = "ENABLED"; else if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_ADDRESS) *vecptr++ = "ADDRESS"; else if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_UNKNOWN) *vecptr++ = "UNKNOWN"; else *vecptr++ = "disabled"; *vecptr++ = ProxyHostLookupRetryCount; *vecptr++ = MetaConShowSeconds (rqptr, ProxyConnectTimeoutSeconds); *vecptr++ = ProxyConnectPersistMax; *vecptr++ = MetaConShowSeconds (rqptr, ProxyConnectPersistSeconds); status = FaolToNet (rqptr, ResponseFao, &FaoVector); if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI); rqptr->rqResponse.PreExpired = PRE_EXPIRE_ADMIN; ResponseHeader200 (rqptr, "text/html", &rqptr->NetWriteBufferDsc); AdminEnd (rqptr); } /*****************************************************************************/ /* */ ProxyMaintControl (REQUEST_STRUCT *rqptr) { BOOL MakeChanges; int status; unsigned short Length; char *cptr, *qptr, *sptr, *zptr; char FieldName [128], FieldValue [256]; /*********/ /* begin */ /*********/ if (WATCHMOD (rqptr, WATCH_MOD_PROXY)) WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintControl()"); MakeChanges = false; /**********************/ /* parse content body */ /**********************/ if (rqptr->rqHeader.Method == HTTP_METHOD_POST) { if (!rqptr->rqBody.DataPtr) { /* read all the request body (special case) then AST back */ BodyReadBegin (rqptr, &ProxyMaintControl, &BodyProcessReadAll); return; } qptr = rqptr->rqBody.DataPtr; } else qptr = rqptr->rqHeader.QueryStringPtr; while (*qptr) { status = StringParseQuery (&qptr, FieldName, sizeof(FieldName), FieldValue, sizeof(FieldValue)); if (VMSnok (status)) { /* error occured */ if (status == SS$_IVCHAR) rqptr->rqResponse.HttpStatus = 400; rqptr->rqResponse.ErrorTextPtr = "parsing query string"; ErrorVmsStatus (rqptr, status, FI_LI); AdminEnd (rqptr); return; } /************************/ /* action button fields */ /************************/ if (strsame (FieldName, "hostname", -1)) { TcpIpHostCacheSupervisor ((unsigned int)-1); ReportSuccess (rqptr, "Server !AZ host name cache purged.", ServerHostPort); } else if (strsame (FieldName, "makechanges", -1)) MakeChanges = true; else if (strsame (FieldName, "ProxyForwarded", -1)) { if (TOUP(FieldValue[0]) == 'B') ProxyForwardedBy = PROXY_FORWARDED_BY; else if (TOUP(FieldValue[0]) == 'F') ProxyForwardedBy = PROXY_FORWARDED_FOR; else ProxyForwardedBy = PROXY_FORWARDED_DISABLED; } else if (strsame (FieldName, "ProxyXForwardedFor", -1)) { if (TOUP(FieldValue[0]) == 'A') ProxyXForwardedFor = PROXY_XFORWARDEDFOR_ADDRESS; else if (TOUP(FieldValue[0]) == 'E') ProxyXForwardedFor = PROXY_XFORWARDEDFOR_ENABLED; else if (TOUP(FieldValue[0]) == 'U') ProxyXForwardedFor = PROXY_XFORWARDEDFOR_UNKNOWN; else ProxyXForwardedFor = PROXY_XFORWARDEDFOR_DISABLED; } else if (strsame (FieldName, "ProxyServingEnabled", -1)) { InstanceMutexLock (INSTANCE_MUTEX_HTTPD); if (TOUP(FieldValue[0]) == 'E') ProxyServingEnabled = ProxyAccountingPtr->ServingEnabled = true; else if (TOUP(FieldValue[0]) == 'D') ProxyServingEnabled = ProxyAccountingPtr->ServingEnabled = false; InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD); } else if (strsame (FieldName, "ProxyHostLookupRetryCount", -1)) { ProxyHostLookupRetryCount = atoi(FieldValue); if (ProxyHostLookupRetryCount < 0 || ProxyHostLookupRetryCount > 100) ProxyHostLookupRetryCount = 0; } else if (strsame (FieldName, "ProxyConnectPersistMax", -1)) ProxyConnectPersistMax = atoi(FieldValue); else if (strsame (FieldName, "ProxyConnectPersistSeconds", -1)) ProxyConnectPersistSeconds = MetaConSetSeconds (NULL, FieldValue, 1); else if (strsame (FieldName, "ProxyConnectTimeoutSeconds", -1)) ProxyConnectTimeoutSeconds = MetaConSetSeconds (NULL, FieldValue, 1); else if (strsame (FieldName, "ProxyUnknownRequestFields", -1)) { if (TOUP(FieldValue[0]) == 'E') ProxyUnknownRequestFields = true; else if (TOUP(FieldValue[0]) == 'D') ProxyUnknownRequestFields = false; } else { /***********/ /* unknown */ /***********/ ErrorGeneral (rqptr, "Unknown query field.", FI_LI); return; } } if (MakeChanges) { ProxyNetInit (); ReportSuccess (rqptr, "Server !AZ new proxy values loaded.", ServerHostPort); } AdminEnd (rqptr); } /****************************************************************************/