ScriptCollection 3.4.55__py3-none-any.whl → 3.5.44__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,128 +1,126 @@
1
- import os
2
- from pathlib import Path
3
- import traceback
4
- from shutil import copyfile
5
- from .ScriptCollectionCore import ScriptCollectionCore
6
- from .GeneralUtilities import GeneralUtilities
7
-
8
-
9
- class CertificateUpdater:
10
-
11
- __domains: list(str)
12
- __email: str
13
-
14
- __current_folder = os.path.dirname(os.path.abspath(__file__))
15
- __repository_folder = GeneralUtilities.resolve_relative_path(f"..{os.path.sep}..{os.path.sep}..{os.path.sep}", __current_folder)
16
- __letsencrypt_folder = GeneralUtilities.resolve_relative_path(f"..{os.path.sep}..{os.path.sep}Volumes{os.path.sep}letsencrypt", __current_folder)
17
- __letsencrypt_live_folder = os.path.join(__letsencrypt_folder, "live")
18
- __letsencrypt_archive_folder = os.path.join(__letsencrypt_folder, "archive")
19
- __log_folder = GeneralUtilities.resolve_relative_path(f"Logs{os.path.sep}Overhead", __repository_folder)
20
- __sc = ScriptCollectionCore()
21
- __line = "___________________________________________________________________"
22
-
23
- def __init__(self, domains: list(str), email: str):
24
- self.__domains = domains
25
- self.__email = email
26
-
27
- @GeneralUtilities.check_arguments
28
- def __get_latest_index_by_domain(self, domain: str) -> int:
29
- result = self.__get_latest_index_by_filelist(GeneralUtilities.get_all_files_of_folder(os.path.join(self.__letsencrypt_archive_folder, domain)))
30
- GeneralUtilities.write_message_to_stdout(f"Debug: Latest found existing number for domain {domain}: {result}")
31
- return result
32
-
33
- @GeneralUtilities.check_arguments
34
- def __get_latest_index_by_filelist(self, filenames: list) -> int:
35
- print("files:")
36
- print(filenames)
37
- filenames = [Path(os.path.basename(file)).stem for file in filenames]
38
- print(filenames)
39
- filenames = [file for file in filenames if file.startswith("privkey")]
40
- print(filenames)
41
- numbers = [int(file[len("privkey"):]) for file in filenames]
42
- # numbers=[]
43
- #print([os.path.basename(file) for file in filenames])
44
- result = max(numbers)
45
- return result
46
-
47
- @GeneralUtilities.check_arguments
48
- def __replace_symlink_by_file(self, domain: str, filename: str, index: int) -> None:
49
- # ".../live/example.com/cert.pem" is a symlink but should replaced by a copy of ".../archive/example.com/cert.42pem"
50
- archive_file = os.path.join(self.__letsencrypt_archive_folder, domain, filename+str(index)+".pem")
51
- live_folder = os.path.join(self.__letsencrypt_live_folder, domain)
52
- live_filename = filename+".pem"
53
- live_file = os.path.join(live_folder, live_filename)
54
- self.__sc.run_program("rm", live_filename, live_folder)
55
- copyfile(archive_file, live_file)
56
-
57
- @GeneralUtilities.check_arguments
58
- def __replace_file_by_symlink(self, domain: str, filename: str, index: int) -> None:
59
- # new ".../live/example.com/cert.pem" is a file but should replaced by a symlink which points to ".../archive/example.com/cert42.pem"
60
- live_folder = os.path.join(self.__letsencrypt_live_folder, domain)
61
- live_filename = filename+".pem"
62
- self.__sc.run_program("rm", live_filename, live_folder)
63
- self.__sc.run_program("ln", f"-s ../../archive/{domain}/{filename+str(index)}.pem {live_filename}", live_folder)
64
-
65
- @GeneralUtilities.check_arguments
66
- def __replace_symlinks_by_files(self, domain):
67
- index = self.__get_latest_index_by_domain(domain)
68
- self.__replace_symlink_by_file(domain, "cert", index)
69
- self.__replace_symlink_by_file(domain, "chain", index)
70
- self.__replace_symlink_by_file(domain, "fullchain", index)
71
- self.__replace_symlink_by_file(domain, "privkey", index)
72
-
73
- @GeneralUtilities.check_arguments
74
- def __replace_files_by_symlinks(self, domain):
75
- index = self.__get_latest_index_by_domain(domain)
76
- self.__replace_file_by_symlink(domain, "cert", index)
77
- self.__replace_file_by_symlink(domain, "chain", index)
78
- self.__replace_file_by_symlink(domain, "fullchain", index)
79
- self.__replace_file_by_symlink(domain, "privkey", index)
80
-
81
- @GeneralUtilities.check_arguments
82
- def update_certificate_managed_by_docker_and_letsencrypt(self) -> None:
83
- GeneralUtilities.write_message_to_stdout("current_folder:")
84
- GeneralUtilities.write_message_to_stdout(self.__current_folder)
85
- GeneralUtilities.write_message_to_stdout("letsencrypt_folder:")
86
- GeneralUtilities.write_message_to_stdout(self.__letsencrypt_folder)
87
- GeneralUtilities.write_message_to_stdout("letsencrypt_live_folder:")
88
- GeneralUtilities.write_message_to_stdout(self.__letsencrypt_live_folder)
89
- GeneralUtilities.write_message_to_stdout("letsencrypt_archive_folder:")
90
- GeneralUtilities.write_message_to_stdout(self.__letsencrypt_archive_folder)
91
- GeneralUtilities.write_message_to_stdout("log_folder:")
92
- GeneralUtilities.write_message_to_stdout(self.__log_folder)
93
-
94
- GeneralUtilities.write_message_to_stdout(self.__line+self.__line)
95
- GeneralUtilities.write_message_to_stdout("Updating certificates")
96
- self.__sc.git_commit(self.__current_folder, "Saved current changes")
97
- for domain in self.__domains:
98
- try:
99
- GeneralUtilities.write_message_to_stdout(self.__line)
100
- GeneralUtilities.write_message_to_stdout(f"Process domain {domain}")
101
- certificate_for_domain_already_exists = os.path.isfile(f"{self.__letsencrypt_folder}/renewal/{domain}.conf")
102
- if certificate_for_domain_already_exists:
103
- GeneralUtilities.write_message_to_stdout(f"Update certificate for domain {domain}")
104
- self.__replace_files_by_symlinks(domain)
105
- else:
106
- GeneralUtilities.write_message_to_stdout(f"Create certificate for domain {domain}")
107
- certbot_container_name = "r2_updatecertificates_certbot"
108
- dockerargument = f"run --name {certbot_container_name} --volume {self.__letsencrypt_folder}:/etc/letsencrypt"
109
- dockerargument = dockerargument+f" --volume {self.__log_folder}:/var/log/letsencrypt -p 80:80 certbot/certbot:latest"
110
- certbotargument = f"--standalone --email {self.__email} --agree-tos --force-renewal --rsa-key-size 4096 --non-interactive --no-eff-email --domain {domain}"
111
- if(certificate_for_domain_already_exists):
112
- self.__sc.run_program("docker", f"{dockerargument} certonly --no-random-sleep-on-renew {certbotargument}",
113
- self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
114
- self.__replace_symlinks_by_files(domain)
115
- else:
116
- self.__sc.run_program("docker", f"{dockerargument} certonly --cert-name {domain} {certbotargument}",
117
- self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
118
- except Exception as exception:
119
- GeneralUtilities.write_exception_to_stderr_with_traceback(exception, traceback, "Error while updating certificate")
120
- finally:
121
- try:
122
- self.__sc.run_program("docker", f"container rm {certbot_container_name}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
123
- except Exception as exception:
124
- GeneralUtilities.write_exception_to_stderr_with_traceback(exception, traceback, "Error while removing container")
125
-
126
- GeneralUtilities.write_message_to_stdout("Commit changes...")
127
- self.__sc.git_commit(self.__repository_folder, "Executed certificate-update-process")
128
- GeneralUtilities.write_message_to_stdout("Finished certificate-update-process")
1
+ import os
2
+ from pathlib import Path
3
+ import traceback
4
+ from shutil import copyfile
5
+ from .ScriptCollectionCore import ScriptCollectionCore
6
+ from .GeneralUtilities import GeneralUtilities
7
+
8
+
9
+ class CertificateUpdater:
10
+
11
+ __domains: list[str]
12
+ __email: str
13
+
14
+ __current_folder = os.path.dirname(os.path.abspath(__file__))
15
+ __repository_folder = GeneralUtilities.resolve_relative_path(f"..{os.path.sep}..{os.path.sep}..{os.path.sep}", __current_folder)
16
+ __letsencrypt_folder = GeneralUtilities.resolve_relative_path(f"..{os.path.sep}..{os.path.sep}Volumes{os.path.sep}letsencrypt", __current_folder)
17
+ __letsencrypt_live_folder = os.path.join(__letsencrypt_folder, "live")
18
+ __letsencrypt_archive_folder = os.path.join(__letsencrypt_folder, "archive")
19
+ __log_folder = GeneralUtilities.resolve_relative_path(f"Logs{os.path.sep}Overhead", __repository_folder)
20
+ __sc = ScriptCollectionCore()
21
+ __line = "___________________________________________________________________"
22
+
23
+ def __init__(self, domains: list[str], email: str):
24
+ self.__domains = domains
25
+ self.__email = email
26
+
27
+ @GeneralUtilities.check_arguments
28
+ def __get_latest_index_by_domain(self, domain: str) -> int:
29
+ result = self.__get_latest_index_by_filelist(GeneralUtilities.get_all_files_of_folder(os.path.join(self.__letsencrypt_archive_folder, domain)))
30
+ GeneralUtilities.write_message_to_stdout(f"Debug: Latest found existing number for domain {domain}: {result}")
31
+ return result
32
+
33
+ @GeneralUtilities.check_arguments
34
+ def __get_latest_index_by_filelist(self, filenames: list) -> int:
35
+ print("files:")
36
+ print(filenames)
37
+ filenames = [Path(os.path.basename(file)).stem for file in filenames]
38
+ print(filenames)
39
+ filenames = [file for file in filenames if file.startswith("privkey")]
40
+ print(filenames)
41
+ numbers = [int(file[len("privkey"):]) for file in filenames]
42
+ # numbers=[]
43
+ # print([os.path.basename(file) for file in filenames])
44
+ result = max(numbers)
45
+ return result
46
+
47
+ @GeneralUtilities.check_arguments
48
+ def __replace_symlink_by_file(self, domain: str, filename: str, index: int) -> None:
49
+ # ".../live/example.com/cert.pem" is a symlink but should replaced by a copy of ".../archive/example.com/cert.42pem"
50
+ archive_file = os.path.join(self.__letsencrypt_archive_folder, domain, filename+str(index)+".pem")
51
+ live_folder = os.path.join(self.__letsencrypt_live_folder, domain)
52
+ live_filename = filename+".pem"
53
+ live_file = os.path.join(live_folder, live_filename)
54
+ self.__sc.run_program("rm", live_filename, live_folder)
55
+ copyfile(archive_file, live_file)
56
+
57
+ @GeneralUtilities.check_arguments
58
+ def __replace_file_by_symlink(self, domain: str, filename: str, index: int) -> None:
59
+ # new ".../live/example.com/cert.pem" is a file but should replaced by a symlink which points to ".../archive/example.com/cert42.pem"
60
+ live_folder = os.path.join(self.__letsencrypt_live_folder, domain)
61
+ live_filename = filename+".pem"
62
+ self.__sc.run_program("rm", live_filename, live_folder)
63
+ self.__sc.run_program("ln", f"-s ../../archive/{domain}/{filename+str(index)}.pem {live_filename}", live_folder)
64
+
65
+ @GeneralUtilities.check_arguments
66
+ def __replace_symlinks_by_files(self, domain):
67
+ index = self.__get_latest_index_by_domain(domain)
68
+ self.__replace_symlink_by_file(domain, "cert", index)
69
+ self.__replace_symlink_by_file(domain, "chain", index)
70
+ self.__replace_symlink_by_file(domain, "fullchain", index)
71
+ self.__replace_symlink_by_file(domain, "privkey", index)
72
+
73
+ @GeneralUtilities.check_arguments
74
+ def __replace_files_by_symlinks(self, domain):
75
+ index = self.__get_latest_index_by_domain(domain)
76
+ self.__replace_file_by_symlink(domain, "cert", index)
77
+ self.__replace_file_by_symlink(domain, "chain", index)
78
+ self.__replace_file_by_symlink(domain, "fullchain", index)
79
+ self.__replace_file_by_symlink(domain, "privkey", index)
80
+
81
+ @GeneralUtilities.check_arguments
82
+ def update_certificate_managed_by_docker_and_letsencrypt(self) -> None:
83
+ GeneralUtilities.write_message_to_stdout("current_folder:")
84
+ GeneralUtilities.write_message_to_stdout(self.__current_folder)
85
+ GeneralUtilities.write_message_to_stdout("letsencrypt_folder:")
86
+ GeneralUtilities.write_message_to_stdout(self.__letsencrypt_folder)
87
+ GeneralUtilities.write_message_to_stdout("letsencrypt_live_folder:")
88
+ GeneralUtilities.write_message_to_stdout(self.__letsencrypt_live_folder)
89
+ GeneralUtilities.write_message_to_stdout("letsencrypt_archive_folder:")
90
+ GeneralUtilities.write_message_to_stdout(self.__letsencrypt_archive_folder)
91
+ GeneralUtilities.write_message_to_stdout("log_folder:")
92
+ GeneralUtilities.write_message_to_stdout(self.__log_folder)
93
+
94
+ GeneralUtilities.write_message_to_stdout(self.__line+self.__line)
95
+ GeneralUtilities.write_message_to_stdout("Updating certificates")
96
+ self.__sc.git_commit(self.__current_folder, "Saved current changes")
97
+ for domain in self.__domains:
98
+ try:
99
+ GeneralUtilities.write_message_to_stdout(self.__line)
100
+ GeneralUtilities.write_message_to_stdout(f"Process domain {domain}")
101
+ certificate_for_domain_already_exists = os.path.isfile(f"{self.__letsencrypt_folder}/renewal/{domain}.conf")
102
+ if certificate_for_domain_already_exists:
103
+ GeneralUtilities.write_message_to_stdout(f"Update certificate for domain {domain}")
104
+ self.__replace_files_by_symlinks(domain)
105
+ else:
106
+ GeneralUtilities.write_message_to_stdout(f"Create certificate for domain {domain}")
107
+ certbot_container_name = "r2_updatecertificates_certbot"
108
+ dockerargument = f"run --name {certbot_container_name} --volume {self.__letsencrypt_folder}:/etc/letsencrypt"
109
+ dockerargument = dockerargument+f" --volume {self.__log_folder}:/var/log/letsencrypt -p 80:80 certbot/certbot:latest"
110
+ certbotargument = f"--standalone --email {self.__email} --agree-tos --force-renewal --rsa-key-size 4096 --non-interactive --no-eff-email --domain {domain}"
111
+ if (certificate_for_domain_already_exists):
112
+ self.__sc.run_program("docker", f"{dockerargument} certonly --no-random-sleep-on-renew {certbotargument}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
113
+ self.__replace_symlinks_by_files(domain)
114
+ else:
115
+ self.__sc.run_program("docker", f"{dockerargument} certonly --cert-name {domain} {certbotargument}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
116
+ except Exception as exception:
117
+ GeneralUtilities.write_exception_to_stderr_with_traceback(exception, traceback, "Error while updating certificate")
118
+ finally:
119
+ try:
120
+ self.__sc.run_program("docker", f"container rm {certbot_container_name}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
121
+ except Exception as exception:
122
+ GeneralUtilities.write_exception_to_stderr_with_traceback(exception, traceback, "Error while removing container")
123
+
124
+ GeneralUtilities.write_message_to_stdout("Commit changes...")
125
+ self.__sc.git_commit(self.__repository_folder, "Executed certificate-update-process")
126
+ GeneralUtilities.write_message_to_stdout("Finished certificate-update-process")
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ScriptCollection
3
- Version: 3.4.55
3
+ Version: 3.5.44
4
4
  Summary: The ScriptCollection is the place for reusable scripts.
5
5
  Home-page: https://github.com/anionDev/ScriptCollection
6
6
  Author: Marius Göcke
@@ -22,25 +22,26 @@ Classifier: Topic :: Terminals
22
22
  Classifier: Topic :: Utilities
23
23
  Requires-Python: >=3.10
24
24
  Description-Content-Type: text/markdown
25
- Requires-Dist: build >=1.0.3
26
- Requires-Dist: coverage >=7.3.2
27
- Requires-Dist: cyclonedx-bom >=3.11.7
28
- Requires-Dist: defusedxml >=0.7.1
29
- Requires-Dist: keyboard >=0.13.5
30
- Requires-Dist: lcov-cobertura >=2.0.2
31
- Requires-Dist: lxml >=4.9.3
32
- Requires-Dist: ntplib >=0.4.0
33
- Requires-Dist: Pillow >=10.1.0
34
- Requires-Dist: pycdlib >=1.14.0
35
- Requires-Dist: Pygments >=2.17.2
36
- Requires-Dist: pylint >=3.0.2
37
- Requires-Dist: pyOpenSSL >=23.3.0
38
- Requires-Dist: PyPDF2 >=3.0.1
39
- Requires-Dist: pytest >=7.4.3
40
- Requires-Dist: qrcode >=7.4.2
41
- Requires-Dist: send2trash >=1.8.2
42
- Requires-Dist: twine >=4.0.2
43
- Requires-Dist: xmlschema >=2.5.0
25
+ Requires-Dist: build>=1.2.2.post1
26
+ Requires-Dist: coverage>=7.6.10
27
+ Requires-Dist: cyclonedx-bom>=5.1.1
28
+ Requires-Dist: defusedxml>=0.7.1
29
+ Requires-Dist: keyboard>=0.13.5
30
+ Requires-Dist: lcov-cobertura>=2.0.2
31
+ Requires-Dist: lxml>=5.3.0
32
+ Requires-Dist: ntplib>=0.4.0
33
+ Requires-Dist: Pillow>=11.1.0
34
+ Requires-Dist: pycdlib>=1.14.0
35
+ Requires-Dist: Pygments>=2.19.1
36
+ Requires-Dist: pylint>=3.3.3
37
+ Requires-Dist: pyOpenSSL>=25.0.0
38
+ Requires-Dist: PyPDF2>=3.0.1
39
+ Requires-Dist: pytest>=8.3.4
40
+ Requires-Dist: PyYAML>=6.0.2
41
+ Requires-Dist: qrcode>=8.0
42
+ Requires-Dist: send2trash>=1.8.3
43
+ Requires-Dist: twine>=6.0.1
44
+ Requires-Dist: xmlschema>=3.4.3
44
45
 
45
46
  # ScriptCollection
46
47
 
@@ -0,0 +1,16 @@
1
+ ScriptCollection/Executables.py,sha256=ls3wGZpt48YwwtO0QGWWyIImSE87SyzbL-WxhpwQJug,20837
2
+ ScriptCollection/GeneralUtilities.py,sha256=coLosZMy17SzEBwvl7PUooPSFCsW0O3tM6G7iA1YrI0,36870
3
+ ScriptCollection/ProcessesRunner.py,sha256=3mu4ZxzZleQo0Op6o9EYTCFiJfb6kx5ov2YfZfT89mU,1395
4
+ ScriptCollection/ProgramRunnerBase.py,sha256=7QAjoqOz6XPmJH19F2k-Z1fFQB_uZnPFvn-T54IJcHQ,2324
5
+ ScriptCollection/ProgramRunnerEpew.py,sha256=C2Rs3YWOWWWJct7XmKphp5CF1tf0j4Fp-ljV2drLTfs,6349
6
+ ScriptCollection/ProgramRunnerPopen.py,sha256=G3LgQUVCfaq7XjBsGzalElH31Hbr0etttGR2_H87YzA,3512
7
+ ScriptCollection/RPStream.py,sha256=NRRHL3YSP3D9MuAV2jB_--0KUKCsvJGxeKnxgrRZ9kY,1545
8
+ ScriptCollection/ScriptCollectionCore.py,sha256=XzduxCnIixxB2Blc4v7-zNYa9R801lsDmt_-vQNZfLs,103654
9
+ ScriptCollection/TasksForCommonProjectStructure.py,sha256=WqkrpofkzX6NXQOu8ewLAxldh3aj0b3nYtUtFRpr_8c,207901
10
+ ScriptCollection/UpdateCertificates.py,sha256=Eynbgu7k9jLxApP2D_8Il77B6BFjJap6K7oTeEAZYbk,7790
11
+ ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ ScriptCollection-3.5.44.dist-info/METADATA,sha256=iEXboM0721iM6EEZADkXVy8-uJ-BrqX8Fpwvqw0Y8rI,7665
13
+ ScriptCollection-3.5.44.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
14
+ ScriptCollection-3.5.44.dist-info/entry_points.txt,sha256=_O7BmQ81LdDfrj5uOhjshg9Xc-tABHQJIxDOyOGRzzI,2397
15
+ ScriptCollection-3.5.44.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
16
+ ScriptCollection-3.5.44.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -3,13 +3,16 @@ scbuildcodeunit = ScriptCollection.Executables:BuildCodeUnit
3
3
  scbuildcodeunits = ScriptCollection.Executables:BuildCodeUnits
4
4
  scbuildcodeunitsc = ScriptCollection.Executables:BuildCodeUnitsC
5
5
  sccalculatebitcoinblockhash = ScriptCollection.Executables:CalculateBitcoinBlockHash
6
+ scchangefileextension = ScriptCollection.Executables:ChangeFileExtensions
6
7
  scchangehashofprogram = ScriptCollection.Executables:ChangeHashOfProgram
8
+ sccreatechangelogentry = ScriptCollection.Executables:CreateChangelogEntry
7
9
  sccreateemptyfilewithspecificsize = ScriptCollection.Executables:CreateEmptyFileWithSpecificSize
8
10
  sccreatehashofallfiles = ScriptCollection.Executables:CreateHashOfAllFiles
9
11
  sccreateisofilewithobfuscatedfiles = ScriptCollection.Executables:CreateISOFileWithObfuscatedFiles
10
12
  sccreatesimplemergewithoutrelease = ScriptCollection.Executables:CreateSimpleMergeWithoutRelease
11
13
  scextractpdfpages = ScriptCollection.Executables:ExtractPDFPages
12
14
  scfilenameobfuscator = ScriptCollection.Executables:FilenameObfuscator
15
+ scgeneratearc42referencetemplate = ScriptCollection.Executables:GenerateARC42ReferenceTemplate
13
16
  scgeneratecertificate = ScriptCollection.Executables:GenerateCertificate
14
17
  scgeneratecertificateauthority = ScriptCollection.Executables:GenerateCertificateAuthority
15
18
  scgeneratecertificatesignrequest = ScriptCollection.Executables:GenerateCertificateSignRequest
@@ -1,14 +0,0 @@
1
- ScriptCollection/Executables.py,sha256=04o5UhEHwtJc0W_WizZMQ9YbRUQalxy5TFGS8LH8suo,19294
2
- ScriptCollection/GeneralUtilities.py,sha256=m4tR0CGUeVBwFbZdVWYczvbkDsO3Oi0J6Dj8cplXVDE,35267
3
- ScriptCollection/ProgramRunnerBase.py,sha256=2kyOuoM3oFjBfLc9Q5t5RTz7Ya2CjUxFtB1rBBDmnjU,1937
4
- ScriptCollection/ProgramRunnerEpew.py,sha256=nIzY4dG6W-xEpkeoTbozwNZtFSIo-bU_W6t6u1AZKtE,6275
5
- ScriptCollection/ProgramRunnerPopen.py,sha256=veDNRg2Z0u0vd4iKWAycVFKbTm_uWYfuK6NTiwlbgrM,3230
6
- ScriptCollection/ScriptCollectionCore.py,sha256=ZIZgDZ6t7mF-jBtAzJdctiC9b-vLPcd5hX0Csu5MOoQ,94128
7
- ScriptCollection/TasksForCommonProjectStructure.py,sha256=qu3XbyM7TD-KUcnOKnXfxRZvJwhRrY5--ZnBHEDTDTQ,167287
8
- ScriptCollection/UpdateCertificates.py,sha256=Go-JJK-YTi7aBB1phlLxypa8GHkmFHBEPB0_TT9G-bw,7918
9
- ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- ScriptCollection-3.4.55.dist-info/METADATA,sha256=ocWeG8ay_5GGNFKKyWOurMClBrst5zfQ2zRFMsXVgHc,7650
11
- ScriptCollection-3.4.55.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
12
- ScriptCollection-3.4.55.dist-info/entry_points.txt,sha256=dwvB9HRGvqst5xlYIGmmwuFN7lBKhxvndmnNrQOfu8w,2153
13
- ScriptCollection-3.4.55.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
14
- ScriptCollection-3.4.55.dist-info/RECORD,,