Skip to content

Instantly share code, notes, and snippets.

@bewest
Last active December 12, 2015 07:59
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 bewest/4741016 to your computer and use it in GitHub Desktop.
Save bewest/4741016 to your computer and use it in GitHub Desktop.
automatically audit sessions

ssh + git hacks

Quick intro

This method automatically forwards serial device over ssh for one-time consumption. After resource is consumed once, all ports and sessions are closed cleanly.

The resource can only be consumed once using this implementation; the whole pipeline is shut-down after a single open/close session on the virtual modem.

Details

See:

system sequence part1 system sequence part2

Help

Integrate with compound document formats

Also see

authorized_keys

Gitolite and svnserve use this technique to map an authenticated key to a specified user by setting up the entire shell so that it's customized for the user.

See: http://sitaramc.github.com/gitolite/auth.html

Now, if you managed to read about gitolite and ssh, you know that
gitolite is meant to be invoked as:

/full/path/to/gitolite-shell some-authenticated-gitolite-username
(where the "gitolite username" is a "virtual" username; it does not
have to be, and usually isn't, an actual unix username).

Part of "user setup" or registration has to be adding an entry for the user's beagle bone key to our authorized_keys_ file

For example, This entry prevents bash or sh from running. Usually what happens is ssh will start bash as the new user.

EG a normal session:

bewest@paragon:~/src$ ssh insulaudit@bewest.io 'whoami ; env ; echo
$SHELL'
insulaudit
MAIL=/var/mail/insulaudit
USER=insulaudit
SSH_CLIENT=24.5.43.241 53043 22
HOME=/home/insulaudit
LOGNAME=insulaudit
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/insulaudit
SSH_CONNECTION=24.5.43.241 53043 10.170.185.103 22
/bin/sh
bewest@paragon:~/src$ 

With the authorized_keys:

command="FOO=BAR /home/insulaudit/bin/do_audit_for.sh bewest" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSZh82PI+uQe62fNvmqNNdB6mpPjJfpoPlxt515PVKjUpE49YQUXpdkbOYNHGtT5cRWdvEBJ7zVyJt0Iiy2cUVZjO2dgd/+iKwTNbFXvk9WyKP/MRwij3AHrf+nMMg9csz0qQ5JwRqBktjOuf3Vxkrf/bkUROxnvj1CU3SDNe7NUx7aGF/awwnQ19vzS/T6oCUct+ivGNWX+ZBLVLeWzPxm4T88Lw6v/ASWeHRydVtEoAOj66F1EP1R429EwBnasZi1a6sqeh3H8wNtqysaN4ultrOPsQldENKOTApZbjtAEL5u03m+/gRxu0PGymDhUFSn08ruwB8qxAedwfS4D9P bewest@ip-10-170-185-103

command="FOO=BAR /home/insulaudit/bin/do_audit_for.sh bewest" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIvYgpg7C+4qqpGAelfX9BilYe4Qs6pJlOlLyZU553w+dmCBb3JGfcMoT8ppBse3N/MTY+DhZ6pfSq//h81wQdj1ieSn6TshCzUyt/crbp+5VPUobj8Y/3DiByiNgnGmY6L17qab3OMCK7ns/+WGWkfGYmN2XFxqbVpENTE2AYyOMkl++VFi+B5UTuqR3XLhlVj1xY0928tEpxKKZIfJaKgcIfxkgVM9fQnH3z/kFM1AIER4oB933CROlln9CXKTFOODUvWk8Xqh2R88DxjcCbaNUrBrsMDvqfb5z3mFKWPhaNgi8Y4gsNiDCgZpsoZJV/uXQRGtdTvfNWHgtCoXcD bewest@paragon

bewest@ip-10-170-185-103:~/src/insulaudit$ ssh insulaudit 'whoami ; env ; echo $SHELL'
$0: /home/insulaudit/bin/do_audit_for.sh
key: bewest
args: bewest
args: bewest
ENV
SHELL=/bin/sh
FOO=BAR
SSH_CLIENT=184.169.177.192 46828 22
USER=insulaudit
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
MAIL=/var/mail/insulaudit
PWD=/home/insulaudit
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/insulaudit
SSH_ORIGINAL_COMMAND=whoami ; env ; echo $SHELL
LOGNAME=insulaudit
SSH_CONNECTION=184.169.177.192 46828 10.170.185.103 22
_=/usr/bin/env
THIS IS MY SPECIAL LOGIN SHELL. HANGING UP.
bewest@ip-10-170-185-103:~/src/insulaudit$

So we are able to take initialize a specified shell session with our authenticated user. All we need to do now is authorise some ports for auditing.

Here's stack overflow on the subject:

restricting shell access/distinguishing one user from another

The answer to the first question is the command= we talked about
before. If you look in the authorized_keys file, you'll see entries
like this (I chopped off the ends of course; they're pretty long
lines):

  command="[path]/gitolite-shell sitaram",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18S2t...
  command="[path]/gitolite-shell usertwo",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArXtCT...
First, it finds out which of the public keys in this file match the
incoming login. That's crypto stuff, and I won't go into it. Once the
match has been found, it will run the command given on that line;
e.g., if I logged in, it would run [path]/gitolite-shell sitaram. So
the first thing to note is that such users do not get "shell access",
which is good!

Before running the command, however, sshd sets up an environment
variable called SSH_ORIGINAL_COMMAND which contains the actual git
command that your workstation sent out. This is the command that would
have run if you did not have the command= part in the authorised keys
file.

When gitolite-shell gets control, it looks at the first argument
("sitaram", "usertwo", etc) to determine who you are. It then looks at
the SSH_ORIGINAL_COMMAND variable to find out which repository you
want to access, and whether you're reading or writing.

Now that it has a user, repository, and access requested (read/write),
gitolite looks at its config file, and either allows or rejects the
request.

But this cannot differentiate between different branches within a
repo; that has to be done separately.

Updating authorized keys

https://github.com/sitaramc/gitolite/blob/master/src/triggers/post-compile/ssh-authkeys Looks like @sitaramc tries very hard to keep duplicate entries out, and to keep the "curated" list separate from any manually added entries.

gitolite

You can emulate gitolite-shell manually by doing something like like this SSH_ORIGINAL_COMMAND="$action" gitolite-shell bewest This actually runs as user git, but gitolite knows to set up all following commands as the "bewest" user. It looks in it's config files for all needed information at this point, although it can interact with some out of band service as well.

Action here is something like "upload, recieve, etc...."

Extending gitolite

Proposed extensions?

Some ideas on how to transition these scripts to be gitolite commands

  • upload-helper []

  • burn-branch <branch-name> <helper> - burn a branch into a repo using this idiom:

git init new-content
cd new-content
# burn a branch
git checkout -b audit-branch && git status || git checkout audit-branch
# run ${HELPER}
HELPER='echo "new content" new-content/incoming.log'
${HELPER}
git add -v .
git commit -avm 'burned new content into my branch'
cd ..
git clone --bare git@foo.io:myrepo.git remote.git
# something like
git --git-dir remote.git remote add local new-content
git --git-dir fetch local
git --git-dir rebase --onto audit-branch audit-branch..local/audit-branch
git --git-dir push origin audit-branch
# test -n $DEBUG && git --git-dir push -f origin audit-branch #???
  • stitch-branch <onto> <branch-name> <helper> - specify a domain specific helper to resolve differences in newly generated content (eg, for regular auditing, where conflicts can be regularly resolved automatically.)
# something like
git --git-dir rebase --onto audit-branch audit-branch..local/audit-branch
${HELPER}
git add -v .
git commit -avm 'burned new content into my branch'
git rebase --continue

git hacks

This one is interesting: https://github.com/progrium/gitreceive/blob/master/gitreceive

How to check in medical records using beaglebone

Take a stab at the overall workflow for what happens when the beaglebone "goes live".

Theory of operation is that given some message with a server, we want to exchange keys and generate a new valid config. Then we use the config to start up an auditing session. An auditing session consists of connecting the local hardware with a remote server process that can perform the device-specific auditing.

These steps are a suggestion on how to generate a "valid config" given an SMS, and how to trigger the server-side process.

Config

Assume this config:

[deviceDetect]
vid=1111
pid=2222

[resourceRequest]
addr=bewest.io
port=80
audit=medevice://YmV3@bewest.io:9001/insulauditpage=audit.php
userid=bew
key_loc=12739022

[serialToNet]
addr=bewest.io
port=9001

[registration]
addr=bewest.io
pollinginterval=300
phr=git@github.com:bewest/diabetes-phr.git
firstname=Ben
lastname=West

So now that do_audit_for knows to set up a user, it needs to set up a new work area.

BASE=/home/insulaudit/
USER=bewest
KEY=12739022 # some unique key
WORK=$BASE/$USER-$KEY
mkdir -p $WORK
PHR_REMOTE=git@github.com:bewest/diabetes.git
git clone $PHR_REMOTE $WORK
cd $WORK
BRANCH="audit-$KEY"
git checkout -b $BRANCH

Given a port forward, we can set up a vmodem

USER=$USER
DEVICE=$BASE/devices/$USER-$KEY.ttyUSB
PORT=9001
socat pty,link=$DEVICE,b9600,raw TCP-L:$PORT

Then run insulaudit to audit some records from a medical device.

VID=1111
PID=2222
guess=$(insulaudit guess --vid $VID --pid $PID)
tool=${guess-"mini.py"}
OUTPUT=$WORK/insulaudit-$(date +%F).log
$tool $DEVICE > $OUTPUT

Then wrap it up, and send the phr back from whence it came.

cd $WORK
summarize_audit $OUTPUT > summary.log
make_manifest $USER $SESSION . > manifest.phr
git add .
git commit -F summary.log
git push origin $BRANCH

Hmm, kill socat, clean up work??

cd
# we hope this kills socat on both remote and local side
rm $DEVICE
rm -Rf $WORK

This ssh config allows ssh command like: ssh insulaudit

Host insulaudit

  Compression no
  User insulaudit
  Hostname bewest.io
  IdentityFile /home/bewest/.ssh/insulaudit.key
  # LocalForward 4142 localhost:4142  # eg $port

We use something like this from the beaglebone to connect to the server. The idea is that socat has forwarded a pty to a TCP interface, and that ssh stitches the port onto a remote host where relevant services can make the best use of the connected device.

# fetch_config/validate_config/setup_session should result in an ssh config that looks like this
Host auditor
Compression no
User insulaudit
Hostname bewest.io # arranged in earlier steps, wherever remote daemon is running
# stitch local socat port to remote port arranged in fetch_config/validate_config/setup_session
LocalForward 4142 localhost:4142 # eg $port
# point to a key
# IdentityFile $id_file
# depending on "login shell" may not be needed
# ProxyCommand ssh %h run_stick $port
#!/bin/bash
# part of insulaudit-ssh-tools
. common
echo $0
# rm -Rvf $WORK_BASE
if [[ -f $VMODEM ]] ; then
# rm -v $VMODEM
echo $VMODEM
fi
email="$(read_config registration.email bewest+insulaudit@gmail.com)"
first="$(read_config registration.firstname insulaudit)"
last="$(read_config registration.lastname helper)"
export email first last
( cd $WORK_LOCAL
git config user.email "$email"
git config user.name "$first $last"
git add -v .
git commit -avm "commit $(basename $WORK_BASE) $(date +%FT%T)"
git push origin $BRANCH
)
echo ?? rm $WORK_BASE
#####
# EOF
# vim: set ft=sh
function read_config ( ) {
file=$SESSION_CONFIG
key=$1
default=$2
git config -f $file --get $key || echo $default
}
#####
# EOF
#!/bin/bash
# part of insulaudit-ssh-tools
echo $0
config=${1}
function do_socat ( ) {
vmodem=${VMODEM-$WORK_BASE/vmodem}
port=$(git config -f $WORK_CONF/audit.config --get serialtonet.port)
baud=$(git config -f $WORK_CONF/audit.config --get serialtonet.baud || echo 9600)
ADDR1="pty,link=$vmodem,waitslave,raw,b${baud}"
ADDR2="TCP:localhost:$port"
do_socat="-d -d $ADDR1 $ADDR2"
echo socat $do_socat
exec socat ${do_socat}
}
( do_socat || echo "SOCAT DIED" ) &
#####
# EOF
#!/bin/bash
export AUDIT_USER=${1}
echo \$0: $0
COMMANDS=${SSH_ORIGINAL_COMMAND-'audit 403332564 6'}
# parse SSH_ORIGINAL_COMMAND to figure out what the user wanted to do
read tool session user <<< "$COMMANDS"
echo tool: $tool
echo session: $session
echo user: $user
export AUDIT_TOOL=${tool}
export AUDIT_SESSION=${session}
export AUDIT_UID=${user}
export BASE=$HOME/session
export SESS_KEY="${user}-${session}"
export BRANCH="audit/$(date +%F)-${SESS_KEY}"
export WORK_BASE="$HOME/sessions/${SESS_KEY}"
export WORK_CONF=$WORK_BASE/conf
export WORK_REMOTE=$WORK_BASE/remote.git
export WORK_LOCAL=$WORK_BASE/local
export VMODEM=${WORK_BASE}/vmodem
export PATH="$HOME/bin:$PATH"
export WORK_BASE WORK_CONF WORK_REMOTE WORK_LOCAL BASE VMODEM
SESSION_CONFIG=$WORK_CONF/audit.config
export SESSION_CONFIG BRANCH SESS_KEY
. common
if [[ $AUDIT_TOOL == "audit" ]] ; then
PHR_REPO=$(read_config registration.phr)
export PHR_REPO
env
setup_audit_work
echo "CREATE VMODEM" $(which create_vmodem)
create_vmodem $WORK_CONF/audit.config
sleep 2
perform_audit
clean_audit_work
else
env
echo "HOWDY, $user"
echo "DID NOT UNDERSTAND:" $AUDIT_TOOL
echo "YOUR COMMAND:"
ssh-add -l
echo $SSH_ORIGINAL_COMMAND
fi
ps
echo "THIS IS MY SPECIAL LOGIN SHELL. HANGING UP."
#####
# EOF
/usr/bin/socat -d -d tcp-l:9001,reuseaddr FILE:/dev/ttyUSB0,nonblock,b9600,raw
now run ssh -L 9001:localhost:9001 bewest.io
2013/02/28 17:36:45 socat[5423] N listening on AF=2 0.0.0.0:9001
$0: /home/insulaudit/bin/do_audit_for.sh
tool: audit
session: 403332564
user: 6
VMODEM=/home/insulaudit/sessions/6-403332564/vmodem
AUDIT_SESSION=403332564
SHELL=/bin/sh
TERM=screen-256color-bce
BASE=/home/insulaudit/session
FOO=BAR
SSH_CLIENT=208.90.215.146 38871 22
PHR_REPO=git@github.com:bewest/diabetes.git
WORK_REMOTE=/home/insulaudit/sessions/6-403332564/remote.git
WORK_CONF=/home/insulaudit/sessions/6-403332564/conf
SSH_TTY=/dev/pts/18
WORK_LOCAL=/home/insulaudit/sessions/6-403332564/local
BRANCH=audit/2013-03-01-6-403332564
AUDIT_USER=bewest
USER=insulaudit
SSH_AUTH_SOCK=/tmp/ssh-xHlre16844/agent.16844
SESSION_CONFIG=/home/insulaudit/sessions/6-403332564/conf/audit.config
PATH=/home/insulaudit/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
MAIL=/var/mail/insulaudit
PWD=/home/insulaudit
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/insulaudit
LOGNAME=insulaudit
SSH_CONNECTION=208.90.215.146 38871 10.170.185.103 22
AUDIT_UID=6
WORK_BASE=/home/insulaudit/sessions/6-403332564
SESS_KEY=6-403332564
AUDIT_TOOL=audit
_=/usr/bin/env
/home/insulaudit/bin/setup_audit_work
https://transactionalweb.com/cloud/configfile.html?s=403332564&u=6
SETUP GIT CLONE
keys:
2048 2f:28:35:d1:0d:7a:f1:40:ec:b6:4e:80:f4:99:db:82 /home/bewest/.ssh/id_rsa (RSA)
2048 a5:70:46:71:e0:6d:76:8a:2e:0e:a6:45:86:9f:e1:c9 /home/bewest/.ssh/id_rsa (RSA)
2048 7d:b9:3a:e0:e0:7d:4d:ad:ce:e1:96:10:c5:a0:be:16 /home/bewest/.ssh/keys/grace.id_rsa.key (RSA)
1024 b5:9d:dc:a2:62:aa:27:5f:65:3b:90:3f:1d:a8:88:0c /home/bewest/.ssh/keys/test_id_dsa.key (DSA)
2048 a9:c7:7b:6b:7f:d3:34:2f:3f:19:bd:c9:f1:9d:06:80 /home/bewest/.ssh/keys/test_rsa.key (RSA)
2048 ee:6c:3f:21:07:55:e3:da:99:f2:b4:7e:82:41:fb:0e /home/meraki/.ssh/id_rsa (RSA)
2048 d9:34:ca:e9:52:af:35:55:81:a1:7e:4a:ac:6a:44:fc /home/bewest/.ssh/bewest (RSA)
2048 13:9b:f6:e3:cf:7e:ff:36:57:28:df:30:54:2b:1f:be /home/bewest/.ssh/gitolite_admin (RSA)
2048 c2:f5:c9:e2:76:1d:a2:d9:bc:f9:2a:4a:d3:4f:89:e8 /home/bewest/.ssh/insulaudit.key (RSA)
2048 4f:35:cb:ff:06:65:b4:ca:c7:c3:06:bf:f6:c0:fb:d1 /home/bewest/.ssh/test_insulaudit.key (RSA)
git@github.com:bewest/diabetes.git
/home/insulaudit/sessions/6-403332564/remote.git
/home/insulaudit/sessions/6-403332564/local
fatal: destination path '/home/insulaudit/sessions/6-403332564/local' already exists and is not an empty directory.
fatal: A branch named 'audit/2013-03-01-6-403332564' already exists.
Already on 'audit/2013-03-01-6-403332564'
From github.com:bewest/diabetes
* branch audit/2013-03-01-6-403332564 -> FETCH_HEAD
Already up-to-date.
CREATE VMODEM /home/insulaudit/bin/create_vmodem
/home/insulaudit/bin/create_vmodem
socat TCP-L:9001,reuseaddr pty,link=/home/insulaudit/sessions/6-403332564/vmodem,b9600,raw
2013/03/01 01:34:51 socat[16899] N PTY is /dev/pts/19
/home/insulaudit/bin/perform_audit
SHOULD I USE VMODEM: /home/insulaudit/sessions/6-403332564/vmodem?
insulaudit onetouch --port /home/insulaudit/sessions/6-403332564/vmodem sugars
INFO:insulaudit.devices.clmm.proto:hello world
2013/03/01 01:34:54 socat[16899] N opening connection to AF=2 127.0.0.1:9001
2013/03/01 01:34:54 socat[16899] N successfully connected from local address AF=2 127.0.0.1:32859
2013/03/01 01:34:54 socat[16899] N starting data transfer loop with FDs [3,3] and [4,4]
2013/02/28 17:36:53 socat[5423] N accepting connection from AF=2 127.0.0.1:38173 on AF=2 127.0.0.1:9001
2013/02/28 17:36:53 socat[5423] N opening character device "/dev/ttyUSB0" for reading and writing
2013/02/28 17:36:53 socat[5423] N starting data transfer loop with FDs [4,4] and [3,3]
('P 500,"WWW2A68BY","MG/DL " 05D9', rec.array([(datetime.datetime(2013, 2, 28, 17, 26, 58), 104),
(datetime.datetime(2013, 2, 28, 15, 1, 9), 160),
(datetime.datetime(2013, 2, 28, 14, 53, 41), 174),
(datetime.datetime(2013, 2, 28, 14, 32, 49), 175),
(datetime.datetime(2013, 2, 28, 13, 7, 11), 187),
(datetime.datetime(2013, 2, 28, 12, 42, 41), 240),
(datetime.datetime(2013, 2, 28, 12, 25, 37), 256),
(datetime.datetime(2013, 2, 28, 10, 9, 54), 267),
(datetime.datetime(2013, 2, 28, 0, 42, 8), 103),
(datetime.datetime(2013, 2, 27, 22, 11, 40), 190),
(datetime.datetime(2013, 2, 27, 22, 2, 4), 172),
(datetime.datetime(2013, 2, 27, 21, 59, 20), 205),
(datetime.datetime(2013, 2, 27, 21, 55, 12), 217),
(datetime.datetime(2013, 2, 27, 21, 51, 33), 203),
(datetime.datetime(2013, 2, 27, 21, 47, 8), 204),
(datetime.datetime(2013, 2, 27, 21, 38, 13), 198),
(datetime.datetime(2013, 2, 27, 21, 29, 35), 189),
(datetime.datetime(2013, 2, 27, 21, 13, 46), 166),
(datetime.datetime(2013, 2, 27, 20, 19, 9), 114),
(datetime.datetime(2013, 2, 27, 19, 13, 59), 77),
(datetime.datetime(2013, 2, 27, 18, 43, 48), 40),
(datetime.datetime(2013, 2, 27, 18, 15, 43), 99),
(datetime.datetime(2013, 2, 27, 17, 21, 58), 206),
(datetime.datetime(2013, 2, 27, 16, 42, 37), 332),
(datetime.datetime(2013, 2, 27, 14, 4, 33), 128),
(datetime.datetime(2013, 2, 27, 13, 49, 43), 142),
(datetime.datetime(2013, 2, 27, 10, 2, 33), 154),
(datetime.datetime(2013, 2, 27, 5, 26, 17), 106),
(datetime.datetime(2013, 2, 27, 1, 45, 24), 98),
(datetime.datetime(2013, 2, 27, 1, 39, 55), 89),
(datetime.datetime(2013, 2, 27, 0, 44, 26), 92),
(datetime.datetime(2013, 2, 26, 21, 43, 38), 244),
(datetime.datetime(2013, 2, 26, 21, 15, 35), 246),
(datetime.datetime(2013, 2, 26, 20, 32, 5), 172),
(datetime.datetime(2013, 2, 26, 19, 24, 4), 187),
(datetime.datetime(2013, 2, 26, 16, 51, 49), 94),
(datetime.datetime(2013, 2, 26, 12, 12, 45), 318),
(datetime.datetime(2013, 2, 26, 1, 11, 19), 167),
(datetime.datetime(2013, 2, 25, 22, 46, 7), 154),
(datetime.datetime(2013, 2, 25, 21, 10, 14), 359),
(datetime.datetime(2013, 2, 25, 20, 48, 27), 219),
(datetime.datetime(2013, 2, 25, 19, 10, 48), 156),
(datetime.datetime(2013, 2, 25, 17, 36, 43), 104),
(datetime.datetime(2013, 2, 25, 16, 24, 19), 153),
(datetime.datetime(2013, 2, 25, 15, 40, 44), 217),
(datetime.datetime(2013, 2, 25, 13, 41, 20), 277),
(datetime.datetime(2013, 2, 25, 13, 17, 2), 251),
(datetime.datetime(2013, 2, 25, 0, 11, 8), 177),
(datetime.datetime(2013, 2, 24, 23, 23, 34), 178),
(datetime.datetime(2013, 2, 24, 22, 45), 169),
(datetime.datetime(2013, 2, 24, 21, 22, 58), 131),
(datetime.datetime(2013, 2, 24, 20, 8, 42), 164),
(datetime.datetime(2013, 2, 24, 17, 37, 5), 185),
(datetime.datetime(2013, 2, 24, 13, 23, 18), 203),
(datetime.datetime(2013, 2, 24, 13, 5, 43), 223),
(datetime.datetime(2013, 2, 24, 12, 21, 55), 253),
(datetime.datetime(2013, 2, 24, 11, 4, 30), 315),
(datetime.datetime(2013, 2, 24, 1, 33, 9), 269),
(datetime.datetime(2013, 2, 23, 23, 18, 45), 229),
(datetime.datetime(2013, 2, 23, 22, 24, 28), 163),
(datetime.datetime(2013, 2, 23, 21, 43, 3), 139),
(datetime.datetime(2013, 2, 23, 21, 9, 29), 179),
(datetime.datetime(2013, 2, 23, 18, 5, 16), 63),
(datetime.datetime(2013, 2, 23, 2, 9, 39), 154),
(datetime.datetime(2013, 2, 23, 0, 15, 46), 180),
(datetime.datetime(2013, 2, 22, 22, 33, 29), 188),
(datetime.datetime(2013, 2, 22, 21, 34, 49), 166),
(datetime.datetime(2013, 2, 22, 21, 7, 58), 155),
(datetime.datetime(2013, 2, 22, 20, 30, 38), 91),
(datetime.datetime(2013, 2, 22, 16, 30, 2), 98),
(datetime.datetime(2013, 2, 22, 12, 21, 41), 139),
(datetime.datetime(2013, 2, 22, 10, 20, 47), 167),
(datetime.datetime(2013, 2, 22, 2, 10, 39), 184),
(datetime.datetime(2013, 2, 21, 22, 17, 35), 94),
(datetime.datetime(2013, 2, 21, 18, 54), 72),
(datetime.datetime(2013, 2, 21, 16, 42, 11), 100),
(datetime.datetime(2013, 2, 21, 13, 38, 47), 125),
(datetime.datetime(2013, 2, 21, 12, 44, 41), 210),
(datetime.datetime(2013, 2, 21, 12, 2, 35), 264),
(datetime.datetime(2013, 2, 20, 22, 55, 7), 74),
(datetime.datetime(2013, 2, 20, 22, 40), 40),
(datetime.datetime(2013, 2, 20, 20, 40, 7), 97),
(datetime.datetime(2013, 2, 20, 18, 12, 14), 74),
(datetime.datetime(2013, 2, 20, 17, 16, 35), 89),
(datetime.datetime(2013, 2, 20, 16, 27, 31), 96),
(datetime.datetime(2013, 2, 20, 16, 23, 31), 112),
(datetime.datetime(2013, 2, 20, 14, 15, 59), 143),
(datetime.datetime(2013, 2, 20, 10, 27, 48), 106),
(datetime.datetime(2013, 2, 20, 1, 30, 57), 227),
(datetime.datetime(2013, 2, 19, 19, 30, 40), 81),
(datetime.datetime(2013, 2, 19, 16, 51, 38), 192),
(datetime.datetime(2013, 2, 19, 16, 32, 23), 189),
(datetime.datetime(2013, 2, 19, 15, 56, 3), 217),
(datetime.datetime(2013, 2, 19, 4, 28, 17), 167),
(datetime.datetime(2013, 2, 19, 3, 7, 30), 70),
(datetime.datetime(2013, 2, 19, 2, 29, 42), 97),
(datetime.datetime(2013, 2, 19, 1, 22, 29), 149),
(datetime.datetime(2013, 2, 19, 0, 31, 15), 192),
(datetime.datetime(2013, 2, 18, 23, 14), 160),
(datetime.datetime(2013, 2, 18, 20, 54, 21), 86),
(datetime.datetime(2013, 2, 18, 20, 14, 23), 76),
(datetime.datetime(2013, 2, 18, 19, 50, 45), 94),
(datetime.datetime(2013, 2, 18, 1, 5), 126),
(datetime.datetime(2013, 2, 17, 21, 38, 50), 222),
(datetime.datetime(2013, 2, 17, 19, 5, 51), 89),
(datetime.datetime(2013, 2, 17, 18, 48, 56), 75),
(datetime.datetime(2013, 2, 17, 17, 59, 37), 89),
(datetime.datetime(2013, 2, 17, 9, 17, 4), 130),
(datetime.datetime(2013, 2, 17, 2, 19, 8), 64),
(datetime.datetime(2013, 2, 17, 1, 17, 57), 209),
(datetime.datetime(2013, 2, 17, 1, 11, 14), 206),
(datetime.datetime(2013, 2, 17, 0, 22, 51), 264),
(datetime.datetime(2013, 2, 16, 23, 4, 44), 233),
(datetime.datetime(2013, 2, 16, 22, 57, 50), 238),
(datetime.datetime(2013, 2, 16, 21, 44, 59), 173),
(datetime.datetime(2013, 2, 16, 21, 12, 14), 215),
(datetime.datetime(2013, 2, 16, 20, 2, 38), 163),
(datetime.datetime(2013, 2, 16, 17, 4, 5), 57),
(datetime.datetime(2013, 2, 15, 23, 41, 3), 195),
(datetime.datetime(2013, 2, 15, 21, 14, 28), 116),
(datetime.datetime(2013, 2, 15, 20, 50, 43), 61),
(datetime.datetime(2013, 2, 15, 20, 32, 37), 84),
(datetime.datetime(2013, 2, 15, 20, 4, 23), 72),
(datetime.datetime(2013, 2, 15, 18, 42, 39), 128),
(datetime.datetime(2013, 2, 15, 15, 15, 12), 79),
(datetime.datetime(2013, 2, 15, 14, 36, 39), 61),
(datetime.datetime(2013, 2, 15, 9, 36, 19), 248),
(datetime.datetime(2013, 2, 15, 0, 9, 24), 78),
(datetime.datetime(2013, 2, 14, 23, 51, 26), 80),
(datetime.datetime(2013, 2, 14, 21, 12, 8), 103),
(datetime.datetime(2013, 2, 14, 17, 59, 39), 114),
(datetime.datetime(2013, 2, 14, 13, 38, 3), 80),
(datetime.datetime(2013, 2, 14, 11, 53), 218),
(datetime.datetime(2013, 2, 14, 8, 50, 44), 422),
(datetime.datetime(2013, 2, 13, 21, 25, 40), 149),
(datetime.datetime(2013, 2, 13, 18, 12, 14), 179),
(datetime.datetime(2013, 2, 13, 16, 48, 51), 127),
(datetime.datetime(2013, 2, 13, 16, 32, 4), 181),
(datetime.datetime(2013, 2, 13, 14, 19, 57), 156),
(datetime.datetime(2013, 2, 13, 13, 46, 21), 199),
(datetime.datetime(2013, 2, 13, 1, 43, 2), 97),
(datetime.datetime(2013, 2, 12, 21, 59, 44), 219),
(datetime.datetime(2013, 2, 12, 19, 29, 27), 124),
(datetime.datetime(2013, 2, 12, 17, 35, 2), 113),
(datetime.datetime(2013, 2, 12, 15, 5, 5), 141),
(datetime.datetime(2013, 2, 12, 0, 13, 10), 190),
(datetime.datetime(2013, 2, 11, 22, 25, 33), 270),
(datetime.datetime(2013, 2, 11, 21, 28, 20), 306),
(datetime.datetime(2013, 2, 11, 20, 36, 36), 266),
(datetime.datetime(2013, 2, 11, 18, 54, 55), 168),
(datetime.datetime(2013, 2, 11, 18, 23, 38), 134),
(datetime.datetime(2013, 2, 11, 9, 2, 43), 97),
(datetime.datetime(2013, 2, 11, 0, 48, 27), 71),
(datetime.datetime(2013, 2, 11, 0, 19, 56), 149),
(datetime.datetime(2013, 2, 11, 0, 7, 14), 189),
(datetime.datetime(2013, 2, 10, 23, 6, 21), 172),
(datetime.datetime(2013, 2, 10, 21, 28, 56), 146),
(datetime.datetime(2013, 2, 10, 21, 4, 11), 203),
(datetime.datetime(2013, 2, 10, 20, 38, 34), 235),
(datetime.datetime(2013, 2, 10, 16, 45, 24), 143),
(datetime.datetime(2013, 2, 10, 12, 32, 45), 93),
(datetime.datetime(2013, 2, 10, 10, 5, 43), 337),
(datetime.datetime(2013, 2, 9, 23, 25, 21), 107),
(datetime.datetime(2013, 2, 9, 16, 52, 15), 219),
(datetime.datetime(2013, 2, 9, 14, 0, 24), 94),
(datetime.datetime(2013, 2, 9, 12, 27, 59), 167),
(datetime.datetime(2013, 2, 9, 10, 59, 58), 222),
(datetime.datetime(2013, 2, 9, 8, 45, 16), 393),
(datetime.datetime(2013, 2, 8, 22, 27, 14), 80),
(datetime.datetime(2013, 2, 8, 20, 32, 55), 113),
(datetime.datetime(2013, 2, 8, 18, 54, 9), 191),
(datetime.datetime(2013, 2, 7, 21, 49, 16), 107),
(datetime.datetime(2013, 2, 7, 17, 13, 5), 135),
(datetime.datetime(2013, 2, 7, 13, 34), 128),
(datetime.datetime(2013, 2, 7, 12, 12, 9), 146),
(datetime.datetime(2013, 2, 7, 3, 49, 51), 162),
(datetime.datetime(2013, 2, 6, 21, 16, 35), 104),
(datetime.datetime(2013, 2, 6, 20, 44, 55), 72),
(datetime.datetime(2013, 2, 6, 13, 27, 36), 353),
(datetime.datetime(2013, 2, 6, 1, 35, 26), 44),
(datetime.datetime(2013, 2, 6, 1, 17, 12), 46),
(datetime.datetime(2013, 2, 5, 23, 18, 31), 88),
(datetime.datetime(2013, 2, 5, 19, 48, 28), 92),
(datetime.datetime(2013, 2, 5, 19, 9, 16), 100),
(datetime.datetime(2013, 2, 5, 18, 29, 56), 90),
(datetime.datetime(2013, 2, 5, 16, 22, 30), 109),
(datetime.datetime(2013, 2, 5, 15, 1, 27), 154),
(datetime.datetime(2013, 2, 5, 6, 48, 41), 91),
(datetime.datetime(2013, 2, 4, 22, 52, 16), 46),
(datetime.datetime(2013, 2, 4, 19, 8, 46), 181),
(datetime.datetime(2013, 2, 4, 17, 27, 57), 61),
(datetime.datetime(2013, 2, 4, 16, 46, 12), 83),
(datetime.datetime(2013, 2, 4, 15, 24, 48), 73),
(datetime.datetime(2013, 2, 4, 3, 58, 31), 70),
(datetime.datetime(2013, 2, 4, 2, 33, 35), 199),
(datetime.datetime(2013, 2, 4, 1, 30, 4), 184),
(datetime.datetime(2013, 2, 3, 23, 49, 24), 199),
(datetime.datetime(2013, 2, 3, 16, 6, 32), 53),
(datetime.datetime(2013, 2, 3, 1, 24, 40), 84),
(datetime.datetime(2013, 2, 2, 21, 44, 33), 189),
(datetime.datetime(2013, 2, 2, 20, 4, 25), 156),
(datetime.datetime(2013, 2, 2, 16, 45, 35), 58),
(datetime.datetime(2013, 2, 2, 2, 34, 33), 94),
(datetime.datetime(2013, 2, 1, 23, 30, 11), 126),
(datetime.datetime(2013, 2, 1, 23, 14, 4), 97),
(datetime.datetime(2013, 2, 1, 23, 4, 33), 86),
(datetime.datetime(2013, 2, 1, 22, 54, 46), 66),
(datetime.datetime(2013, 2, 1, 22, 21, 10), 66),
(datetime.datetime(2013, 2, 1, 22, 18, 16), 65),
(datetime.datetime(2013, 2, 1, 22, 12), 67),
(datetime.datetime(2013, 2, 1, 19, 54, 20), 120),
(datetime.datetime(2013, 2, 1, 18, 46, 31), 215),
(datetime.datetime(2013, 2, 1, 16, 17, 34), 99),
(datetime.datetime(2013, 1, 31, 21, 10, 20), 63),
(datetime.datetime(2013, 1, 31, 20, 59, 25), 53),
(datetime.datetime(2013, 1, 31, 20, 56, 42), 60),
(datetime.datetime(2013, 1, 31, 19, 41, 22), 62),
(datetime.datetime(2013, 1, 31, 14, 38, 36), 116),
(datetime.datetime(2013, 1, 31, 13, 9, 3), 119),
(datetime.datetime(2013, 1, 31, 4, 45, 31), 335),
(datetime.datetime(2013, 1, 30, 23, 12), 58),
(datetime.datetime(2013, 1, 30, 23, 5, 10), 52),
(datetime.datetime(2013, 1, 30, 22, 48, 9), 53),
(datetime.datetime(2013, 1, 30, 12, 36, 47), 97),
(datetime.datetime(2013, 1, 30, 9, 38, 49), 56),
(datetime.datetime(2013, 1, 30, 6, 28, 1), 68),
(datetime.datetime(2013, 1, 30, 6, 27, 14), 65),
(datetime.datetime(2013, 1, 30, 3, 14, 47), 304),
(datetime.datetime(2013, 1, 29, 23, 7, 37), 41),
(datetime.datetime(2013, 1, 29, 21, 20, 21), 81),
(datetime.datetime(2013, 1, 29, 19, 48, 43), 98),
(datetime.datetime(2013, 1, 29, 18, 24, 27), 209),
(datetime.datetime(2013, 1, 29, 15, 16, 6), 71),
(datetime.datetime(2013, 1, 28, 21, 18, 27), 286),
(datetime.datetime(2013, 1, 28, 19, 26, 39), 127),
(datetime.datetime(2013, 1, 28, 16, 37, 8), 116),
(datetime.datetime(2013, 1, 28, 14, 56, 46), 204),
(datetime.datetime(2013, 1, 27, 21, 29, 29), 155),
(datetime.datetime(2013, 1, 27, 14, 14, 59), 51),
(datetime.datetime(2013, 1, 27, 14, 7, 52), 56),
(datetime.datetime(2013, 1, 27, 12, 28, 8), 143),
(datetime.datetime(2013, 1, 27, 11, 41, 19), 230),
(datetime.datetime(2013, 1, 27, 11, 8, 40), 223),
(datetime.datetime(2013, 1, 27, 9, 57, 12), 254),
(datetime.datetime(2013, 1, 26, 21, 34, 43), 73),
(datetime.datetime(2013, 1, 26, 20, 49, 17), 62),
(datetime.datetime(2013, 1, 26, 19, 45, 43), 61),
(datetime.datetime(2013, 1, 25, 22, 10, 37), 86),
(datetime.datetime(2013, 1, 25, 21, 28, 20), 89),
(datetime.datetime(2013, 1, 25, 16, 55, 58), 71),
(datetime.datetime(2013, 1, 24, 20, 38, 6), 134),
(datetime.datetime(2013, 1, 24, 19, 0, 4), 135),
(datetime.datetime(2013, 1, 24, 17, 23, 31), 106),
(datetime.datetime(2013, 1, 24, 15, 56, 39), 138),
(datetime.datetime(2013, 1, 24, 13, 47, 46), 169),
(datetime.datetime(2013, 1, 24, 13, 39, 20), 175),
(datetime.datetime(2013, 1, 24, 13, 26, 6), 168),
(datetime.datetime(2013, 1, 24, 13, 14, 35), 161),
(datetime.datetime(2013, 1, 24, 12, 27, 10), 144),
(datetime.datetime(2013, 1, 24, 2, 20, 39), 157),
(datetime.datetime(2013, 1, 23, 23, 59, 4), 112),
(datetime.datetime(2013, 1, 23, 23, 20, 24), 197),
(datetime.datetime(2013, 1, 23, 22, 44, 32), 185),
(datetime.datetime(2013, 1, 23, 21, 19, 23), 426),
(datetime.datetime(2013, 1, 23, 8, 27, 40), 251),
(datetime.datetime(2013, 1, 22, 23, 57, 59), 58),
(datetime.datetime(2013, 1, 22, 23, 49, 6), 52),
(datetime.datetime(2013, 1, 22, 0, 32), 113),
(datetime.datetime(2013, 1, 21, 21, 6, 33), 152),
(datetime.datetime(2013, 1, 21, 19, 26, 40), 58),
(datetime.datetime(2013, 1, 21, 9, 28, 12), 212),
(datetime.datetime(2013, 1, 21, 0, 59, 10), 83),
(datetime.datetime(2013, 1, 20, 12, 27, 23), 177),
(datetime.datetime(2013, 1, 20, 11, 7, 27), 223),
(datetime.datetime(2013, 1, 19, 22, 20, 44), 49),
(datetime.datetime(2013, 1, 19, 22, 14, 37), 51),
(datetime.datetime(2013, 1, 18, 19, 12, 31), 85),
(datetime.datetime(2013, 1, 18, 17, 53, 57), 61),
(datetime.datetime(2013, 1, 18, 16, 7, 58), 142),
(datetime.datetime(2013, 1, 17, 18, 44, 57), 217),
(datetime.datetime(2013, 1, 17, 16, 26, 41), 88),
(datetime.datetime(2013, 1, 16, 20, 47, 26), 99),
(datetime.datetime(2013, 1, 16, 20, 15, 50), 81),
(datetime.datetime(2013, 1, 16, 18, 14, 15), 116),
(datetime.datetime(2013, 1, 16, 17, 3, 38), 73),
(datetime.datetime(2013, 1, 16, 13, 0, 38), 171),
(datetime.datetime(2013, 1, 16, 9, 50, 41), 154),
(datetime.datetime(2013, 1, 16, 6, 54, 53), 245),
(datetime.datetime(2013, 1, 15, 19, 1, 25), 222),
(datetime.datetime(2013, 1, 15, 18, 24, 2), 234),
(datetime.datetime(2013, 1, 15, 15, 59, 2), 67),
(datetime.datetime(2013, 1, 15, 8, 34, 31), 96),
(datetime.datetime(2013, 1, 15, 1, 55, 56), 76),
(datetime.datetime(2013, 1, 15, 0, 24, 35), 150),
(datetime.datetime(2013, 1, 14, 23, 11, 14), 82),
(datetime.datetime(2013, 1, 14, 22, 46, 13), 71),
(datetime.datetime(2013, 1, 14, 22, 32, 30), 82),
(datetime.datetime(2013, 1, 14, 21, 53, 32), 184),
(datetime.datetime(2013, 1, 14, 21, 24, 9), 202),
(datetime.datetime(2013, 1, 14, 21, 4, 28), 228),
(datetime.datetime(2013, 1, 14, 20, 18, 6), 289),
(datetime.datetime(2013, 1, 14, 19, 47, 40), 288),
(datetime.datetime(2013, 1, 14, 18, 17, 23), 305),
(datetime.datetime(2013, 1, 14, 16, 55, 25), 167),
(datetime.datetime(2013, 1, 14, 16, 22, 47), 176),
(datetime.datetime(2013, 1, 14, 15, 35, 30), 190),
(datetime.datetime(2013, 1, 14, 14, 52, 51), 221),
(datetime.datetime(2013, 1, 14, 14, 27, 6), 246),
(datetime.datetime(2013, 1, 14, 13, 30, 5), 319),
(datetime.datetime(2013, 1, 14, 12, 0, 23), 352),
(datetime.datetime(2013, 1, 14, 10, 54, 1), 347),
(datetime.datetime(2013, 1, 14, 10, 39, 4), 370),
(datetime.datetime(2013, 1, 14, 10, 23, 5), 343),
(datetime.datetime(2013, 1, 14, 9, 18, 57), 365),
(datetime.datetime(2013, 1, 14, 9, 9, 9), 365),
(datetime.datetime(2013, 1, 14, 8, 35, 36), 421),
(datetime.datetime(2013, 1, 14, 7, 48, 50), 369),
(datetime.datetime(2013, 1, 14, 6, 18, 9), 372),
(datetime.datetime(2013, 1, 14, 4, 32, 1), 455),
(datetime.datetime(2013, 1, 14, 2, 55, 5), 428),
(datetime.datetime(2013, 1, 13, 22, 10, 13), 76),
(datetime.datetime(2013, 1, 13, 21, 51, 6), 79),
(datetime.datetime(2013, 1, 13, 12, 29, 5), 127),
(datetime.datetime(2013, 1, 13, 9, 59, 33), 331),
(datetime.datetime(2013, 1, 13, 0, 48, 3), 122),
(datetime.datetime(2013, 1, 12, 21, 31, 17), 106),
(datetime.datetime(2013, 1, 12, 19, 2, 4), 56),
(datetime.datetime(2013, 1, 12, 17, 23, 48), 94),
(datetime.datetime(2013, 1, 12, 15, 40, 51), 113),
(datetime.datetime(2013, 1, 12, 13, 33, 20), 167),
(datetime.datetime(2013, 1, 12, 8, 41, 19), 319),
(datetime.datetime(2013, 1, 12, 2, 48, 18), 379),
(datetime.datetime(2013, 1, 11, 20, 35, 17), 136),
(datetime.datetime(2013, 1, 11, 20, 18, 44), 130),
(datetime.datetime(2013, 1, 11, 19, 48, 50), 214),
(datetime.datetime(2013, 1, 11, 19, 40, 21), 221),
(datetime.datetime(2013, 1, 11, 19, 18, 4), 290),
(datetime.datetime(2013, 1, 11, 18, 49, 34), 335),
(datetime.datetime(2013, 1, 11, 17, 54, 59), 286),
(datetime.datetime(2013, 1, 11, 16, 13, 39), 150),
(datetime.datetime(2013, 1, 11, 15, 15, 13), 39),
(datetime.datetime(2013, 1, 10, 12, 18, 35), 244),
(datetime.datetime(2013, 1, 9, 17, 58, 37), 296),
(datetime.datetime(2013, 1, 9, 17, 10, 41), 237),
(datetime.datetime(2013, 1, 9, 15, 36, 10), 68),
(datetime.datetime(2013, 1, 9, 6, 41, 48), 117),
(datetime.datetime(2013, 1, 8, 19, 31, 55), 142),
(datetime.datetime(2013, 1, 8, 16, 40, 11), 185),
(datetime.datetime(2013, 1, 8, 16, 21, 9), 224),
(datetime.datetime(2013, 1, 8, 15, 13, 20), 237),
(datetime.datetime(2013, 1, 8, 14, 57, 2), 228),
(datetime.datetime(2013, 1, 8, 4, 35, 27), 399),
(datetime.datetime(2013, 1, 7, 22, 10, 56), 167),
(datetime.datetime(2013, 1, 7, 21, 1, 18), 126),
(datetime.datetime(2013, 1, 7, 19, 43, 13), 204),
(datetime.datetime(2013, 1, 7, 16, 30, 20), 88),
(datetime.datetime(2013, 1, 7, 1, 5, 30), 211),
(datetime.datetime(2013, 1, 6, 20, 21, 31), 87),
(datetime.datetime(2013, 1, 6, 5, 31, 2), 67),
(datetime.datetime(2013, 1, 6, 0, 58, 5), 194),
(datetime.datetime(2013, 1, 5, 23, 56, 49), 310),
(datetime.datetime(2013, 1, 5, 20, 39, 50), 100),
(datetime.datetime(2013, 1, 5, 9, 41, 6), 311),
(datetime.datetime(2013, 1, 5, 5, 1, 46), 289),
(datetime.datetime(2013, 1, 5, 1, 36, 58), 222),
(datetime.datetime(2013, 1, 4, 22, 9, 19), 112),
(datetime.datetime(2013, 1, 4, 20, 39, 29), 69),
(datetime.datetime(2013, 1, 4, 15, 58, 49), 102),
(datetime.datetime(2013, 1, 4, 8, 45, 57), 136),
(datetime.datetime(2013, 1, 4, 4, 5, 49), 119),
(datetime.datetime(2013, 1, 3, 22, 8, 28), 70),
(datetime.datetime(2013, 1, 3, 19, 1, 48), 76),
(datetime.datetime(2013, 1, 3, 15, 5, 14), 211),
(datetime.datetime(2013, 1, 3, 13, 36, 44), 134),
(datetime.datetime(2013, 1, 3, 10, 45, 58), 66),
(datetime.datetime(2013, 1, 3, 7, 25, 52), 73),
(datetime.datetime(2013, 1, 2, 23, 32, 2), 93),
(datetime.datetime(2013, 1, 2, 18, 55, 37), 175),
(datetime.datetime(2013, 1, 2, 16, 2, 34), 127),
(datetime.datetime(2013, 1, 2, 14, 50, 37), 197),
(datetime.datetime(2013, 1, 2, 11, 11, 28), 234),
(datetime.datetime(2013, 1, 2, 7, 1, 20), 63),
(datetime.datetime(2013, 1, 2, 6, 46, 37), 58),
(datetime.datetime(2013, 1, 1, 22, 37, 42), 84),
(datetime.datetime(2013, 1, 1, 14, 15, 31), 104),
(datetime.datetime(2013, 1, 1, 13, 56, 27), 107),
(datetime.datetime(2013, 1, 1, 8, 5, 54), 101),
(datetime.datetime(2012, 12, 31, 21, 49, 23), 68),
(datetime.datetime(2012, 12, 31, 19, 26, 24), 141),
(datetime.datetime(2012, 12, 31, 17, 2, 48), 130),
(datetime.datetime(2012, 12, 31, 15, 13, 19), 109),
(datetime.datetime(2012, 12, 31, 13, 41, 41), 99),
(datetime.datetime(2012, 12, 31, 10, 47, 27), 85),
(datetime.datetime(2012, 12, 31, 10, 38, 6), 92),
(datetime.datetime(2012, 12, 31, 9, 14, 21), 97),
(datetime.datetime(2012, 12, 31, 6, 48, 49), 210),
(datetime.datetime(2012, 12, 30, 22, 32, 16), 79),
(datetime.datetime(2012, 12, 30, 21, 40, 35), 97),
(datetime.datetime(2012, 12, 30, 19, 18, 3), 202),
(datetime.datetime(2012, 12, 30, 18, 34, 48), 183),
(datetime.datetime(2012, 12, 30, 18, 1, 10), 110),
(datetime.datetime(2012, 12, 30, 17, 15, 58), 86),
(datetime.datetime(2012, 12, 30, 17, 0, 42), 95),
(datetime.datetime(2012, 12, 30, 15, 47, 57), 124),
(datetime.datetime(2012, 12, 30, 14, 50, 42), 132),
(datetime.datetime(2012, 12, 30, 10, 31, 14), 101),
(datetime.datetime(2012, 12, 30, 9, 6, 15), 187),
(datetime.datetime(2012, 12, 30, 0, 38, 55), 176),
(datetime.datetime(2012, 12, 29, 16, 44, 54), 182),
(datetime.datetime(2012, 12, 29, 15, 48, 18), 159),
(datetime.datetime(2012, 12, 29, 12, 7, 30), 72),
(datetime.datetime(2012, 12, 29, 9, 40, 21), 152),
(datetime.datetime(2012, 12, 28, 23, 4, 2), 105),
(datetime.datetime(2012, 12, 28, 21, 8, 43), 138),
(datetime.datetime(2012, 12, 28, 16, 51, 22), 172),
(datetime.datetime(2012, 12, 28, 15, 51, 54), 237),
(datetime.datetime(2012, 12, 28, 14, 12, 9), 283),
(datetime.datetime(2012, 12, 28, 10, 24, 46), 60),
(datetime.datetime(2012, 12, 28, 7, 12, 38), 156),
(datetime.datetime(2012, 12, 28, 5, 22, 18), 167),
(datetime.datetime(2012, 12, 27, 19, 58, 27), 124),
(datetime.datetime(2012, 12, 27, 17, 7, 53), 63),
(datetime.datetime(2012, 12, 27, 16, 57, 2), 60),
(datetime.datetime(2012, 12, 27, 16, 48, 29), 64),
(datetime.datetime(2012, 12, 27, 15, 53, 18), 86),
(datetime.datetime(2012, 12, 27, 14, 6, 54), 118),
(datetime.datetime(2012, 12, 27, 9, 47, 38), 128),
(datetime.datetime(2012, 12, 26, 23, 57, 51), 93),
(datetime.datetime(2012, 12, 26, 22, 0, 39), 186),
(datetime.datetime(2012, 12, 26, 18, 28, 45), 54),
(datetime.datetime(2012, 12, 26, 16, 50, 40), 125),
(datetime.datetime(2012, 12, 26, 12, 55, 31), 86),
(datetime.datetime(2012, 12, 26, 10, 27, 43), 101),
(datetime.datetime(2012, 12, 26, 6, 39, 28), 131),
(datetime.datetime(2012, 12, 25, 22, 51, 59), 224),
(datetime.datetime(2012, 12, 25, 20, 2, 59), 98),
(datetime.datetime(2012, 12, 25, 18, 46, 45), 178),
(datetime.datetime(2012, 12, 25, 17, 15, 42), 246),
(datetime.datetime(2012, 12, 25, 16, 55, 18), 301),
(datetime.datetime(2012, 12, 25, 15, 31, 46), 293),
(datetime.datetime(2012, 12, 25, 12, 53, 56), 62),
(datetime.datetime(2012, 12, 25, 12, 47, 46), 53),
(datetime.datetime(2012, 12, 25, 12, 0, 16), 90),
(datetime.datetime(2012, 12, 25, 7, 36, 33), 62),
(datetime.datetime(2012, 12, 24, 23, 31, 1), 109),
(datetime.datetime(2012, 12, 24, 20, 9, 31), 60),
(datetime.datetime(2012, 12, 24, 17, 22, 43), 162),
(datetime.datetime(2012, 12, 24, 13, 39, 59), 104),
(datetime.datetime(2012, 12, 24, 12, 21, 3), 61),
(datetime.datetime(2012, 12, 24, 8, 3, 25), 85),
(datetime.datetime(2012, 12, 23, 22, 14, 11), 61),
(datetime.datetime(2012, 12, 23, 18, 2, 57), 132),
(datetime.datetime(2012, 12, 23, 15, 42, 15), 68),
(datetime.datetime(2012, 12, 23, 11, 9, 58), 190),
(datetime.datetime(2012, 12, 23, 6, 40, 52), 100),
(datetime.datetime(2012, 12, 22, 22, 8, 37), 115),
(datetime.datetime(2012, 12, 22, 16, 37, 53), 155),
(datetime.datetime(2012, 12, 22, 15, 13, 17), 137),
(datetime.datetime(2012, 12, 22, 13, 59, 8), 53),
(datetime.datetime(2012, 12, 22, 13, 43, 27), 72),
(datetime.datetime(2012, 12, 22, 12, 5, 8), 314),
(datetime.datetime(2012, 12, 22, 8, 11, 32), 114),
(datetime.datetime(2012, 12, 22, 7, 20, 5), 53),
(datetime.datetime(2012, 12, 21, 20, 7, 2), 73),
(datetime.datetime(2012, 12, 21, 19, 16, 27), 127),
(datetime.datetime(2012, 12, 21, 16, 14, 50), 186),
(datetime.datetime(2012, 12, 21, 12, 19, 27), 128),
(datetime.datetime(2012, 12, 21, 9, 28, 2), 89),
(datetime.datetime(2012, 12, 21, 9, 23, 30), 86),
(datetime.datetime(2012, 12, 20, 15, 31, 5), 125),
(datetime.datetime(2012, 12, 20, 13, 53, 23), 79),
(datetime.datetime(2012, 12, 20, 8, 32, 40), 77),
(datetime.datetime(2012, 12, 20, 4, 59, 38), 75),
(datetime.datetime(2012, 12, 20, 0, 52, 43), 249),
(datetime.datetime(2012, 12, 19, 21, 32, 5), 93),
(datetime.datetime(2012, 12, 19, 19, 56, 42), 58),
(datetime.datetime(2012, 12, 19, 18, 14, 6), 125),
(datetime.datetime(2012, 12, 19, 16, 17, 58), 131),
(datetime.datetime(2012, 12, 19, 10, 15, 4), 268),
(datetime.datetime(2012, 12, 19, 3, 26, 45), 104),
(datetime.datetime(2012, 12, 18, 23, 7, 18), 59),
(datetime.datetime(2012, 12, 18, 22, 22, 55), 102),
(datetime.datetime(2012, 12, 18, 21, 15, 19), 151),
(datetime.datetime(2012, 12, 18, 19, 23, 43), 84),
(datetime.datetime(2012, 12, 18, 17, 50, 58), 142),
(datetime.datetime(2012, 12, 18, 16, 1, 3), 139),
(datetime.datetime(2012, 12, 18, 15, 19, 3), 58),
(datetime.datetime(2012, 12, 18, 9, 55, 45), 102),
(datetime.datetime(2012, 12, 17, 20, 2, 57), 157),
(datetime.datetime(2012, 12, 17, 14, 10, 30), 184),
(datetime.datetime(2012, 12, 17, 10, 2, 18), 308),
(datetime.datetime(2012, 12, 16, 21, 13, 3), 108),
(datetime.datetime(2012, 12, 16, 17, 38, 16), 270),
(datetime.datetime(2012, 12, 16, 15, 19, 12), 256),
(datetime.datetime(2012, 12, 16, 11, 47, 41), 143),
(datetime.datetime(2012, 12, 15, 20, 59, 23), 124),
(datetime.datetime(2012, 12, 15, 19, 18, 23), 78),
(datetime.datetime(2012, 12, 14, 22, 0, 29), 106),
(datetime.datetime(2012, 12, 14, 20, 10, 58), 98),
(datetime.datetime(2012, 12, 14, 16, 10, 5), 143)],
dtype=[('time', '|O8'), ('value', '<i8')]))
len glucose: 2
2013-02-28T17:26:58 104
2013-02-28T15:01:09 160
2013-02-28T14:53:41 174
2013-02-28T14:32:49 175
2013-02-28T13:07:11 187
2013-02-28T12:42:41 240
2013-02-28T12:25:37 256
2013-02-28T10:09:54 267
2013-02-28T00:42:08 103
2013-02-27T22:11:40 190
2013-02-27T22:02:04 172
2013-02-27T21:59:20 205
2013-02-27T21:55:12 217
2013-02-27T21:51:33 203
2013-02-27T21:47:08 204
2013-02-27T21:38:13 198
2013-02-27T21:29:35 189
2013-02-27T21:13:46 166
2013-02-27T20:19:09 114
2013-02-27T19:13:59 77
2013-02-27T18:43:48 40
2013-02-27T18:15:43 99
2013-02-27T17:21:58 206
2013-02-27T16:42:37 332
2013-02-27T14:04:33 128
2013-02-27T13:49:43 142
2013-02-27T10:02:33 154
2013-02-27T05:26:17 106
2013-02-27T01:45:24 98
2013-02-27T01:39:55 89
2013-02-27T00:44:26 92
2013-02-26T21:43:38 244
2013-02-26T21:15:35 246
2013-02-26T20:32:05 172
2013-02-26T19:24:04 187
2013-02-26T16:51:49 94
2013-02-26T12:12:45 318
2013-02-26T01:11:19 167
2013-02-25T22:46:07 154
2013-02-25T21:10:14 359
2013-02-25T20:48:27 219
2013-02-25T19:10:48 156
2013-02-25T17:36:43 104
2013-02-25T16:24:19 153
2013-02-25T15:40:44 217
2013-02-25T13:41:20 277
2013-02-25T13:17:02 251
2013-02-25T00:11:08 177
2013-02-24T23:23:34 178
2013-02-24T22:45:00 169
2013-02-24T21:22:58 131
2013-02-24T20:08:42 164
2013-02-24T17:37:05 185
2013-02-24T13:23:18 203
2013-02-24T13:05:43 223
2013-02-24T12:21:55 253
2013-02-24T11:04:30 315
2013-02-24T01:33:09 269
2013-02-23T23:18:45 229
2013-02-23T22:24:28 163
2013-02-23T21:43:03 139
2013-02-23T21:09:29 179
2013-02-23T18:05:16 63
2013-02-23T02:09:39 154
2013-02-23T00:15:46 180
2013-02-22T22:33:29 188
2013-02-22T21:34:49 166
2013-02-22T21:07:58 155
2013-02-22T20:30:38 91
2013-02-22T16:30:02 98
2013-02-22T12:21:41 139
2013-02-22T10:20:47 167
2013-02-22T02:10:39 184
2013-02-21T22:17:35 94
2013-02-21T18:54:00 72
2013-02-21T16:42:11 100
2013-02-21T13:38:47 125
2013-02-21T12:44:41 210
2013-02-21T12:02:35 264
2013-02-20T22:55:07 74
2013-02-20T22:40:00 40
2013-02-20T20:40:07 97
2013-02-20T18:12:14 74
2013-02-20T17:16:35 89
2013-02-20T16:27:31 96
2013-02-20T16:23:31 112
2013-02-20T14:15:59 143
2013-02-20T10:27:48 106
2013-02-20T01:30:57 227
2013-02-19T19:30:40 81
2013-02-19T16:51:38 192
2013-02-19T16:32:23 189
2013-02-19T15:56:03 217
2013-02-19T04:28:17 167
2013-02-19T03:07:30 70
2013-02-19T02:29:42 97
2013-02-19T01:22:29 149
2013-02-19T00:31:15 192
2013-02-18T23:14:00 160
2013-02-18T20:54:21 86
2013-02-18T20:14:23 76
2013-02-18T19:50:45 94
2013-02-18T01:05:00 126
2013-02-17T21:38:50 222
2013-02-17T19:05:51 89
2013-02-17T18:48:56 75
2013-02-17T17:59:37 89
2013-02-17T09:17:04 130
2013-02-17T02:19:08 64
2013-02-17T01:17:57 209
2013-02-17T01:11:14 206
2013-02-17T00:22:51 264
2013-02-16T23:04:44 233
2013-02-16T22:57:50 238
2013-02-16T21:44:59 173
2013-02-16T21:12:14 215
2013-02-16T20:02:38 163
2013-02-16T17:04:05 57
2013-02-15T23:41:03 195
2013-02-15T21:14:28 116
2013-02-15T20:50:43 61
2013-02-15T20:32:37 84
2013-02-15T20:04:23 72
2013-02-15T18:42:39 128
2013-02-15T15:15:12 79
2013-02-15T14:36:39 61
2013-02-15T09:36:19 248
2013-02-15T00:09:24 78
2013-02-14T23:51:26 80
2013-02-14T21:12:08 103
2013-02-14T17:59:39 114
2013-02-14T13:38:03 80
2013-02-14T11:53:00 218
2013-02-14T08:50:44 422
2013-02-13T21:25:40 149
2013-02-13T18:12:14 179
2013-02-13T16:48:51 127
2013-02-13T16:32:04 181
2013-02-13T14:19:57 156
2013-02-13T13:46:21 199
2013-02-13T01:43:02 97
2013-02-12T21:59:44 219
2013-02-12T19:29:27 124
2013-02-12T17:35:02 113
2013-02-12T15:05:05 141
2013-02-12T00:13:10 190
2013-02-11T22:25:33 270
2013-02-11T21:28:20 306
2013-02-11T20:36:36 266
2013-02-11T18:54:55 168
2013-02-11T18:23:38 134
2013-02-11T09:02:43 97
2013-02-11T00:48:27 71
2013-02-11T00:19:56 149
2013-02-11T00:07:14 189
2013-02-10T23:06:21 172
2013-02-10T21:28:56 146
2013-02-10T21:04:11 203
2013-02-10T20:38:34 235
2013-02-10T16:45:24 143
2013-02-10T12:32:45 93
2013-02-10T10:05:43 337
2013-02-09T23:25:21 107
2013-02-09T16:52:15 219
2013-02-09T14:00:24 94
2013-02-09T12:27:59 167
2013-02-09T10:59:58 222
2013-02-09T08:45:16 393
2013-02-08T22:27:14 80
2013-02-08T20:32:55 113
2013-02-08T18:54:09 191
2013-02-07T21:49:16 107
2013-02-07T17:13:05 135
2013-02-07T13:34:00 128
2013-02-07T12:12:09 146
2013-02-07T03:49:51 162
2013-02-06T21:16:35 104
2013-02-06T20:44:55 72
2013-02-06T13:27:36 353
2013-02-06T01:35:26 44
2013-02-06T01:17:12 46
2013-02-05T23:18:31 88
2013-02-05T19:48:28 92
2013-02-05T19:09:16 100
2013-02-05T18:29:56 90
2013-02-05T16:22:30 109
2013-02-05T15:01:27 154
2013-02-05T06:48:41 91
2013-02-04T22:52:16 46
2013-02-04T19:08:46 181
2013-02-04T17:27:57 61
2013-02-04T16:46:12 83
2013-02-04T15:24:48 73
2013-02-04T03:58:31 70
2013-02-04T02:33:35 199
2013-02-04T01:30:04 184
2013-02-03T23:49:24 199
2013-02-03T16:06:32 53
2013-02-03T01:24:40 84
2013-02-02T21:44:33 189
2013-02-02T20:04:25 156
2013-02-02T16:45:35 58
2013-02-02T02:34:33 94
2013-02-01T23:30:11 126
2013-02-01T23:14:04 97
2013-02-01T23:04:33 86
2013-02-01T22:54:46 66
2013-02-01T22:21:10 66
2013-02-01T22:18:16 65
2013-02-01T22:12:00 67
2013-02-01T19:54:20 120
2013-02-01T18:46:31 215
2013-02-01T16:17:34 99
2013-01-31T21:10:20 63
2013-01-31T20:59:25 53
2013-01-31T20:56:42 60
2013-01-31T19:41:22 62
2013-01-31T14:38:36 116
2013-01-31T13:09:03 119
2013-01-31T04:45:31 335
2013-01-30T23:12:00 58
2013-01-30T23:05:10 52
2013-01-30T22:48:09 53
2013-01-30T12:36:47 97
2013-01-30T09:38:49 56
2013-01-30T06:28:01 68
2013-01-30T06:27:14 65
2013-01-30T03:14:47 304
2013-01-29T23:07:37 41
2013-01-29T21:20:21 81
2013-01-29T19:48:43 98
2013-01-29T18:24:27 209
2013-01-29T15:16:06 71
2013-01-28T21:18:27 286
2013-01-28T19:26:39 127
2013-01-28T16:37:08 116
2013-01-28T14:56:46 204
2013-01-27T21:29:29 155
2013-01-27T14:14:59 51
2013-01-27T14:07:52 56
2013-01-27T12:28:08 143
2013-01-27T11:41:19 230
2013-01-27T11:08:40 223
2013-01-27T09:57:12 254
2013-01-26T21:34:43 73
2013-01-26T20:49:17 62
2013-01-26T19:45:43 61
2013-01-25T22:10:37 86
2013-01-25T21:28:20 89
2013-01-25T16:55:58 71
2013-01-24T20:38:06 134
2013-01-24T19:00:04 135
2013-01-24T17:23:31 106
2013-01-24T15:56:39 138
2013-01-24T13:47:46 169
2013-01-24T13:39:20 175
2013-01-24T13:26:06 168
2013-01-24T13:14:35 161
2013-01-24T12:27:10 144
2013-01-24T02:20:39 157
2013-01-23T23:59:04 112
2013-01-23T23:20:24 197
2013-01-23T22:44:32 185
2013-01-23T21:19:23 426
2013-01-23T08:27:40 251
2013-01-22T23:57:59 58
2013-01-22T23:49:06 52
2013-01-22T00:32:00 113
2013-01-21T21:06:33 152
2013-01-21T19:26:40 58
2013-01-21T09:28:12 212
2013-01-21T00:59:10 83
2013-01-20T12:27:23 177
2013-01-20T11:07:27 223
2013-01-19T22:20:44 49
2013-01-19T22:14:37 51
2013-01-18T19:12:31 85
2013-01-18T17:53:57 61
2013-01-18T16:07:58 142
2013-01-17T18:44:57 217
2013-01-17T16:26:41 88
2013-01-16T20:47:26 99
2013-01-16T20:15:50 81
2013-01-16T18:14:15 116
2013-01-16T17:03:38 73
2013-01-16T13:00:38 171
2013-01-16T09:50:41 154
2013-01-16T06:54:53 245
2013-01-15T19:01:25 222
2013-01-15T18:24:02 234
2013-01-15T15:59:02 67
2013-01-15T08:34:31 96
2013-01-15T01:55:56 76
2013-01-15T00:24:35 150
2013-01-14T23:11:14 82
2013-01-14T22:46:13 71
2013-01-14T22:32:30 82
2013-01-14T21:53:32 184
2013-01-14T21:24:09 202
2013-01-14T21:04:28 228
2013-01-14T20:18:06 289
2013-01-14T19:47:40 288
2013-01-14T18:17:23 305
2013-01-14T16:55:25 167
2013-01-14T16:22:47 176
2013-01-14T15:35:30 190
2013-01-14T14:52:51 221
2013-01-14T14:27:06 246
2013-01-14T13:30:05 319
2013-01-14T12:00:23 352
2013-01-14T10:54:01 347
2013-01-14T10:39:04 370
2013-01-14T10:23:05 343
2013-01-14T09:18:57 365
2013-01-14T09:09:09 365
2013-01-14T08:35:36 421
2013-01-14T07:48:50 369
2013-01-14T06:18:09 372
2013-01-14T04:32:01 455
2013-01-14T02:55:05 428
2013-01-13T22:10:13 76
2013-01-13T21:51:06 79
2013-01-13T12:29:05 127
2013-01-13T09:59:33 331
2013-01-13T00:48:03 122
2013-01-12T21:31:17 106
2013-01-12T19:02:04 56
2013-01-12T17:23:48 94
2013-01-12T15:40:51 113
2013-01-12T13:33:20 167
2013-01-12T08:41:19 319
2013-01-12T02:48:18 379
2013-01-11T20:35:17 136
2013-01-11T20:18:44 130
2013-01-11T19:48:50 214
2013-01-11T19:40:21 221
2013-01-11T19:18:04 290
2013-01-11T18:49:34 335
2013-01-11T17:54:59 286
2013-01-11T16:13:39 150
2013-01-11T15:15:13 39
2013-01-10T12:18:35 244
2013-01-09T17:58:37 296
2013-01-09T17:10:41 237
2013-01-09T15:36:10 68
2013-01-09T06:41:48 117
2013-01-08T19:31:55 142
2013-01-08T16:40:11 185
2013-01-08T16:21:09 224
2013-01-08T15:13:20 237
2013-01-08T14:57:02 228
2013-01-08T04:35:27 399
2013-01-07T22:10:56 167
2013-01-07T21:01:18 126
2013-01-07T19:43:13 204
2013-01-07T16:30:20 88
2013-01-07T01:05:30 211
2013-01-06T20:21:31 87
2013-01-06T05:31:02 67
2013-01-06T00:58:05 194
2013-01-05T23:56:49 310
2013-01-05T20:39:50 100
2013-01-05T09:41:06 311
2013-01-05T05:01:46 289
2013-01-05T01:36:58 222
2013-01-04T22:09:19 112
2013-01-04T20:39:29 69
2013-01-04T15:58:49 102
2013-01-04T08:45:57 136
2013-01-04T04:05:49 119
2013-01-03T22:08:28 70
2013-01-03T19:01:48 76
2013-01-03T15:05:14 211
2013-01-03T13:36:44 134
2013-01-03T10:45:58 66
2013-01-03T07:25:52 73
2013-01-02T23:32:02 93
2013-01-02T18:55:37 175
2013-01-02T16:02:34 127
2013-01-02T14:50:37 197
2013-01-02T11:11:28 234
2013-01-02T07:01:20 63
2013-01-02T06:46:37 58
2013-01-01T22:37:42 84
2013-01-01T14:15:31 104
2013-01-01T13:56:27 107
2013-01-01T08:05:54 101
2012-12-31T21:49:23 68
2012-12-31T19:26:24 141
2012-12-31T17:02:48 130
2012-12-31T15:13:19 109
2012-12-31T13:41:41 99
2012-12-31T10:47:27 85
2012-12-31T10:38:06 92
2012-12-31T09:14:21 97
2012-12-31T06:48:49 210
2012-12-30T22:32:16 79
2012-12-30T21:40:35 97
2012-12-30T19:18:03 202
2012-12-30T18:34:48 183
2012-12-30T18:01:10 110
2012-12-30T17:15:58 86
2012-12-30T17:00:42 95
2012-12-30T15:47:57 124
2012-12-30T14:50:42 132
2012-12-30T10:31:14 101
2012-12-30T09:06:15 187
2012-12-30T00:38:55 176
2012-12-29T16:44:54 182
2012-12-29T15:48:18 159
2012-12-29T12:07:30 72
2012-12-29T09:40:21 152
2012-12-28T23:04:02 105
2012-12-28T21:08:43 138
2012-12-28T16:51:22 172
2012-12-28T15:51:54 237
2012-12-28T14:12:09 283
2012-12-28T10:24:46 60
2012-12-28T07:12:38 156
2012-12-28T05:22:18 167
2012-12-27T19:58:27 124
2012-12-27T17:07:53 63
2012-12-27T16:57:02 60
2012-12-27T16:48:29 64
2012-12-27T15:53:18 86
2012-12-27T14:06:54 118
2012-12-27T09:47:38 128
2012-12-26T23:57:51 93
2012-12-26T22:00:39 186
2012-12-26T18:28:45 54
2012-12-26T16:50:40 125
2012-12-26T12:55:31 86
2012-12-26T10:27:43 101
2012-12-26T06:39:28 131
2012-12-25T22:51:59 224
2012-12-25T20:02:59 98
2012-12-25T18:46:45 178
2012-12-25T17:15:42 246
2012-12-25T16:55:18 301
2012-12-25T15:31:46 293
2012-12-25T12:53:56 62
2012-12-25T12:47:46 53
2012-12-25T12:00:16 90
2012-12-25T07:36:33 62
2012-12-24T23:31:01 109
2012-12-24T20:09:31 60
2012-12-24T17:22:43 162
2012-12-24T13:39:59 104
2012-12-24T12:21:03 61
2012-12-24T08:03:25 85
2012-12-23T22:14:11 61
2012-12-23T18:02:57 132
2012-12-23T15:42:15 68
2012-12-23T11:09:58 190
2012-12-23T06:40:52 100
2012-12-22T22:08:37 115
2012-12-22T16:37:53 155
2012-12-22T15:13:17 137
2012-12-22T13:59:08 53
2012-12-22T13:43:27 72
2012-12-22T12:05:08 314
2012-12-22T08:11:32 114
2012-12-22T07:20:05 53
2012-12-21T20:07:02 73
2012-12-21T19:16:27 127
2012-12-21T16:14:50 186
2012-12-21T12:19:27 128
2012-12-21T09:28:02 89
2012-12-21T09:23:30 86
2012-12-20T15:31:05 125
2012-12-20T13:53:23 79
2012-12-20T08:32:40 77
2012-12-20T04:59:38 75
2012-12-20T00:52:43 249
2012-12-19T21:32:05 93
2012-12-19T19:56:42 58
2012-12-19T18:14:06 125
2012-12-19T16:17:58 131
2012-12-19T10:15:04 268
2012-12-19T03:26:45 104
2012-12-18T23:07:18 59
2012-12-18T22:22:55 102
2012-12-18T21:15:19 151
2012-12-18T19:23:43 84
2012-12-18T17:50:58 142
2012-12-18T16:01:03 139
2012-12-18T15:19:03 58
2012-12-18T09:55:45 102
2012-12-17T20:02:57 157
2012-12-17T14:10:30 184
2012-12-17T10:02:18 308
2012-12-16T21:13:03 108
2012-12-16T17:38:16 270
2012-12-16T15:19:12 256
2012-12-16T11:47:41 143
2012-12-15T20:59:23 124
2012-12-15T19:18:23 78
2012-12-14T22:00:29 106
2012-12-14T20:10:58 98
2012-12-14T16:10:05 143
2013/03/01 01:35:50 socat[16899] N read(3, 0x8fa060, 8192): Input/output error (probably PTY closed)
2013/03/01 01:35:50 socat[16899] N socket 1 (fd 3) is at EOF
/home/insulaudit/bin/clean_audit_work
add 'incoming.log'
[audit/2013-03-01-6-403332564 3f429a3] commit 6-403332564 2013-03-01T01:35:51
1 file changed, 1000 insertions(+), 2 deletions(-)
2013/02/28 17:37:49 socat[5423] N socket 1 (fd 4) is at EOF
2013/03/01 01:35:51 socat[16899] N exiting with status 0
2013/02/28 17:37:49 socat[5423] N exiting with status 0
Counting objects: 5, done.
Compressing objects: 33% (1/3) Compressing objects: 66% (2/3) Compressing objects: 100% (3/3) Compressing objects: 100% (3/3), done.
Writing objects: 33% (1/3) Writing objects: 66% (2/3) Writing objects: 100% (3/3) Writing objects: 100% (3/3), 8.23 KiB, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:bewest/diabetes.git
6d38c85..3f429a3 audit/2013-03-01-6-403332564 -> audit/2013-03-01-6-403332564
?? rm /home/insulaudit/sessions/6-403332564
PID TTY TIME CMD
16845 pts/18 00:00:00 sh
16846 pts/18 00:00:00 do_audit_for.sh
17077 pts/18 00:00:00 ps
THIS IS MY SPECIAL LOGIN SHELL. HANGING UP.
Connection to bewest.io closed.

$0: /home/insulaudit/bin/do_audit_for.sh tool: audit session: 403332564 user: 6 /home/insulaudit/bin/do_audit_for.sh: line 25: VMODEM=${$WORK_BASE/vmodem}: bad substitution AUDIT_SESSION=403332564 SHELL=/bin/sh TERM=screen-256color-bce BASE=/home/insulaudit/session FOO=BAR SSH_CLIENT=184.169.177.192 47006 22 WORK_REMOTE=/home/insulaudit/sessions/6-403332564/remote WORK_CONF=/home/insulaudit/sessions/6-403332564/conf SSH_TTY=/dev/pts/16 WORK_LOCAL=/home/insulaudit/sessions/6-403332564/local AUDIT_USER=bewest USER=insulaudit PATH=~/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games MAIL=/var/mail/insulaudit PWD=/home/insulaudit LANG=en_US.UTF-8 SHLVL=1 HOME=/home/insulaudit LOGNAME=insulaudit SSH_CONNECTION=184.169.177.192 47006 10.170.185.103 22 AUDIT_UID=6 WORK_BASE=/home/insulaudit/sessions/6-403332564 AUDIT_TOOL=audit _=/usr/bin/env /home/insulaudit/bin/do_audit_for.sh https://transactionalweb.com/cloud/configfile.html?s=403332564&u=6 /home/insulaudit/bin/do_audit_for.sh socat TCP-L:9001,reuseaddr pty,link=/home/insulaudit/sessions/6-403332564/vmodem,b9600,raw socat pid: 4383 /home/insulaudit/bin/do_audit_for.sh /home/insulaudit/bin/do_audit_for.sh ?? rm /home/insulaudit/sessions/6-403332564 THIS IS MY SPECIAL LOGIN SHELL. HANGING UP.

#!/bin/bash
sms=${1}
python decode_audit_sms.py ${sms}
# something like
# key=D34DB33F
# manage=mevice://bewest.io:4142
# or even medevice://D34DB33F@bewest.io:4142
#####
# EOF
#!/bin/bash
print_sms | while read sms ; do
rm new.config
fetch_config_from $sms | validate_config new.config
if [[ -f new.config ]] ; then
mv new.config good.config
auditor=$(setup_session good.config) # tell management to give us a port now!
# auditor == "./ssh-audit-4142-D34DB33F.config
ssh -F $auditor auditor run_stick $auditor
# remote side has a login shell that only responds to "run_stick" and a few other commands, or run_stick is a command that takes the session "key"
fi
done
#!/usr/bin/python
import serial
import sys
from pprint import pprint, pformat
import insulaudit
from insulaudit.log import io
from insulaudit.devices import lsultramini
PORT = '/home/bewest/dev/vmodem0'
def format_packet( command ):
COMMAND = [
2, # STX
len( command ) + 6 ] # mundane details are always 6 bytes
pass
def read_serial( ):
commands = [ 5, 11, 2, 0, 0, 0, 0, 132, 106, 232, 115, 0 ]
def get_serial( port, timeout=2 ):
return serial.Serial( port, timeout=timeout )
def init( ):
mini = lsultramini.LSUltraMini( PORT, 0.5 )
print "is open? %s\n timeout: %s" % ( mini.serial.isOpen( ), mini.serial.getTimeout() )
mini.disconnect( )
print "Initial DISCONNECT"
print "GETTING FIRMWARE INFO"
firmware = mini.execute( lsultramini.DiscoverFirmware( ) )
print "FIRMWARE IS: %s" % firmware
print ""
print "read serial number"
serial = mini.execute( lsultramini.ReadSerialNumber( ) )
print "serial number: %s" % serial
print ""
print "number of available records:"
max_records = mini.execute( lsultramini.ReadAvailableRecords( ) )
print "max records: %s" % max_records
print ""
print "all records"
records = [ ]
for x in xrange( max_records ):
print 'record: %s' % x
r = mini.execute( lsultramini.ReadGlucoseRecord( x ) )
print r
records.append( x )
print "total records found:%s" % len(records)
return mini
if __name__ == '__main__':
PORT = len(sys.argv) > 1 and sys.argv[1] or PORT
io.info("using PORT %s" % PORT)
port = init()
io.info( port )
#!/bin/bash
# part of insulaudit-ssh-tools
. common
echo $0
echo -n SHOULD I USE VMODEM: $VMODEM?
echo $( test -a $VMODEM && echo "yes" || echo "NO")
if [[ -a $VMODEM ]] ; then
auditor="mini.py"
args=$VMODEM
#auditor="insulaudit"
#args="mini --port $VMODEM hello"
(
echo "INCOMING: $(date +%F)"
env
#echo insulaudit onetouch --port $VMODEM hello
#insulaudit onetouch --port $VMODEM hello
echo $auditor $args;
# insulaudit onetouch --port $VMODEM sugars
${auditor} $args | tee $WORK_BASE/sugars.txt
) 2>&1 | tee $WORK_LOCAL/incoming.log
DATA_URL=$(read_config registration.dataurl)
curl --data=@$WORK_BASE/sugars.txt $DATA_URL
else
echo $VMODEM does not exist
fi
#####
# EOF
#!/bin/bash
# part of insulaudit-ssh-tools
. common
echo $0
mkdir -p $WORK_BASE
config_url="https://transactionalweb.com/cloud/configfile.html?s=${AUDIT_SESSION}&u=${AUDIT_UID}"
echo $config_url
mkdir -p $WORK_CONF
curl -s $config_url > $SESSION_CONFIG
echo SETUP GIT CLONE
echo keys:
# eval $(ssh-agent)
ssh-add -l
PHR_REPO=$(read_config registration.phr)
export PHR_REPO
echo $PHR_REPO
echo $WORK_REMOTE
echo $WORK_LOCAL
# git clone --bare $PHR_REPO $WORK_REMOTE
git clone $PHR_REPO $WORK_LOCAL
cd $WORK_LOCAL
git checkout -b $BRANCH && git status || git checkout $BRANCH
git pull origin $BRANCH
#####
# EOF
#!/bin/bash
config=$1
function print_ssh_config ( ) {
host=${1-bewest.io}
port=${2-4142}
cat <<<EOT
# fetch_config/validate_config/setup_session should result in an ssh config that looks like this
Host auditor
Compression no
User insulaudit
Hostname $host
# stitch local socat port to remote port arranged in fetch_config/validate_config/setup_session
LocalForward $port localhost:$port
# point to a key
# IdentityFile $id_file
# depending on "login shell" may not be needed
# ProxyCommand ssh -p %p %h run_stick $key
EOT
}
medevice=$(cat $config | grep medevice | cut -d'=' -f 1)
eval $(url2bash.py $medevice)
session="./medevice-$port-$user-ssh.config"
print_ssh_config $host $port > $session
echo $session
#####
# EOF
#!/bin/bash
# http://www.dest-unreach.org/socat/doc/socat-ttyovertcp.txt
# EXAMPLE FOR REMOTE TTY (TTY OVER TCP) USING SOCAT
#
# You have a host with some serial device like a modem or a bluetooth interface
# (modem server)
# You want to make use of this device on a different host. (client)
#
# 1) on the modem server start a process that accepts network connections and
# links them with the serial device /dev/tty0:
#
# $ socat tcp-l:54321,reuseaddr,fork file:/dev/tty0,nonblock,waitlock=/var/run/tty0.lock
#
# 2) on the client start a process that creates a pseudo tty and links it with a
# tcp connection to the modem server:
#
# $ socat pty,link=$HOME/dev/vmodem0,waitslave tcp:modem-server:54321
# socat FILE:/dev/ttyUSB0,nonblock,b9600,raw tcp:localhost:4161
#
echo ""
SOCAT=$(which socat)
# BLOCK_SIZE="-b 64"
BLOCK_SIZE=""
ADDR1="tcp-l:9001,reuseaddr"
ADDR2="FILE:/dev/ttyUSB0,nonblock,b9600,raw"
# ADDR2="FILE:carelink.ttyUSB0,b9600,raw"
# $ socat pty,link=$HOME/dev/vmodem0,waitslave tcp:modem-server:54321
SOCAT_ARGS="-d -d ${BLOCK_SIZE} ${ADDR1} ${ADDR2}"
echo "$SOCAT $SOCAT_ARGS"
echo "now run ssh -L 9001:localhost:9001 bewest.io"
$SOCAT $SOCAT_ARGS &
ssh -R localhost:9001:localhost:9001 insulaudit
#####
# EOF
#!/usr/bin/env python
import os, sys
from urlparse import urlparse, parse_qsl
uri = sys.argv[1]
result = urlparse(uri)
host = result.netloc.split('@')
user, host = host[1:] and host or ['', host[0]]
user = user.split(':')
user, passw = user[1:] and user or [user[0], '']
host = host.split(':')
host, port = host[1:] and host or [host[0], '']
path = result.path
query = result.query
frag = result.fragment
print 'user=%s' % user
print 'passw=%s' % passw
print 'host=%s' % host
print 'path=%s' % path
print 'port=%s' % port
print 'query=%s' % parse_qsl(query)
for k, v in parse_qsl(query):
print '%s=%s' % (k, v)
print 'frag=%s' % frag
#####
# EOF
#!/bin/bash
valid_config=${1-new.config}
# no-op for now
cat - > $valid_config
#####
# EOF
@bewest
Copy link
Author

bewest commented Feb 8, 2013

One option here is for setup_session to create a specially crafted ssh config file replete with custom hostname and proxycommand.

@bewest
Copy link
Author

bewest commented Feb 8, 2013

On serverside, the ssh user can use the trick used by git and many others: special "login-shell" for the "insulaudit" user.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment