base.ts 2.4 KB

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