首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python将值插入到JS脚本中

使用python将值插入到JS脚本中
EN

Stack Overflow用户
提问于 2022-10-05 21:59:27
回答 1查看 127关注 0票数 0

我正在解析存储在目录中的JS文件,以获取tags中的值。在使用regex在tags中找到相关值后,我希望将这些值移到一个名为controls的新节下。我已经能够使用下面的脚本在controls变量中获得所需的值:

代码语言:javascript
复制
def parse_sigs(target_folder):    
    try:
        count = 0

        for root, dir, files in os.walk(target_folder):
            for file in files:
                file_extension = os.path.splitext(file)[1]
                if file_extension.lower() == ".js":
                    print(file)
                    filename = os.path.join(root, file)
                    print(f'Processing : {filename}')

                    with open(filename, "r") as f_in:
                        data = f_in.read()
                    data = re.search(r"\btags\s*:\s*(\[.*?\])", data, flags=re.S)
                    if data:
                        data = literal_eval(data.group(1))
                        #print(type(data)
                        cregex = re.compile(r".*\-.*\-.*[\.|\-].*")
                        controls = list(filter(cregex.match, data))
                            
                        count +=1
                        print(controls)
        print(count)
    except Exception as e:
        print(f"Error in Processing  {filename} Skipping -- ")  
        print(e)  

我想不出一种将controls列表作为一个新字段插入JS文件并更新它的方法。它应该出现在tags字段之后。

JS文件示例如下:

代码语言:javascript
复制
var fs = require('fs');
var path = require('path')
const remediation = fs.readFileSync(path.resolve(__dirname, '../sig/file.md'), 'utf-8')

module.exports = {
  status: "ENABLED",
  sig: {
    name: "iam",
    tags: [
        "aws",
        "iam",
        "compliance",
        "chg-02.1",
        "AWS-CIS-v1.4",
        "AWS-CIS-v1.4-1.12",
        "AWS-CIS-v1.4-1.14",
        "SOC-2",
        "SOC-2-CC6.8",
        "NIST-800-53rev5",
        "NIST-800-53rev5-CM-3(1)"
    ],
    result: "A.id, A.name",
    result_header: [
      "account_id",
      "account_name",
    ],
    primary_resource: "user_arn",
  },
  expected: {
   "all":
    [
      {
        user_name: "2506"
      }
    ]
  }
};

我的最终目标是创建一个JS文件,其tags和新添加的controls部分如下所示:

代码语言:javascript
复制
    tags: [
        "aws",
        "iam",
        "compliance",
        "chg-02.1",
        "AWS-CIS-v1.4",
        "SOC-2",
        "NIST-800-53rev5"
    ],

controls: [
        "AWS-CIS-v1.4-1.12",
        "AWS-CIS-v1.4-1.14",
        "NIST-800-53rev5-CM-3(1)",
        "SOC-2-CC6.8",
    ],

编辑:能够让它使用@Dev提供的解决方案。唯一不合适的是关闭]。是否有一种方法可以将结束括号正确地缩进?

代码语言:javascript
复制
    tags: [
        "aws",
        "docdb",
        "kms",
        "configuration-check",
],
 controls: [
        "SOC-2-CC6.1",
        "NIST-800-53rev5-SC-12"
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-06 00:52:25

您可以提取这些标记并使用包jsonnet将它们转换为JSON,然后使用regex对它们进行迭代,然后构建一个字符串来替换原始标记,如下所示:

代码语言:javascript
复制
import json
import os
import re
import _jsonnet


def parse_sigs(target_folder):
    
    count = 0
    cregex = re.compile(r".*-.*-.*[.|\-].*")
    for root, _, files in os.walk(target_folder):
        for file in files:
            file_extension = os.path.splitext(file)[1]

            if file_extension.lower() == ".js":
                new_tags = []
                controls = []
                # pint(file)

                filename = os.path.join(root, file)
                print(f'Processing : {filename}')
                try:
                    with open(filename, "r") as f_in:
                        data = f_in.read()
                        snippet = re.findall(r'module.exports = (.*);', data, flags=re.S)[0]
                    json_data = json.loads(_jsonnet.evaluate_snippet('snippet', snippet))

                    # print(json.dumps(json_data['sig']['tags'], indent=4))
                    for tag in json_data['sig']['tags']:
                        if re.match(cregex, tag):
                            controls.append(tag)
                        else:
                            new_tags.append(tag)
                    new_string = f"tags: {json.dumps(new_tags, indent=8)},\n controls: {json.dumps(controls, indent=8)}"

                    data = re.sub(r'tags: \[(.*?)]', new_string, data, flags=re.S)
                    
                    if data:
                        print(data)
                        count += 1
                    print(count)
                    
                except Exception as e:
                    print(f"Error in Processing  {filename} Skipping -- ")
                    print(e)


parse_sigs('./')

产出:

代码语言:javascript
复制
Processing : ./test.js
var fs = require('fs');
var path = require('path')
const remediation = fs.readFileSync(path.resolve(__dirname, '../sig/file.md'), 'utf-8')

module.exports = {
  status: "ENABLED",
  sig: {
    name: "iam",
    tags: [
        "aws",
        "iam",
        "compliance",
        "chg-02.1",
        "SOC-2",
        "NIST-800-53rev5"
],
 controls: [
        "AWS-CIS-v1.4",
        "AWS-CIS-v1.4-1.12",
        "AWS-CIS-v1.4-1.14",
        "SOC-2-CC6.8",
        "NIST-800-53rev5-CM-3(1)"
],
    result: "A.id, A.name",
    result_header: [
      "account_id",
      "account_name",
    ],
    primary_resource: "user_arn",
  },
  expected: {
   "all":
    [
      {
        user_name: "2506"
      }
    ]
  }
};


1

用格式更新:

代码语言:javascript
复制
import json
import os
import re
import _jsonnet
import jsbeautifier


opts = jsbeautifier.default_options()
opts.indent_size = 2
opts.space_in_empty_paren = True


def parse_sigs(target_folder):
    count = 0
    cregex = re.compile(r".*-.*-.*[.|\-].*")
    for root, _, files in os.walk(target_folder):
        for file in files:
            file_extension = os.path.splitext(file)[1]

            if file_extension.lower() == ".js":
                new_tags = []
                controls = []
                # pint(file)

                filename = os.path.join(root, file)
                print(f'Processing : {filename}')
                try:
                    with open(filename, "r") as f_in:
                        data = f_in.read()
                        snippet = re.findall(r'module.exports = (.*);', data, flags=re.S)[0]
                    json_data = json.loads(_jsonnet.evaluate_snippet('snippet', snippet))

                    # print(json.dumps(json_data['sig']['tags'], indent=4))
                    for tag in json_data['sig']['tags']:
                        if re.match(cregex, tag):
                            controls.append(tag)
                        else:
                            new_tags.append(tag)
                    new_string = f"tags: {json.dumps(new_tags, indent=8)},\n controls: {json.dumps(controls, indent=8)}"

                    data = re.sub(r'tags: \[(.*?)]', new_string, data, flags=re.S)

                    data = jsbeautifier.beautify(data, opts)

                    if data:
                        print(data)
                        count += 1
                    print(count)

                except Exception as e:
                    print(f"Error in Processing  {filename} Skipping -- ")
                    print(e)


parse_sigs('./')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73966718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档