use the new get machine id code to fix a race condition bug
This commit is contained in:
parent
50d3129010
commit
5e580e6e2c
3 changed files with 77 additions and 20 deletions
|
@ -2,7 +2,8 @@ from uuid import uuid4 as uuid4
|
||||||
import xbmc
|
import xbmc
|
||||||
import xbmcaddon
|
import xbmcaddon
|
||||||
import xbmcgui
|
import xbmcgui
|
||||||
|
import os
|
||||||
|
from Lock import Lock
|
||||||
|
|
||||||
class ClientInformation():
|
class ClientInformation():
|
||||||
|
|
||||||
|
@ -11,21 +12,39 @@ class ClientInformation():
|
||||||
WINDOW = xbmcgui.Window( 10000 )
|
WINDOW = xbmcgui.Window( 10000 )
|
||||||
|
|
||||||
clientId = WINDOW.getProperty("client_id")
|
clientId = WINDOW.getProperty("client_id")
|
||||||
self.addonSettings = xbmcaddon.Addon(id='plugin.video.mb3sync')
|
if(clientId != None and clientId != ""):
|
||||||
if(clientId == None or clientId == ""):
|
return clientId
|
||||||
xbmc.log("CLIENT_ID - > No Client ID in WINDOW")
|
|
||||||
clientId = self.addonSettings.getSetting('client_id')
|
# we need to load and or generate a client machine id
|
||||||
|
__addon__ = xbmcaddon.Addon(id='plugin.video.mb3sync')
|
||||||
|
__addondir__ = xbmc.translatePath( __addon__.getAddonInfo('path'))
|
||||||
|
machine_guid_lock_path = os.path.join(__addondir__, "machine_guid.lock")
|
||||||
|
machine_guid_path = os.path.join(__addondir__, "machine_guid")
|
||||||
|
clientId = ""
|
||||||
|
|
||||||
if(clientId == None or clientId == ""):
|
try:
|
||||||
xbmc.log("CLIENT_ID - > No Client ID in SETTINGS")
|
lock = Lock(machine_guid_lock_path)
|
||||||
uuid = uuid4()
|
locked = lock.acquire()
|
||||||
clientId = str("%012X" % uuid)
|
|
||||||
|
if(locked == True):
|
||||||
|
|
||||||
|
fd = os.open(machine_guid_path, os.O_CREAT|os.O_RDWR)
|
||||||
|
clientId = os.read(fd, 256)
|
||||||
|
|
||||||
|
if(len(clientId) == 0):
|
||||||
|
uuid = uuid4()
|
||||||
|
clientId = str("%012X" % uuid)
|
||||||
|
xbmc.log("CLIENT_ID - > Client ID saved to FILE : " + clientId)
|
||||||
|
os.write(fd, clientId)
|
||||||
|
os.fsync(fd)
|
||||||
|
|
||||||
|
os.close(fd)
|
||||||
|
|
||||||
|
xbmc.log("CLIENT_ID - > Client ID saved to WINDOW : " + clientId)
|
||||||
WINDOW.setProperty("client_id", clientId)
|
WINDOW.setProperty("client_id", clientId)
|
||||||
self.addonSettings.setSetting('client_id', clientId)
|
|
||||||
xbmc.log("CLIENT_ID - > New Client ID : " + clientId)
|
finally:
|
||||||
else:
|
lock.release()
|
||||||
WINDOW.setProperty('client_id', clientId)
|
|
||||||
xbmc.log("CLIENT_ID - > Client ID saved to WINDOW from Settings : " + clientId)
|
|
||||||
|
|
||||||
return clientId
|
return clientId
|
||||||
|
|
||||||
|
|
|
@ -102,12 +102,10 @@ class ConnectionManager():
|
||||||
if(return_value > -1):
|
if(return_value > -1):
|
||||||
selected_user = userList[return_value]
|
selected_user = userList[return_value]
|
||||||
self.printDebug("Setting Selected User : " + selected_user)
|
self.printDebug("Setting Selected User : " + selected_user)
|
||||||
if self.addonSettings.getSetting("port") != server_port:
|
self.addonSettings.setSetting("port", server_port)
|
||||||
self.addonSettings.setSetting("port", server_port)
|
self.addonSettings.setSetting("ipaddress", server_address)
|
||||||
if self.addonSettings.getSetting("ipaddress") != server_address:
|
self.addonSettings.setSetting("username", selected_user)
|
||||||
self.addonSettings.setSetting("ipaddress", server_address)
|
downloadUtils.authenticate()
|
||||||
if self.addonSettings.getSetting("username") != selected_user:
|
|
||||||
self.addonSettings.setSetting("username", selected_user)
|
|
||||||
|
|
||||||
def getServerDetails(self):
|
def getServerDetails(self):
|
||||||
|
|
||||||
|
|
40
resources/lib/Lock.py
Normal file
40
resources/lib/Lock.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import errno
|
||||||
|
import xbmc
|
||||||
|
|
||||||
|
class Lock:
|
||||||
|
|
||||||
|
def __init__(self, filename):
|
||||||
|
self.filename = filename
|
||||||
|
self.delay = 0.5
|
||||||
|
self.timeout = 10
|
||||||
|
self.is_locked = False
|
||||||
|
self.fd = None
|
||||||
|
|
||||||
|
def acquire(self):
|
||||||
|
start_time = time.time()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
self.fd = os.open(self.filename, os.O_CREAT|os.O_RDWR|os.O_EXCL)
|
||||||
|
break;
|
||||||
|
except OSError as e:
|
||||||
|
if (time.time() - start_time) >= self.timeout:
|
||||||
|
xbmc.log("File_Lock_On " + self.filename + " timed out")
|
||||||
|
return False
|
||||||
|
#xbmc.log("File_Lock_On " + self.filename + " error " + str(e))
|
||||||
|
time.sleep(self.delay)
|
||||||
|
self.is_locked = True
|
||||||
|
xbmc.log("File_Lock_On " + self.filename + " obtained")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def release(self):
|
||||||
|
if self.is_locked:
|
||||||
|
os.close(self.fd)
|
||||||
|
os.unlink(self.filename)
|
||||||
|
self.is_locked = False
|
||||||
|
xbmc.log("File_Lock_On " + self.filename + " released")
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.release()
|
||||||
|
|
Loading…
Reference in a new issue