1 package org.metricshub.winrm;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.regex.Pattern;
27 import java.util.stream.Collectors;
28 import org.metricshub.winrm.exceptions.WqlQuerySyntaxException;
29
30 public abstract class WmiHelper {
31
32
33
34
35 private WmiHelper() {}
36
37 public static final String DEFAULT_NAMESPACE = "ROOT\\CIMV2";
38
39
40
41
42 private static final Pattern WQL_SIMPLE_SELECT_PATTERN = Pattern.compile(
43 "^\\s*SELECT\\s+(\\*|(?!SELECT|FROM|WHERE)[a-z0-9._]+|((?!SELECT|FROM|WHERE)[a-z0-9._]+\\s*,\\s*)+((?!SELECT|FROM|WHERE)[a-z0-9._]+))\\s+FROM\\s+((?!WHERE|FROM)\\w+)\\s*(WHERE\\s+.*)?$",
44 Pattern.CASE_INSENSITIVE
45 );
46
47
48
49
50
51
52
53
54
55 public static boolean isValidWql(final String wqlQuery) {
56 return WQL_SIMPLE_SELECT_PATTERN.matcher(wqlQuery).find();
57 }
58
59
60
61
62
63
64
65
66 public static String createNetworkResource(final String hostname, final String namespace) {
67 Utils.checkNonNull(namespace, "namespace");
68 return hostname == null || hostname.isEmpty() ? namespace : String.format("\\\\%s\\%s", hostname, namespace);
69 }
70
71
72
73
74
75 public static boolean isLocalNetworkResource(final String networkResource) {
76 Utils.checkNonNull(networkResource, "networkResource");
77 return (
78 !networkResource.startsWith("\\\\") ||
79 networkResource.startsWith("\\\\localhost\\") ||
80 networkResource.startsWith("\\\\127.0.0.1\\") ||
81 networkResource.startsWith("\\\\0:0:0:0:0:0:0:1\\") ||
82 networkResource.startsWith("\\\\::1\\") ||
83 networkResource.startsWith("\\\\0000:0000:0000:0000:0000:0000:0000:0001\\") ||
84 networkResource.toLowerCase().startsWith("\\\\" + Utils.getComputerName().toLowerCase() + "\\")
85 );
86 }
87
88
89
90
91
92
93
94
95
96
97
98
99 public static List<String> extractPropertiesFromResult(final List<Map<String, Object>> resultRows, final String wql) {
100 try {
101 return extractPropertiesFromResult(resultRows, WqlQuery.newInstance(wql));
102 } catch (WqlQuerySyntaxException e) {
103 throw new IllegalStateException(e);
104 }
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 public static List<String> extractPropertiesFromResult(
121 final List<Map<String, Object>> resultRows,
122 final WqlQuery wqlQuery
123 ) {
124
125
126
127 if (resultRows.isEmpty()) {
128 return wqlQuery.getSelectedProperties();
129 }
130
131
132 final String[] resultPropertyArray = resultRows.get(0).keySet().toArray(new String[0]);
133
134
135
136 if (wqlQuery.getSelectedProperties().isEmpty()) {
137 Arrays.sort(resultPropertyArray, String.CASE_INSENSITIVE_ORDER);
138 return Arrays.asList(resultPropertyArray);
139 }
140
141
142
143 final List<String> queryProperties = wqlQuery.getSelectedProperties();
144 final Map<String, String> resultProperties = Arrays
145 .asList(resultPropertyArray)
146 .stream()
147 .collect(Collectors.toMap(String::toLowerCase, property -> property));
148 return queryProperties
149 .stream()
150 .map(property -> resultProperties.getOrDefault(property.toLowerCase(), property))
151 .collect(Collectors.toList());
152 }
153 }