-
Notifications
You must be signed in to change notification settings - Fork 121
/
dependencies.py
156 lines (138 loc) · 5.07 KB
/
dependencies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
'''
Created on Oct 7, 2015
@author: synkarius
'''
import os, sys, socket, time, pkg_resources, subprocess
from pkg_resources import VersionConflict, DistributionNotFound
from subprocess import Popen
from castervoice.lib import settings
update = None
def find_pip():
# Find the pip script for Python.
python_scripts = os.path.join(sys.exec_prefix, "Scripts")
if sys.platform == "win32":
pip = os.path.join(python_scripts, "pip.exe")
return pip
if sys.platform.startswith("linux"):
pip = os.path.join(python_scripts, "pip")
return pip
def install_type():
# Checks if Caster install is Classic or PIP.
try:
pkg_resources.require("castervoice")
except VersionConflict:
pass
except DistributionNotFound:
return "classic"
return "pip"
def internet_check(host="1.1.1.1", port=53, timeout=3):
"""
Checks for network connection via DNS resolution.
:param host: CloudFire DNS
:param port: 53/tcp
:param timeout: An integer
:return: True or False
"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.settimeout(timeout)
s.connect((host, port))
return True
except socket.error as e:
if e.errno == 11001:
print ("Caster: Internet check failed to resolve CloudFire DNS")
if e.errno == 10051: # Unreachable Network
pass
if e.errno not in (10051, 11001): # Unknown Error
print (e.errno)
return False
def dependency_check(command=None):
# Check for updates pip packages castervoice/dragonfly2
com = [find_pip(), "search", command]
startupinfo = None
global update
try:
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
p = subprocess.Popen(com,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
startupinfo=startupinfo)
out = p.communicate('')
for line in out:
if "INSTALLED" and "latest" in line:
print("Caster: {0} is up-to-date".format(command.strip('2')))
update = False
break
else:
print("Caster: Say 'Update {0}' to update.".format(command.strip('2')))
update = True
break
except Exception as e:
print("Exception from starting subprocess {0}: " "{1}".format(com, e))
def dep_missing():
# For classic: Checks for missing dependencies parsing requirements.txt
base = os.path.normpath(settings.SETTINGS["paths"]["BASE_PATH"] + os.sep + os.pardir)
requirements = os.path.join(base, "requirements.txt")
with open(requirements) as f:
requirements = f.read().splitlines()
for dep in requirements:
try:
pkg_resources.require("{}".format(dep))
except VersionConflict:
pass
except DistributionNotFound as e:
print("\n Caster: A Dependency is missing 'pip install {0}'".format(e.req))
time.sleep(15)
def dep_min_version():
# For classic: Checks for Maintainer specified package requirements.
# Needs to be manually resolved if Caster requires a specific version of dependency
# A GitHub Issue URL needed to explain the change to version specific '==' dependency.
upgradelist = []
listdependency = ([
["dragonfly2", ">=", "0.13.0", None],
])
for dep in listdependency:
package = dep[0]
operator = dep[1]
version = dep[2]
issueurl = dep[3]
try:
pkg_resources.require('{0} {1} {2}'.format(package, operator, version))
except VersionConflict as e:
if operator is ">=":
upgradelist.append('{0}'.format(package))
if operator is "==":
print(
"\nCaster: Requires an exact version of dependencies. Issue reference: {0} \n"
.format(issueurl))
print("Install the exact version: 'pip install {0}'".format(e.req))
if not upgradelist:
pass
else:
pippackages = (' '.join(map(str, upgradelist)))
print(
"\nCaster: Requires updated version of dependencies.\n Update With: 'pip install --upgrade {0}' \n"
.format(pippackages))
class DependencyMan:
# Initializes functions
def initialize(self):
install = install_type()
if install is "classic":
dep_min_version()
dep_missing()
if settings.SETTINGS["miscellaneous"]["online_mode"]:
if internet_check():
if install is "pip":
dependency_check(command="castervoice")
dependency_check(command="dragonfly2")
else:
print("\nCaster: Network off-line check network connection\n")
else:
print("\nCaster: Off-line mode is enabled\n")
NATLINK = True
PIL = True
PYWIN32 = True
WX = True