QNServerConfigMonitor.m 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. //
  2. // QNServerConfiguration.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2021/8/25.
  6. // Copyright © 2021 Qiniu. All rights reserved.
  7. //
  8. #import "QNLogUtil.h"
  9. #import "QNDefine.h"
  10. #import "QNAutoZone.h"
  11. #import "QNDnsPrefetch.h"
  12. #import "QNConfiguration.h"
  13. #import "QNServerConfigSynchronizer.h"
  14. #import "QNServerConfigCache.h"
  15. #import "QNServerConfigMonitor.h"
  16. #import "QNTransactionManager.h"
  17. #define kQNServerConfigTransactionKey @"QNServerConfig"
  18. @interface QNGlobalConfiguration(DnsDefaultServer)
  19. @property(nonatomic, strong)NSArray *defaultDohIpv4Servers;
  20. @property(nonatomic, strong)NSArray *defaultDohIpv6Servers;
  21. @property(nonatomic, strong)NSArray *defaultUdpDnsIpv4Servers;
  22. @property(nonatomic, strong)NSArray *defaultUdpDnsIpv6Servers;
  23. @end
  24. @implementation QNGlobalConfiguration(DnsDefaultServer)
  25. @dynamic defaultDohIpv4Servers;
  26. @dynamic defaultDohIpv6Servers;
  27. @dynamic defaultUdpDnsIpv4Servers;
  28. @dynamic defaultUdpDnsIpv6Servers;
  29. @end
  30. @interface QNServerConfigMonitor()
  31. @property(nonatomic, assign)BOOL enable;
  32. @property(nonatomic, strong)QNServerConfigCache *cache;
  33. @end
  34. @implementation QNServerConfigMonitor
  35. + (instancetype)share {
  36. static QNServerConfigMonitor *monitor = nil;
  37. static dispatch_once_t onceToken;
  38. dispatch_once(&onceToken, ^{
  39. monitor = [[QNServerConfigMonitor alloc] init];
  40. });
  41. return monitor;
  42. }
  43. - (instancetype)init {
  44. if (self = [super init]) {
  45. _enable = true;
  46. _cache = [[QNServerConfigCache alloc] init];
  47. }
  48. return self;
  49. }
  50. + (BOOL)enable {
  51. return [[QNServerConfigMonitor share] enable];
  52. }
  53. + (void)setEnable:(BOOL)enable {
  54. [QNServerConfigMonitor share].enable = enable;
  55. }
  56. + (NSString *)token {
  57. return QNServerConfigSynchronizer.token;
  58. }
  59. // 配置 token
  60. + (void)setToken:(NSString *)token {
  61. QNServerConfigSynchronizer.token = token;
  62. }
  63. // 开始监控
  64. + (void)startMonitor {
  65. if (![QNServerConfigMonitor share].enable) {
  66. return;
  67. }
  68. @synchronized (self) {
  69. BOOL isExist = [kQNTransactionManager existTransactionsForName:kQNServerConfigTransactionKey];
  70. if (isExist) {
  71. return;
  72. }
  73. int interval = 120 + arc4random()%240;
  74. QNTransaction *transaction = [QNTransaction timeTransaction:kQNServerConfigTransactionKey after:0 interval:interval action:^{
  75. [[QNServerConfigMonitor share] monitor];
  76. }];
  77. [kQNTransactionManager addTransaction:transaction];
  78. }
  79. }
  80. // 停止监控
  81. + (void)endMonitor {
  82. @synchronized (self) {
  83. NSArray *transactions = [kQNTransactionManager transactionsForName:kQNServerConfigTransactionKey];
  84. for (QNTransaction *transaction in transactions) {
  85. [kQNTransactionManager removeTransaction:transaction];
  86. }
  87. }
  88. }
  89. + (void)removeConfigCache {
  90. [[QNServerConfigMonitor share].cache removeConfigCache];
  91. }
  92. - (void)monitor {
  93. if (!self.enable) {
  94. return;
  95. }
  96. if (self.cache.config == nil) {
  97. QNServerConfig *config = [self.cache getConfigFromDisk];
  98. [self handleServerConfig:config];
  99. self.cache.config = config;
  100. }
  101. if (!self.cache.config.isValid) {
  102. [QNServerConfigSynchronizer getServerConfigFromServer:^(QNServerConfig * _Nonnull config) {
  103. if (config == nil) {
  104. return;
  105. }
  106. [self handleServerConfig:config];
  107. self.cache.config = config;
  108. [self.cache saveConfigToDisk:config];
  109. }];
  110. }
  111. if (self.cache.userConfig == nil) {
  112. QNServerUserConfig *config = [self.cache getUserConfigFromDisk];
  113. [self handleServerUserConfig:config];
  114. self.cache.userConfig = config;
  115. }
  116. if (!self.cache.userConfig.isValid) {
  117. [QNServerConfigSynchronizer getServerUserConfigFromServer:^(QNServerUserConfig * _Nonnull config) {
  118. if (config == nil) {
  119. return;
  120. }
  121. [self handleServerUserConfig:config];
  122. self.cache.userConfig = config;
  123. [self.cache saveUserConfigToDisk:config];
  124. }];
  125. }
  126. }
  127. - (void)handleServerConfig:(QNServerConfig *)config {
  128. if (config == nil) {
  129. return;
  130. }
  131. // 清理 region 缓存
  132. if (self.cache.config.regionConfig &&
  133. config.regionConfig.clearId > self.cache.config.regionConfig.clearId &&
  134. config.regionConfig.clearCache) {
  135. QNLogDebug(@"server config: clear region cache");
  136. [QNAutoZone clearCache];
  137. }
  138. // dns 配置
  139. if (config.dnsConfig.enable) {
  140. QNLogDebug(@"server config: dns enable %@", config.dnsConfig.enable);
  141. kQNGlobalConfiguration.isDnsOpen = [config.dnsConfig.enable boolValue];
  142. }
  143. // 清理 dns 缓存
  144. if (self.cache.config.dnsConfig &&
  145. config.dnsConfig.clearId > self.cache.config.dnsConfig.clearId &&
  146. config.dnsConfig.clearCache) {
  147. QNLogDebug(@"server config: clear dns cache");
  148. [kQNDnsPrefetch clearDnsCache:nil];
  149. }
  150. // udp 配置
  151. if (config.dnsConfig.udpConfig.enable) {
  152. QNLogDebug(@"server config: udp enable %@", config.dnsConfig.udpConfig.enable);
  153. kQNGlobalConfiguration.udpDnsEnable = [config.dnsConfig.udpConfig.enable boolValue];
  154. }
  155. if (config.dnsConfig.udpConfig.ipv4Server.isOverride &&
  156. [config.dnsConfig.udpConfig.ipv4Server.servers isKindOfClass:[NSArray class]]) {
  157. QNLogDebug(@"server config: udp config ipv4Server %@", config.dnsConfig.udpConfig.ipv4Server.servers);
  158. kQNGlobalConfiguration.defaultUdpDnsIpv4Servers = [config.dnsConfig.udpConfig.ipv4Server.servers copy];
  159. }
  160. if (config.dnsConfig.udpConfig.ipv6Server.isOverride &&
  161. [config.dnsConfig.udpConfig.ipv6Server.servers isKindOfClass:[NSArray class]]) {
  162. QNLogDebug(@"server config: udp config ipv6Server %@", config.dnsConfig.udpConfig.ipv6Server.servers);
  163. kQNGlobalConfiguration.defaultUdpDnsIpv6Servers = [config.dnsConfig.udpConfig.ipv6Server.servers copy];
  164. }
  165. // doh 配置
  166. if (config.dnsConfig.dohConfig.enable) {
  167. kQNGlobalConfiguration.dohEnable = [config.dnsConfig.dohConfig.enable boolValue];
  168. QNLogDebug(@"server config: doh enable %@", config.dnsConfig.dohConfig.enable);
  169. }
  170. if (config.dnsConfig.dohConfig.ipv4Server.isOverride &&
  171. [config.dnsConfig.dohConfig.ipv4Server.servers isKindOfClass:[NSArray class]]) {
  172. QNLogDebug(@"server config: doh config ipv4Server %@", config.dnsConfig.dohConfig.ipv4Server.servers);
  173. kQNGlobalConfiguration.defaultDohIpv4Servers = [config.dnsConfig.dohConfig.ipv4Server.servers copy];
  174. }
  175. if (config.dnsConfig.dohConfig.ipv6Server.isOverride &&
  176. [config.dnsConfig.dohConfig.ipv6Server.servers isKindOfClass:[NSArray class]]) {
  177. QNLogDebug(@"server config: doh config ipv6Server %@", config.dnsConfig.dohConfig.ipv6Server.servers);
  178. kQNGlobalConfiguration.defaultDohIpv6Servers = [config.dnsConfig.dohConfig.ipv6Server.servers copy];
  179. }
  180. }
  181. - (void)handleServerUserConfig:(QNServerUserConfig *)config {
  182. if (config == nil) {
  183. return;
  184. }
  185. if (config.networkCheckEnable) {
  186. QNLogDebug(@"server config: connect check enable %@", config.networkCheckEnable);
  187. kQNGlobalConfiguration.connectCheckEnable = [config.networkCheckEnable boolValue];
  188. }
  189. }
  190. @end