Initial commit: Server configurations and license management
This commit is contained in:
BIN
NX Licenses/DocumentationProxy.3.3.1.aol
Normal file
BIN
NX Licenses/DocumentationProxy.3.3.1.aol
Normal file
Binary file not shown.
416
NX Licenses/License_Ugslmd.txt
Normal file
416
NX Licenses/License_Ugslmd.txt
Normal file
@@ -0,0 +1,416 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# Siemens Industry Software Inc. #
|
||||||
|
# License File #
|
||||||
|
# #
|
||||||
|
# Sold-To/Install: 10219284 WebKey Access Code: 94H8K31Z45 #
|
||||||
|
# Contact Name: Mayahtt Licensing NA Created: 11/26/2025 #
|
||||||
|
# Customer Name: Atomaste #
|
||||||
|
# E-mail Address: antoine@atomaste.ca Version: 2506 #
|
||||||
|
# Type: Production 1 #
|
||||||
|
################################################################################
|
||||||
|
# For issues with the license file please open a service ticket at #
|
||||||
|
# https://www.sw.siemens.com/en-US/support-services/ #
|
||||||
|
# #
|
||||||
|
################################################################################
|
||||||
|
SERVER YourHostname ANY 28000
|
||||||
|
VENDOR ugslmd
|
||||||
|
PACKAGE NX93300 ugslmd 2025.06 COMPONENTS="NX93300_3d_to_2d_flattener \
|
||||||
|
NX93300_adv_assemblies NX93300_assemblies \
|
||||||
|
NX93300_design_studio NX93300_drafting NX93300_dxf_to_ug \
|
||||||
|
NX93300_dxfdwg NX93300_features_modeling \
|
||||||
|
NX93300_free_form_modeling NX93300_gateway \
|
||||||
|
NX93300_geometric_tol NX93300_grip_execute NX93300_iges \
|
||||||
|
NX93300_nx_design_explr_eval NX93300_nx_freeform_1 \
|
||||||
|
NX93300_nx_freeform_2 NX93300_nx_ml_region_finder \
|
||||||
|
NX93300_nx_ml_sel_pred_std NX93300_nx_ml_show_hide \
|
||||||
|
NX93300_nx_multi_scale NX93300_nx_nastran_export \
|
||||||
|
NX93300_nx_sheet_metal NX93300_nx_spsd_stress \
|
||||||
|
NX93300_nx_spsd_vibration NX93300_nx_subdivision \
|
||||||
|
NX93300_nx_synchronous NX93300_nx_visual_reporting \
|
||||||
|
NX93300_pcf_package_file NX93300_pstudio_cons \
|
||||||
|
NX93300_pv_ugdatagenerator NX93300_routing_base \
|
||||||
|
NX93300_sla_3d_systems NX93300_solid_modeling \
|
||||||
|
NX93300_step_ap203 NX93300_step_ap214 NX93300_studio_analyze \
|
||||||
|
NX93300_studio_free_form NX93300_studio_render \
|
||||||
|
NX93300_studio_visualize NX93300_ug_checkmate \
|
||||||
|
NX93300_ug_kf_checker NX93300_ug_kf_execute NX93300_ug_nas_des \
|
||||||
|
NX93300_ug_opt_wizard NX93300_ug_prod_des_advisor \
|
||||||
|
NX93300_ug_smart_models NX93300_ug_to_dxf \
|
||||||
|
NX93300_ug_web_express NX93300_ugopen_menuscript \
|
||||||
|
NX93300_usr_defined_features NX93300_wave " OPTIONS=SUITE \
|
||||||
|
SIGN="1A25 C82B 267E 8FE0 B53B 01ED 1C72 5D22 247C 8E77 B1D7 \
|
||||||
|
3754 6068 BBDF F291 0670 F840 5BF3 E795 C408 8C6C 1E30 D331 \
|
||||||
|
77F1 DF45 7FC0 CDCB BBBA 04D3 695C"
|
||||||
|
PACKAGE SC13500 ugslmd 2025.06 COMPONENTS="SC13500_3d_to_2d_flattener \
|
||||||
|
SC13500_assemblies SC13500_dxfdwg SC13500_features_modeling \
|
||||||
|
SC13500_gateway SC13500_grip_execute SC13500_id_ext_fem_beam \
|
||||||
|
SC13500_iges SC13500_nx_freeform_1 SC13500_nx_freeform_2 \
|
||||||
|
SC13500_nx_ftk SC13500_nx_masterfem SC13500_nx_material_system \
|
||||||
|
SC13500_nx_nastran_export SC13500_nx_nastran_import \
|
||||||
|
SC13500_nx_spsd_stress SC13500_nx_spsd_vibration \
|
||||||
|
SC13500_nx_visual_reporting SC13500_pcf_package_file \
|
||||||
|
SC13500_pstudio_cons SC13500_pv_ugdatagenerator \
|
||||||
|
SC13500_sc_enabled SC13500_sla_3d_systems \
|
||||||
|
SC13500_solid_modeling SC13500_step_ap203 SC13500_step_ap214 \
|
||||||
|
SC13500_studio_render SC13500_studio_visualize \
|
||||||
|
SC13500_ug_checkmate SC13500_ug_kf_checker \
|
||||||
|
SC13500_ug_kf_execute SC13500_ug_nas_bn \
|
||||||
|
SC13500_ug_smart_models SC13500_ug_struct_pe_solver \
|
||||||
|
SC13500_ug_web_express SC13500_ugopen_menuscript \
|
||||||
|
SC13500_usr_defined_features" OPTIONS=SUITE SIGN="1257 B7C1 \
|
||||||
|
671A BDB0 D205 6472 EE46 9510 2A46 60D1 1522 E095 8BB7 4403 \
|
||||||
|
4864 1CBD 96B9 4A5B C59D 2FD7 058C 8122 8A11 6F47 53A4 7B73 \
|
||||||
|
C079 424E 84B2 4295"
|
||||||
|
INCREMENT NX93300 ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="NX Design for Industrial Design" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="0921 2972 E79F DEBF 11A2 \
|
||||||
|
A26D C67F B071 D56F D973 2715 B968 9198 6FBF 4CA4 0986 825C \
|
||||||
|
4C2B 2739 D0BF C9D3 778B 2724 B26C A5E8 9878 E5E6 53D4 AF0E \
|
||||||
|
559B"
|
||||||
|
INCREMENT SC13500 ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="1A99 2218 8B08 3AD2 73CC \
|
||||||
|
F260 D83B 306C 6FE2 E1E0 1C1B 1BD1 33A1 CC21 2349 0DC1 A3FD \
|
||||||
|
10B0 7710 5080 894A 92BA 69C8 732E FABE 15CC 6BA2 3EBC 1294 \
|
||||||
|
D299"
|
||||||
|
INCREMENT active_collab ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="16E9 9029 75B8 FEA5 \
|
||||||
|
8519 7DD3 6858 018A 6992 B695 2ADB 6861 0A00 923D CCA6 005A \
|
||||||
|
5FB5 9D23 7E99 F4BD 0401 ABD0 9944 C2B7 1FCD A3D3 B7C5 0E2C \
|
||||||
|
C851 202B"
|
||||||
|
INCREMENT adv_structure_mgt ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1B19 5175 ADB1 69E1 \
|
||||||
|
D5DE E2AB 6135 E2CE 7967 533C E4EC 81E1 5E9A 306E AE4A 1932 \
|
||||||
|
AD3E CEBD 1AD4 6266 E4D3 150E 34B1 2D00 269A 558A 74A8 759E \
|
||||||
|
A16E F14F"
|
||||||
|
INCREMENT ansys_meshers ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="0A20 EF24 B6EA 46F1 9F7F \
|
||||||
|
7149 1E75 4881 46EB ED8E 863B A3F4 A56F 84FA 00FA 13DB 47C9 \
|
||||||
|
1944 5743 4089 D2E5 5A5C BC3F DB45 CAE3 29EC 9738 9165 88C2 \
|
||||||
|
0585"
|
||||||
|
INCREMENT gfem_ansys ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="0A7A 87D9 4526 8C10 ADBB \
|
||||||
|
7780 562E DEA3 2973 422A 2262 2700 C04D BAC0 2629 1B0A B372 \
|
||||||
|
5313 C1F9 8E26 721F C0AD 0BF5 A95A BEA4 0EF9 02A3 280A A7AC \
|
||||||
|
B26F"
|
||||||
|
INCREMENT gfem_nastran ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="1950 DF26 784C 0CE5 B3A1 \
|
||||||
|
F9C4 3BE7 EE91 5E47 979F 260F 9661 A7A6 5930 0F0B 0DEA 8949 \
|
||||||
|
D268 56BD A573 184A 1C6A 9EB1 C5B6 9054 7B24 B602 9D2C CE19 \
|
||||||
|
0CF4"
|
||||||
|
INCREMENT hds_heeds_dll_nx ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="1355 5397 1CE3 90D1 2018 \
|
||||||
|
5CCD 5128 7338 A444 E09C 9F4D 2572 D2A6 423A 42DD 1137 3985 \
|
||||||
|
285E 223D A33F E702 C654 B3B0 23A8 D1C0 ABFE D918 D41E D828 \
|
||||||
|
9DF3"
|
||||||
|
INCREMENT ideas_integration ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0066 09CF F78B D7BB \
|
||||||
|
DF40 980F 9BAA DE46 9322 BBBB 161E A5E0 2D8D CD46 8967 14FC \
|
||||||
|
BF0E 46E5 0DE1 6544 DECC 1DAB E3B0 970D EFDF 556F 8224 DB0A \
|
||||||
|
CFE3 1F4C"
|
||||||
|
INCREMENT nx_design_explr_eval ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="080D C59F 4E60 7D10 49FE \
|
||||||
|
6F55 AFCC A5F0 4512 34F4 AAE3 AB25 7DA2 4E94 043D 1E68 E48B \
|
||||||
|
7F78 6FF5 D9A7 FEB7 8288 B3D8 CC27 CDFC 73BA 0637 464C 5311 \
|
||||||
|
9562"
|
||||||
|
INCREMENT nx_design_token ugslmd 2025.06 03-dec-2025 50 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE ISSUED=26-nov-2025 SIGN="152C 4330 B6BE F1B2 \
|
||||||
|
15A0 E913 1CCF B17B 0475 EB7E 4217 C994 0C5B 7065 B7CB 0DD3 \
|
||||||
|
C22A F151 BB49 7168 1CFD 8E32 0AEB 0078 7A02 608F 40F4 9F6A \
|
||||||
|
E54E 320D"
|
||||||
|
INCREMENT nx_integration ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="055C 70C3 541D 9DD1 \
|
||||||
|
E5B8 3050 CF67 6431 098A D4A8 7134 CCF4 EBFB 2FF6 3358 00D9 \
|
||||||
|
2EB4 74BD F6C8 BA1A 402A 188E 813E D4D5 04CB 5109 051E 3F46 \
|
||||||
|
2F3B 2157"
|
||||||
|
INCREMENT nx_nas_bn_basic_dsk ugslmd 2025.06 03-dec-2025 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE user_info="Common to NX Design for Industrial \
|
||||||
|
Design; Simcenter Structures" ISSUED=26-nov-2025 BORROW=2880 \
|
||||||
|
SIGN="17C6 AC2D EC5A 2782 8BF4 04A8 DF07 3F07 FDD0 F58A D075 \
|
||||||
|
F58A E1AD 9C84 D1C4 03A2 8104 8FA9 4682 B3D5 02E4 947E C0AC \
|
||||||
|
FBEA 2369 957F F5C6 A113 AAB9 62D4"
|
||||||
|
INCREMENT nx_nas_nonlin_dsk ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="08EA A596 E192 1A67 C901 \
|
||||||
|
0B91 E172 7353 EF0E 96C9 A5C7 0B65 7E9D 4BF6 657C 1D2F 435C \
|
||||||
|
7B0D 5290 8E47 3EB7 8CC0 BC29 B136 878D F426 AC4E 7453 130E \
|
||||||
|
342C"
|
||||||
|
INCREMENT nx_synchronous ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="1881 4DA3 33D9 2D3E 73BD \
|
||||||
|
35DD 17E9 59F6 32AC 35CB 8350 4DA0 ECF7 1241 62EA 0CF2 45C5 \
|
||||||
|
FAFE AEA5 DA90 43AA 63CD 4988 0A1F 36AB 55C0 8196 8C10 BD78 \
|
||||||
|
CC18"
|
||||||
|
INCREMENT ple_diagram ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0BF8 A2A0 02D0 4055 \
|
||||||
|
A026 30A1 B0F6 F377 2589 6479 1D72 51BA 96B4 FC52 1D36 02F9 \
|
||||||
|
596D 6325 E480 147A 35A2 C3CF 4FB2 EF01 7A20 2DBF 0B6F D6EB \
|
||||||
|
F37A BDDA"
|
||||||
|
INCREMENT remotesim_plugin ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="08C9 5335 9133 BAA2 E81E \
|
||||||
|
9A07 BADA CE54 C617 5319 0834 EEFE C817 7AD3 3414 0D3E 392C \
|
||||||
|
497D 8E52 6741 88F7 8E63 B482 922E D5F5 A4AA B9C6 757F D150 \
|
||||||
|
DD03"
|
||||||
|
INCREMENT remotesim_server ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="0A2C 0F2D 4B18 4C62 1889 \
|
||||||
|
F0E7 B94A 5658 3794 37E5 AFDB CEED 08D2 DBD0 DBF3 104B 36CB \
|
||||||
|
7664 3FE3 BAD1 94A3 3850 0ADE F3C2 ABDB 4915 790F 4137 8C64 \
|
||||||
|
E8C1"
|
||||||
|
INCREMENT sc3d_dsktop_presence ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="0849 37BB A206 7C6B A33A \
|
||||||
|
3B04 ED69 7E4B 932A 6F1C 3EB8 D564 8BC2 1EC4 B600 01C8 57E2 \
|
||||||
|
F546 802E 1ADC 39D2 F3DF 6135 6E93 BFAE D0AC 3AC2 754B 675C \
|
||||||
|
77A3"
|
||||||
|
INCREMENT sc_design_explr_eval ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="100D E52C 3EF9 2014 0AAA \
|
||||||
|
D4D1 D7CE 447F A9C7 C5BA 6903 F7E4 5193 1936 9ADF 1159 D92E \
|
||||||
|
5E05 DF99 4B51 A444 6989 6AFA 673C 5F21 2DF3 002E 5845 730F \
|
||||||
|
EE4B"
|
||||||
|
INCREMENT teamcenter_admin ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1E00 7C83 E7DB 38AE \
|
||||||
|
1E31 1A0C 2D8B D825 81A4 7C0C 9B59 AEEF 104F 2B74 B119 10CF \
|
||||||
|
687C 457A 54A4 D2D5 08F9 5FDA A69E 336C B373 8B7D 14E9 0333 \
|
||||||
|
AC34 A7D4"
|
||||||
|
INCREMENT teamcenter_author ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1DE6 C4C9 62BA 7037 \
|
||||||
|
E3DB 550E 1CB8 58AE 69EA 04C6 CD22 772C FC02 16D3 16EE 0921 \
|
||||||
|
546B DEDF D069 9192 287D 5775 57A6 3A9F FA84 3A83 486E 38DB \
|
||||||
|
862E 059E"
|
||||||
|
INCREMENT teamcenter_designer ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0909 B063 9ED5 B35D \
|
||||||
|
2F8F 9B7B 0F31 A6F2 97B4 18E7 5BCA D635 77F0 8A3A A8F8 09A2 \
|
||||||
|
B173 9B73 D7A3 744E 19DB 7C38 9A8A 788B 2589 746B C441 B0F9 \
|
||||||
|
5C88 C759"
|
||||||
|
INCREMENT teamcenter_doctor ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0F17 F741 AA07 E493 \
|
||||||
|
C666 A92D 3D07 3895 578B 20A0 ABAE A4FC 9FFF 6947 FCCF 14E9 \
|
||||||
|
0D04 7150 B65D AA02 F581 6479 EBEB 6B24 005B F855 7949 1BD9 \
|
||||||
|
04B0 181B"
|
||||||
|
INCREMENT teamcenter_tcrs ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="08BB D943 BE42 5945 \
|
||||||
|
C5EF 9560 39CC A93A 84FD 01BB 8759 A4AF 0BDE F028 ED36 1896 \
|
||||||
|
B627 2455 C299 ABCB 066C DDE0 B8B3 3863 786B 6335 510F DF55 \
|
||||||
|
5EDD 7832"
|
||||||
|
INCREMENT ug_scenario ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=26-nov-2025 BORROW=2880 SIGN="18C0 BB1F 9A6D F9D5 37E9 \
|
||||||
|
7F70 5D82 880D 74A6 8CDB 7CD9 9771 C35C 4CB2 A64E 014C D206 \
|
||||||
|
49F7 0920 04C4 3C3F E359 9987 C610 A834 5853 453F 91EC E4EC \
|
||||||
|
A789"
|
||||||
|
INCREMENT vendor_mgt ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="00EE 4076 BD93 D0E4 \
|
||||||
|
FECA DC40 D1F6 A4E9 D915 8C0D 9099 3F91 D5F2 7E95 DD04 19F8 \
|
||||||
|
7488 2A07 41E8 4E8A DC88 79C6 B6E6 309A 2A75 A51F 2160 4248 \
|
||||||
|
2BE6 85F8"
|
||||||
|
INCREMENT visview_base ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Common to Simcenter Structures; Tc \
|
||||||
|
Author" ISSUED=26-nov-2025 BORROW=2880 SIGN="1888 6747 B96E \
|
||||||
|
3958 4D2F 284B 55EF 9409 676F 2114 C85B F903 561E F1BC 7D64 \
|
||||||
|
1603 B224 48C3 F930 894E EE27 A15D 36F9 600F D944 B504 3AEF \
|
||||||
|
4B3B 5D54 3AAA"
|
||||||
|
INCREMENT vp_convert ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Tc Author" ISSUED=26-nov-2025 \
|
||||||
|
BORROW=2880 SIGN="0E9A 700F FD75 6033 2D37 C4A4 B846 087E F704 \
|
||||||
|
DF12 6036 07BB 36B4 C639 A1F1 0726 15AF E25A A16A 2239 CBE2 \
|
||||||
|
6108 0BAE 984D 5DFF D0D7 8238 D7A5 803A B9A3"
|
||||||
|
INCREMENT vp_print ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Tc Author" ISSUED=26-nov-2025 \
|
||||||
|
BORROW=2880 SIGN="11CE 4367 8C35 33C6 D4B3 4A76 A0D9 0286 FD66 \
|
||||||
|
E720 DF9D E457 8029 E4E0 C9B8 0BD9 2D68 0697 F1BC CE30 DE71 \
|
||||||
|
0903 7DC2 B138 AC76 0695 06F2 F1D0 8E00 AED7"
|
||||||
|
INCREMENT xc_nx ugslmd 2025.06 03-dec-2025 1 SUPERSEDE DUP_GROUP=NONE \
|
||||||
|
ISSUED=26-nov-2025 SIGN="0CBE 9E31 0C26 0B9A C17E 7B57 50DE \
|
||||||
|
B991 D264 6938 82DE BF6B 039D F7A2 4BC1 0924 651D C9C0 6C2C \
|
||||||
|
F6BA EF75 7C43 9B95 E271 8EE1 885A 4C62 9269 6EEE B4B1"
|
||||||
|
INCREMENT xc_teamcenter ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="121F 25DB 6728 F11E \
|
||||||
|
F885 6E24 1B9F 8885 1C2B 3394 FEF6 EF3E B56B B202 B860 072F \
|
||||||
|
2250 F750 7989 F8EE A560 E5AD 3B52 8324 F594 760A E189 25D7 \
|
||||||
|
75E7 73A0"
|
||||||
|
INCREMENT xc_vis ugslmd 2025.12 03-dec-2025 1 SUPERSEDE DUP_GROUP=UHD \
|
||||||
|
ISSUED=26-nov-2025 SIGN="028C 4AF2 916F 28DA D0B6 80C4 3CE9 \
|
||||||
|
FD89 B4A3 2D81 D928 94C5 2D94 0179 EE6A 0E72 016B 6F07 60F6 \
|
||||||
|
7671 E7F3 59EF AD9C A926 50BB B57A 3D39 5CBA E93B 14BC"
|
||||||
|
INCREMENT borrowing ugslmd 2025.12 permanent 1 DUP_GROUP=NONE \
|
||||||
|
user_info="License Borrow Option" ISSUED=26-nov-2025 \
|
||||||
|
SIGN="10E0 F841 7EFA 75D5 9F7A 4E26 B763 7601 DDFD 3D09 5E8F \
|
||||||
|
3A5D 2E7D E10C 68F2 1403 AA39 A604 B9FA 8870 310B 9848 3936 \
|
||||||
|
B7D0 FD65 530D 37F0 7C26 61F4 4AFA"
|
||||||
|
INCREMENT gateway_id ugslmd 2025.06 permanent 1000 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="I-deas gateway" ISSUED=26-nov-2025 \
|
||||||
|
BORROW=2880 SIGN="0E25 E9DE 76FF 553A 54DC DA57 7C60 AEE5 9B9E \
|
||||||
|
461A 3598 021A 0FFB 0E70 4CBC 05D1 236E 67E9 AF4A 759B 2E59 \
|
||||||
|
2D14 0B13 2210 4DA8 96EE 1AF3 7D68 C928 EDCA"
|
||||||
|
INCREMENT server_id ugslmd 2025.12 permanent 1 \
|
||||||
|
VENDOR_STRING="10219284 - Atomaste" user_info=94H8K31Z45 \
|
||||||
|
ISSUER=SIEMENS BORROW=2880 SIGN="07FC 7D42 D528 9194 8CA1 03CC \
|
||||||
|
7823 7B31 705B A7C1 9B0D A8A2 3B96 8469 B297 0604 9136 7FDC \
|
||||||
|
3D95 C356 F040 5418 E524 BD89 D035 1DC7 60A1 9104 C553 2680"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# SOFTWARE LICENSE TO FEATURE NAME CROSS REFERENCE #
|
||||||
|
# Version: 2506 Created: 11/26/2025 14:04:39#
|
||||||
|
# Atomaste Sold-To/Install: 10219284 #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# LICENSE PRODUCT QTY DESCRIPTION QTY FEATURE NAME
|
||||||
|
|
||||||
|
# --------------- ----- -------------------- ----- ---------------------------
|
||||||
|
# NX35050 1 NX Value Based Licensing 50 pack
|
||||||
|
# 50 nx_design_token
|
||||||
|
# NX93300 1 NX Design for Industrial Design
|
||||||
|
# 1 3d_to_2d_flattener
|
||||||
|
# 1 adv_assemblies
|
||||||
|
# 1 assemblies
|
||||||
|
# 1 design_studio
|
||||||
|
# 1 drafting
|
||||||
|
# 1 dxf_to_ug
|
||||||
|
# 1 dxfdwg
|
||||||
|
# 1 features_modeling
|
||||||
|
# 1 free_form_modeling
|
||||||
|
# 1 gateway
|
||||||
|
# 1 geometric_tol
|
||||||
|
# 1 grip_execute
|
||||||
|
# 1 ideas_integration
|
||||||
|
# 1 iges
|
||||||
|
# 1 nx_design_explr_eval
|
||||||
|
# 1 nx_freeform_1
|
||||||
|
# 1 nx_freeform_2
|
||||||
|
# 1 nx_integration
|
||||||
|
# 1 nx_ml_region_finder
|
||||||
|
# 1 nx_ml_sel_pred_std
|
||||||
|
# 1 nx_ml_show_hide
|
||||||
|
# 1 nx_multi_scale
|
||||||
|
# 1 nx_nas_bn_basic_dsk
|
||||||
|
# 1 nx_nastran_export
|
||||||
|
# 1 nx_sheet_metal
|
||||||
|
# 1 nx_spsd_stress
|
||||||
|
# 1 nx_spsd_vibration
|
||||||
|
# 1 nx_subdivision
|
||||||
|
# 1 nx_synchronous
|
||||||
|
# 1 nx_visual_reporting
|
||||||
|
# 1 pcf_package_file
|
||||||
|
# 1 ple_diagram
|
||||||
|
# 1 pstudio_cons
|
||||||
|
# 1 pv_ugdatagenerator
|
||||||
|
# 1 routing_base
|
||||||
|
# 1 sla_3d_systems
|
||||||
|
# 1 solid_modeling
|
||||||
|
# 1 step_ap203
|
||||||
|
# 1 step_ap214
|
||||||
|
# 1 studio_analyze
|
||||||
|
# 1 studio_free_form
|
||||||
|
# 1 studio_render
|
||||||
|
# 1 studio_visualize
|
||||||
|
# 1 ug_checkmate
|
||||||
|
# 1 ug_kf_checker
|
||||||
|
# 1 ug_kf_execute
|
||||||
|
# 1 ug_nas_des
|
||||||
|
# 1 ug_opt_wizard
|
||||||
|
# 1 ug_prod_des_advisor
|
||||||
|
# 1 ug_smart_models
|
||||||
|
# 1 ug_to_dxf
|
||||||
|
# 1 ug_web_express
|
||||||
|
# 1 ugopen_menuscript
|
||||||
|
# 1 usr_defined_features
|
||||||
|
# 1 wave
|
||||||
|
# SC13500 1 Simcenter Structures 1 3d_to_2d_flattener
|
||||||
|
# 1 ansys_meshers
|
||||||
|
# 1 assemblies
|
||||||
|
# 1 dxfdwg
|
||||||
|
# 1 features_modeling
|
||||||
|
# 1 gateway
|
||||||
|
# 1 gfem_ansys
|
||||||
|
# 1 gfem_nastran
|
||||||
|
# 1 grip_execute
|
||||||
|
# 1 hds_heeds_dll_nx
|
||||||
|
# 1 id_ext_fem_beam
|
||||||
|
# 1 ideas_integration
|
||||||
|
# 1 iges
|
||||||
|
# 1 nx_design_explr_eval
|
||||||
|
# 1 nx_freeform_1
|
||||||
|
# 1 nx_freeform_2
|
||||||
|
# 1 nx_ftk
|
||||||
|
# 1 nx_integration
|
||||||
|
# 1 nx_masterfem
|
||||||
|
# 1 nx_material_system
|
||||||
|
# 1 nx_nas_bn_basic_dsk
|
||||||
|
# 1 nx_nas_nonlin_dsk
|
||||||
|
# 1 nx_nastran_export
|
||||||
|
# 1 nx_nastran_import
|
||||||
|
# 1 nx_spsd_stress
|
||||||
|
# 1 nx_spsd_vibration
|
||||||
|
# 1 nx_synchronous
|
||||||
|
# 1 nx_visual_reporting
|
||||||
|
# 1 pcf_package_file
|
||||||
|
# 1 pstudio_cons
|
||||||
|
# 1 pv_ugdatagenerator
|
||||||
|
# 1 remotesim_plugin
|
||||||
|
# 1 remotesim_server
|
||||||
|
# 1 sc3d_dsktop_presence
|
||||||
|
# 1 sc_design_explr_eval
|
||||||
|
# 1 sc_enabled
|
||||||
|
# 1 sla_3d_systems
|
||||||
|
# 1 solid_modeling
|
||||||
|
# 1 step_ap203
|
||||||
|
# 1 step_ap214
|
||||||
|
# 1 studio_render
|
||||||
|
# 1 studio_visualize
|
||||||
|
# 1 teamcenter_designer
|
||||||
|
# 1 ug_checkmate
|
||||||
|
# 1 ug_kf_checker
|
||||||
|
# 1 ug_kf_execute
|
||||||
|
# 1 ug_nas_bn
|
||||||
|
# 1 ug_scenario
|
||||||
|
# 1 ug_smart_models
|
||||||
|
# 1 ug_struct_pe_solver
|
||||||
|
# 1 ug_web_express
|
||||||
|
# 1 ugopen_menuscript
|
||||||
|
# 1 usr_defined_features
|
||||||
|
# 1 visview_base
|
||||||
|
# TC10101 1 Tc Author 1 active_collab
|
||||||
|
# 1 adv_structure_mgt
|
||||||
|
# 1 teamcenter_author
|
||||||
|
# 1 teamcenter_doctor
|
||||||
|
# 1 vendor_mgt
|
||||||
|
# 1 visview_base
|
||||||
|
# 1 vp_convert
|
||||||
|
# 1 vp_print
|
||||||
|
# TC50100 1 Teamcenter Rapid Start
|
||||||
|
# 1 teamcenter_tcrs
|
||||||
|
# TCADMIN 2 Teamcenter Admin 2 teamcenter_admin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# The following products are not included on this file #
|
||||||
|
# for the respective reason listed #
|
||||||
|
# #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# PRODUCT QTY DESCRIPTION REASON
|
||||||
|
# ------------------ ----- ----------------------- ---------------------
|
||||||
|
# TC1DOTC 1 Teamcenter Deployment Deployment Option
|
||||||
416
NX Licenses/License_Ugslmd_2.txt
Normal file
416
NX Licenses/License_Ugslmd_2.txt
Normal file
@@ -0,0 +1,416 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# Siemens Industry Software Inc. #
|
||||||
|
# License File #
|
||||||
|
# #
|
||||||
|
# Sold-To/Install: 10219284 WebKey Access Code: R1FCRAKGPG #
|
||||||
|
# Contact Name: Mayahtt Licensing NA Created: 02.12.2025 #
|
||||||
|
# Customer Name: Atomaste #
|
||||||
|
# E-mail Address: licensingna@mayahtt.com Version: 2506 #
|
||||||
|
# Type: Production 1 #
|
||||||
|
################################################################################
|
||||||
|
# For issues with the license file please open a service ticket at #
|
||||||
|
# https://www.sw.siemens.com/en-US/support-services/ #
|
||||||
|
# #
|
||||||
|
################################################################################
|
||||||
|
SERVER dalidou COMPOSITE=88F027D30355 28000
|
||||||
|
VENDOR ugslmd
|
||||||
|
PACKAGE NX93300 ugslmd 2025.06 COMPONENTS="NX93300_3d_to_2d_flattener \
|
||||||
|
NX93300_adv_assemblies NX93300_assemblies \
|
||||||
|
NX93300_design_studio NX93300_drafting NX93300_dxf_to_ug \
|
||||||
|
NX93300_dxfdwg NX93300_features_modeling \
|
||||||
|
NX93300_free_form_modeling NX93300_gateway \
|
||||||
|
NX93300_geometric_tol NX93300_grip_execute NX93300_iges \
|
||||||
|
NX93300_nx_design_explr_eval NX93300_nx_freeform_1 \
|
||||||
|
NX93300_nx_freeform_2 NX93300_nx_ml_region_finder \
|
||||||
|
NX93300_nx_ml_sel_pred_std NX93300_nx_ml_show_hide \
|
||||||
|
NX93300_nx_multi_scale NX93300_nx_nastran_export \
|
||||||
|
NX93300_nx_sheet_metal NX93300_nx_spsd_stress \
|
||||||
|
NX93300_nx_spsd_vibration NX93300_nx_subdivision \
|
||||||
|
NX93300_nx_synchronous NX93300_nx_visual_reporting \
|
||||||
|
NX93300_pcf_package_file NX93300_pstudio_cons \
|
||||||
|
NX93300_pv_ugdatagenerator NX93300_routing_base \
|
||||||
|
NX93300_sla_3d_systems NX93300_solid_modeling \
|
||||||
|
NX93300_step_ap203 NX93300_step_ap214 NX93300_studio_analyze \
|
||||||
|
NX93300_studio_free_form NX93300_studio_render \
|
||||||
|
NX93300_studio_visualize NX93300_ug_checkmate \
|
||||||
|
NX93300_ug_kf_checker NX93300_ug_kf_execute NX93300_ug_nas_des \
|
||||||
|
NX93300_ug_opt_wizard NX93300_ug_prod_des_advisor \
|
||||||
|
NX93300_ug_smart_models NX93300_ug_to_dxf \
|
||||||
|
NX93300_ug_web_express NX93300_ugopen_menuscript \
|
||||||
|
NX93300_usr_defined_features NX93300_wave " OPTIONS=SUITE \
|
||||||
|
SIGN="1A25 C82B 267E 8FE0 B53B 01ED 1C72 5D22 247C 8E77 B1D7 \
|
||||||
|
3754 6068 BBDF F291 0670 F840 5BF3 E795 C408 8C6C 1E30 D331 \
|
||||||
|
77F1 DF45 7FC0 CDCB BBBA 04D3 695C"
|
||||||
|
PACKAGE SC13500 ugslmd 2025.06 COMPONENTS="SC13500_3d_to_2d_flattener \
|
||||||
|
SC13500_assemblies SC13500_dxfdwg SC13500_features_modeling \
|
||||||
|
SC13500_gateway SC13500_grip_execute SC13500_id_ext_fem_beam \
|
||||||
|
SC13500_iges SC13500_nx_freeform_1 SC13500_nx_freeform_2 \
|
||||||
|
SC13500_nx_ftk SC13500_nx_masterfem SC13500_nx_material_system \
|
||||||
|
SC13500_nx_nastran_export SC13500_nx_nastran_import \
|
||||||
|
SC13500_nx_spsd_stress SC13500_nx_spsd_vibration \
|
||||||
|
SC13500_nx_visual_reporting SC13500_pcf_package_file \
|
||||||
|
SC13500_pstudio_cons SC13500_pv_ugdatagenerator \
|
||||||
|
SC13500_sc_enabled SC13500_sla_3d_systems \
|
||||||
|
SC13500_solid_modeling SC13500_step_ap203 SC13500_step_ap214 \
|
||||||
|
SC13500_studio_render SC13500_studio_visualize \
|
||||||
|
SC13500_ug_checkmate SC13500_ug_kf_checker \
|
||||||
|
SC13500_ug_kf_execute SC13500_ug_nas_bn \
|
||||||
|
SC13500_ug_smart_models SC13500_ug_struct_pe_solver \
|
||||||
|
SC13500_ug_web_express SC13500_ugopen_menuscript \
|
||||||
|
SC13500_usr_defined_features" OPTIONS=SUITE SIGN="1257 B7C1 \
|
||||||
|
671A BDB0 D205 6472 EE46 9510 2A46 60D1 1522 E095 8BB7 4403 \
|
||||||
|
4864 1CBD 96B9 4A5B C59D 2FD7 058C 8122 8A11 6F47 53A4 7B73 \
|
||||||
|
C079 424E 84B2 4295"
|
||||||
|
INCREMENT NX93300 ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="NX Design for Industrial Design" \
|
||||||
|
ISSUED=02-dec-2025 BORROW=2880 SIGN="1206 B94C C1B3 EE1F 3F06 \
|
||||||
|
0285 8E3B 8559 84A8 72F1 1436 9086 157A 818A D74D 1C33 1EDC \
|
||||||
|
C297 4C1F 62D2 EA12 AED9 1F23 F836 8766 4396 50D9 7CC3 C914 \
|
||||||
|
C91E"
|
||||||
|
INCREMENT SC13500 ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="047C 6BBB 8D45 F7B2 2AE9 \
|
||||||
|
4E52 49EA 554E 4701 5312 0EEB 19D5 45D7 2BFD 8D80 0E5D 901C \
|
||||||
|
77C1 D037 7191 0A26 9AA5 350C 5197 4AD2 5170 A19C 20F9 0015 \
|
||||||
|
D2E4"
|
||||||
|
INCREMENT active_collab ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1AB8 9C55 D5C9 5000 \
|
||||||
|
0329 C374 E7C9 E84D C96F F06C 1BED C709 2845 D64F CCBA 0D44 \
|
||||||
|
65FD A438 F028 305C A0C2 9306 A8EB 60E4 AD6B 6081 1248 3EF2 \
|
||||||
|
371F DBE9"
|
||||||
|
INCREMENT adv_structure_mgt ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="07A1 34CE 41C7 8373 \
|
||||||
|
999C E10A E38E 0D24 A8D7 6EC5 0A65 941F 70C5 0D75 0619 0B49 \
|
||||||
|
D9A3 48C0 2FD8 0FC5 301D EA59 E100 ACAB A217 3A25 EDB5 D202 \
|
||||||
|
1EC7 20F5"
|
||||||
|
INCREMENT ansys_meshers ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="1E58 CCCE AEB8 F250 B98D \
|
||||||
|
5A51 5D29 4EBB 9B8E 5FC5 C753 75BB 704B ED26 C1A7 0015 1CC3 \
|
||||||
|
1D6C EE0D 5B1D 3661 EFF2 50C6 B10B B630 A15B 17F9 6683 CADE \
|
||||||
|
0925"
|
||||||
|
INCREMENT gfem_ansys ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="0ED7 D431 3BFA DBD6 E43D \
|
||||||
|
1A40 5206 0257 9E85 25E6 4A8F 0E2A 8055 CFA0 A2D6 1DFF 2169 \
|
||||||
|
AF0C 346D 135F 8525 1BB4 5803 F736 87D7 9BB6 96D1 F22D DDDC \
|
||||||
|
99C4"
|
||||||
|
INCREMENT gfem_nastran ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="0BF3 E2D9 453F DD1A 7E6C \
|
||||||
|
FD26 5306 B32F 4174 2C07 CB90 5929 A951 A907 D36B 0CBE 87C2 \
|
||||||
|
7C53 2AE2 47A8 8BA4 1E5A 3405 924F E79F 6F2A 595D 5F6D C1EE \
|
||||||
|
E8D8"
|
||||||
|
INCREMENT hds_heeds_dll_nx ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="1175 361F A1A3 79C5 F89E \
|
||||||
|
256F F16B 9430 E2E0 32E1 8B24 FEA0 2408 BBA4 B0DB 1DFA C0C2 \
|
||||||
|
6C10 4A16 C043 7E61 251F 810E A0ED B8F9 E84A 51B5 439C B33D \
|
||||||
|
A74C"
|
||||||
|
INCREMENT ideas_integration ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="11F6 3EF9 2F63 DA3F \
|
||||||
|
88DB 1631 EB01 C7B4 A1DF 5BF2 46E3 D5D5 E2BD 3FD9 9DC5 0EA4 \
|
||||||
|
7722 FF2D 9F72 C70B A82F B07D CCDF 2651 E607 7145 A0D9 5BBA \
|
||||||
|
868C 0E27"
|
||||||
|
INCREMENT nx_design_explr_eval ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="1DBD 1075 3983 0A98 AA3F \
|
||||||
|
E331 E7EE 0A96 6D2B 156B DF46 564E CB11 8E7B D148 1B91 C141 \
|
||||||
|
6719 E779 301A DF5E 123B 709D 6258 6CF0 385D 521D C216 73CA \
|
||||||
|
1BD9"
|
||||||
|
INCREMENT nx_design_token ugslmd 2025.06 02-mar-2026 50 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE ISSUED=02-dec-2025 SIGN="0C68 ACA8 2B66 005E \
|
||||||
|
3786 2D87 5669 363A 18E4 4E27 B3A7 3E46 F639 74DE 2E76 0D2D \
|
||||||
|
8203 FC7D B00B 3543 8FAE 7B24 ADA3 FFB1 1135 A811 10FA 2FD3 \
|
||||||
|
7520 6271"
|
||||||
|
INCREMENT nx_integration ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1AC9 82E1 FCE5 1A8E \
|
||||||
|
EA07 0FB5 6452 808C 466A 6987 3856 A287 DE42 665D 5057 056D \
|
||||||
|
C589 F16A F59D 5204 F5B4 7B65 1723 0C04 EBA3 D6B2 566D AC81 \
|
||||||
|
FAF4 2C87"
|
||||||
|
INCREMENT nx_nas_bn_basic_dsk ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE user_info="Common to NX Design for Industrial \
|
||||||
|
Design; Simcenter Structures" ISSUED=20-jun-2025 BORROW=2880 \
|
||||||
|
SIGN="05FF 9779 45A2 D31C 53F8 9D51 A54E B39E D362 E0E3 4D2A \
|
||||||
|
BD31 52A5 B654 8BFF 1E44 7DD0 2876 8260 B97F 8D90 4AED 5F7E \
|
||||||
|
A69C 8D43 117E 7F45 DFCE 36BC BA2E"
|
||||||
|
INCREMENT nx_nas_nonlin_dsk ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=NONE user_info="Simcenter Structures" \
|
||||||
|
ISSUED=20-jun-2025 BORROW=2880 SIGN="02CD E1DC 49D0 4194 5FC2 \
|
||||||
|
DF2A 9E9F 6001 6F0D 76E9 21F1 7B09 BA81 CF75 898F 0387 51DE \
|
||||||
|
DC70 1240 ED16 28AB 5AF1 6795 A9C7 079C B6D8 F86A 21E1 18E9 \
|
||||||
|
5FB4"
|
||||||
|
INCREMENT nx_synchronous ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="152E 42DC 20FB 2625 A035 \
|
||||||
|
D8F5 72B0 A66E D7E0 CF30 EF6E 2803 1C87 A5A7 EC7D 1A78 3B61 \
|
||||||
|
C2BD 3434 5489 8119 67A8 51D7 9E28 FCEB 9120 5C00 937C BBA0 \
|
||||||
|
FB02"
|
||||||
|
INCREMENT ple_diagram ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="07E0 994A BC83 FE41 \
|
||||||
|
324B 8ED2 D82F EF23 478E 2DAA EB4B 3BD2 24A5 737B 8F1A 05FE \
|
||||||
|
D1D8 045D A9B2 BB5E B352 EAEC FA5A BAAB 12CF EC7A 1228 7970 \
|
||||||
|
FC9A 66E0"
|
||||||
|
INCREMENT remotesim_plugin ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="0334 936E BC95 4C57 3D0A \
|
||||||
|
01E1 6B30 E07D 6994 AA63 98B7 0646 B711 6B3D 2209 1BC2 C01E \
|
||||||
|
60D5 B074 011B 613F 4D03 87DA 90C3 01B1 9684 C2B5 0FC4 EF13 \
|
||||||
|
C3D6"
|
||||||
|
INCREMENT remotesim_server ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="1465 FF5A 814A CA5F 91CF \
|
||||||
|
261B 794B DF19 BF7A 39A4 9859 27AF 61EE D635 7665 177C 7B09 \
|
||||||
|
D386 4CD9 3FEF EFDC 6727 1CB6 99CE 4554 62FF C10E 8867 AD7D \
|
||||||
|
BBAB"
|
||||||
|
INCREMENT sc3d_dsktop_presence ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="018C A0E4 391F 7CC9 9C27 \
|
||||||
|
E62F 523D A33A 6403 B550 BF4B 905A 2542 2E2E C96C 102C 2448 \
|
||||||
|
CDA0 93A4 E063 7E45 C4F0 5EFE CDB4 E9DC BFEA 387C 8BC9 D99C \
|
||||||
|
FD2A"
|
||||||
|
INCREMENT sc_design_explr_eval ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="0EEF 04F8 AC93 D6DB 096E \
|
||||||
|
AD50 C6A4 B9A1 C374 0FA1 C8D9 2CB1 5E77 95EA AD51 1E4F 111E \
|
||||||
|
750E E84D 8162 A758 DE9A 95AF 6BEC 7E52 36ED 4659 49B7 65C8 \
|
||||||
|
6048"
|
||||||
|
INCREMENT teamcenter_admin ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1279 D52A AD58 8CC7 \
|
||||||
|
E5A6 238E F05A 59C3 3747 F531 CD7C F2C0 0D52 8D9B 38EF 1D6A \
|
||||||
|
BFCB 9E9A D3C8 E83D A12D 6872 E1B5 CE94 FCC4 368F 69D8 74E9 \
|
||||||
|
3387 3F3C"
|
||||||
|
INCREMENT teamcenter_author ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="09EA 669C 1772 DCD8 \
|
||||||
|
2AB4 2563 8292 9F75 5690 95E2 2006 606A 8BC3 3076 33BA 1528 \
|
||||||
|
EFFC 07F5 0365 F46B 67DE EAC5 1BEC 7765 EF6F 00BF 9A81 A1BC \
|
||||||
|
40CE 01C3"
|
||||||
|
INCREMENT teamcenter_designer ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1F2A F164 EC4B FECE \
|
||||||
|
3AF5 8CD1 965F B284 EBF9 F53E B7B7 4E88 4630 C304 83B7 09E9 \
|
||||||
|
46B3 7833 227D 7AAD AA1E 3CD7 25AC 2BD6 770E 008D B3F3 3E76 \
|
||||||
|
1733 FA06"
|
||||||
|
INCREMENT teamcenter_doctor ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="0531 AD8F 0E0C 9B6D \
|
||||||
|
AA88 1DA0 1CC7 0A6D CD61 2C3A 910C 6FB1 A739 00D4 A649 0821 \
|
||||||
|
4AD6 26FE 734C 7185 7A26 D9EC 7E0D 2365 080E 90C8 835F 4676 \
|
||||||
|
DE82 599B"
|
||||||
|
INCREMENT teamcenter_tcrs ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1A3C 6C96 77D8 E045 \
|
||||||
|
B267 691B C20D 74A3 54B9 CBB8 DB85 F899 B2FD 7433 3472 0D55 \
|
||||||
|
CA27 DD19 F33D 5199 AC22 7123 06AA 1057 6072 5BE2 9745 FF5B \
|
||||||
|
884A C519"
|
||||||
|
INCREMENT ug_scenario ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Simcenter Structures" \
|
||||||
|
ISSUED=12-may-2025 BORROW=2880 SIGN="077D 2F9E 5B40 D673 F982 \
|
||||||
|
77F2 D31B 99C8 B639 649B 83B7 83D9 070D 621A 23EF 1361 7027 \
|
||||||
|
4C01 463A DD04 F2C5 FF87 238B 217A 51E6 308C 4A9A 190D 7524 \
|
||||||
|
373E"
|
||||||
|
INCREMENT vendor_mgt ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1898 1CF5 0443 C3C6 \
|
||||||
|
0DB7 D9C2 C15B D43A ECFF BE0F 1396 8B67 BB8F 70A9 EFED 0BF0 \
|
||||||
|
B945 157A DBE8 E2D4 DE4D B60F D98E 331B 5106 993B 97B7 C506 \
|
||||||
|
E825 5617"
|
||||||
|
INCREMENT visview_base ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Common to Simcenter Structures; Tc \
|
||||||
|
Author" ISSUED=12-jun-2025 BORROW=2880 SIGN="1FF9 1BFD C4F7 \
|
||||||
|
CD12 F220 9212 2F03 2CB3 510C 6647 27D1 CAFB 963A C91D BF35 \
|
||||||
|
1EA3 0062 54A4 DCF2 1EA5 759D 45DE 3A07 5A45 2C9B AE87 DA98 \
|
||||||
|
86D3 DF40 95DE"
|
||||||
|
INCREMENT vp_convert ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Tc Author" ISSUED=12-jun-2025 \
|
||||||
|
BORROW=2880 SIGN="1BB2 88F5 9AF6 272F 9D7D 290E 6812 7DF5 03FA \
|
||||||
|
79A5 E37C 36D5 4B45 C9D6 0654 1330 D8FF DF3B FC78 0AD8 850E \
|
||||||
|
A2BA 4806 CBA2 E594 09AC A9FF 6CDA 5616 E3A8"
|
||||||
|
INCREMENT vp_print ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="Tc Author" ISSUED=12-jun-2025 \
|
||||||
|
BORROW=2880 SIGN="0495 1DD1 174D 7E8B 7246 C237 BB2C F983 6DCD \
|
||||||
|
2EFF 7900 F1D7 61F7 E2C9 6D32 04EB 6296 42B2 C2F5 DD31 2328 \
|
||||||
|
603E B112 D9D4 39B3 736F 9D4F 7CB5 C8E7 FF15"
|
||||||
|
INCREMENT xc_nx ugslmd 2025.06 02-mar-2026 1 SUPERSEDE DUP_GROUP=NONE \
|
||||||
|
ISSUED=20-jun-2025 SIGN="16D8 5F15 C8A0 66B2 98B5 4B42 D633 \
|
||||||
|
F935 7DA1 3CA4 E6F9 239A CF7D 067D 92AA 1715 CDD8 9A32 C0D5 \
|
||||||
|
1318 2BBF 9A51 404E 124A 0AF6 890E 2203 F72A 46FE 7C78"
|
||||||
|
INCREMENT xc_teamcenter ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1141 2E9E 78D1 D5B0 \
|
||||||
|
2E28 60E6 1DC5 B4D7 FB7A 819B 072B B519 A675 E550 9287 0E33 \
|
||||||
|
1D7F 8D9C 3A48 D67D 7B81 BE94 964B 79BE CB52 DE5B 7F12 4B4A \
|
||||||
|
6EB5 D507"
|
||||||
|
INCREMENT xc_vis ugslmd 2025.06 02-mar-2026 1 SUPERSEDE DUP_GROUP=UHD \
|
||||||
|
ISSUED=12-jun-2025 SIGN="05F3 DB2B 6439 A748 E1BE DC00 2E5F \
|
||||||
|
DE07 DA5F 09E3 054A 72AD 26F7 2839 AB25 0D9F 0154 F4E1 72D3 \
|
||||||
|
98C0 D936 0CEC 3EFA 25FC 5B99 7C1D 81A8 8EBA FBE9 E148"
|
||||||
|
INCREMENT borrowing ugslmd 2025.06 permanent 1 DUP_GROUP=NONE \
|
||||||
|
user_info="License Borrow Option" ISSUED=20-jun-2025 \
|
||||||
|
SIGN="1265 429D 66F8 9762 E13E 02EB 29D4 5454 D6A7 FC3A B969 \
|
||||||
|
630E 59C6 E159 1E68 1489 BD44 81AB E20E EFDC C360 B6BA 3CBE \
|
||||||
|
FEA1 413B 3AE4 EF85 21F5 4773 2BA4"
|
||||||
|
INCREMENT gateway_id ugslmd 2025.06 permanent 1000 SUPERSEDE \
|
||||||
|
DUP_GROUP=UHD user_info="I-deas gateway" ISSUED=12-may-2025 \
|
||||||
|
BORROW=2880 SIGN="0511 54C1 813F C5EC 6500 0B16 8677 0E34 5F0A \
|
||||||
|
0A97 5C65 A684 DF2E 1A20 EED1 0CC7 B8A9 E9D3 7786 807A 1B52 \
|
||||||
|
22BE CD21 C7BB AFF0 3569 0FF1 8FFA C20D 0D2F"
|
||||||
|
INCREMENT server_id ugslmd 2025.06 permanent 1 \
|
||||||
|
VENDOR_STRING="10219284 - Atomaste" user_info=R1FCRAKGPG \
|
||||||
|
ISSUER=SIEMENS BORROW=2880 SIGN="112D DE19 ABB0 032F D017 CCBC \
|
||||||
|
E4C1 9B2B AC79 EA30 307C 23D0 840F D40C E3E1 1925 C74C BEF7 \
|
||||||
|
16F4 CC87 2E13 2CD6 0916 81AD 7D13 E397 89D7 288F D4ED BDD3"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# SOFTWARE LICENSE TO FEATURE NAME CROSS REFERENCE #
|
||||||
|
# Version: 2506 Created: 02.12.2025 08:49:02#
|
||||||
|
# Atomaste Sold-To/Install: 10219284 #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# LICENSE PRODUCT QTY DESCRIPTION QTY FEATURE NAME
|
||||||
|
|
||||||
|
# --------------- ----- -------------------- ----- ---------------------------
|
||||||
|
# NX35050 1 NX Value Based Licensing 50 pack
|
||||||
|
# 50 nx_design_token
|
||||||
|
# NX93300 1 NX Design for Industrial Design
|
||||||
|
# 1 3d_to_2d_flattener
|
||||||
|
# 1 adv_assemblies
|
||||||
|
# 1 assemblies
|
||||||
|
# 1 design_studio
|
||||||
|
# 1 drafting
|
||||||
|
# 1 dxf_to_ug
|
||||||
|
# 1 dxfdwg
|
||||||
|
# 1 features_modeling
|
||||||
|
# 1 free_form_modeling
|
||||||
|
# 1 gateway
|
||||||
|
# 1 geometric_tol
|
||||||
|
# 1 grip_execute
|
||||||
|
# 1 ideas_integration
|
||||||
|
# 1 iges
|
||||||
|
# 1 nx_design_explr_eval
|
||||||
|
# 1 nx_freeform_1
|
||||||
|
# 1 nx_freeform_2
|
||||||
|
# 1 nx_integration
|
||||||
|
# 1 nx_ml_region_finder
|
||||||
|
# 1 nx_ml_sel_pred_std
|
||||||
|
# 1 nx_ml_show_hide
|
||||||
|
# 1 nx_multi_scale
|
||||||
|
# 1 nx_nas_bn_basic_dsk
|
||||||
|
# 1 nx_nastran_export
|
||||||
|
# 1 nx_sheet_metal
|
||||||
|
# 1 nx_spsd_stress
|
||||||
|
# 1 nx_spsd_vibration
|
||||||
|
# 1 nx_subdivision
|
||||||
|
# 1 nx_synchronous
|
||||||
|
# 1 nx_visual_reporting
|
||||||
|
# 1 pcf_package_file
|
||||||
|
# 1 ple_diagram
|
||||||
|
# 1 pstudio_cons
|
||||||
|
# 1 pv_ugdatagenerator
|
||||||
|
# 1 routing_base
|
||||||
|
# 1 sla_3d_systems
|
||||||
|
# 1 solid_modeling
|
||||||
|
# 1 step_ap203
|
||||||
|
# 1 step_ap214
|
||||||
|
# 1 studio_analyze
|
||||||
|
# 1 studio_free_form
|
||||||
|
# 1 studio_render
|
||||||
|
# 1 studio_visualize
|
||||||
|
# 1 ug_checkmate
|
||||||
|
# 1 ug_kf_checker
|
||||||
|
# 1 ug_kf_execute
|
||||||
|
# 1 ug_nas_des
|
||||||
|
# 1 ug_opt_wizard
|
||||||
|
# 1 ug_prod_des_advisor
|
||||||
|
# 1 ug_smart_models
|
||||||
|
# 1 ug_to_dxf
|
||||||
|
# 1 ug_web_express
|
||||||
|
# 1 ugopen_menuscript
|
||||||
|
# 1 usr_defined_features
|
||||||
|
# 1 wave
|
||||||
|
# SC13500 1 Simcenter Structures 1 3d_to_2d_flattener
|
||||||
|
# 1 ansys_meshers
|
||||||
|
# 1 assemblies
|
||||||
|
# 1 dxfdwg
|
||||||
|
# 1 features_modeling
|
||||||
|
# 1 gateway
|
||||||
|
# 1 gfem_ansys
|
||||||
|
# 1 gfem_nastran
|
||||||
|
# 1 grip_execute
|
||||||
|
# 1 hds_heeds_dll_nx
|
||||||
|
# 1 id_ext_fem_beam
|
||||||
|
# 1 ideas_integration
|
||||||
|
# 1 iges
|
||||||
|
# 1 nx_design_explr_eval
|
||||||
|
# 1 nx_freeform_1
|
||||||
|
# 1 nx_freeform_2
|
||||||
|
# 1 nx_ftk
|
||||||
|
# 1 nx_integration
|
||||||
|
# 1 nx_masterfem
|
||||||
|
# 1 nx_material_system
|
||||||
|
# 1 nx_nas_bn_basic_dsk
|
||||||
|
# 1 nx_nas_nonlin_dsk
|
||||||
|
# 1 nx_nastran_export
|
||||||
|
# 1 nx_nastran_import
|
||||||
|
# 1 nx_spsd_stress
|
||||||
|
# 1 nx_spsd_vibration
|
||||||
|
# 1 nx_synchronous
|
||||||
|
# 1 nx_visual_reporting
|
||||||
|
# 1 pcf_package_file
|
||||||
|
# 1 pstudio_cons
|
||||||
|
# 1 pv_ugdatagenerator
|
||||||
|
# 1 remotesim_plugin
|
||||||
|
# 1 remotesim_server
|
||||||
|
# 1 sc3d_dsktop_presence
|
||||||
|
# 1 sc_design_explr_eval
|
||||||
|
# 1 sc_enabled
|
||||||
|
# 1 sla_3d_systems
|
||||||
|
# 1 solid_modeling
|
||||||
|
# 1 step_ap203
|
||||||
|
# 1 step_ap214
|
||||||
|
# 1 studio_render
|
||||||
|
# 1 studio_visualize
|
||||||
|
# 1 teamcenter_designer
|
||||||
|
# 1 ug_checkmate
|
||||||
|
# 1 ug_kf_checker
|
||||||
|
# 1 ug_kf_execute
|
||||||
|
# 1 ug_nas_bn
|
||||||
|
# 1 ug_scenario
|
||||||
|
# 1 ug_smart_models
|
||||||
|
# 1 ug_struct_pe_solver
|
||||||
|
# 1 ug_web_express
|
||||||
|
# 1 ugopen_menuscript
|
||||||
|
# 1 usr_defined_features
|
||||||
|
# 1 visview_base
|
||||||
|
# TC10101 1 Tc Author 1 active_collab
|
||||||
|
# 1 adv_structure_mgt
|
||||||
|
# 1 teamcenter_author
|
||||||
|
# 1 teamcenter_doctor
|
||||||
|
# 1 vendor_mgt
|
||||||
|
# 1 visview_base
|
||||||
|
# 1 vp_convert
|
||||||
|
# 1 vp_print
|
||||||
|
# TC50100 1 Teamcenter Rapid Start
|
||||||
|
# 1 teamcenter_tcrs
|
||||||
|
# TCADMIN 2 Teamcenter Admin 2 teamcenter_admin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# The following products are not included on this file #
|
||||||
|
# for the respective reason listed #
|
||||||
|
# #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# PRODUCT QTY DESCRIPTION REASON
|
||||||
|
# ------------------ ----- ----------------------- ---------------------
|
||||||
|
# TC1DOTC 1 Teamcenter Deployment Deployment Option
|
||||||
BIN
NX Licenses/SiemensLicenseServer_v5.0.0.0_Lnx64_x86-64.bin
Normal file
BIN
NX Licenses/SiemensLicenseServer_v5.0.0.0_Lnx64_x86-64.bin
Normal file
Binary file not shown.
159
README.md
Normal file
159
README.md
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
# Dalidou Server - Master Documentation
|
||||||
|
|
||||||
|
> **Server:** dalidou (Lenovo W520)
|
||||||
|
> **Tailscale IP:** 100.80.199.40
|
||||||
|
> **Local IP:** 192.168.86.50
|
||||||
|
|
||||||
|
This folder contains all documentation, scripts, and configuration for the dalidou home server.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### SSH Access
|
||||||
|
```bash
|
||||||
|
ssh papa@192.168.86.50 # Local WiFi
|
||||||
|
ssh papa@100.80.199.40 # Tailscale (remote)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Commands
|
||||||
|
```bash
|
||||||
|
docker ps # List running services
|
||||||
|
docker logs <container> # View logs
|
||||||
|
docker restart <container> # Restart service
|
||||||
|
df -h /srv # Check disk space
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
| File | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| [docs/DALIDOU-SERVER.md](docs/DALIDOU-SERVER.md) | Complete server documentation - services, credentials, troubleshooting |
|
||||||
|
| [docs/CLAUDE-ASSISTANT.md](docs/CLAUDE-ASSISTANT.md) | Claude AI Assistant - weather, skiing, git workflow, daily briefings |
|
||||||
|
| [docs/LICENSE-SERVER-INFO.md](docs/LICENSE-SERVER-INFO.md) | License server Host ID for NX & SolidWorks |
|
||||||
|
| [docs/thinkpad-setup.md](docs/thinkpad-setup.md) | ThinkPad P16 setup instructions |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scripts
|
||||||
|
|
||||||
|
| File | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| [scripts/server-setup.sh](scripts/server-setup.sh) | Enable Git LFS on Gitea (run on dalidou) |
|
||||||
|
| [scripts/windows-setup.ps1](scripts/windows-setup.ps1) | Set up Git LFS on Windows |
|
||||||
|
| [scripts/init-cad-repo.ps1](scripts/init-cad-repo.ps1) | Initialize CAD project folder structure |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Templates
|
||||||
|
|
||||||
|
| File | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| [templates/gitattributes-template.txt](templates/gitattributes-template.txt) | Git LFS tracking rules for CAD files |
|
||||||
|
| [templates/gitignore-template.txt](templates/gitignore-template.txt) | Ignore rules for CAD temp files |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Services Running on Dalidou
|
||||||
|
|
||||||
|
| Service | Port | URL |
|
||||||
|
|---------|------|-----|
|
||||||
|
| Gitea (Git) | 3000 | http://192.168.86.50:3000 |
|
||||||
|
| Seafile (Cloud) | 8083 | http://192.168.86.50:8083 |
|
||||||
|
| Immich (Photos) | 2283 | http://192.168.86.50:2283 |
|
||||||
|
| Filebrowser | 8081 | http://192.168.86.50:8081 |
|
||||||
|
| Paperless (Docs) | 8082 | http://192.168.86.50:8082 |
|
||||||
|
| Syncthing | 8384 | http://192.168.86.50:8384 |
|
||||||
|
| Home Assistant | 8080 | http://192.168.86.50:8080 |
|
||||||
|
| Claude MCP Server | - | via SSH |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Claude AI Assistant
|
||||||
|
|
||||||
|
Interactive assistant available in Claude Code with these capabilities:
|
||||||
|
|
||||||
|
### Slash Commands
|
||||||
|
- `/morning` - Morning briefing (yesterday recap + today's weather + skiing)
|
||||||
|
- `/eod` - End of day summary
|
||||||
|
- `/ski` - Skiing conditions check
|
||||||
|
- `/weather` - Quick weather check
|
||||||
|
- `/push` - Push CAD changes to Gitea
|
||||||
|
- `/pull` - Pull latest from Gitea
|
||||||
|
|
||||||
|
### MCP Tools (on dalidou)
|
||||||
|
- Weather: current, hourly, daily forecasts
|
||||||
|
- Skiing: conditions check, best time windows
|
||||||
|
- Gitea: commits, repos, activity
|
||||||
|
|
||||||
|
### Natural Language
|
||||||
|
Just talk normally:
|
||||||
|
- "Hey good morning, let's start my day"
|
||||||
|
- "When should I go skiing?"
|
||||||
|
- "Push my CAD work"
|
||||||
|
- "What did I work on this week?"
|
||||||
|
|
||||||
|
See [docs/CLAUDE-ASSISTANT.md](docs/CLAUDE-ASSISTANT.md) for full details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CAD Workflow (Git LFS)
|
||||||
|
|
||||||
|
### Push Changes
|
||||||
|
```powershell
|
||||||
|
# Use PUSH.bat or ask Claude: "push my cad"
|
||||||
|
cd C:\Users\Antoine\CADTOMASTE
|
||||||
|
git add .
|
||||||
|
git commit -m "description"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pull Latest
|
||||||
|
```powershell
|
||||||
|
# Use PULL.bat or ask Claude: "pull latest"
|
||||||
|
cd C:\Users\Antoine\CADTOMASTE
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lock Files Before Editing
|
||||||
|
```powershell
|
||||||
|
git lfs lock "Projects/MyProject/part.prt"
|
||||||
|
# ... edit in NX/SolidWorks ...
|
||||||
|
git lfs unlock "Projects/MyProject/part.prt"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Folder Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
Server/
|
||||||
|
├── README.md # This file
|
||||||
|
├── docs/
|
||||||
|
│ ├── DALIDOU-SERVER.md # Complete server docs
|
||||||
|
│ ├── CLAUDE-ASSISTANT.md # AI assistant docs
|
||||||
|
│ ├── LICENSE-SERVER-INFO.md
|
||||||
|
│ └── thinkpad-setup.md
|
||||||
|
├── scripts/
|
||||||
|
│ ├── server-setup.sh # Dalidou setup
|
||||||
|
│ ├── windows-setup.ps1 # Windows Git LFS setup
|
||||||
|
│ └── init-cad-repo.ps1 # New CAD project init
|
||||||
|
└── templates/
|
||||||
|
├── gitattributes-template.txt
|
||||||
|
└── gitignore-template.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credentials
|
||||||
|
|
||||||
|
See [docs/DALIDOU-SERVER.md](docs/DALIDOU-SERVER.md#user-accounts) for full credentials list.
|
||||||
|
|
||||||
|
| Service | Username |
|
||||||
|
|---------|----------|
|
||||||
|
| SSH | papa |
|
||||||
|
| Gitea | Antoine |
|
||||||
|
| Filebrowser | Antoine |
|
||||||
|
| Seafile | antoine.letarte@gmail.com |
|
||||||
303
docs/CLAUDE-ASSISTANT.md
Normal file
303
docs/CLAUDE-ASSISTANT.md
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
# Claude AI Professional Assistant
|
||||||
|
|
||||||
|
> **Status:** Operational
|
||||||
|
> **Last Updated:** November 28, 2025
|
||||||
|
> **Role:** Professional assistant for Atomaste consulting work
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Claude is your professional AI assistant for your mechanical/simulation freelance engineering work at **Atomaste**.
|
||||||
|
|
||||||
|
**Primary Functions:**
|
||||||
|
- **Day Planning** - Prepare priorities, tasks, reminders
|
||||||
|
- **Work Documentation** - Log activities, summarize accomplishments
|
||||||
|
- **Daily Notes** - Maintain comprehensive daily records
|
||||||
|
- **Project Tracking** - Monitor CAD work, commits, progress
|
||||||
|
- **Work-Life Balance** - Weather/outdoor activity planning
|
||||||
|
|
||||||
|
**Architecture:** MCP server on dalidou + Claude Code on Windows (free with subscription)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Daily Workflow
|
||||||
|
|
||||||
|
### Morning - Start the Day
|
||||||
|
|
||||||
|
Say: **"Hey good morning, let's start my day"** or **"Bonjour, on commence?"**
|
||||||
|
|
||||||
|
Claude will:
|
||||||
|
1. **Review yesterday** - What was accomplished, commits made
|
||||||
|
2. **Check priorities** - Outstanding tasks, deadlines
|
||||||
|
3. **Plan today** - Suggest focus areas and time blocks
|
||||||
|
4. **Weather check** - Conditions for outdoor breaks (skiing, etc.)
|
||||||
|
5. **Set the tone** - Energizing briefing to start productive
|
||||||
|
|
||||||
|
### During the Day
|
||||||
|
|
||||||
|
- "What should I focus on next?"
|
||||||
|
- "Log this: finished FEA analysis for P04-Gigabit"
|
||||||
|
- "Remind me to follow up with client X"
|
||||||
|
- "Push my CAD work"
|
||||||
|
- "What have I done today so far?"
|
||||||
|
|
||||||
|
### Evening - Close the Day
|
||||||
|
|
||||||
|
Say: **"Let's wrap up the day"** or **"On ferme la journée"**
|
||||||
|
|
||||||
|
Claude will:
|
||||||
|
1. **Summarize work** - All commits, files changed, activities logged
|
||||||
|
2. **Document achievements** - What was completed
|
||||||
|
3. **Note blockers** - What's pending or stuck
|
||||||
|
4. **Plan tomorrow** - Suggested priorities for next day
|
||||||
|
5. **Update daily note** - Comprehensive record of the day
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What Claude Tracks
|
||||||
|
|
||||||
|
### Work Activities
|
||||||
|
- CAD file changes (NX Siemens, SolidWorks)
|
||||||
|
- Git commits with descriptions
|
||||||
|
- Project progress (P04-Gigabit, etc.)
|
||||||
|
- Client work and deliverables
|
||||||
|
- FEA/simulation tasks
|
||||||
|
|
||||||
|
### Daily Documentation
|
||||||
|
- Time spent on tasks
|
||||||
|
- Accomplishments and milestones
|
||||||
|
- Blockers and challenges
|
||||||
|
- Decisions made
|
||||||
|
- Ideas and notes
|
||||||
|
|
||||||
|
### Personal Balance
|
||||||
|
- Weather conditions
|
||||||
|
- Best outdoor activity windows
|
||||||
|
- Skiing conditions
|
||||||
|
- Work breaks and energy management
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Slash Commands
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/morning` | Full morning briefing with planning |
|
||||||
|
| `/eod` | End of day summary and documentation |
|
||||||
|
| `/ski` | Skiing conditions check |
|
||||||
|
| `/weather` | Quick weather check |
|
||||||
|
| `/push` | Push CAD changes to Gitea |
|
||||||
|
| `/pull` | Pull latest from Gitea |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Natural Language Examples
|
||||||
|
|
||||||
|
### Planning
|
||||||
|
- "What are my priorities today?"
|
||||||
|
- "I need to focus on the P04 assembly this morning"
|
||||||
|
- "Block 2 hours for FEA work"
|
||||||
|
- "What's pending from yesterday?"
|
||||||
|
|
||||||
|
### Logging Work
|
||||||
|
- "Log: completed thermal analysis for client X"
|
||||||
|
- "I just finished the bracket redesign"
|
||||||
|
- "Note: waiting for client feedback on envelope design"
|
||||||
|
- "Add to today: reviewed simulation results, found stress concentration issue"
|
||||||
|
|
||||||
|
### Tracking Progress
|
||||||
|
- "What did I work on this week?"
|
||||||
|
- "Show me my recent commits"
|
||||||
|
- "How's the P04-Gigabit project going?"
|
||||||
|
- "What files did I modify today?"
|
||||||
|
|
||||||
|
### CAD Workflow
|
||||||
|
- "Push my CAD work" (with commit message)
|
||||||
|
- "Pull latest files"
|
||||||
|
- "What's changed in CADTOMASTE?"
|
||||||
|
|
||||||
|
### Breaks & Balance
|
||||||
|
- "When's good for skiing today?"
|
||||||
|
- "What's the weather like?"
|
||||||
|
- "Should I take a break outside?"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Daily Note Structure
|
||||||
|
|
||||||
|
Claude maintains daily documentation with:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# [Date] - Daily Work Log
|
||||||
|
|
||||||
|
## Morning Plan
|
||||||
|
- Priority 1: ...
|
||||||
|
- Priority 2: ...
|
||||||
|
- Scheduled: ...
|
||||||
|
|
||||||
|
## Work Log
|
||||||
|
- 09:00 - Started FEA analysis for P04-Gigabit
|
||||||
|
- 11:30 - Completed mesh refinement
|
||||||
|
- 14:00 - Client call regarding envelope specs
|
||||||
|
- ...
|
||||||
|
|
||||||
|
## Commits
|
||||||
|
- a57c45b: "Updated lateral support shoe geometry"
|
||||||
|
- 8624cdd: "Fixed mesh convergence issue"
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
- Completed thermal analysis
|
||||||
|
- Delivered preliminary results to client
|
||||||
|
- Fixed bracket interference issue
|
||||||
|
|
||||||
|
## Blockers / Pending
|
||||||
|
- Waiting for client approval on design change
|
||||||
|
- Need material data for simulation
|
||||||
|
|
||||||
|
## Notes & Ideas
|
||||||
|
- Consider alternative mounting approach
|
||||||
|
- Research vibration damping options
|
||||||
|
|
||||||
|
## Tomorrow's Focus
|
||||||
|
- Finalize P04 assembly
|
||||||
|
- Start documentation for deliverable
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## MCP Tools Available
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `get_current_weather` | Current conditions in Rouyn-Noranda |
|
||||||
|
| `get_hourly_forecast` | Hour-by-hour forecast |
|
||||||
|
| `get_daily_forecast` | Daily forecast (highs, lows) |
|
||||||
|
| `find_best_activity_windows` | Best times for skiing, hiking |
|
||||||
|
| `check_skiing_conditions` | Quick ski conditions check |
|
||||||
|
| `get_today_commits` | Today's git commits |
|
||||||
|
| `get_recent_activity` | Recent git activity (7 days) |
|
||||||
|
| `list_repos` | List Gitea repositories |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ DALIDOU SERVER (100.80.199.40) │
|
||||||
|
│ ┌───────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ MCP Server (/srv/claude-assistant) │ │
|
||||||
|
│ │ ├─ Weather tools (Open-Meteo API) │ │
|
||||||
|
│ │ ├─ Gitea tools (commits, repos) │ │
|
||||||
|
│ │ └─ Activity analysis │ │
|
||||||
|
│ └───────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
│ SSH + MCP Protocol
|
||||||
|
│
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ WINDOWS WORKSTATION │
|
||||||
|
│ ┌───────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Claude Code (Opus 4.5 - your subscription) │ │
|
||||||
|
│ │ ├─ Intelligent planning and analysis │ │
|
||||||
|
│ │ ├─ Work documentation and logging │ │
|
||||||
|
│ │ ├─ CAD file management (push/pull) │ │
|
||||||
|
│ │ └─ Daily note maintenance │ │
|
||||||
|
│ └───────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Server Location
|
||||||
|
```
|
||||||
|
/srv/claude-assistant/
|
||||||
|
├── .env # API keys and tokens
|
||||||
|
├── config.yaml # Location, preferences
|
||||||
|
├── run-mcp.sh # MCP startup script
|
||||||
|
├── mcp-server/
|
||||||
|
│ └── server.js # MCP server
|
||||||
|
└── tools/
|
||||||
|
├── weather.js # Open-Meteo integration
|
||||||
|
├── gitea.js # Gitea API
|
||||||
|
└── obsidian.js # Daily notes (future)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows Configuration
|
||||||
|
```
|
||||||
|
C:\Users\Antoine\.claude\
|
||||||
|
├── mcp.json # MCP server connection
|
||||||
|
└── commands/
|
||||||
|
├── morning.md # Morning briefing
|
||||||
|
├── eod.md # End of day summary
|
||||||
|
├── ski.md # Skiing conditions
|
||||||
|
├── weather.md # Weather check
|
||||||
|
├── push.md # Push CAD
|
||||||
|
└── pull.md # Pull CAD
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cost
|
||||||
|
|
||||||
|
| Usage | Cost |
|
||||||
|
|-------|------|
|
||||||
|
| Interactive (Claude Code) | **FREE** (your subscription) |
|
||||||
|
| Automated API (optional) | ~$0.03 per run |
|
||||||
|
|
||||||
|
Current setup = **$0/month**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What's Working
|
||||||
|
|
||||||
|
- [x] MCP server on dalidou
|
||||||
|
- [x] Weather and skiing tools
|
||||||
|
- [x] Gitea integration (commits, repos)
|
||||||
|
- [x] Slash commands
|
||||||
|
- [x] Push/pull CAD workflow
|
||||||
|
- [x] Natural language interaction
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Future Improvements
|
||||||
|
|
||||||
|
- [ ] Daily notes auto-save to Obsidian vault
|
||||||
|
- [ ] Calendar integration (meetings, deadlines)
|
||||||
|
- [ ] Client project tracking
|
||||||
|
- [ ] Time tracking per project
|
||||||
|
- [ ] Weekly/monthly summaries
|
||||||
|
- [ ] Invoice preparation assistance
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### MCP not connecting
|
||||||
|
```bash
|
||||||
|
ssh root@100.80.199.40 /srv/claude-assistant/run-mcp.sh
|
||||||
|
```
|
||||||
|
Then restart VSCode.
|
||||||
|
|
||||||
|
### Gitea returns empty
|
||||||
|
Check token in `/srv/claude-assistant/.env`
|
||||||
|
|
||||||
|
### Check MCP status
|
||||||
|
```
|
||||||
|
claude mcp list
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. Open Claude Code (VSCode)
|
||||||
|
2. Say "Hey good morning, let's start my day"
|
||||||
|
3. Claude prepares your briefing
|
||||||
|
4. Work on your projects
|
||||||
|
5. Say "Log: [what you did]" to track activities
|
||||||
|
6. End with "Let's wrap up the day"
|
||||||
|
7. Claude documents everything
|
||||||
645
docs/DALIDOU-SERVER.md
Normal file
645
docs/DALIDOU-SERVER.md
Normal file
@@ -0,0 +1,645 @@
|
|||||||
|
# Dalidou Home Server - Complete Documentation
|
||||||
|
|
||||||
|
> **Last Updated:** December 6, 2025
|
||||||
|
> **Server Name:** dalidou
|
||||||
|
> **Owner:** Antoine Letarte
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
1. [Server Overview](#server-overview)
|
||||||
|
2. [Network Configuration](#network-configuration)
|
||||||
|
3. [User Accounts](#user-accounts)
|
||||||
|
4. [Installed Services](#installed-services)
|
||||||
|
5. [Service Details & Configuration](#service-details--configuration)
|
||||||
|
6. [Docker Infrastructure](#docker-infrastructure)
|
||||||
|
7. [Directory Structure](#directory-structure)
|
||||||
|
8. [Backup Strategy](#backup-strategy)
|
||||||
|
9. [Maintenance Commands](#maintenance-commands)
|
||||||
|
10. [Disaster Recovery](#disaster-recovery)
|
||||||
|
11. [Troubleshooting](#troubleshooting)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server Overview
|
||||||
|
|
||||||
|
### Hardware
|
||||||
|
- **Type:** Home server running Docker containers
|
||||||
|
- **OS:** Linux (Debian/Ubuntu-based)
|
||||||
|
- **Location:** Home network
|
||||||
|
|
||||||
|
### Purpose
|
||||||
|
Self-hosted infrastructure replacing cloud services:
|
||||||
|
- Google Photos → Immich
|
||||||
|
- Google Drive → Seafile
|
||||||
|
- Dropbox → Syncthing
|
||||||
|
- GitHub → Gitea
|
||||||
|
- Document management → Paperless-ngx
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Network Configuration
|
||||||
|
|
||||||
|
### IP Addresses
|
||||||
|
|
||||||
|
| Network | IP Address | Usage |
|
||||||
|
|---------|------------|-------|
|
||||||
|
| WiFi (Primary) | `192.168.86.50` | Main local access |
|
||||||
|
| Wired | `10.0.0.77` | Backup/alternate |
|
||||||
|
| Tailscale VPN | `100.80.199.40` | Remote access from anywhere |
|
||||||
|
|
||||||
|
### SSH Access
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Local network
|
||||||
|
ssh papa@192.168.86.50
|
||||||
|
|
||||||
|
# Via Tailscale (remote)
|
||||||
|
ssh papa@100.80.199.40
|
||||||
|
|
||||||
|
# Using hostname (if DNS configured)
|
||||||
|
ssh papa@dalidou
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ports in Use
|
||||||
|
|
||||||
|
| Port | Service | Protocol |
|
||||||
|
|------|---------|----------|
|
||||||
|
| 22 | SSH (host) | TCP |
|
||||||
|
| 80 | Caddy (reverse proxy) | TCP |
|
||||||
|
| 2222 | Gitea SSH | TCP |
|
||||||
|
| 2283 | Immich | TCP |
|
||||||
|
| 3000 | Gitea Web | TCP |
|
||||||
|
| 3001 | Homepage Dashboard | TCP |
|
||||||
|
| 8080 | Home Assistant | TCP |
|
||||||
|
| 8081 | Filebrowser | TCP |
|
||||||
|
| 8082 | Paperless-ngx | TCP |
|
||||||
|
| 8083 | Seafile | TCP |
|
||||||
|
| 8384 | Syncthing Web UI | TCP |
|
||||||
|
| 21027 | Syncthing Discovery | UDP |
|
||||||
|
| 22000 | Syncthing Transfer | TCP/UDP |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## User Accounts
|
||||||
|
|
||||||
|
### System Users
|
||||||
|
|
||||||
|
| Username | Password | Role |
|
||||||
|
|----------|----------|------|
|
||||||
|
| papa | Ladygaga | Admin (SSH, sudo) |
|
||||||
|
|
||||||
|
### Service Accounts
|
||||||
|
|
||||||
|
| Service | Username | Password | Email |
|
||||||
|
|---------|----------|----------|-------|
|
||||||
|
| Gitea | Antoine | Ladygaga | antoine.letarte@gmail.com |
|
||||||
|
| Filebrowser | Antoine | Ladygaga2024 | - |
|
||||||
|
| Seafile | antoine.letarte@gmail.com | Ladygaga2025 | antoine.letarte@gmail.com |
|
||||||
|
| Immich | Antoine | (see Bitwarden) | antoine.letarte@gmail.com |
|
||||||
|
| Paperless | Antoine | (see Bitwarden) | - |
|
||||||
|
|
||||||
|
### Family Accounts
|
||||||
|
|
||||||
|
| Name | Password | Notes |
|
||||||
|
|------|----------|-------|
|
||||||
|
| Odile | Adalidou948 | Family member access |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installed Services
|
||||||
|
|
||||||
|
### Quick Access URLs
|
||||||
|
|
||||||
|
| Service | Local URL | Direct IP URL |
|
||||||
|
|---------|-----------|---------------|
|
||||||
|
| **Homepage** (Dashboard) | http://home.dalidou.home | http://192.168.86.50:3001 |
|
||||||
|
| **Immich** (Photos) | http://photos.dalidou.home | http://192.168.86.50:2283 |
|
||||||
|
| **Filebrowser** | http://files.dalidou.home | http://192.168.86.50:8081 |
|
||||||
|
| **Paperless** (Docs) | http://docs.dalidou.home | http://192.168.86.50:8082 |
|
||||||
|
| **Gitea** (Git) | http://git.dalidou.home | http://192.168.86.50:3000 |
|
||||||
|
| **Syncthing** | http://sync.dalidou.home | http://192.168.86.50:8384 |
|
||||||
|
| **Seafile** (Cloud) | http://cloud.dalidou.home | http://192.168.86.50:8083 |
|
||||||
|
| **Home Assistant** | - | http://192.168.86.50:8080 |
|
||||||
|
|
||||||
|
### Remote Access (Tailscale)
|
||||||
|
|
||||||
|
When away from home, use Tailscale IP:
|
||||||
|
- Immich: http://100.80.199.40:2283
|
||||||
|
- Seafile: http://100.80.199.40:8083
|
||||||
|
- Gitea: http://100.80.199.40:3000
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Service Details & Configuration
|
||||||
|
|
||||||
|
### 1. Immich - Photo Management
|
||||||
|
|
||||||
|
**Purpose:** Google Photos replacement - backup, organize, and share photos
|
||||||
|
|
||||||
|
**Containers:**
|
||||||
|
- `immich_server` - Main application
|
||||||
|
- `immich_postgres` - Database
|
||||||
|
- `immich_redis` - Cache
|
||||||
|
|
||||||
|
**Data Location:** `/srv/immich/`
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Mobile app backup (iOS/Android)
|
||||||
|
- Face recognition
|
||||||
|
- Location mapping
|
||||||
|
- Sharing albums
|
||||||
|
|
||||||
|
**Mobile App:** "Immich" on App Store / Play Store
|
||||||
|
- Server URL: http://192.168.86.50:2283 (local) or http://100.80.199.40:2283 (remote)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Filebrowser - Web File Manager
|
||||||
|
|
||||||
|
**Purpose:** Browse and manage server files via web browser
|
||||||
|
|
||||||
|
**Container:** `filebrowser`
|
||||||
|
|
||||||
|
**Data Location:**
|
||||||
|
- Config: `/srv/filebrowser/config/`
|
||||||
|
- Database: `/srv/filebrowser/database/`
|
||||||
|
- Serves: `/srv/storage/shared/`
|
||||||
|
|
||||||
|
**Login:** Antoine / Ladygaga2024
|
||||||
|
|
||||||
|
**Use Cases:**
|
||||||
|
- Quick file access without SSH
|
||||||
|
- Share files with family
|
||||||
|
- Upload/download files
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Paperless-ngx - Document Management
|
||||||
|
|
||||||
|
**Purpose:** Scan, OCR, organize, and search documents
|
||||||
|
|
||||||
|
**Containers:**
|
||||||
|
- `paperless` - Main application
|
||||||
|
- `paperless_postgres` - Database
|
||||||
|
- `paperless_redis` - Cache
|
||||||
|
|
||||||
|
**Data Location:** `/srv/paperless/`
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- OCR scanning
|
||||||
|
- Full-text search
|
||||||
|
- Tagging and categorization
|
||||||
|
- Correspondent tracking
|
||||||
|
|
||||||
|
**Workflow:**
|
||||||
|
1. Scan documents to consume folder
|
||||||
|
2. Paperless auto-processes and OCRs
|
||||||
|
3. Search and organize in web UI
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Gitea - Git Repository Hosting
|
||||||
|
|
||||||
|
**Purpose:** Self-hosted GitHub - version control for code and CAD files
|
||||||
|
|
||||||
|
**Containers:**
|
||||||
|
- `gitea` - Main application
|
||||||
|
- `gitea_postgres` - Database
|
||||||
|
|
||||||
|
**Data Location:** `/srv/gitea/`
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- Web Port: 3000
|
||||||
|
- SSH Port: 2222
|
||||||
|
- LFS Enabled: Yes (for large CAD files)
|
||||||
|
- LFS Path: `/data/git/lfs`
|
||||||
|
|
||||||
|
**Git LFS:** Enabled for large file storage (CAD files, binaries)
|
||||||
|
|
||||||
|
**Clone via HTTPS:**
|
||||||
|
```bash
|
||||||
|
git clone http://192.168.86.50:3000/Antoine/CADTOMASTE.git
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clone via SSH:**
|
||||||
|
```bash
|
||||||
|
git clone ssh://git@192.168.86.50:2222/Antoine/CADTOMASTE.git
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Syncthing - File Synchronization
|
||||||
|
|
||||||
|
**Purpose:** Sync files between devices (like Dropbox but self-hosted)
|
||||||
|
|
||||||
|
**Container:** `syncthing`
|
||||||
|
|
||||||
|
**Data Location:** `/srv/syncthing/`
|
||||||
|
|
||||||
|
**Ports:**
|
||||||
|
- 8384: Web UI
|
||||||
|
- 22000: Sync (TCP/UDP)
|
||||||
|
- 21027: Discovery (UDP)
|
||||||
|
|
||||||
|
**Use Cases:**
|
||||||
|
- Sync folders between laptop and server
|
||||||
|
- Backup important directories
|
||||||
|
- Share folders with family
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Seafile - Cloud Storage
|
||||||
|
|
||||||
|
**Purpose:** Self-hosted Google Drive / Dropbox alternative
|
||||||
|
|
||||||
|
**Containers:**
|
||||||
|
- `seafile` - Main application
|
||||||
|
- `seafile-mysql` - Database (MariaDB)
|
||||||
|
- `seafile-memcached` - Cache
|
||||||
|
|
||||||
|
**Data Location:** `/srv/seafile/`
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- Web Port: 8083
|
||||||
|
- Admin: antoine.letarte@gmail.com / Ladygaga2025
|
||||||
|
- Timezone: America/Toronto
|
||||||
|
|
||||||
|
**Clients:**
|
||||||
|
- **SeaDrive (Windows):** Creates virtual drive letter (S:\)
|
||||||
|
- **Mobile App:** "Seafile" on App Store / Play Store
|
||||||
|
|
||||||
|
**Desktop Client Setup:**
|
||||||
|
1. Install SeaDrive from https://www.seafile.com/en/download/
|
||||||
|
2. Server: http://192.168.86.50:8083
|
||||||
|
3. Login with your credentials
|
||||||
|
4. Choose drive letter (e.g., S:\)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Home Assistant - Smart Home
|
||||||
|
|
||||||
|
**Purpose:** Home automation and smart device control
|
||||||
|
|
||||||
|
**Container:** `homeassistant`
|
||||||
|
|
||||||
|
**Access:** http://192.168.86.50:8080
|
||||||
|
|
||||||
|
**Additional:** Matter Server (`matter-server`) for Matter/Thread devices
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 8. Homepage - Server Dashboard
|
||||||
|
|
||||||
|
**Purpose:** Centralized dashboard to view and access all server services at a glance
|
||||||
|
|
||||||
|
**Container:** `homepage`
|
||||||
|
|
||||||
|
**Image:** `ghcr.io/gethomepage/homepage:latest`
|
||||||
|
|
||||||
|
**Data Location:** `/srv/homepage/`
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- Web Port: 3001
|
||||||
|
- Theme: Dark (slate color)
|
||||||
|
- Docker integration enabled (monitors container status)
|
||||||
|
|
||||||
|
**Access:**
|
||||||
|
- Local: http://192.168.86.50:3001
|
||||||
|
- Wired: http://10.0.0.77:3001
|
||||||
|
- Tailscale: http://100.80.199.40:3001
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Real-time Docker container status monitoring
|
||||||
|
- Quick links to all services (Immich, Paperless, Gitea, Seafile, etc.)
|
||||||
|
- Customizable widgets and bookmarks
|
||||||
|
- Dark theme with clean interface
|
||||||
|
|
||||||
|
**Configuration Files:**
|
||||||
|
- `services.yaml` - Define services and their icons/links
|
||||||
|
- `settings.yaml` - Theme, layout, and general settings
|
||||||
|
- `widgets.yaml` - System widgets (CPU, memory, etc.)
|
||||||
|
- `bookmarks.yaml` - External bookmarks
|
||||||
|
- `docker.yaml` - Docker socket configuration
|
||||||
|
|
||||||
|
**Customization:**
|
||||||
|
```bash
|
||||||
|
# Edit service definitions
|
||||||
|
nano /srv/homepage/services.yaml
|
||||||
|
|
||||||
|
# Restart to apply changes
|
||||||
|
docker restart homepage
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Docker Infrastructure
|
||||||
|
|
||||||
|
### View Running Containers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh papa@192.168.86.50 "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Restart a service
|
||||||
|
docker restart <container_name>
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
docker logs <container_name>
|
||||||
|
docker logs -f <container_name> # Follow logs
|
||||||
|
|
||||||
|
# Stop/Start
|
||||||
|
docker stop <container_name>
|
||||||
|
docker start <container_name>
|
||||||
|
|
||||||
|
# Check resource usage
|
||||||
|
docker stats
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Compose Locations
|
||||||
|
|
||||||
|
| Service | Compose File Location |
|
||||||
|
|---------|----------------------|
|
||||||
|
| Seafile | `/srv/seafile/docker-compose.yml` |
|
||||||
|
| Immich | `/srv/immich/docker-compose.yml` |
|
||||||
|
| Gitea | `/srv/gitea/docker-compose.yml` |
|
||||||
|
| Paperless | `/srv/paperless/docker-compose.yml` |
|
||||||
|
| Homepage | `/home/papa/docker-compose.yml` |
|
||||||
|
|
||||||
|
### Restart All Services
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /srv/<service>
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/srv/
|
||||||
|
├── filebrowser/
|
||||||
|
│ ├── config/
|
||||||
|
│ └── database/
|
||||||
|
│
|
||||||
|
├── gitea/
|
||||||
|
│ ├── data/
|
||||||
|
│ │ └── git/
|
||||||
|
│ │ ├── repositories/
|
||||||
|
│ │ └── lfs/
|
||||||
|
│ └── postgres/
|
||||||
|
│
|
||||||
|
├── immich/
|
||||||
|
│ ├── upload/
|
||||||
|
│ ├── library/
|
||||||
|
│ └── postgres/
|
||||||
|
│
|
||||||
|
├── paperless/
|
||||||
|
│ ├── consume/ ← Drop documents here
|
||||||
|
│ ├── data/
|
||||||
|
│ ├── media/
|
||||||
|
│ └── postgres/
|
||||||
|
│
|
||||||
|
├── seafile/
|
||||||
|
│ ├── data/
|
||||||
|
│ │ └── seafile/
|
||||||
|
│ │ ├── conf/
|
||||||
|
│ │ └── seafile-data/
|
||||||
|
│ └── mysql/
|
||||||
|
│
|
||||||
|
├── syncthing/
|
||||||
|
│ └── config/
|
||||||
|
│
|
||||||
|
├── homepage/
|
||||||
|
│ ├── services.yaml ← Service definitions
|
||||||
|
│ ├── settings.yaml ← Theme and layout
|
||||||
|
│ ├── widgets.yaml ← Dashboard widgets
|
||||||
|
│ ├── bookmarks.yaml ← External links
|
||||||
|
│ └── docker.yaml ← Docker integration
|
||||||
|
│
|
||||||
|
└── storage/
|
||||||
|
└── shared/ ← Filebrowser root
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Backup Strategy
|
||||||
|
|
||||||
|
### Critical Data Locations
|
||||||
|
|
||||||
|
| Priority | Data | Location | Backup Method |
|
||||||
|
|----------|------|----------|---------------|
|
||||||
|
| HIGH | Photos | `/srv/immich/` | External drive + cloud |
|
||||||
|
| HIGH | Documents | `/srv/paperless/` | External drive |
|
||||||
|
| HIGH | Git repos | `/srv/gitea/` | Git push to remote |
|
||||||
|
| MEDIUM | Seafile | `/srv/seafile/` | External drive |
|
||||||
|
| LOW | Configs | `/srv/*/config/` | Copy to backup |
|
||||||
|
|
||||||
|
### Manual Backup Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backup Immich
|
||||||
|
tar -czvf immich-backup-$(date +%Y%m%d).tar.gz /srv/immich/
|
||||||
|
|
||||||
|
# Backup Paperless
|
||||||
|
tar -czvf paperless-backup-$(date +%Y%m%d).tar.gz /srv/paperless/
|
||||||
|
|
||||||
|
# Backup Gitea
|
||||||
|
tar -czvf gitea-backup-$(date +%Y%m%d).tar.gz /srv/gitea/
|
||||||
|
|
||||||
|
# Backup Seafile (stop first for consistency)
|
||||||
|
docker compose -f /srv/seafile/docker-compose.yml stop seafile
|
||||||
|
tar -czvf seafile-backup-$(date +%Y%m%d).tar.gz /srv/seafile/
|
||||||
|
docker compose -f /srv/seafile/docker-compose.yml start seafile
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Maintenance Commands
|
||||||
|
|
||||||
|
### System Updates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update system packages
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Update Docker images
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Disk Space
|
||||||
|
|
||||||
|
```bash
|
||||||
|
df -h /srv
|
||||||
|
du -sh /srv/*
|
||||||
|
```
|
||||||
|
|
||||||
|
### View All Container Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker logs --tail 50 <container_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart docker
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Disaster Recovery
|
||||||
|
|
||||||
|
### If Server Fails - Rebuild Steps
|
||||||
|
|
||||||
|
1. **Install fresh Linux (Debian/Ubuntu)**
|
||||||
|
|
||||||
|
2. **Install Docker:**
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://get.docker.com | sh
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Restore /srv from backup:**
|
||||||
|
```bash
|
||||||
|
sudo mkdir /srv
|
||||||
|
sudo tar -xzvf backup.tar.gz -C /
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Start each service:**
|
||||||
|
```bash
|
||||||
|
cd /srv/gitea && docker compose up -d
|
||||||
|
cd /srv/immich && docker compose up -d
|
||||||
|
cd /srv/paperless && docker compose up -d
|
||||||
|
cd /srv/seafile && docker compose up -d
|
||||||
|
# etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Install Tailscale:**
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://tailscale.com/install.sh | sh
|
||||||
|
sudo tailscale up
|
||||||
|
```
|
||||||
|
|
||||||
|
### Key Files to Backup
|
||||||
|
|
||||||
|
- All of `/srv/`
|
||||||
|
- `/etc/caddy/Caddyfile` (if using Caddy)
|
||||||
|
- Docker compose files (already in /srv/)
|
||||||
|
- This documentation!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Service Not Accessible
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if container is running
|
||||||
|
docker ps | grep <service>
|
||||||
|
|
||||||
|
# Check container logs
|
||||||
|
docker logs <container_name>
|
||||||
|
|
||||||
|
# Restart the service
|
||||||
|
docker restart <container_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port Already in Use
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find what's using a port
|
||||||
|
sudo lsof -i :<port>
|
||||||
|
sudo netstat -tlnp | grep <port>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Container Won't Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check logs for errors
|
||||||
|
docker logs <container_name>
|
||||||
|
|
||||||
|
# Check disk space
|
||||||
|
df -h
|
||||||
|
|
||||||
|
# Check Docker status
|
||||||
|
sudo systemctl status docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database Issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enter postgres container
|
||||||
|
docker exec -it <postgres_container> psql -U <user> -d <database>
|
||||||
|
|
||||||
|
# Check database health
|
||||||
|
docker exec <postgres_container> pg_isready
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reset Service Password
|
||||||
|
|
||||||
|
**Filebrowser:**
|
||||||
|
```bash
|
||||||
|
docker stop filebrowser
|
||||||
|
docker run --rm -v /srv/filebrowser/database:/database filebrowser/filebrowser \
|
||||||
|
users update admin --password newpassword -d /database/filebrowser.db
|
||||||
|
docker start filebrowser
|
||||||
|
```
|
||||||
|
|
||||||
|
**Gitea:**
|
||||||
|
```bash
|
||||||
|
docker exec -it gitea gitea admin user change-password --username Antoine --password newpassword
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference Card
|
||||||
|
|
||||||
|
### SSH Access
|
||||||
|
```bash
|
||||||
|
ssh papa@192.168.86.50 # Local
|
||||||
|
ssh papa@100.80.199.40 # Tailscale
|
||||||
|
```
|
||||||
|
|
||||||
|
### Most Used Commands
|
||||||
|
```bash
|
||||||
|
# Check all containers
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Restart a service
|
||||||
|
docker restart <name>
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
docker logs -f <name>
|
||||||
|
|
||||||
|
# Disk space
|
||||||
|
df -h /srv
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service URLs (Local)
|
||||||
|
- Dashboard: http://192.168.86.50:3001
|
||||||
|
- Photos: http://192.168.86.50:2283
|
||||||
|
- Files: http://192.168.86.50:8081
|
||||||
|
- Docs: http://192.168.86.50:8082
|
||||||
|
- Git: http://192.168.86.50:3000
|
||||||
|
- Cloud: http://192.168.86.50:8083
|
||||||
|
- Sync: http://192.168.86.50:8384
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Document History
|
||||||
|
|
||||||
|
| Date | Change |
|
||||||
|
|------|--------|
|
||||||
|
| 2025-11-27 | Initial documentation created |
|
||||||
|
| 2025-11-27 | Added Seafile setup |
|
||||||
|
| 2025-11-27 | Added Git LFS for CAD versioning |
|
||||||
|
| 2025-12-06 | Added Homepage dashboard documentation |
|
||||||
229
docs/LICENSE-SERVER-INFO.md
Normal file
229
docs/LICENSE-SERVER-INFO.md
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
# License Server Host Information
|
||||||
|
|
||||||
|
**Updated:** 2025-12-01
|
||||||
|
**Server:** dalidou (ThinkPad W520)
|
||||||
|
**Status:** OPERATIONAL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference - What to Tell Siemens
|
||||||
|
|
||||||
|
For your permanent NX license, provide:
|
||||||
|
|
||||||
|
```
|
||||||
|
Hostname: dalidou
|
||||||
|
CID: COMPOSITE=88F027D30355
|
||||||
|
Port: 28000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server Details
|
||||||
|
|
||||||
|
| Field | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| **Hostname** | `dalidou` |
|
||||||
|
| **Composite ID (CID)** | `COMPOSITE=88F027D30355` |
|
||||||
|
| **Ethernet MAC Address** | `f0:de:f1:e6:e4:6a` |
|
||||||
|
| **Host ID (no colons)** | `f0def1e6e46a` |
|
||||||
|
| **Local Network IP (Wi-Fi)** | `192.168.86.50` |
|
||||||
|
| **Tailscale IP** | `100.80.199.40` |
|
||||||
|
| **NX License Port** | `28000` |
|
||||||
|
|
||||||
|
### All CIDs (from getcid command)
|
||||||
|
| Interface | CID | MAC |
|
||||||
|
|-----------|-----|-----|
|
||||||
|
| **enp0s25 (Ethernet)** | `COMPOSITE=88F027D30355` | F0DEF1E6E46A |
|
||||||
|
| wlp3s0 (Wi-Fi) | `COMPOSITE=F3B17C78293B` | 2477036FCD80 |
|
||||||
|
|
||||||
|
**Use the Ethernet CID** - it's more stable.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Current License Configuration
|
||||||
|
|
||||||
|
**Permanent license valid until:** March 2, 2026
|
||||||
|
|
||||||
|
| License | Status |
|
||||||
|
|---------|--------|
|
||||||
|
| NX93300 (NX Design for Industrial Design) | 1 seat |
|
||||||
|
| SC13500 (Simcenter Structures) | 1 seat |
|
||||||
|
| TC10101 (Tc Author) | 1 seat |
|
||||||
|
| TC50100 (Teamcenter Rapid Start) | 1 seat |
|
||||||
|
| NX35050 (NX Value Based Licensing) | 50 tokens |
|
||||||
|
| + many more features | See license file |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Client Setup (Windows Laptops)
|
||||||
|
|
||||||
|
### Step 1: Set Environment Variable
|
||||||
|
|
||||||
|
1. Open **System Properties** (`Win + R` → `sysdm.cpl`)
|
||||||
|
2. Click **Advanced** → **Environment Variables**
|
||||||
|
3. Under **System variables**, click **New**
|
||||||
|
4. Add:
|
||||||
|
- **Variable name:** `SPLM_LICENSE_SERVER`
|
||||||
|
- **Variable value:** `28000@dalidou;28000@100.80.199.40;29000@DESKTOP-PRECISION`
|
||||||
|
|
||||||
|
### Step 2: Verify in Siemens Licensing Tool
|
||||||
|
|
||||||
|
1. Open **Siemens Licensing Tool**
|
||||||
|
2. Go to **Environment Settings**
|
||||||
|
3. Confirm all servers show **Connection status: Successful**
|
||||||
|
|
||||||
|
### License Server Priority
|
||||||
|
|
||||||
|
| Priority | Server | Use Case |
|
||||||
|
|----------|--------|----------|
|
||||||
|
| 1st | `28000@dalidou` | Local network (fastest) |
|
||||||
|
| 2nd | `28000@100.80.199.40` | Remote via Tailscale |
|
||||||
|
| 3rd | `29000@DESKTOP-PRECISION` | Fallback if dalidou down |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server Installation (Already Done on Dalidou)
|
||||||
|
|
||||||
|
### Location
|
||||||
|
```
|
||||||
|
/opt/Siemens/LicenseServer/
|
||||||
|
├── lmgrd # FlexNet license manager
|
||||||
|
├── saltd # Siemens vendor daemon (v5)
|
||||||
|
├── ugslmd -> saltd # Symlink for compatibility
|
||||||
|
├── lmutil # License utilities
|
||||||
|
├── License_Ugslmd.lic # License file
|
||||||
|
└── logs/
|
||||||
|
└── lmgrd.log # Server log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Systemd Service
|
||||||
|
```bash
|
||||||
|
# Service file: /etc/systemd/system/siemens-lmgrd.service
|
||||||
|
sudo systemctl status siemens-lmgrd # Check status
|
||||||
|
sudo systemctl start siemens-lmgrd # Start
|
||||||
|
sudo systemctl stop siemens-lmgrd # Stop
|
||||||
|
sudo systemctl restart siemens-lmgrd # Restart
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Commands
|
||||||
|
```bash
|
||||||
|
cd /opt/Siemens/LicenseServer
|
||||||
|
|
||||||
|
# Check license status
|
||||||
|
./lmutil lmstat -a
|
||||||
|
|
||||||
|
# Check specific feature
|
||||||
|
./lmutil lmstat -f NX93300
|
||||||
|
|
||||||
|
# View log
|
||||||
|
tail -50 logs/lmgrd.log
|
||||||
|
|
||||||
|
# Start manually (if systemd not working)
|
||||||
|
./lmgrd -c License_Ugslmd.lic -l logs/lmgrd.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Firewall
|
||||||
|
```bash
|
||||||
|
# Port 28000 is open
|
||||||
|
sudo ufw status | grep 28000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Updating the License File
|
||||||
|
|
||||||
|
When you receive a new license from Siemens:
|
||||||
|
|
||||||
|
1. **Edit the SERVER line** to match dalidou:
|
||||||
|
```
|
||||||
|
SERVER dalidou ANY 28000
|
||||||
|
VENDOR ugslmd
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Copy to dalidou:**
|
||||||
|
```bash
|
||||||
|
scp new_license.lic root@dalidou:/opt/Siemens/LicenseServer/License_Ugslmd.lic
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Restart the service:**
|
||||||
|
```bash
|
||||||
|
ssh root@dalidou "systemctl restart siemens-lmgrd"
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Verify:**
|
||||||
|
```bash
|
||||||
|
ssh root@dalidou "cd /opt/Siemens/LicenseServer && ./lmutil lmstat -a"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ThinkPad Setup (When Repaired)
|
||||||
|
|
||||||
|
On your ThinkPad, follow the same **Client Setup** steps above:
|
||||||
|
|
||||||
|
1. Set `SPLM_LICENSE_SERVER` environment variable:
|
||||||
|
```
|
||||||
|
28000@dalidou;28000@100.80.199.40
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Make sure **Tailscale** is installed and connected
|
||||||
|
|
||||||
|
3. Test with Siemens Licensing Tool
|
||||||
|
|
||||||
|
That's it - no license server installation needed on the ThinkPad!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### License server not responding
|
||||||
|
```bash
|
||||||
|
# Check if running
|
||||||
|
ssh root@dalidou "ps aux | grep lmgrd"
|
||||||
|
|
||||||
|
# Check log for errors
|
||||||
|
ssh root@dalidou "tail -50 /opt/Siemens/LicenseServer/logs/lmgrd.log"
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
ssh root@dalidou "systemctl restart siemens-lmgrd"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Can't connect from laptop
|
||||||
|
1. Check Tailscale is connected: `tailscale status`
|
||||||
|
2. Ping dalidou: `ping 100.80.199.40`
|
||||||
|
3. Check firewall: `ssh root@dalidou "ufw status"`
|
||||||
|
|
||||||
|
### "All licenses in use" error
|
||||||
|
Only 1 seat per license - close NX on other machines first.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SolidWorks (Future)
|
||||||
|
|
||||||
|
When setting up SolidWorks SNL license:
|
||||||
|
|
||||||
|
| Field | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| Server Name | `dalidou` |
|
||||||
|
| MAC Address | `F0DEF1E6E46A` |
|
||||||
|
| License Server Port | `25734` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Port Reference
|
||||||
|
|
||||||
|
| Service | Port | Protocol |
|
||||||
|
|---------|------|----------|
|
||||||
|
| Siemens lmgrd (NX) | 28000 | TCP |
|
||||||
|
| SolidWorks SNL | 25734 | TCP |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## History
|
||||||
|
|
||||||
|
| Date | Change |
|
||||||
|
|------|--------|
|
||||||
|
| 2025-12-01 | Installed Siemens License Server v5.0.0 on dalidou |
|
||||||
|
| 2025-12-01 | Configured systemd auto-start service |
|
||||||
|
| 2025-12-01 | Set up SPLM_LICENSE_SERVER on Precision |
|
||||||
|
| 2025-12-01 | Temporary license active until Dec 3 |
|
||||||
248
docs/SIEMENS-DOCS-SERVER.md
Normal file
248
docs/SIEMENS-DOCS-SERVER.md
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
# Siemens Documentation Server on Dalidou
|
||||||
|
|
||||||
|
**Updated:** 2025-12-05
|
||||||
|
**Server:** dalidou (ThinkPad W520)
|
||||||
|
**Status:** OPERATIONAL
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This setup provides authenticated access to Siemens Support Center documentation (NX Open, Simcenter, Teamcenter) through an MCP server that can be used by Claude in Atomizer.
|
||||||
|
|
||||||
|
### Components
|
||||||
|
|
||||||
|
1. **Siemens Documentation Proxy** (port 5000) - Official Siemens proxy for documentation access
|
||||||
|
2. **Puppeteer Authentication** - Headless browser that handles Siemens SSO login
|
||||||
|
3. **MCP Server Tools** - Exposed via the dalidou-assistant MCP server
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### For Claude/Atomizer
|
||||||
|
|
||||||
|
The Siemens docs tools are automatically available through the MCP server. Use these tools:
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `siemens_docs_search` | Search NX Open, Simcenter docs for a topic |
|
||||||
|
| `siemens_docs_fetch` | Fetch a specific documentation page by URL |
|
||||||
|
| `siemens_auth_status` | Check if authentication session is active |
|
||||||
|
| `siemens_login` | Re-login if session expired |
|
||||||
|
| `siemens_docs_list` | List available documentation categories |
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
# Search for NX Open Session class
|
||||||
|
siemens_docs_search(query="NXOpen Session", product="nx")
|
||||||
|
|
||||||
|
# Fetch a specific page
|
||||||
|
siemens_docs_fetch(url="https://support.sw.siemens.com/en-US/knowledge-base/...")
|
||||||
|
|
||||||
|
# Check auth status
|
||||||
|
siemens_auth_status()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server Configuration
|
||||||
|
|
||||||
|
### Documentation Proxy Service
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Service status
|
||||||
|
ssh root@dalidou "systemctl status siemensdocumentationproxyserver"
|
||||||
|
|
||||||
|
# Restart if needed
|
||||||
|
ssh root@dalidou "systemctl restart siemensdocumentationproxyserver"
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
ssh root@dalidou "cat /srv/siemens-docs/proxy/logs/*.log | tail -50"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Location:** `/srv/siemens-docs/proxy/`
|
||||||
|
**Port:** 5000 (HTTP, bound to 0.0.0.0)
|
||||||
|
**API Key:** siemens-docs-2024
|
||||||
|
|
||||||
|
### MCP Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Files location
|
||||||
|
/srv/claude-assistant/
|
||||||
|
├── mcp-server/
|
||||||
|
│ └── server.js # Main MCP server (v1.2.0)
|
||||||
|
├── tools/
|
||||||
|
│ ├── siemens-auth.js # Puppeteer authentication
|
||||||
|
│ ├── siemens-docs.js # Documentation fetching
|
||||||
|
│ ├── weather.js # Weather tools
|
||||||
|
│ └── gitea.js # Gitea tools
|
||||||
|
└── vault/
|
||||||
|
├── siemens-creds.json # Siemens login credentials (secured)
|
||||||
|
└── siemens-cookies.json # Session cookies
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
The system uses Puppeteer (headless Chrome) to:
|
||||||
|
|
||||||
|
1. Navigate to `https://customer.sw.siemens.com`
|
||||||
|
2. Accept cookie consent
|
||||||
|
3. Click "Log In" → redirects to `login.siemens.com`
|
||||||
|
4. Enter email/username and password
|
||||||
|
5. Save session cookies for reuse
|
||||||
|
|
||||||
|
### Credentials Storage
|
||||||
|
|
||||||
|
Credentials are stored securely on Dalidou:
|
||||||
|
```bash
|
||||||
|
/srv/claude-assistant/vault/siemens-creds.json # chmod 600
|
||||||
|
```
|
||||||
|
|
||||||
|
### Session Management
|
||||||
|
|
||||||
|
- Cookies are saved after successful login
|
||||||
|
- Session typically lasts several hours
|
||||||
|
- The tools auto-detect expired sessions and re-login
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### "Session expired" or auth errors
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Force re-login
|
||||||
|
ssh root@dalidou "cd /srv/claude-assistant && node -e \"import docs from './tools/siemens-docs.js'; await docs.performLogin(); await docs.closeBrowser();\""
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Page not found" errors
|
||||||
|
|
||||||
|
The Siemens documentation structure changes. Some URLs may be outdated. Use the search function to find current documentation.
|
||||||
|
|
||||||
|
### Browser issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Kill any stuck Chrome processes
|
||||||
|
ssh root@dalidou "pkill -f chrome"
|
||||||
|
|
||||||
|
# Clear cookies and re-login
|
||||||
|
ssh root@dalidou "rm /srv/claude-assistant/vault/siemens-cookies.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check all services
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Documentation Proxy
|
||||||
|
ssh root@dalidou "systemctl status siemensdocumentationproxyserver"
|
||||||
|
|
||||||
|
# Test proxy connectivity
|
||||||
|
ssh root@dalidou "curl -s http://localhost:5000/ | head -5"
|
||||||
|
|
||||||
|
# Test authentication
|
||||||
|
ssh root@dalidou "cd /srv/claude-assistant && node -e \"import docs from './tools/siemens-docs.js'; const r = await docs.checkAuthStatus(); console.log(r); await docs.closeBrowser();\""
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Updating Credentials
|
||||||
|
|
||||||
|
If your Siemens password changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@dalidou "cat > /srv/claude-assistant/vault/siemens-creds.json << EOF
|
||||||
|
{
|
||||||
|
\"username\": \"your.email@example.com\",
|
||||||
|
\"password\": \"your-new-password\"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod 600 /srv/claude-assistant/vault/siemens-creds.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
|
||||||
|
### Why Puppeteer Instead of Direct API?
|
||||||
|
|
||||||
|
Siemens Support Center uses:
|
||||||
|
- Single Sign-On (SSO) via `login.siemens.com`
|
||||||
|
- JavaScript-heavy SPA architecture
|
||||||
|
- Cookie-based session management
|
||||||
|
- No public API for documentation access
|
||||||
|
|
||||||
|
Puppeteer provides:
|
||||||
|
- Full browser rendering for SPA content
|
||||||
|
- Automatic SSO flow handling
|
||||||
|
- Cookie persistence for session reuse
|
||||||
|
|
||||||
|
### Documentation Proxy Purpose
|
||||||
|
|
||||||
|
The Siemens Documentation Proxy (`DocumentationProxy.3.3.1.aol`) is designed for:
|
||||||
|
- Serving documentation in air-gapped/offline environments
|
||||||
|
- Caching documentation locally
|
||||||
|
- Providing documentation access without individual logins
|
||||||
|
|
||||||
|
However, it still requires valid Siemens credentials for initial setup.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NX Open Python Reference - Validated Access
|
||||||
|
|
||||||
|
**Status: FULLY OPERATIONAL** (Tested 2025-12-05)
|
||||||
|
|
||||||
|
### Base URL
|
||||||
|
```
|
||||||
|
https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verified Working Pages
|
||||||
|
|
||||||
|
| Page | URL | Status |
|
||||||
|
|------|-----|--------|
|
||||||
|
| Main Index | `index.html` | ✅ |
|
||||||
|
| Class Index | `classes.html` | ✅ |
|
||||||
|
| Class List | `annotated.html` | ✅ |
|
||||||
|
| Class Hierarchy | `hierarchy.html` | ✅ |
|
||||||
|
| Functions Index | `functions.html` | ✅ |
|
||||||
|
| **NXOpen.Session** | `a03318.html` | ✅ |
|
||||||
|
| **NXOpen.Part** | `a02434.html` | ✅ |
|
||||||
|
| **NXOpen.BasePart** | `a00266.html` | ✅ |
|
||||||
|
| NXOpen.PDM.PdmSession | `a50542.html` | ✅ |
|
||||||
|
| NXOpen.CAE.CaeSession | `a10510.html` | ✅ |
|
||||||
|
|
||||||
|
### Key Classes Quick Reference
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Main entry points
|
||||||
|
NXOpen.Session # a03318.html - Main NX session object
|
||||||
|
NXOpen.Part # a02434.html - Part file object
|
||||||
|
NXOpen.BasePart # a00266.html - Base part class
|
||||||
|
|
||||||
|
# CAE/CAM
|
||||||
|
NXOpen.CAE.CaeSession # a10510.html - CAE session
|
||||||
|
NXOpen.CAM.CAMSession # Via Session.CAMSession()
|
||||||
|
|
||||||
|
# PDM/Teamcenter
|
||||||
|
NXOpen.PDM.PdmSession # a50542.html - PDM session
|
||||||
|
```
|
||||||
|
|
||||||
|
### URL Pattern Notes
|
||||||
|
|
||||||
|
- Class pages use format: `aXXXXX.html` (5-digit ID)
|
||||||
|
- Function pages: `functions.html`, `functions_a.html` through `functions_z.html`
|
||||||
|
- Namespace pages may return "Access Denied" when accessed directly
|
||||||
|
- Navigate through Class List (`annotated.html`) for best results
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
| Date | Version | Changes |
|
||||||
|
|------|---------|---------|
|
||||||
|
| 2025-12-05 | 1.2.1 | Validated full NX Open Python Reference access |
|
||||||
|
| 2025-12-05 | 1.2.0 | Added Puppeteer-based authentication |
|
||||||
|
| 2025-12-05 | 1.1.0 | Installed Documentation Proxy, initial setup |
|
||||||
119
docs/thinkpad-setup.md
Normal file
119
docs/thinkpad-setup.md
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
# ThinkPad P16 Setup - Git LFS for CAD
|
||||||
|
|
||||||
|
When the ThinkPad comes back from repair, follow these steps to set up Git LFS for CAD versioning.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Git installed (should already be there)
|
||||||
|
- Network access to dalidou (192.168.86.50)
|
||||||
|
|
||||||
|
## Setup Steps
|
||||||
|
|
||||||
|
### 1. Open PowerShell as Administrator
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd C:\Users\Antoine\Documents\Dalidou-Server-Setup
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Run the Setup Script
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.\windows-setup.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Verify Git is installed
|
||||||
|
- Install Git LFS if needed
|
||||||
|
- Initialize Git LFS globally
|
||||||
|
- Configure Git for large file uploads (500MB buffer)
|
||||||
|
|
||||||
|
### 3. Create or Clone CAD Repository
|
||||||
|
|
||||||
|
**Option A: Clone existing repo**
|
||||||
|
```powershell
|
||||||
|
git clone http://git.dalidou.home/antoine/cad-projects.git
|
||||||
|
cd cad-projects
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option B: Initialize new repo**
|
||||||
|
1. Create repo in Gitea: http://git.dalidou.home
|
||||||
|
2. Clone it:
|
||||||
|
```powershell
|
||||||
|
git clone http://git.dalidou.home/antoine/YOUR-REPO-NAME.git
|
||||||
|
cd YOUR-REPO-NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Add LFS Configuration Files
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Copy-Item "..\Dalidou-Server-Setup\.gitattributes" .
|
||||||
|
Copy-Item "..\Dalidou-Server-Setup\.gitignore" .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Initialize Folder Structure (Optional)
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
..\Dalidou-Server-Setup\init-cad-repo.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Commit and Push
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git add .
|
||||||
|
git commit -m "Initialize CAD repository with LFS tracking"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verify LFS is Working
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Check tracked patterns
|
||||||
|
git lfs track
|
||||||
|
|
||||||
|
# Should show:
|
||||||
|
# *.prt filter=lfs ...
|
||||||
|
# *.sldprt filter=lfs ...
|
||||||
|
# etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Test with a CAD File
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Copy a test part file
|
||||||
|
Copy-Item "C:\path\to\some\test.prt" .
|
||||||
|
|
||||||
|
# Add and commit
|
||||||
|
git add test.prt
|
||||||
|
git commit -m "Test LFS upload"
|
||||||
|
git push
|
||||||
|
|
||||||
|
# Verify it used LFS
|
||||||
|
git lfs ls-files
|
||||||
|
# Should show: test.prt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Daily Workflow
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Lock before editing
|
||||||
|
git lfs lock "NX/Projects/MyProject/part.prt"
|
||||||
|
|
||||||
|
# Edit in NX...
|
||||||
|
|
||||||
|
# Commit
|
||||||
|
git add .
|
||||||
|
git commit -m "Updated part geometry"
|
||||||
|
git push
|
||||||
|
|
||||||
|
# Unlock
|
||||||
|
git lfs unlock "NX/Projects/MyProject/part.prt"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Server Info
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| Gitea URL | http://git.dalidou.home |
|
||||||
|
| Gitea IP | http://192.168.86.50:3000 |
|
||||||
|
| SSH | git@192.168.86.50:2222 |
|
||||||
|
| LFS Status | ✅ Enabled (Nov 27, 2025) |
|
||||||
97
scripts/init-cad-repo.ps1
Normal file
97
scripts/init-cad-repo.ps1
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
# ===========================================
|
||||||
|
# Initialize CAD Repository Structure
|
||||||
|
# Run this inside your cloned repository
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
param(
|
||||||
|
[string]$RepoPath = "."
|
||||||
|
)
|
||||||
|
|
||||||
|
Write-Host "=== Initializing CAD Repository Structure ===" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
Push-Location $RepoPath
|
||||||
|
|
||||||
|
# Create directory structure
|
||||||
|
$directories = @(
|
||||||
|
"NX/Projects/P04-StarSpec"
|
||||||
|
"NX/Projects/Atomaste-Tools"
|
||||||
|
"NX/Projects/Client-Projects"
|
||||||
|
"NX/Templates/part-templates"
|
||||||
|
"NX/Templates/simulation-templates"
|
||||||
|
"NX/Libraries/materials"
|
||||||
|
"NX/Libraries/fasteners"
|
||||||
|
"SolidWorks/Projects"
|
||||||
|
"SolidWorks/Templates"
|
||||||
|
"Exports/STEP"
|
||||||
|
"Exports/STL"
|
||||||
|
"Exports/PDF"
|
||||||
|
"Documentation/specs"
|
||||||
|
"Documentation/reports"
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($dir in $directories) {
|
||||||
|
if (!(Test-Path $dir)) {
|
||||||
|
New-Item -ItemType Directory -Path $dir -Force | Out-Null
|
||||||
|
# Create .gitkeep to track empty directories
|
||||||
|
New-Item -ItemType File -Path "$dir/.gitkeep" -Force | Out-Null
|
||||||
|
Write-Host "Created: $dir" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host "Exists: $dir" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create README.md
|
||||||
|
$readmeContent = @"
|
||||||
|
# CAD Projects Repository
|
||||||
|
|
||||||
|
Version-controlled CAD files using Git LFS on Gitea.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
- **NX/** - NX Siemens projects and files
|
||||||
|
- **Projects/** - Active project folders
|
||||||
|
- **Templates/** - Part and simulation templates
|
||||||
|
- **Libraries/** - Reusable materials and components
|
||||||
|
|
||||||
|
- **SolidWorks/** - SolidWorks projects and files
|
||||||
|
|
||||||
|
- **Exports/** - Exchange format exports (STEP, STL, PDF)
|
||||||
|
|
||||||
|
- **Documentation/** - Specs and reports
|
||||||
|
|
||||||
|
## Quick Commands
|
||||||
|
|
||||||
|
``````bash
|
||||||
|
# Lock a file before editing
|
||||||
|
git lfs lock "NX/Projects/P04-StarSpec/main-assembly.prt"
|
||||||
|
|
||||||
|
# Check what's locked
|
||||||
|
git lfs locks
|
||||||
|
|
||||||
|
# Unlock after committing
|
||||||
|
git lfs unlock "NX/Projects/P04-StarSpec/main-assembly.prt"
|
||||||
|
|
||||||
|
# See LFS tracked files
|
||||||
|
git lfs ls-files
|
||||||
|
``````
|
||||||
|
|
||||||
|
## Server
|
||||||
|
|
||||||
|
- Gitea: http://git.dalidou.home
|
||||||
|
- IP: 192.168.86.50:3000
|
||||||
|
"@
|
||||||
|
|
||||||
|
$readmeContent | Out-File -FilePath "README.md" -Encoding utf8
|
||||||
|
Write-Host "Created: README.md" -ForegroundColor Green
|
||||||
|
|
||||||
|
Pop-Location
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Repository structure initialized!" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Next steps:" -ForegroundColor Yellow
|
||||||
|
Write-Host " cd $RepoPath"
|
||||||
|
Write-Host " git add ."
|
||||||
|
Write-Host " git commit -m 'Initialize CAD repository structure'"
|
||||||
|
Write-Host " git push"
|
||||||
138
scripts/server-setup.sh
Normal file
138
scripts/server-setup.sh
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ===========================================
|
||||||
|
# Gitea Git LFS Setup Script for dalidou
|
||||||
|
# Server: 192.168.86.50
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Gitea Git LFS Setup for dalidou ==="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 1: Find Gitea container and config
|
||||||
|
# -----------------------------------------
|
||||||
|
echo "[1/5] Finding Gitea container..."
|
||||||
|
|
||||||
|
GITEA_CONTAINER=$(docker ps --format '{{.Names}}' | grep -i gitea | head -1)
|
||||||
|
|
||||||
|
if [ -z "$GITEA_CONTAINER" ]; then
|
||||||
|
echo "ERROR: Gitea container not found!"
|
||||||
|
echo "Make sure Gitea is running: docker ps"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Found container: $GITEA_CONTAINER"
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 2: Find app.ini location
|
||||||
|
# -----------------------------------------
|
||||||
|
echo ""
|
||||||
|
echo "[2/5] Locating app.ini..."
|
||||||
|
|
||||||
|
# Try common locations
|
||||||
|
APP_INI_PATHS=(
|
||||||
|
"/data/gitea/conf/app.ini"
|
||||||
|
"/etc/gitea/app.ini"
|
||||||
|
"/app/gitea/conf/app.ini"
|
||||||
|
)
|
||||||
|
|
||||||
|
APP_INI=""
|
||||||
|
for path in "${APP_INI_PATHS[@]}"; do
|
||||||
|
if docker exec "$GITEA_CONTAINER" test -f "$path" 2>/dev/null; then
|
||||||
|
APP_INI="$path"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$APP_INI" ]; then
|
||||||
|
echo "WARNING: Could not find app.ini automatically."
|
||||||
|
echo "Searching inside container..."
|
||||||
|
APP_INI=$(docker exec "$GITEA_CONTAINER" find / -name "app.ini" 2>/dev/null | head -1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$APP_INI" ]; then
|
||||||
|
echo "ERROR: app.ini not found!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Found app.ini at: $APP_INI"
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 3: Backup current config
|
||||||
|
# -----------------------------------------
|
||||||
|
echo ""
|
||||||
|
echo "[3/5] Backing up current configuration..."
|
||||||
|
|
||||||
|
BACKUP_NAME="app.ini.backup.$(date +%Y%m%d_%H%M%S)"
|
||||||
|
docker exec "$GITEA_CONTAINER" cp "$APP_INI" "${APP_INI}.backup"
|
||||||
|
echo "Backup created: ${APP_INI}.backup"
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 4: Check/Enable LFS settings
|
||||||
|
# -----------------------------------------
|
||||||
|
echo ""
|
||||||
|
echo "[4/5] Checking LFS configuration..."
|
||||||
|
|
||||||
|
# Check if LFS is already configured
|
||||||
|
if docker exec "$GITEA_CONTAINER" grep -q "LFS_START_SERVER" "$APP_INI"; then
|
||||||
|
echo "LFS_START_SERVER already exists in config"
|
||||||
|
docker exec "$GITEA_CONTAINER" grep "LFS_START_SERVER" "$APP_INI"
|
||||||
|
else
|
||||||
|
echo "LFS not configured. Adding LFS settings..."
|
||||||
|
|
||||||
|
# Create a temporary script to modify the config
|
||||||
|
docker exec "$GITEA_CONTAINER" sh -c "
|
||||||
|
# Add LFS_START_SERVER to [server] section if not present
|
||||||
|
if grep -q '^\[server\]' '$APP_INI'; then
|
||||||
|
sed -i '/^\[server\]/a LFS_START_SERVER = true' '$APP_INI'
|
||||||
|
fi
|
||||||
|
"
|
||||||
|
echo "Added LFS_START_SERVER = true to [server] section"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check/add [lfs] section
|
||||||
|
if docker exec "$GITEA_CONTAINER" grep -q "^\[lfs\]" "$APP_INI"; then
|
||||||
|
echo "[lfs] section already exists"
|
||||||
|
docker exec "$GITEA_CONTAINER" grep -A5 "^\[lfs\]" "$APP_INI"
|
||||||
|
else
|
||||||
|
echo "Adding [lfs] section..."
|
||||||
|
docker exec "$GITEA_CONTAINER" sh -c "
|
||||||
|
echo '' >> '$APP_INI'
|
||||||
|
echo '[lfs]' >> '$APP_INI'
|
||||||
|
echo 'PATH = /data/lfs' >> '$APP_INI'
|
||||||
|
"
|
||||||
|
echo "Added [lfs] section with PATH = /data/lfs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 5: Create LFS directory and set permissions
|
||||||
|
# -----------------------------------------
|
||||||
|
echo ""
|
||||||
|
echo "[5/5] Setting up LFS directory..."
|
||||||
|
|
||||||
|
docker exec "$GITEA_CONTAINER" sh -c "
|
||||||
|
mkdir -p /data/lfs
|
||||||
|
chown -R git:git /data/lfs 2>/dev/null || chown -R 1000:1000 /data/lfs
|
||||||
|
chmod 755 /data/lfs
|
||||||
|
"
|
||||||
|
echo "LFS directory created at /data/lfs"
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Show final configuration
|
||||||
|
# -----------------------------------------
|
||||||
|
echo ""
|
||||||
|
echo "=== Current LFS Configuration ==="
|
||||||
|
docker exec "$GITEA_CONTAINER" grep -E "(LFS_START_SERVER|^\[lfs\]|^PATH)" "$APP_INI" || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Next Steps ==="
|
||||||
|
echo "1. Restart Gitea to apply changes:"
|
||||||
|
echo " docker restart $GITEA_CONTAINER"
|
||||||
|
echo ""
|
||||||
|
echo "2. Verify LFS is enabled:"
|
||||||
|
echo " docker logs $GITEA_CONTAINER 2>&1 | grep -i lfs"
|
||||||
|
echo ""
|
||||||
|
echo "3. Test from Windows client (see windows-setup.ps1)"
|
||||||
|
echo ""
|
||||||
|
echo "Done!"
|
||||||
102
scripts/windows-setup.ps1
Normal file
102
scripts/windows-setup.ps1
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# ===========================================
|
||||||
|
# Git LFS Setup for Windows (ThinkPad P16)
|
||||||
|
# CAD Versioning with Gitea on dalidou
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
Write-Host "=== Git LFS Setup for CAD Versioning ===" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 1: Check Git installation
|
||||||
|
# -----------------------------------------
|
||||||
|
Write-Host "[1/5] Checking Git installation..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
try {
|
||||||
|
$gitVersion = git --version
|
||||||
|
Write-Host "Git installed: $gitVersion" -ForegroundColor Green
|
||||||
|
} catch {
|
||||||
|
Write-Host "ERROR: Git is not installed!" -ForegroundColor Red
|
||||||
|
Write-Host "Install Git from: https://git-scm.com/download/win"
|
||||||
|
Write-Host "Or run: winget install Git.Git"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 2: Install Git LFS
|
||||||
|
# -----------------------------------------
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "[2/5] Checking/Installing Git LFS..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
try {
|
||||||
|
$lfsVersion = git lfs version
|
||||||
|
Write-Host "Git LFS installed: $lfsVersion" -ForegroundColor Green
|
||||||
|
} catch {
|
||||||
|
Write-Host "Git LFS not found. Installing..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Try winget first
|
||||||
|
$wingetInstalled = Get-Command winget -ErrorAction SilentlyContinue
|
||||||
|
if ($wingetInstalled) {
|
||||||
|
Write-Host "Installing via winget..."
|
||||||
|
winget install GitHub.GitLFS --accept-package-agreements --accept-source-agreements
|
||||||
|
} else {
|
||||||
|
Write-Host "ERROR: Please install Git LFS manually from https://git-lfs.github.com/"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 3: Initialize Git LFS globally
|
||||||
|
# -----------------------------------------
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "[3/5] Initializing Git LFS..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
git lfs install
|
||||||
|
Write-Host "Git LFS initialized globally" -ForegroundColor Green
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 4: Configure Git for large files
|
||||||
|
# -----------------------------------------
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "[4/5] Configuring Git for large file uploads..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Increase HTTP buffer for large CAD files
|
||||||
|
git config --global http.postBuffer 524288000
|
||||||
|
|
||||||
|
# Configure credentials for Gitea
|
||||||
|
git config --global credential.helper manager
|
||||||
|
|
||||||
|
Write-Host "HTTP buffer set to 500MB" -ForegroundColor Green
|
||||||
|
Write-Host "Credential helper configured" -ForegroundColor Green
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Step 5: Display connection info
|
||||||
|
# -----------------------------------------
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "[5/5] Setup Complete!" -ForegroundColor Green
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "=== Gitea Server Info ===" -ForegroundColor Cyan
|
||||||
|
Write-Host "URL: http://git.dalidou.home" -ForegroundColor White
|
||||||
|
Write-Host "Alt URL: http://192.168.86.50:3000" -ForegroundColor White
|
||||||
|
Write-Host "SSH: ssh://git@192.168.86.50:2222" -ForegroundColor White
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "=== Next Steps ===" -ForegroundColor Cyan
|
||||||
|
Write-Host "1. Create a new repository in Gitea web UI"
|
||||||
|
Write-Host "2. Clone it:"
|
||||||
|
Write-Host " git clone http://git.dalidou.home/antoine/cad-projects.git"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "3. Copy .gitattributes and .gitignore to the repo:"
|
||||||
|
Write-Host " Copy-Item '.\.gitattributes' 'cad-projects\'"
|
||||||
|
Write-Host " Copy-Item '.\.gitignore' 'cad-projects\'"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "4. Commit and push:"
|
||||||
|
Write-Host " cd cad-projects"
|
||||||
|
Write-Host " git add .gitattributes .gitignore"
|
||||||
|
Write-Host " git commit -m 'Add LFS tracking for CAD files'"
|
||||||
|
Write-Host " git push"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "=== Daily Workflow Commands ===" -ForegroundColor Cyan
|
||||||
|
Write-Host "Lock file: git lfs lock 'path/to/file.prt'"
|
||||||
|
Write-Host "View locks: git lfs locks"
|
||||||
|
Write-Host "Unlock: git lfs unlock 'path/to/file.prt'"
|
||||||
|
Write-Host "LFS status: git lfs status"
|
||||||
|
Write-Host ""
|
||||||
50
temp/find-part.js
Normal file
50
temp/find-part.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
// Navigate to annotated.html and find Part class
|
||||||
|
await page.goto('https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/annotated.html', { waitUntil: 'networkidle2' });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Find Part class links
|
||||||
|
const partLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a.el'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && (a.innerText === 'Part' || a.innerText === 'NXOpen::Part'))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() }));
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Part links found:', partLinks);
|
||||||
|
|
||||||
|
// Also search for BasePart
|
||||||
|
const basePartLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a.el'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && a.innerText.includes('BasePart'))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() }))
|
||||||
|
.slice(0, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('BasePart links:', basePartLinks);
|
||||||
|
|
||||||
|
// Navigate to Part if found
|
||||||
|
if (partLinks.length > 0) {
|
||||||
|
const partUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/' + partLinks[0].href;
|
||||||
|
console.log('\nNavigating to:', partUrl);
|
||||||
|
await page.goto(partUrl, { waitUntil: 'networkidle2' });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const content = await page.evaluate(() => ({
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
preview: document.body.innerText.substring(0, 2000)
|
||||||
|
}));
|
||||||
|
|
||||||
|
console.log('Title:', content.title);
|
||||||
|
console.log('Has error:', content.hasError);
|
||||||
|
console.log('Content:', content.preview);
|
||||||
|
}
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
BIN
temp/python-ref-1.png
Normal file
BIN
temp/python-ref-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
BIN
temp/python-ref-3.png
Normal file
BIN
temp/python-ref-3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
336
temp/server.js
Normal file
336
temp/server.js
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
// MCP Server - exposes dalidou tools to Claude Code on Windows
|
||||||
|
|
||||||
|
import "dotenv/config";
|
||||||
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
||||||
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||||
|
import {
|
||||||
|
CallToolRequestSchema,
|
||||||
|
ListToolsRequestSchema,
|
||||||
|
} from "@modelcontextprotocol/sdk/types.js";
|
||||||
|
import weather from "../tools/weather.js";
|
||||||
|
import gitea from "../tools/gitea.js";
|
||||||
|
import siemensDocs from "../tools/siemens-docs.js";
|
||||||
|
|
||||||
|
const server = new Server(
|
||||||
|
{
|
||||||
|
name: "dalidou-assistant",
|
||||||
|
version: "1.3.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
capabilities: {
|
||||||
|
tools: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// List available tools
|
||||||
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
||||||
|
return {
|
||||||
|
tools: [
|
||||||
|
// Weather tools
|
||||||
|
{
|
||||||
|
name: "get_current_weather",
|
||||||
|
description: "Get current weather conditions in Rouyn-Noranda (temperature, wind, conditions)",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {},
|
||||||
|
required: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get_hourly_forecast",
|
||||||
|
description: "Get hourly weather forecast for planning activities",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
days: { type: "number", description: "Days to forecast (1-7)" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get_daily_forecast",
|
||||||
|
description: "Get daily weather forecast (highs, lows, conditions)",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
days: { type: "number", description: "Days to forecast (1-14)" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "find_best_activity_windows",
|
||||||
|
description: "Find best time windows for outdoor activities based on weather",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
activity: {
|
||||||
|
type: "string",
|
||||||
|
description: "Activity: skiing, cross-country-skiing, hiking, mushroom-hunting"
|
||||||
|
},
|
||||||
|
days: { type: "number", description: "Days to search (1-7)" }
|
||||||
|
},
|
||||||
|
required: ["activity"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "check_skiing_conditions",
|
||||||
|
description: "Check if current conditions are good for cross-country skiing",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Gitea tools
|
||||||
|
{
|
||||||
|
name: "get_today_commits",
|
||||||
|
description: "Get all git commits made today from Gitea",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get_recent_activity",
|
||||||
|
description: "Get recent git activity across all Gitea repos",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
days: { type: "number", description: "Days of history (default 7)" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "list_repos",
|
||||||
|
description: "List all repositories on Gitea",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Siemens Documentation tools
|
||||||
|
{
|
||||||
|
name: "siemens_docs_list",
|
||||||
|
description: "List available Siemens documentation categories, NX Open class IDs, and usage info",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "siemens_docs_search",
|
||||||
|
description: "Search Siemens Support Center documentation for a specific topic",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
query: {
|
||||||
|
type: "string",
|
||||||
|
description: "Search query (e.g., 'NXOpen Body.GetFaces', 'sketch constraints')"
|
||||||
|
},
|
||||||
|
product: {
|
||||||
|
type: "string",
|
||||||
|
description: "Product to search: nx, teamcenter, simcenter, nastran (default: nx)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: ["query"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "siemens_docs_fetch",
|
||||||
|
description: "Fetch a specific Siemens documentation page by URL",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
url: {
|
||||||
|
type: "string",
|
||||||
|
description: "Full URL of the documentation page to fetch"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: ["url"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "siemens_auth_status",
|
||||||
|
description: "Check Siemens Support Center authentication status",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "siemens_login",
|
||||||
|
description: "Login to Siemens Support Center (use if session expired)",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// NX Open Python Reference tools
|
||||||
|
{
|
||||||
|
name: "nxopen_get_class",
|
||||||
|
description: "Get NX Open Python class documentation. Known classes: Session, Part, BasePart, PdmSession, CaeSession",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
className: {
|
||||||
|
type: "string",
|
||||||
|
description: "Class name (e.g., 'Session', 'Part', 'BasePart')"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: ["className"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nxopen_get_index",
|
||||||
|
description: "Get NX Open Python Reference index pages (class list, functions, hierarchy)",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
indexType: {
|
||||||
|
type: "string",
|
||||||
|
description: "Index type: classes, annotated, hierarchy, functions, main (default: classes)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nxopen_fetch_page",
|
||||||
|
description: "Fetch any NX Open Python Reference page by page ID (e.g., 'a03318.html' for Session)",
|
||||||
|
inputSchema: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
pagePath: {
|
||||||
|
type: "string",
|
||||||
|
description: "Page path (e.g., 'a03318.html', 'classes.html', 'functions_s.html')"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: ["pagePath"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle tool calls
|
||||||
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
||||||
|
const { name, arguments: args } = request.params;
|
||||||
|
|
||||||
|
try {
|
||||||
|
let result;
|
||||||
|
|
||||||
|
switch (name) {
|
||||||
|
// Weather tools
|
||||||
|
case "get_current_weather":
|
||||||
|
result = await weather.getCurrentWeather();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "get_hourly_forecast":
|
||||||
|
result = await weather.getHourlyForecast(args?.days || 2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "get_daily_forecast":
|
||||||
|
result = await weather.getDailyForecast(args?.days || 7);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "find_best_activity_windows":
|
||||||
|
result = await weather.findBestTimeWindows(args.activity, args?.days || 2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "check_skiing_conditions":
|
||||||
|
const current = await weather.getCurrentWeather();
|
||||||
|
const skiCheck = weather.isGoodForSkiing(current);
|
||||||
|
result = {
|
||||||
|
current_weather: current,
|
||||||
|
good_for_skiing: skiCheck.good,
|
||||||
|
assessment: skiCheck.reasons
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Gitea tools
|
||||||
|
case "get_today_commits":
|
||||||
|
result = await gitea.getAllTodayCommits();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "get_recent_activity":
|
||||||
|
result = await gitea.getRepoActivity(args?.days || 7);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "list_repos":
|
||||||
|
result = await gitea.listRepos();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Siemens Documentation tools
|
||||||
|
case "siemens_docs_list":
|
||||||
|
result = await siemensDocs.listAvailableDocs();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "siemens_docs_search":
|
||||||
|
result = await siemensDocs.searchDocs(args.query, args.product || "nx");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "siemens_docs_fetch":
|
||||||
|
result = await siemensDocs.fetchDocPage(args.url);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "siemens_auth_status":
|
||||||
|
result = await siemensDocs.checkAuthStatus();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "siemens_login":
|
||||||
|
result = await siemensDocs.performLogin();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// NX Open Python Reference tools
|
||||||
|
case "nxopen_get_class":
|
||||||
|
result = await siemensDocs.fetchNXOpenClass(args.className);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "nxopen_get_index":
|
||||||
|
result = await siemensDocs.getNXOpenIndex(args?.indexType || "classes");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "nxopen_fetch_page":
|
||||||
|
result = await siemensDocs.fetchNXOpenPythonRef(args.pagePath);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return {
|
||||||
|
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
||||||
|
isError: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
content: [{
|
||||||
|
type: "text",
|
||||||
|
text: typeof result === "string" ? result : JSON.stringify(result, null, 2)
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
content: [{ type: "text", text: `Error: ${error.message}` }],
|
||||||
|
isError: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cleanup on exit
|
||||||
|
process.on("SIGINT", async () => {
|
||||||
|
await siemensDocs.closeBrowser();
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGTERM", async () => {
|
||||||
|
await siemensDocs.closeBrowser();
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start server
|
||||||
|
async function main() {
|
||||||
|
const transport = new StdioServerTransport();
|
||||||
|
await server.connect(transport);
|
||||||
|
console.error("Dalidou MCP Server v1.3.0 running on stdio (with NX Open Python Reference)");
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(console.error);
|
||||||
110
temp/test-classes.js
Normal file
110
temp/test-classes.js
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Class Documentation Access ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
// Navigate to the hierarchy page (which we know works)
|
||||||
|
const hierarchyUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/a00006.html';
|
||||||
|
console.log('Loading hierarchy page:', hierarchyUrl);
|
||||||
|
await page.goto(hierarchyUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup if present
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the page title and content
|
||||||
|
const pageInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
h1: document.querySelector('h1')?.innerText || 'No H1',
|
||||||
|
bodyText: document.body.innerText.substring(0, 1500)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nPage Title:', pageInfo.title);
|
||||||
|
console.log('H1:', pageInfo.h1);
|
||||||
|
console.log('\nPage content preview:');
|
||||||
|
console.log(pageInfo.bodyText);
|
||||||
|
|
||||||
|
// Find all class links on the hierarchy page
|
||||||
|
const classLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.href && a.href.includes('class') && a.innerText)
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.filter(l => l.text.length > 0 && l.text.length < 100)
|
||||||
|
.slice(0, 20);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\n=== Found class links:', classLinks.length);
|
||||||
|
classLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`));
|
||||||
|
|
||||||
|
// Try clicking on a class link (NXOpen.Session if available)
|
||||||
|
const sessionLink = classLinks.find(l => l.text.includes('Session') || l.text.includes('NXOpen'));
|
||||||
|
if (sessionLink) {
|
||||||
|
console.log('\n=== Testing click on:', sessionLink.text);
|
||||||
|
|
||||||
|
// Click the link
|
||||||
|
await page.evaluate((href) => {
|
||||||
|
const link = document.querySelector(`a[href="${href}"]`) ||
|
||||||
|
Array.from(document.querySelectorAll('a')).find(a => a.href === href);
|
||||||
|
if (link) link.click();
|
||||||
|
}, sessionLink.href);
|
||||||
|
|
||||||
|
await new Promise(r => setTimeout(r, 5000));
|
||||||
|
|
||||||
|
// Check the new page
|
||||||
|
const classPageInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
url: window.location.href,
|
||||||
|
title: document.title,
|
||||||
|
h1: document.querySelector('h1')?.innerText || 'No H1',
|
||||||
|
hasContent: document.body.innerText.length > 500,
|
||||||
|
bodyPreview: document.body.innerText.substring(0, 1000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nClass page URL:', classPageInfo.url);
|
||||||
|
console.log('Class page title:', classPageInfo.title);
|
||||||
|
console.log('Class page H1:', classPageInfo.h1);
|
||||||
|
console.log('Has substantial content:', classPageInfo.hasContent);
|
||||||
|
console.log('\nContent preview:');
|
||||||
|
console.log(classPageInfo.bodyPreview);
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/class-page.png' });
|
||||||
|
console.log('\nScreenshot saved to /tmp/class-page.png');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test direct navigation to a known class URL via the iframe
|
||||||
|
console.log('\n=== Testing direct class URL within iframe context ===');
|
||||||
|
const sessionClassUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/classNXOpen_1_1Session.html';
|
||||||
|
await page.goto(sessionClassUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const directAccessInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
url: window.location.href,
|
||||||
|
title: document.title,
|
||||||
|
bodyText: document.body.innerText.substring(0, 1500),
|
||||||
|
hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error')
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nDirect URL access result:');
|
||||||
|
console.log('Title:', directAccessInfo.title);
|
||||||
|
console.log('Has error:', directAccessInfo.hasError);
|
||||||
|
console.log('Content:', directAccessInfo.bodyText);
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
158
temp/test-classes2.js
Normal file
158
temp/test-classes2.js
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Class Documentation Navigation ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
// Start from the main index page
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// Navigate to Class Index
|
||||||
|
const classIndexUrl = baseUrl + 'classes.html';
|
||||||
|
console.log('Loading Class Index:', classIndexUrl);
|
||||||
|
await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup if present
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
const classIndexInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
bodyPreview: document.body.innerText.substring(0, 2000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', classIndexInfo.title);
|
||||||
|
console.log('URL:', classIndexInfo.url);
|
||||||
|
console.log('\nContent preview:');
|
||||||
|
console.log(classIndexInfo.bodyPreview);
|
||||||
|
|
||||||
|
// Find all class links
|
||||||
|
const allClassLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.href && (a.href.includes('class') || a.href.includes('struct')))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.filter(l => l.text.length > 0)
|
||||||
|
.slice(0, 50);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\n=== Class links found:', allClassLinks.length);
|
||||||
|
allClassLinks.slice(0, 20).forEach(l => console.log(` - ${l.text}`));
|
||||||
|
|
||||||
|
// Try clicking on the Session class if found
|
||||||
|
const sessionLink = allClassLinks.find(l => l.text === 'Session' || l.text.includes('Session'));
|
||||||
|
if (sessionLink) {
|
||||||
|
console.log('\n=== Clicking on Session class ===');
|
||||||
|
console.log('Link:', sessionLink.href);
|
||||||
|
|
||||||
|
await page.goto(sessionLink.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const sessionInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error'),
|
||||||
|
bodyPreview: document.body.innerText.substring(0, 2000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nSession class page:');
|
||||||
|
console.log('Title:', sessionInfo.title);
|
||||||
|
console.log('URL:', sessionInfo.url);
|
||||||
|
console.log('Has error:', sessionInfo.hasError);
|
||||||
|
console.log('\nContent:');
|
||||||
|
console.log(sessionInfo.bodyPreview);
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/session-class.png' });
|
||||||
|
} else {
|
||||||
|
// Try any class link
|
||||||
|
if (allClassLinks.length > 0) {
|
||||||
|
console.log('\n=== Clicking on first class:', allClassLinks[0].text);
|
||||||
|
await page.goto(allClassLinks[0].href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const classInfo = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error'),
|
||||||
|
bodyPreview: document.body.innerText.substring(0, 2000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', classInfo.title);
|
||||||
|
console.log('Has error:', classInfo.hasError);
|
||||||
|
console.log('Content:', classInfo.bodyPreview);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test accessing through the Doxygen wrapper URL
|
||||||
|
console.log('\n=== Testing via Siemens docs portal wrapper ===');
|
||||||
|
const portalUrl = 'https://docs.sw.siemens.com/en-US/doc/209349590/PL20200522120320484.nxopen_python_ref?audience=external';
|
||||||
|
await page.goto(portalUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 5000));
|
||||||
|
|
||||||
|
// Handle any cookie popup
|
||||||
|
const cookieBtn2 = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn2 && cookieBtn2.asElement()) {
|
||||||
|
await cookieBtn2.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for iframe
|
||||||
|
const frames = page.frames();
|
||||||
|
console.log('Frames found:', frames.length);
|
||||||
|
|
||||||
|
for (const frame of frames) {
|
||||||
|
const frameUrl = frame.url();
|
||||||
|
if (frameUrl.includes('nxopen_python_ref')) {
|
||||||
|
console.log('Found doc frame:', frameUrl);
|
||||||
|
|
||||||
|
// Try to find and click on Classes menu
|
||||||
|
const classesMenu = await frame.evaluateHandle(() => {
|
||||||
|
const elements = Array.from(document.querySelectorAll('a, button, span'));
|
||||||
|
return elements.find(e => e.innerText && e.innerText.trim() === 'Classes');
|
||||||
|
});
|
||||||
|
|
||||||
|
if (classesMenu && classesMenu.asElement()) {
|
||||||
|
console.log('Found Classes menu, clicking...');
|
||||||
|
await classesMenu.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
// Check for dropdown
|
||||||
|
const dropdown = await frame.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && a.offsetParent !== null)
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.filter(l => l.href.includes('class'))
|
||||||
|
.slice(0, 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Dropdown class links:', dropdown);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/portal-view.png' });
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
126
temp/test-classes3.js
Normal file
126
temp/test-classes3.js
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Class Documentation - Finding Session Class ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
// Navigate to S section of class index
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// First get the classes.html and look for actual clickable class links
|
||||||
|
const classIndexUrl = baseUrl + 'classes.html';
|
||||||
|
console.log('Loading Class Index:', classIndexUrl);
|
||||||
|
await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup if present
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find actual class links (not letter index links)
|
||||||
|
const classLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.filter(l => l.href.includes('class') && l.href.endsWith('.html') && !l.href.includes('classes.html'))
|
||||||
|
.slice(0, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Found actual class links:', classLinks.length);
|
||||||
|
classLinks.slice(0, 20).forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`));
|
||||||
|
|
||||||
|
// Try to find Session class link
|
||||||
|
const sessionLink = classLinks.find(l => l.text.includes('Session') && !l.text.includes('SessionBuilder'));
|
||||||
|
console.log('\nSession link found:', sessionLink);
|
||||||
|
|
||||||
|
if (sessionLink) {
|
||||||
|
console.log('\n=== Navigating to Session class ===');
|
||||||
|
await page.goto(sessionLink.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const sessionPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied') ||
|
||||||
|
document.body.innerText.includes('<Error>') ||
|
||||||
|
document.body.innerText.includes('AccessDenied'),
|
||||||
|
bodyText: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Session page title:', sessionPage.title);
|
||||||
|
console.log('URL:', sessionPage.url);
|
||||||
|
console.log('Has error:', sessionPage.hasError);
|
||||||
|
console.log('\n--- Content ---');
|
||||||
|
console.log(sessionPage.bodyText);
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/session-class.png' });
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no session link directly, navigate to the NXOpen namespace and look there
|
||||||
|
if (!sessionLink || classLinks.length === 0) {
|
||||||
|
console.log('\n=== Trying NXOpen namespace page ===');
|
||||||
|
const nxopenUrl = baseUrl + 'namespaceNXOpen.html';
|
||||||
|
await page.goto(nxopenUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const nxopenPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
bodyText: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('NXOpen namespace page:');
|
||||||
|
console.log('Title:', nxopenPage.title);
|
||||||
|
console.log('Has error:', nxopenPage.hasError);
|
||||||
|
console.log(nxopenPage.bodyText);
|
||||||
|
|
||||||
|
// Look for Session class link
|
||||||
|
const sessionInNs = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText.includes('Session'))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.slice(0, 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nSession links in NXOpen namespace:', sessionInNs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try the annotated page
|
||||||
|
console.log('\n=== Testing annotated.html ===');
|
||||||
|
const annotatedUrl = baseUrl + 'annotated.html';
|
||||||
|
await page.goto(annotatedUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const annotatedPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
bodyText: document.body.innerText.substring(0, 2000),
|
||||||
|
links: Array.from(document.querySelectorAll('a'))
|
||||||
|
.filter(a => a.href.includes('class') && a.innerText.includes('Session'))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Annotated page title:', annotatedPage.title);
|
||||||
|
console.log('Has error:', annotatedPage.hasError);
|
||||||
|
console.log('Session links:', annotatedPage.links);
|
||||||
|
console.log('\nContent preview:');
|
||||||
|
console.log(annotatedPage.bodyText);
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
166
temp/test-classes4.js
Normal file
166
temp/test-classes4.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Class List Navigation ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// Navigate to annotated.html (Class List)
|
||||||
|
const annotatedUrl = baseUrl + 'annotated.html';
|
||||||
|
console.log('Loading:', annotatedUrl);
|
||||||
|
await page.goto(annotatedUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to expand the tree view by clicking on detail level indicators
|
||||||
|
console.log('\n=== Expanding tree view ===');
|
||||||
|
|
||||||
|
// Look for expand arrows or [+] buttons
|
||||||
|
const expandButtons = await page.evaluate(() => {
|
||||||
|
// Look for various expand mechanisms
|
||||||
|
const results = {
|
||||||
|
arrows: [],
|
||||||
|
plusSigns: [],
|
||||||
|
togglers: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// Doxygen typically uses arrow images or [+] text
|
||||||
|
const imgs = Array.from(document.querySelectorAll('img'));
|
||||||
|
imgs.forEach(img => {
|
||||||
|
if (img.alt && (img.alt.includes('arrow') || img.alt.includes('expand'))) {
|
||||||
|
results.arrows.push({ src: img.src, alt: img.alt });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Look for tree toggle elements
|
||||||
|
const spans = Array.from(document.querySelectorAll('span'));
|
||||||
|
spans.forEach(s => {
|
||||||
|
if (s.className && (s.className.includes('arrow') || s.className.includes('toggle'))) {
|
||||||
|
results.togglers.push(s.className);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Look for any clickable elements near NXOpen
|
||||||
|
const allElements = Array.from(document.querySelectorAll('*'));
|
||||||
|
const nxopenElements = allElements.filter(e =>
|
||||||
|
e.innerText && e.innerText.includes('NXOpen') && e.innerText.length < 50
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...results,
|
||||||
|
nxopenElements: nxopenElements.map(e => ({
|
||||||
|
tag: e.tagName,
|
||||||
|
text: e.innerText.trim(),
|
||||||
|
className: e.className
|
||||||
|
})),
|
||||||
|
html: document.body.innerHTML.substring(0, 5000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Expand buttons found:', expandButtons.arrows.length, 'arrows,', expandButtons.togglers.length, 'togglers');
|
||||||
|
console.log('NXOpen elements:', expandButtons.nxopenElements);
|
||||||
|
|
||||||
|
// Try clicking on the NXOpen row to expand it
|
||||||
|
const clickResult = await page.evaluate(() => {
|
||||||
|
// Look for expandable row
|
||||||
|
const rows = Array.from(document.querySelectorAll('tr'));
|
||||||
|
for (const row of rows) {
|
||||||
|
if (row.innerText && row.innerText.includes('NXOpen')) {
|
||||||
|
// Find the arrow/expand control in this row
|
||||||
|
const arrow = row.querySelector('span.arrow') || row.querySelector('img') || row.querySelector('[onclick]');
|
||||||
|
if (arrow) {
|
||||||
|
arrow.click();
|
||||||
|
return 'Clicked arrow in NXOpen row';
|
||||||
|
}
|
||||||
|
// Try clicking the row itself
|
||||||
|
row.click();
|
||||||
|
return 'Clicked NXOpen row';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try the detail level links
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
const detailLink = links.find(a => a.innerText && a.innerText.includes('3'));
|
||||||
|
if (detailLink) {
|
||||||
|
detailLink.click();
|
||||||
|
return 'Clicked detail level 3';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'No expandable element found';
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Click result:', clickResult);
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
// Get current state
|
||||||
|
const pageContent = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
text: document.body.innerText.substring(0, 4000),
|
||||||
|
allLinks: Array.from(document.querySelectorAll('a'))
|
||||||
|
.filter(a => a.href && a.href.includes('.html'))
|
||||||
|
.map(a => ({ text: a.innerText.trim().substring(0, 50), href: a.href.split('/').pop() }))
|
||||||
|
.slice(0, 50)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\n=== Page content after click ===');
|
||||||
|
console.log(pageContent.text);
|
||||||
|
console.log('\n=== Links found ===');
|
||||||
|
pageContent.allLinks.forEach(l => console.log(` - ${l.text}: ${l.href}`));
|
||||||
|
|
||||||
|
// Try the search functionality
|
||||||
|
console.log('\n=== Testing search functionality ===');
|
||||||
|
const searchUrl = baseUrl + 'search.html';
|
||||||
|
await page.goto(searchUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
const searchPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
hasSearchBox: !!document.querySelector('input[type="search"]') || !!document.querySelector('#MSearchBox'),
|
||||||
|
content: document.body.innerText.substring(0, 1000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Search page title:', searchPage.title);
|
||||||
|
console.log('Has error:', searchPage.hasError);
|
||||||
|
console.log('Has search box:', searchPage.hasSearchBox);
|
||||||
|
console.log('Content:', searchPage.content);
|
||||||
|
|
||||||
|
// Try to access functions list
|
||||||
|
console.log('\n=== Testing functions list ===');
|
||||||
|
const functionsUrl = baseUrl + 'functions.html';
|
||||||
|
await page.goto(functionsUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
const functionsPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
content: document.body.innerText.substring(0, 2000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Functions page title:', functionsPage.title);
|
||||||
|
console.log('Has error:', functionsPage.hasError);
|
||||||
|
console.log('Content preview:', functionsPage.content.substring(0, 500));
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/functions-page.png' });
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
129
temp/test-classes5.js
Normal file
129
temp/test-classes5.js
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open - Accessing Actual Class Pages ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// Navigate to functions.html which we know works
|
||||||
|
const functionsUrl = baseUrl + 'functions.html';
|
||||||
|
console.log('Loading:', functionsUrl);
|
||||||
|
await page.goto(functionsUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find links to actual class pages
|
||||||
|
const classLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.href && (a.href.includes('classNXOpen') || a.href.includes('class_n_x_open')))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.filter(l => l.text.length > 0 && l.text.length < 80)
|
||||||
|
.slice(0, 30);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Class links found:', classLinks.length);
|
||||||
|
classLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`));
|
||||||
|
|
||||||
|
// Find Session class link
|
||||||
|
const sessionLink = classLinks.find(l =>
|
||||||
|
l.text.includes('Session') && !l.text.includes('SessionCollection') && !l.text.includes('SessionBuilder')
|
||||||
|
);
|
||||||
|
|
||||||
|
// Or try any class link if Session not found
|
||||||
|
const targetLink = sessionLink || classLinks[0];
|
||||||
|
|
||||||
|
if (targetLink) {
|
||||||
|
console.log('\n=== Navigating to:', targetLink.text, '===');
|
||||||
|
console.log('URL:', targetLink.href);
|
||||||
|
|
||||||
|
await page.goto(targetLink.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const classPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied') ||
|
||||||
|
document.body.innerText.includes('<Error>') ||
|
||||||
|
document.body.innerText.includes('AccessDenied'),
|
||||||
|
bodyText: document.body.innerText.substring(0, 4000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nClass page result:');
|
||||||
|
console.log('Title:', classPage.title);
|
||||||
|
console.log('URL:', classPage.url);
|
||||||
|
console.log('Has error:', classPage.hasError);
|
||||||
|
console.log('\n--- Content ---');
|
||||||
|
console.log(classPage.bodyText);
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/class-access.png' });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's also test the class list functions_s.html to find Session directly
|
||||||
|
console.log('\n=== Testing functions_s.html (looking for Session) ===');
|
||||||
|
const functionsSUrl = baseUrl + 'functions_s.html';
|
||||||
|
await page.goto(functionsSUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const sessionContent = await page.evaluate(() => {
|
||||||
|
const text = document.body.innerText;
|
||||||
|
const sessionLines = text.split('\n').filter(l => l.includes('Session'));
|
||||||
|
return {
|
||||||
|
hasError: text.includes('Access Denied'),
|
||||||
|
sessionLines: sessionLines.slice(0, 20),
|
||||||
|
sessionLinks: Array.from(document.querySelectorAll('a'))
|
||||||
|
.filter(a => a.innerText && a.innerText.includes('Session') && a.href)
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }))
|
||||||
|
.slice(0, 10)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Has error:', sessionContent.hasError);
|
||||||
|
console.log('Session-related lines:');
|
||||||
|
sessionContent.sessionLines.forEach(l => console.log(` ${l.substring(0, 100)}`));
|
||||||
|
console.log('\nSession links:');
|
||||||
|
sessionContent.sessionLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`));
|
||||||
|
|
||||||
|
// Try to click on a Session link if found
|
||||||
|
if (sessionContent.sessionLinks.length > 0) {
|
||||||
|
const sessionClassLink = sessionContent.sessionLinks.find(l =>
|
||||||
|
l.href.includes('Session') && !l.text.includes('Builder')
|
||||||
|
) || sessionContent.sessionLinks[0];
|
||||||
|
|
||||||
|
console.log('\n=== Clicking on Session link:', sessionClassLink.text, '===');
|
||||||
|
await page.goto(sessionClassLink.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const sessionPage = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
content: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', sessionPage.title);
|
||||||
|
console.log('Has error:', sessionPage.hasError);
|
||||||
|
console.log('\n--- Session class content ---');
|
||||||
|
console.log(sessionPage.content);
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/session-page.png' });
|
||||||
|
}
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
170
temp/test-find-session.js
Normal file
170
temp/test-find-session.js
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Finding NXOpen.Session Class Page ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// Navigate to hierarchy.html and look for Session
|
||||||
|
console.log('Loading hierarchy.html...');
|
||||||
|
await page.goto(baseUrl + 'hierarchy.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find Session links in hierarchy
|
||||||
|
const hierarchyLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && a.innerText.trim() === 'Session')
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href, file: a.href.split('/').pop() }));
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Session links in hierarchy:', hierarchyLinks);
|
||||||
|
|
||||||
|
// Try each Session link to find the NXOpen.Session class
|
||||||
|
for (const link of hierarchyLinks.slice(0, 3)) {
|
||||||
|
console.log(`\n=== Trying: ${link.file} ===`);
|
||||||
|
await page.goto(link.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const pageContent = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
firstLines: document.body.innerText.substring(0, 500)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', pageContent.title);
|
||||||
|
console.log('Has error:', pageContent.hasError);
|
||||||
|
console.log('Content preview:', pageContent.firstLines);
|
||||||
|
|
||||||
|
if (!pageContent.hasError && pageContent.title.includes('Session')) {
|
||||||
|
// Found a working Session page!
|
||||||
|
console.log('\n=== FOUND WORKING SESSION PAGE! ===');
|
||||||
|
|
||||||
|
// Get full content
|
||||||
|
const fullContent = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
content: document.body.innerText.substring(0, 5000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(fullContent.content);
|
||||||
|
await page.screenshot({ path: '/tmp/nxopen-session.png' });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also try directly searching in class index page for Session (NXOpen)
|
||||||
|
console.log('\n=== Looking for Session (NXOpen) specifically ===');
|
||||||
|
await page.goto(baseUrl + 'classes.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Get all text and find Session (NXOpen)
|
||||||
|
const classIndexSearch = await page.evaluate(() => {
|
||||||
|
const text = document.body.innerText;
|
||||||
|
// Look for Session followed by (NXOpen) or Session(NXOpen)
|
||||||
|
const sessionIdx = text.indexOf('Session (NXOpen)');
|
||||||
|
if (sessionIdx > -1) {
|
||||||
|
// Get surrounding context
|
||||||
|
return {
|
||||||
|
found: true,
|
||||||
|
context: text.substring(Math.max(0, sessionIdx - 100), sessionIdx + 200)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { found: false };
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Session (NXOpen) in class index:', classIndexSearch);
|
||||||
|
|
||||||
|
// Find the link for Session class under NXOpen namespace
|
||||||
|
const sessionNXOpenLink = await page.evaluate(() => {
|
||||||
|
// Get all links
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
|
||||||
|
// Find links that have "Session" text
|
||||||
|
const sessionLinks = links
|
||||||
|
.filter(a => a.innerText && a.innerText.trim() === 'Session')
|
||||||
|
.map(a => {
|
||||||
|
// Get parent context to identify namespace
|
||||||
|
let parentText = a.parentElement?.innerText || '';
|
||||||
|
return {
|
||||||
|
text: a.innerText.trim(),
|
||||||
|
href: a.href,
|
||||||
|
file: a.href.split('/').pop(),
|
||||||
|
parentContext: parentText.substring(0, 100)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return sessionLinks;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nSession links with context:', sessionNXOpenLink);
|
||||||
|
|
||||||
|
// Try the NXOpen namespace directly to find Session class
|
||||||
|
console.log('\n=== Trying NXOpen namespace from annotated.html ===');
|
||||||
|
await page.goto(baseUrl + 'annotated.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Expand NXOpen namespace and look for Session
|
||||||
|
const annotatedSessionLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a.el'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && a.innerText.includes('Session'))
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() }))
|
||||||
|
.filter(l => !l.text.includes('.') || l.text.startsWith('NXOpen.Session'))
|
||||||
|
.slice(0, 20);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Session links from annotated:', annotatedSessionLinks);
|
||||||
|
|
||||||
|
// Try the pattern a***.html to find Session directly
|
||||||
|
// Let's try a55186 (common pattern for main classes)
|
||||||
|
const testUrls = [
|
||||||
|
'a55186.html', // Possible Session
|
||||||
|
'a55188.html',
|
||||||
|
'a55190.html',
|
||||||
|
'a55180.html'
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const testUrl of testUrls) {
|
||||||
|
console.log(`\nTrying ${testUrl}...`);
|
||||||
|
await page.goto(baseUrl + testUrl, { waitUntil: 'networkidle2', timeout: 30000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
const testResult = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
isSession: document.title.includes('Session') && document.title.includes('NXOpen')
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`${testUrl}: ${testResult.title} (error: ${testResult.hasError})`);
|
||||||
|
|
||||||
|
if (!testResult.hasError && testResult.isSession) {
|
||||||
|
console.log('\n=== FOUND NXOPEN.SESSION! ===');
|
||||||
|
const content = await page.evaluate(() => document.body.innerText.substring(0, 4000));
|
||||||
|
console.log(content);
|
||||||
|
await page.screenshot({ path: '/tmp/nxopen-session-found.png' });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
111
temp/test-nxopen.js
Normal file
111
temp/test-nxopen.js
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
import auth from './tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Python Reference Access ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const url = 'https://docs.sw.siemens.com/en-US/doc/209349590/PL20200522120320484.nxopen_python_ref?audience=external';
|
||||||
|
console.log('Loading:', url);
|
||||||
|
await page.goto(url, { waitUntil: 'networkidle2' });
|
||||||
|
await new Promise(r => setTimeout(r, 5000));
|
||||||
|
|
||||||
|
// Handle cookie popup - click multiple times if needed
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
console.log('Clicking Accept All Cookies...');
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
await page.screenshot({ path: '/tmp/nxopen-1.png' });
|
||||||
|
|
||||||
|
// Check for iframes
|
||||||
|
const frames = page.frames();
|
||||||
|
console.log('\nFrames found:', frames.length);
|
||||||
|
frames.forEach((f, i) => console.log(` Frame ${i}: ${f.url().substring(0, 80)}`));
|
||||||
|
|
||||||
|
// Look for documentation iframe
|
||||||
|
let docFrame = null;
|
||||||
|
for (const frame of frames) {
|
||||||
|
const frameUrl = frame.url();
|
||||||
|
if (frameUrl.includes('nxopen') || frameUrl.includes('doxygen') || frameUrl.includes('/doc/')) {
|
||||||
|
docFrame = frame;
|
||||||
|
console.log('\nFound doc frame:', frameUrl);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no iframe, check the main page content
|
||||||
|
console.log('\n=== Main Page Content ===');
|
||||||
|
const mainContent = await page.evaluate(() => {
|
||||||
|
// Get all text
|
||||||
|
const text = document.body.innerText;
|
||||||
|
// Look for specific elements
|
||||||
|
const title = document.title;
|
||||||
|
const h1s = Array.from(document.querySelectorAll('h1')).map(h => h.innerText);
|
||||||
|
const h2s = Array.from(document.querySelectorAll('h2')).map(h => h.innerText);
|
||||||
|
|
||||||
|
return { title, h1s, h2s, text: text.substring(0, 2000) };
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', mainContent.title);
|
||||||
|
console.log('H1s:', mainContent.h1s);
|
||||||
|
console.log('H2s:', mainContent.h2s);
|
||||||
|
|
||||||
|
// Try clicking on "Classes" tab
|
||||||
|
console.log('\n=== Trying to click Classes ===');
|
||||||
|
const classesTab = await page.evaluateHandle(() => {
|
||||||
|
const elements = Array.from(document.querySelectorAll('*'));
|
||||||
|
return elements.find(e => e.innerText === 'Classes' || e.innerText === 'Classes▼');
|
||||||
|
});
|
||||||
|
|
||||||
|
if (classesTab && classesTab.asElement()) {
|
||||||
|
console.log('Found Classes element, clicking...');
|
||||||
|
await classesTab.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
await page.screenshot({ path: '/tmp/nxopen-2.png' });
|
||||||
|
|
||||||
|
// Get dropdown content
|
||||||
|
const dropdownContent = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => a.innerText && a.href)
|
||||||
|
.map(a => a.innerText.trim())
|
||||||
|
.filter(t => t.length > 2 && t.length < 100)
|
||||||
|
.slice(0, 50);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Dropdown links:', dropdownContent.length);
|
||||||
|
dropdownContent.slice(0, 30).forEach(l => console.log(' -', l));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find the embedded documentation content
|
||||||
|
console.log('\n=== Looking for embedded content ===');
|
||||||
|
const embeddedContent = await page.evaluate(() => {
|
||||||
|
// Look for common documentation containers
|
||||||
|
const containers = document.querySelectorAll('iframe, .doc-content, .documentation, #content, main');
|
||||||
|
const results = [];
|
||||||
|
containers.forEach(c => {
|
||||||
|
results.push({
|
||||||
|
tag: c.tagName,
|
||||||
|
id: c.id,
|
||||||
|
className: c.className,
|
||||||
|
src: c.src || null
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Found containers:', embeddedContent);
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\nDone!');
|
||||||
86
temp/test-session-final.js
Normal file
86
temp/test-session-final.js
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Accessing NXOpen.Session Class (a03318.html) ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// Navigate to NXOpen.Session class page
|
||||||
|
const sessionUrl = baseUrl + 'a03318.html';
|
||||||
|
console.log('Loading:', sessionUrl);
|
||||||
|
await page.goto(sessionUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Handle cookie popup
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get page content
|
||||||
|
const sessionContent = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
fullText: document.body.innerText
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Title:', sessionContent.title);
|
||||||
|
console.log('URL:', sessionContent.url);
|
||||||
|
console.log('Has error:', sessionContent.hasError);
|
||||||
|
|
||||||
|
if (!sessionContent.hasError) {
|
||||||
|
console.log('\n=== SUCCESS! NXOpen.Session class documentation ===\n');
|
||||||
|
console.log(sessionContent.fullText.substring(0, 8000));
|
||||||
|
await page.screenshot({ path: '/tmp/nxopen-session-success.png' });
|
||||||
|
|
||||||
|
// Also test another important class - Part
|
||||||
|
console.log('\n\n=== Now testing NXOpen.Part class ===');
|
||||||
|
|
||||||
|
// First find Part class page ID
|
||||||
|
await page.goto(baseUrl + 'classes.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
const partLink = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
const partLinks = links
|
||||||
|
.filter(a => a.innerText && a.innerText.trim() === 'Part')
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href, parent: a.parentElement?.innerText?.substring(0, 50) || '' }));
|
||||||
|
return partLinks.find(l => l.parent.includes('NXOpen')) || partLinks[0];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (partLink) {
|
||||||
|
console.log('Found Part link:', partLink);
|
||||||
|
await page.goto(partLink.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
const partContent = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
content: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Part class title:', partContent.title);
|
||||||
|
console.log('Has error:', partContent.hasError);
|
||||||
|
console.log('\nPart class content preview:');
|
||||||
|
console.log(partContent.content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('\n=== ERROR: Could not access Session class ===');
|
||||||
|
console.log(sessionContent.fullText);
|
||||||
|
}
|
||||||
|
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
159
temp/test-session.js
Normal file
159
temp/test-session.js
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
import auth from '../tools/siemens-auth.js';
|
||||||
|
|
||||||
|
console.log('=== Testing NX Open Session Class Access ===\n');
|
||||||
|
|
||||||
|
const browser = await auth.getBrowser();
|
||||||
|
const page = await browser.newPage();
|
||||||
|
await page.setViewport({ width: 1400, height: 900 });
|
||||||
|
await auth.loadCookies(page);
|
||||||
|
|
||||||
|
const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/';
|
||||||
|
|
||||||
|
// First navigate to the index page to establish session
|
||||||
|
console.log('Loading index page first...');
|
||||||
|
await page.goto(baseUrl + 'index.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
// Handle cookie popup
|
||||||
|
const cookieBtn = await page.evaluateHandle(() => {
|
||||||
|
const btns = Array.from(document.querySelectorAll('button'));
|
||||||
|
return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies'));
|
||||||
|
});
|
||||||
|
if (cookieBtn && cookieBtn.asElement()) {
|
||||||
|
await cookieBtn.asElement().click();
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to navigate to Class Index and find Session
|
||||||
|
console.log('\n=== Looking for NXOpen.Session class ===');
|
||||||
|
const classIndexUrl = baseUrl + 'classes.html';
|
||||||
|
await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Get HTML to find the actual Session link
|
||||||
|
const sessionInfo = await page.evaluate(() => {
|
||||||
|
const html = document.body.innerHTML;
|
||||||
|
const text = document.body.innerText;
|
||||||
|
|
||||||
|
// Look for Session (NXOpen) in the class index
|
||||||
|
const sessionMatch = text.match(/Session\s*\(NXOpen\)/);
|
||||||
|
|
||||||
|
// Look for all links containing Session
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
const sessionLinks = links
|
||||||
|
.filter(a => a.innerText && a.innerText.includes('Session') && a.href)
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href }));
|
||||||
|
|
||||||
|
return {
|
||||||
|
hasSessionInText: sessionMatch ? sessionMatch[0] : null,
|
||||||
|
sessionLinks: sessionLinks,
|
||||||
|
// Look for the specific pattern in text
|
||||||
|
sessionSection: text.split('\n').filter(l => l.includes('Session') && l.includes('NXOpen')).slice(0, 10)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Session in text:', sessionInfo.hasSessionInText);
|
||||||
|
console.log('Session-related lines:', sessionInfo.sessionSection);
|
||||||
|
console.log('Session links found:', sessionInfo.sessionLinks.length);
|
||||||
|
sessionInfo.sessionLinks.slice(0, 10).forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`));
|
||||||
|
|
||||||
|
// Navigate to the S section of the class index
|
||||||
|
console.log('\n=== Checking S section of class index ===');
|
||||||
|
const sSectionUrl = baseUrl + 'classes.html#letter_s';
|
||||||
|
await page.goto(sSectionUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 2000));
|
||||||
|
|
||||||
|
const sSectionContent = await page.evaluate(() => {
|
||||||
|
const text = document.body.innerText;
|
||||||
|
// Find the section starting from S
|
||||||
|
const sIndex = text.indexOf('\nS\n');
|
||||||
|
if (sIndex > -1) {
|
||||||
|
return text.substring(sIndex, sIndex + 3000);
|
||||||
|
}
|
||||||
|
// Try to find Session
|
||||||
|
const sessionIdx = text.indexOf('Session');
|
||||||
|
if (sessionIdx > -1) {
|
||||||
|
return text.substring(Math.max(0, sessionIdx - 100), sessionIdx + 500);
|
||||||
|
}
|
||||||
|
return text.substring(0, 2000);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('S section content:');
|
||||||
|
console.log(sSectionContent);
|
||||||
|
|
||||||
|
// Try to click on Session class from classes page
|
||||||
|
const sessionClassLinks = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
return links
|
||||||
|
.filter(a => {
|
||||||
|
const text = a.innerText.trim();
|
||||||
|
// Look for Session class that's under NXOpen namespace
|
||||||
|
return text === 'Session' || (text.includes('Session') && !text.includes('Builder') && !text.includes('Collection') && text.length < 30);
|
||||||
|
})
|
||||||
|
.map(a => ({ text: a.innerText.trim(), href: a.href, parent: a.parentElement?.innerText?.substring(0, 50) || '' }))
|
||||||
|
.slice(0, 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nSession class candidates:', sessionClassLinks);
|
||||||
|
|
||||||
|
// Try direct access to NXOpen.Session class page using Doxygen naming convention
|
||||||
|
// Doxygen uses classNXOpen_1_1Session.html format
|
||||||
|
console.log('\n=== Trying direct Session class URL ===');
|
||||||
|
const sessionDirectUrl = baseUrl + 'a55186.html'; // This is likely the Session page based on pattern
|
||||||
|
await page.goto(sessionDirectUrl, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
let sessionPageResult = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
content: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Direct URL result:');
|
||||||
|
console.log('Title:', sessionPageResult.title);
|
||||||
|
console.log('Has error:', sessionPageResult.hasError);
|
||||||
|
console.log('Content:', sessionPageResult.content.substring(0, 500));
|
||||||
|
|
||||||
|
// If error, try to find Session by navigating from hierarchy
|
||||||
|
if (sessionPageResult.hasError) {
|
||||||
|
console.log('\n=== Trying via hierarchy.html ===');
|
||||||
|
await page.goto(baseUrl + 'hierarchy.html', { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
// Find Session link
|
||||||
|
const hierarchySession = await page.evaluate(() => {
|
||||||
|
const links = Array.from(document.querySelectorAll('a'));
|
||||||
|
const sessionLink = links.find(a => a.innerText.trim() === 'Session');
|
||||||
|
if (sessionLink) {
|
||||||
|
return { text: sessionLink.innerText, href: sessionLink.href };
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (hierarchySession) {
|
||||||
|
console.log('Found Session in hierarchy:', hierarchySession);
|
||||||
|
await page.goto(hierarchySession.href, { waitUntil: 'networkidle2', timeout: 60000 });
|
||||||
|
await new Promise(r => setTimeout(r, 3000));
|
||||||
|
|
||||||
|
sessionPageResult = await page.evaluate(() => {
|
||||||
|
return {
|
||||||
|
title: document.title,
|
||||||
|
url: window.location.href,
|
||||||
|
hasError: document.body.innerText.includes('Access Denied'),
|
||||||
|
content: document.body.innerText.substring(0, 3000)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\nSession page via hierarchy:');
|
||||||
|
console.log('Title:', sessionPageResult.title);
|
||||||
|
console.log('Has error:', sessionPageResult.hasError);
|
||||||
|
console.log('Content:', sessionPageResult.content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.screenshot({ path: '/tmp/session-final.png' });
|
||||||
|
await auth.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
25
temp/test-siemens-docs.js
Normal file
25
temp/test-siemens-docs.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import docs from '../tools/siemens-docs.js';
|
||||||
|
|
||||||
|
console.log('=== Testing updated siemens-docs.js ===\n');
|
||||||
|
|
||||||
|
// Test listAvailableDocs
|
||||||
|
console.log('1. listAvailableDocs():');
|
||||||
|
const availableDocs = await docs.listAvailableDocs();
|
||||||
|
console.log(JSON.stringify(availableDocs, null, 2));
|
||||||
|
|
||||||
|
// Test fetchNXOpenClass for Session
|
||||||
|
console.log('\n2. fetchNXOpenClass("Session"):');
|
||||||
|
const sessionDocs = await docs.fetchNXOpenClass('Session');
|
||||||
|
console.log('Title:', sessionDocs.title);
|
||||||
|
console.log('Has error:', sessionDocs.error ? 'Yes: ' + sessionDocs.error : 'No');
|
||||||
|
console.log('Content preview:', (sessionDocs.content || '').substring(0, 800));
|
||||||
|
|
||||||
|
// Test getNXOpenIndex
|
||||||
|
console.log('\n3. getNXOpenIndex("functions"):');
|
||||||
|
const functionsIndex = await docs.getNXOpenIndex('functions');
|
||||||
|
console.log('Title:', functionsIndex.title);
|
||||||
|
console.log('Has error:', functionsIndex.error ? 'Yes' : 'No');
|
||||||
|
console.log('Content preview:', (functionsIndex.content || '').substring(0, 500));
|
||||||
|
|
||||||
|
await docs.closeBrowser();
|
||||||
|
console.log('\n=== Test Complete ===');
|
||||||
91
templates/gitattributes-template.txt
Normal file
91
templates/gitattributes-template.txt
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# ===========================================
|
||||||
|
# Git LFS Configuration for CAD Projects
|
||||||
|
# NX Siemens + SolidWorks + Simulation Files
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# NX Siemens Files
|
||||||
|
# -----------------------------------------
|
||||||
|
*.prt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.prt.* filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.asm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# NX Simulation/Nastran files
|
||||||
|
*.sim filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.fem filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.dat filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.nas filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.op2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.f06 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.f04 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xdb filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.unv filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# NX CAM files
|
||||||
|
*.cls filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# SolidWorks Files
|
||||||
|
# -----------------------------------------
|
||||||
|
*.sldprt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.sldasm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.slddrw filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.sldlfp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.sldmat filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# SolidWorks Simulation
|
||||||
|
*.cwr filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Neutral/Exchange Formats
|
||||||
|
# -----------------------------------------
|
||||||
|
*.step filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.stp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.iges filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.igs filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.x_t filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.x_b filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.sat filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.3mf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Mesh & Visualization
|
||||||
|
# -----------------------------------------
|
||||||
|
*.stl filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.obj filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ply filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.3ds filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.fbx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.dae filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Documents & Images (large)
|
||||||
|
# -----------------------------------------
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tif filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tiff filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bmp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Archives
|
||||||
|
# -----------------------------------------
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# File Locking (prevents merge conflicts)
|
||||||
|
# Enable for files that cannot be merged
|
||||||
|
# -----------------------------------------
|
||||||
|
*.prt lockable
|
||||||
|
*.asm lockable
|
||||||
|
*.sldprt lockable
|
||||||
|
*.sldasm lockable
|
||||||
|
*.slddrw lockable
|
||||||
|
*.sim lockable
|
||||||
|
*.fem lockable
|
||||||
58
templates/gitignore-template.txt
Normal file
58
templates/gitignore-template.txt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# ===========================================
|
||||||
|
# Git Ignore for CAD Projects
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# NX Siemens Temporary Files
|
||||||
|
# -----------------------------------------
|
||||||
|
*.log
|
||||||
|
*.lck
|
||||||
|
*_i.jt
|
||||||
|
*_jt*.log
|
||||||
|
*.prt.*[0-9]
|
||||||
|
CacheFile*.cac
|
||||||
|
*.cae_bak
|
||||||
|
|
||||||
|
# NX Journal files (unless you want to track them)
|
||||||
|
# *.vb
|
||||||
|
# *.py
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# SolidWorks Temporary Files
|
||||||
|
# -----------------------------------------
|
||||||
|
~$*.sldprt
|
||||||
|
~$*.sldasm
|
||||||
|
~$*.slddrw
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# SolidWorks backup files
|
||||||
|
*.sldprt.bak
|
||||||
|
*.sldasm.bak
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Nastran/Simulation Temporary
|
||||||
|
# -----------------------------------------
|
||||||
|
*.DBALL
|
||||||
|
*.MASTER
|
||||||
|
*.IFPDAT
|
||||||
|
*.scratch
|
||||||
|
*.SCR
|
||||||
|
fort.*
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# System Files
|
||||||
|
# -----------------------------------------
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
desktop.ini
|
||||||
|
*.bak
|
||||||
|
*~
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# IDE/Editor
|
||||||
|
# -----------------------------------------
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
Reference in New Issue
Block a user