Posts Tagged ‘python’
Moto RAZR + Bluetooth + Linux + Python = ObexCopier
While in Schaumburg, Illinois last week for the Oracle DBA Workshop II, I was taking some photos on my Motorola RAZR camera phone, in the hopes of posting them for my 5-year-old daughter to see. I needed to clear up some misconceptions, since she was under the impression that I “sleep at the school.” I soon learned, however, that transferring photos from the RAZR one-at-a-time over bluetooth to my Fedora 8 laptop became tedious, and waiting for a response from the GUI file browser was just frustrating. Enter: ObexFTP.
Thanks to a tip from a friend, I found ObexFTP and, in my quest to force myself to learn python, set about crafting a script to do the following:
- Transfer files based on a date (default to today).
- Transfer all files in the directory.
So I’m presenting to you my first stab at it. Some of the hard-codings depend on how the RAZR stores photos in the micro-SD card. If anyone wants to submit enhancements or critiques, I’m all ears. Right now it just works for what I needed it to do.
#!/usr/bin/env python
# Don Seiler, don@seiler.us
import obexftp, ConfigParser, os
from xml.etree.ElementTree import XML
from optparse import OptionParser
from datetime import date
# This script is dependent on the Moto Razr convention of naming
# pictures in an MM-DD-YYYY_XXXX.jpg format
# Users need to create ~/.obexcopier.ini with these variables defined
# [ObexCopier]
# device = 1A:2B:3C:4D:5E:6F
# channel = 6
# source_dir = /MMC(Removable)/motorola/shared/picture
# dest_dir = /media/pictures
# Read config from ~/.obexcopier.ini
config = ConfigParser.ConfigParser()
config.read(os.path.expanduser('~/.obexcopier.ini'))
# Probably a waste of precious memory to store these again
device = config.get('ObexCopier','device')
channel = config.getint('ObexCopier','channel')
source_dir = config.get('ObexCopier','source_dir')
dest_dir = config.get('ObexCopier','dest_dir')
# Get today for default date
today = date.today().strftime("%m-%d-%y")
# Command-line handling to allow for date
parser = OptionParser()
parser.add_option("-d", "--date", dest="date", default=today, help="Grab pictures from this date, defaults to today [default: %default]",metavar="MM-DD-YY")
parser.add_option("-a", "--all", action="store_true", dest="all", default=False, help="Copy all files, regardless of date [default: %default]")
(options, args) = parser.parse_args()
# Connect to the client
print "Connecting to %s on channel %d" % (device, channel)
cli = obexftp.client(obexftp.BLUETOOTH)
cli.connect(device, channel)
# Get the list of files from the SD card picture dir
if options.all:
print "Copying all files to disk"
else:
print "Copying files from %s" % options.date
files_xml = cli.list(source_dir)
folder_listing = XML(files_xml)
files = folder_listing.findall('./file/')
for file in files:
# Only handle pictures taken on the specified date
if options.all or file.get('name').startswith(options.date):
print "Copying %s" % file.get('name')
data = cli.get(source_dir + '/' + file.get('name'))
localfile = open(dest_dir + '/' + file.get('name'), 'wb')
localfile.write(data)
localfile.close()
# Disconnect and delete the client
cli.disconnect()
cli.delete
python + cx_Oracle = <3
Took some time over the past two days to deliberately use python. Much fun was had by all (where all = me).
My first creation used the subprocess module (although I had to install the older separate version since I’m on python 2.3) to call df over ssh and then again locally to make sure that my disk partitions were large enough to hold an rman duplication. Works like a champ, and hopefully I won’t have long-running duplications blow up and page me at 2 AM. Subprocess is a really nice module for making system calls as well, I’ll let you play around with it before thanking me.
My second creation used the cx_Oracle module to connect to Oracle as the SYSDBA and do some post-duplication tasks for my development databases. Changing flags to note that it isn’t production, granting some more privileges to the developers, etc. Thanks to Anthony Tuininga for answering my newbie emails.
ATTN Python Lovers: A New cx_Oracle Awaits You!
The Oracle extension of choice for python, cx_Oracle has come out with a new release. Release notes are fun reading, as always.
For the unwashed masses (from their homepage):
cx_Oracle is a Python extension module that allows access to Oracle databases and conforms to the Python database API specification.
Makes me realize how I wish I could find more stuff to use python in. Most of my reporting is done in perl, and not worth converting. Most of my maintenance scripts (rman, etc.) are bash scripts calling the Oracle executables themselves.
Also be thankful that the Hoff is there in case you have fat fingers!
python + oracle == <3
Finally got around to installing the cx_Oracle lib for python. Since my Oracle sandbox at work is only CentOS3 (to be as close to prod RHEL3 as possible), I only have python 2.2, so I needed to build/install from source. Sadly, I didn’t realize how trivial this was, but it’s done now, and I can further my python fanboidom AND play with Oracle at the same time.
To quote Animal House: THANK YOU, GOD.



