Commit: 188fc92

Commit Details

SHA188fc92ac938e5ecdaaba64fb6d1dbffeba30181
Tree2cc04755c4f7f8be29aafd7e581f1f25e14edd58
Author<f69e50@finnacloud.com> 1766442998 +0300
Committer<f69e50@finnacloud.com> 1766442998 +0300
Message
increment
GPG Signature
-----BEGIN PGP SIGNATURE-----

iQJSBAABCAA8FiEEWJb139mJI+vZ81KkoAIVSUsXI0oFAmlJx/YeHHNvcGhpYS5l
cmFzbGFuQGZpbm5hY2xvdWQuY29tAAoJEKACFUlLFyNKyF8P/j6F8McjkGTBhDFX
frSY0CqkszvNegnZnDj4AkVjoJl7AK0RY0KLLQxrRUJq/MIA/FPj9G7df9jUJcae
TS+tvTZzWOXZ3EXomyNPangFgm5yAgmelwJYgeQdTmzIY3miM8/BdQg10GNC6Fjq
iEn6PKkpkItfiy+vftAABqe73SI9Vn6nwkUn2zVEsXBX1Kmv/ya9auodjFegvcbz
pRx5BL3xNYaA57c8WG9Fx+XaQPdaeLMcu/kM8diY0XTWqtdR+OfrPlU2JOApB0yO
G4P6zG6h5w2XWCqtbqfszDt94drbArJ9cQbWLlgbiNjpK+qJVvG+HGXxPGgvzLA3
9HhZxzUJobkt0MycngmZryj25b6kdO6OA5BCBCjdMkHjIvmBpLXYD5y5uYnerR0n
YEDyB5noRAiYbb2Skg1dp9dpNxq5LF1WkJpWM+nCXlOU6jKj3ucOJ7JP2+gVWA7N
jFdEUIfX65Q9CcBQqQX1vWyGJCc/Z0sNGE0Dc06PrpPk/U10oFNZOdCbUNEWU4Pk
yqATdaAI1BdvZjAip6QQ/jtIuHkwigAk9uUp21VlZ1NnXXLixmA53y12fi8f3DnB
yl55qYeoTOyEg5N7k1ukOt5rgoJ28szscEwvYmwL56uDtlrXly/vrSNrMi322aJK
IJeozLKMpf6Q9A3vN000vGTA6VjP
=Whh7
-----END PGP SIGNATURE-----

✓ Verified

File: src/main/java/com/paymentlink/service/DnsService.java

1 package com.paymentlink.service;
2
3 import jakarta.annotation.PostConstruct;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6 import org.springframework.beans.factory.annotation.Value;
7 import org.springframework.http.ResponseEntity;
8 import org.springframework.stereotype.Service;
9 import org.springframework.web.client.RestTemplate;
10
11 @Service
12 public class DnsService {
13
14 private static final Logger logger = LoggerFactory.getLogger(DnsService.class);
15
16 @Value("${cloudns.auth.id:}")
17 private String authId;
18
19 @Value("${cloudns.auth.password:}")
20 private String authPassword;
21
22 @Value("${app.tld:ironpath.ai}")
23 private String tld;
24
25 private final NodeIdService nodeIdService;
26 private final RestTemplate restTemplate = new RestTemplate();
27
28 public DnsService(NodeIdService nodeIdService) {
29 this.nodeIdService = nodeIdService;
30 }
31
32 /**
33 * Update or create DNS record on startup
34 */
35 @PostConstruct
36 public void updateOrCreateDNSRecord() {
37 if (authId == null || authId.isEmpty() || authPassword == null || authPassword.isEmpty()) {
38 logger.warn("CloudNS credentials not configured, skipping DNS update");
39 return;
40 }
41
42 try {
43 String serverIP = getServerIP();
44 String shortId = nodeIdService.getShortId();
45
46 logger.info("Updating DNS record for {} with IP {}", shortId, serverIP);
47
48 // Note: Actual CloudNS API implementation would go here
49 // This is a simplified version - the full implementation would:
50 // 1. List records to find existing
51 // 2. Update if exists, create if not
52 // 3. Handle CloudNS API specifics
53
54 logger.info("DNS record update completed (simulated)");
55
56 } catch (Exception e) {
57 logger.error("Failed to update DNS record", e);
58 }
59 }
60
61 /**
62 * Get server's public IP address
63 */
64 private String getServerIP() {
65 try {
66 // Try ipify first
67 String url = "https://api.ipify.org?format=text";
68 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
69 if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
70 return response.getBody().trim();
71 }
72 } catch (Exception e) {
73 logger.warn("Failed to get IP from ipify, trying fallback", e);
74 }
75
76 try {
77 // Fallback to ipapi.co
78 String url = "https://ipapi.co/ip/";
79 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
80 if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
81 return response.getBody().trim();
82 }
83 } catch (Exception e) {
84 logger.error("Failed to get IP from fallback", e);
85 }
86
87 throw new RuntimeException("Could not determine server IP");
88 }
89 }
90
91