Skip to content

Instantly share code, notes, and snippets.

@anilsg
Created March 18, 2018 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anilsg/e08d074c6f33c2cb3fd596c9ee9a05bd to your computer and use it in GitHub Desktop.
Save anilsg/e08d074c6f33c2cb3fd596c9ee9a05bd to your computer and use it in GitHub Desktop.
Openbox pipemenu and conky Python script to turn dropbox-cli on and off and return status of sync
#!/usr/bin/env python
'''
menu-dropbox.py
Display Dropbox daemon sync status and progress for Conky and Openbox menu.
Provide daemon toggle on / off options for Openbox menu.
Options:
-m Return minutes remaining: ${execbar ~/.config/openbox/menu-dropbox.py -m}
-o Return Openbox pipe menu
-d Return description: ${exec ~/.config/openbox/menu-dropbox.py -t}
Uses:
> dropbox-cli status
Syncing "a" (13 mins left)
Uploading "a" (134.3 KB/sec, 13 mins left)
Dropbox isn't running!
Up to date
Syncing (8 files remaining) / Uploading 8 files...
Syncing "test.png" (8 secs left) / Uploading "test.png" (965.5 KB/sec, 8 secs left)
Syncing "test.png" (1 sec left) / Uploading "test.png" (259.5 KB/sec, 1 sec left)
Syncing (2 files remaining, 53 secs left) / Uploading 2 files (77.2 KB/sec, 53 secs left)
Syncing (2 files remaining, 2 mins left) / Uploading 2 files (33.2 KB/sec, 2 mins left)
Syncing "test.txt" (1 min left)][Uploading "test.txt" (46,228 KB/sec, 1 min left)
Was:
cat << EOFMENU
<openbox_pipe_menu>
<separator label="`dropbox-cli status | head -1 | sed s/\"/\'/g`" />
<item label="Dropbox Start"><action name="Execute"><command>dropbox-cli start</command></action></item>
<item label="Dropbox Stop"><action name="Execute"><command>dropbox-cli stop</command></action></item>
</openbox_pipe_menu>
EOFMENU
Anil Gulati
10/02/2018
'''
import string
import sys
import subprocess
description = '[dropbox-cli status unknown]' # Default description.
minutes = 100 # Use 100 minutes as arbitrary maximum.
additional = '' # May not always have additional lines.
# Get the Dropbox client daemon status and pick a single line of text.
try:
ran = subprocess.run(['dropbox-cli', 'status'], timeout=2, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
additional = ran.stdout.splitlines() # Just catch all the lines here first.
description = additional[0] or description # Grab first line of output or default if nothing.
description = description.replace('"', "'") # Double quotes pollute Openbox menu.
additional = len(additional) > 1 and additional[1] or '' # Get additional information line if available.
additional = additional.replace('"', "'") # Double quotes pollute Openbox menu.
except subprocess.TimeoutExpired:
description = '[Error: dropbox-cli timeout!]'
except:
description = '[Error: dropbox-cli exception!]'
# Scrape the text for minutes left to sync.
number = 100 # In case can't find a number in preceding words.
tab = str.maketrans('', '', string.punctuation) # Translate table to delete punctuation.
for word in description.split():
word = word.translate(tab) # Remove punctuation to elicit number from ' (12 mins remaining) '.
if word.isdigit(): number = int(word) # Cache any whole numbers found.
if word == 'secs' or word == 'sec': minutes = 1 # Approximate conversion from seconds to minutes.
if word == 'mins' or word == 'min': minutes = number # Previous number must be minutes.
# Convert frequently occurring scenarios.
if description == "Dropbox isn't running!": description, minutes = 'Sync off', 100
if description == "Up to date": description, minutes = 'Sync complete', 0
# Return request output.
if len(sys.argv) <= 1 or 'd' in sys.argv[1]: print(description) # -d returns simple description.
elif 'm' in sys.argv[1]: print(minutes > 100 and 100 or minutes) # Limit minutes to 100 for Conky bar graph.
else: # -o returns Openbox pipe menu.
print((
'<openbox_pipe_menu>'
'<separator label="{description}" />'
'{additional}'
'<item label="Dropbox {command}"><action name="Execute"><command>dropbox-cli {command}</command></action></item>'
'</openbox_pipe_menu>'
).format(
description=description,
additional=(additional and '<separator label="{0}" />'.format(additional) or ''),
command=(description == 'Sync off' and 'start' or 'stop')
))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment