base.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import path from 'node:path';
  2. import type { Span } from '../../trace';
  3. import { compareAndWriteFile } from '../create-file';
  4. export abstract class BaseWriteStrategy {
  5. // abstract readonly type: 'domainset' | 'non_ip' | 'ip' | (string & {});
  6. public overwriteFilename: string | null = null;
  7. public abstract readonly type: 'domainset' | 'non_ip' | 'ip' | (string & {});
  8. abstract readonly fileExtension: 'conf' | 'txt' | 'json' | (string & {});
  9. constructor(protected outputDir: string) {}
  10. protected abstract result: string[] | null;
  11. abstract writeDomain(domain: string): void;
  12. abstract writeDomainSuffix(domain: string): void;
  13. abstract writeDomainKeywords(keyword: Set<string>): void;
  14. abstract writeDomainWildcards(wildcard: Set<string>): void;
  15. abstract writeUserAgents(userAgent: Set<string>): void;
  16. abstract writeProcessNames(processName: Set<string>): void;
  17. abstract writeProcessPaths(processPath: Set<string>): void;
  18. abstract writeUrlRegexes(urlRegex: Set<string>): void;
  19. abstract writeIpCidrs(ipCidr: string[], noResolve: boolean): void;
  20. abstract writeIpCidr6s(ipCidr6: string[], noResolve: boolean): void;
  21. abstract writeGeoip(geoip: Set<string>, noResolve: boolean): void;
  22. abstract writeIpAsns(asns: Set<string>, noResolve: boolean): void;
  23. abstract writeSourceIpCidrs(sourceIpCidr: string[]): void;
  24. abstract writeSourcePorts(port: Set<string>): void;
  25. abstract writeDestinationPorts(port: Set<string>): void;
  26. abstract writeOtherRules(rule: string[]): void;
  27. static readonly domainWildCardToRegex = (domain: string) => {
  28. let result = '^';
  29. for (let i = 0, len = domain.length; i < len; i++) {
  30. switch (domain[i]) {
  31. case '.':
  32. result += String.raw`\.`;
  33. break;
  34. case '*':
  35. result += String.raw`[\w.-]*?`;
  36. break;
  37. case '?':
  38. result += String.raw`[\w.-]`;
  39. break;
  40. default:
  41. result += domain[i];
  42. }
  43. }
  44. result += '$';
  45. return result;
  46. };
  47. abstract withPadding(title: string, description: string[] | readonly string[], date: Date, content: string[]): string[];
  48. output(
  49. span: Span,
  50. title: string,
  51. description: string[] | readonly string[],
  52. date: Date,
  53. relativePath: string
  54. ): void | Promise<void> {
  55. if (!this.result) {
  56. return;
  57. }
  58. return compareAndWriteFile(
  59. span,
  60. this.withPadding(
  61. title,
  62. description,
  63. date,
  64. this.result
  65. ),
  66. path.join(this.outputDir, relativePath)
  67. );
  68. };
  69. get content() {
  70. return this.result;
  71. }
  72. }