Register Guidelines E-Books Search Today's Posts Mark Forums Read

Go Back   MobileRead Forums > E-Book Software > Calibre > Related Tools

Notices

Reply
 
Thread Tools Search this Thread
Old 04-07-2014, 04:27 PM   #1
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Fully automatic calibre installer/updater for linux

Growing out of this discussion: Official Calibre PPA?, here is a simple bash script to update calibre on linux.
Note: This can also perform the first-time install, since the version check returns the same failure for out-of-date as it does if there is no calibre installed.

Thanks to aleyx for working on the version checking!

EDIT: The script has been updated to fix a few problems. Also, you can now install the script and add the cron job by running the following one-liner in a terminal:
Code:
sudo -v && wget -nv -O- https://github.com/eli-schwartz/calibre-installer/raw/master/linux/calibre-installer.sh | sudo sh -
New code:
Spoiler:
Code:
#!/bin/bash

# Unset git development source
export CALIBRE_DEVELOP_FROM=
# by default, switch is off
force_upgrade=0


# Functions

calibre_is_installed()
{
    command -v calibre >/dev/null 2>&1
}

usage()
{
	cat <<- _EOF_
		Usage: calibre-upgrade.sh [OPTIONS]
		Upgrades calibre installation. Automatically checks if the current version is up to date.
		Must be run as root.

		OPTIONS
		    -f, --force       Force an update. This is only useful if binaries
		                      were updated for a critical error. :shrug:
		    -h, --help        Displays this help message.
_EOF_
}

do_upgrade()
{
    if calibre_is_installed; then
        # shutdown calibre as each logged-in user.
        for i in $(users | tr ' ' '\n' | sort -u); do
            sudo -u $i calibre --shutdown-running-calibre
        done
        killall calibre-server
    fi
    wget -nv -O- https://github.com/kovidgoyal/calibre/raw/master/setup/linux-installer.py | python -c "import sys; main=lambda x,y:sys.stderr.write('Download failed\n'); exec(sys.stdin.read()); main()"
}

# Options
while [ "$1" != "" ]; do
    case $1 in
        -h|--help)      usage
                        exit
                        ;;
        -f|--force)     shift
                        force_upgrade=1
                        ;;
        *)              echo "calibre-upgrade.sh: unrecognized option '$1'"
                        echo "Try 'calibre-upgrade.sh --help' for more information."
                        exit 1
    esac
    shift
done

# Main

## Check that we are running as root
if [[ $EUID -ne 0 ]]; then
    echo -e "You can only install calibre if you have root permission."
    exit 1
fi



if calibre_is_installed; then
    calibre-debug -c "import urllib as u; from calibre.constants import numeric_version; raise SystemExit(int(numeric_version  < (tuple(map(int, u.urlopen('http://calibre-ebook.com/downloads/latest_version').read().split('.'))))))"
    UP_TO_DATE=$?
else
    echo -e "Calibre is not installed, installing...\n\n"
    UP_TO_DATE=1
fi

if [ "$UP_TO_DATE" = 0 ]; then
    echo "Calibre is up-to-date"

    if [ "$force_upgrade" = 1 ]; then
        echo ""
        echo "Forcing upgrade anyway -- are you sure you want to continue? [y/n]"
        read answer

        if [[ "$answer" = "y" || "$answer" = "yes" ]]; then
            do_upgrade
        else
            echo "Exiting..."
            exit 1
        fi
    fi
else
    calibre_is_installed && echo -e "Calibre is out-of-date. Upgrading...\n\n"
    do_upgrade
fi


Old code:
Spoiler:
Code:
#!/bin/bash

calibre-debug -c "import urllib as u; from calibre.constants import numeric_version; raise SystemExit(int(numeric_version  < (tuple(map(int, u.urlopen('http://calibre-ebook.com/downloads/latest_version').read().split('.'))))))"

UP_TO_DATE=$?

if [ $UP_TO_DATE = 0 ]; then
	echo "Calibre is up-to-date"
else
	calibre --shutdown-running-calibre
	killall calibre-server

	sudo -v; wget -nv -O- https://github.com/kovidgoyal/calibre/raw/master/setup/linux-installer.py | sudo python -c "import sys; main=lambda:sys.stderr.write('Download failed\n'); exec(sys.stdin.read()); main()"
fi


Explanation:
Spoiler:
Very simply:
  1. we start off with a one-liner which runs calibre-debug to determine the currently installed version, and compares it to the version declared at http://calibre-ebook.com/downloads/latest_version
  2. if it returns negative, calibre is already up to date, and it tells you so. Why bother updating to the current version?
  3. if not, we:
    1. close any running instances of calibre
    2. kill calibre-server, if running
    3. run Kovid's one-liner install code. If you use a non-default install directory, you can edit this!
      Just drop in Kovid's other code.


Save this as "calibre-upgrade.sh" (or whatever you want) and stick it in "/usr/bin/", to add it to your path. ("$HOME/bin/" works too, but this is for a system install, so this is nicer. )

You can now update calibre by running
Code:
sudo calibre-upgrade.sh
but to make this fully automatic, simply add:
Code:
0 6 * * 5 /usr/bin/calibre-upgrade.sh > /dev/null 2>&1
or if you want the output emailed to you by cron, add
Code:
0 6 * * 5 /usr/bin/calibre-upgrade.sh
to your crontab (with the command "sudo crontab -e") and the updater will run every Friday at 5:00 AM. Presumably, you aren't awake at that time, but you can fill in whatever time you want.

Attached is a zip of the updater script (in a bin directory, and marked as executable), which can be extracted to "/usr/" (or $HOME) for your convenience.
Attached Files
File Type: gz calibre-upgrade.sh.tar.gz (1.3 KB, 38 views)

Last edited by eschwartz; 12-09-2014 at 03:58 PM. Reason: new script
eschwartz is online now   Reply With Quote
Old 04-07-2014, 05:19 PM   #2
aleyx
Groupie
aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.
 
Posts: 193
Karma: 20386
Join Date: Sep 2010
Location: France
Device: Cybook Orizon
You're welcome ^_^

Some ideas:

After the update one-liner, it may be useful to test for the success (or failure) of the update, then run a separate .sh containing the calibre-server command(s) for your particular libraries. That way you don't have to relaunch the servers manually. You can also use that separate .sh at boot time.

Maybe also sending a mail with a little blurb (whether there was an update, whether it succeeded...)

Also, between the killall and the oneliner, a backup.sh would be nice. Although anyone savvy enough to use this script should already have a nigthly backup in place, so maybe not?

For those who are a little wary about messing with their crontab, just linking calibre-update.sh into /etc/cron.daily (or /etc/cron.weekly) can be an adequate solution.

N.
aleyx is offline   Reply With Quote
Old 04-07-2014, 05:49 PM   #3
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
All kinds of frills can be used, of course. But the basics are there.

Regarding mail blurbs, just using
Code:
0 6 * * 5 /usr/bin/calibre-upgrade.sh
without sending stdout and stderr to /dev/null should mail you the output anyway.

Last edited by eschwartz; 04-07-2014 at 06:14 PM.
eschwartz is online now   Reply With Quote
Old 04-07-2014, 06:01 PM   #4
aleyx
Groupie
aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.aleyx can self-interpret dreams as they happen.
 
Posts: 193
Karma: 20386
Join Date: Sep 2010
Location: France
Device: Cybook Orizon
That's... a good point, actually.
aleyx is offline   Reply With Quote
Old 05-11-2014, 10:04 AM   #5
R71986
Member
R71986 began at the beginning.
 
Posts: 12
Karma: 10
Join Date: May 2014
Device: None
In order to automate it have I understood the cron setup correctly?
sudo ln -s /usr/bin/calibre-upgrade.sh /etc/cron.weekly/calibre-upgrade

(note i have removed the sh from the object link)

I am not clear when cron.weekly will run. Is that a system operation not controlled by a cron script?
R71986 is offline   Reply With Quote
Old 05-11-2014, 12:00 PM   #6
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Quote:
Originally Posted by R71986 View Post
In order to automate it have I understood the cron setup correctly?
sudo ln -s /usr/bin/calibre-upgrade.sh /etc/cron.weekly/calibre-upgrade

(note i have removed the sh from the object link)

I am not clear when cron.weekly will run. Is that a system operation not controlled by a cron script?
That uses anacron instead of cron, and should do basically the same thing. But you will have to edit "/etc/anacrontab" or "/etc/cron.d/anacron" (not sure which, since I just stuck with crontab and have no idea how anacron works) I think, to change anacron's schedule to run weekly jobs on Friday, or the job won't run until anacron's default time. I think it defaults to running weekly jobs on Sunday, so you'd be two days behind.

The purpose of anacron is for running jobs on startup if the jobs were missed because the computer was off. You may not need that.
I'd just put the command to run calibre-upgrade as a crontab job, like in the instructions. It's simpler/easier to control.

Last edited by eschwartz; 05-11-2014 at 12:02 PM.
eschwartz is online now   Reply With Quote
Old 05-11-2014, 09:23 PM   #7
BetterRed
null operator
BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.
 
Posts: 3,996
Karma: 2925589
Join Date: Mar 2012
Location: NSW Australia
Device: none
Quote:
Originally Posted by eschwartz View Post
I just stuck with crontab and have no idea how anacron works
Dare I suggest anachronistically, or anarchically

BR
BetterRed is offline   Reply With Quote
Old 05-11-2014, 09:38 PM   #8
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Quote:
Originally Posted by BetterRed View Post
Dare I suggest anachronistically, or anarchically

BR
You mean it is secretly controlled by Something Else Entirely, for instance, perhaps the hidden Phase Of The Moon Generator?
eschwartz is online now   Reply With Quote
Old 05-11-2014, 09:53 PM   #9
BetterRed
null operator
BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.BetterRed ought to be getting tired of karma fortunes by now.
 
Posts: 3,996
Karma: 2925589
Join Date: Mar 2012
Location: NSW Australia
Device: none
No... by the Ghosts of Godwin and Early Burke
BetterRed is offline   Reply With Quote
Old 07-30-2014, 02:53 AM   #10
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
I have created a github repository here: https://github.com/eli-schwartz/calibre-installer which contains an updated calibre-upgrade.sh as well as a script à la calibre's installer, which allows for a one-liner installation of the upgrade script. (Was that statement confusing enough? )

Run the following command in a terminal:

Code:
sudo -v && wget -nv -O- https://github.com/eli-schwartz/calibre-installer/raw/master/calibre-installer.sh | sudo sh -
It will:
  1. Download calibre-upgrade.sh to /usr/bin/calibre-upgrade.sh
  2. chmod it so it is executable.
  3. Add the cron job to root's crontab. (If cron is not installed*, this step will fail and report that to you.)

If anyone has any improvement suggestions, I'd be delighted to hear them.

* Because on my system it isn't -- who knew? Apparently, systemd is the wave of the future, and Arch Linux wants you to use systemd timers instead of crontabs. When I get around to it (or rather, figure out how they work ), I may write one of these timers. Meanwhile, if you are on Arch too, you can manually install a cron daemon or write your own stinking timer. (If anyone does, please share. </beg> )

Last edited by eschwartz; 07-30-2014 at 09:35 AM.
eschwartz is online now   Reply With Quote
Old 07-30-2014, 03:01 AM   #11
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Things the new script fixes:
  • running "calibre --shutdown-running-calibre" as root doesn't seem particularly useful, unless you happen to be running calibre as root. So now it sudo's to each logged-in user to shutdown.
  • Makes sure you run as root.
  • Prettier messages when calibre is not yet installed. Instead of getting a lot of "bash: ****: command not found".
eschwartz is online now   Reply With Quote
Old 07-30-2014, 03:14 AM   #12
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 26,438
Karma: 5383257
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
@eschwartz: pacman -S cronie
kovidgoyal is offline   Reply With Quote
Old 07-30-2014, 03:17 AM   #13
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Quote:
Originally Posted by kovidgoyal View Post
@eschwartz: pacman -S cronie
Of course I did this. (Weeks ago.) I even finished editing both that post and the main one, and suggested doing this, before finally noticing your post.

I had to do a bunch of edits, because I never get these right the first time around.
eschwartz is online now   Reply With Quote
Old 09-23-2014, 09:50 AM   #14
Lofwyr23
Enthusiast
Lofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameterLofwyr23 can solve quadratic equations while standing on his or her head reciting poetry in iambic pentameter
 
Posts: 48
Karma: 12662
Join Date: Sep 2013
Device: Kobo Glo,Nexus 4, Samsung GTab 3 GT-P3200
So, after running this "in production" for a few weeks, I must say, it's a great little thing.

I can only say "Thank you!" for this piece of code. Aside from a small hiccup when 2.0 came around, it ran like a mo...... from his father....
Lofwyr23 is offline   Reply With Quote
Old 09-23-2014, 12:13 PM   #15
eschwartz
Irrational Optimist
eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.eschwartz ought to be getting tired of karma fortunes by now.
 
eschwartz's Avatar
 
Posts: 8,376
Karma: 15078359
Join Date: Nov 2012
Location: The Beaten Path, USA, Roundworld, This Side of Infinity
Device: Kindle Touch fw5.3.7 (Wifi only)
Quote:
Originally Posted by Lofwyr23 View Post
So, after running this "in production" for a few weeks, I must say, it's a great little thing.

I can only say "Thank you!" for this piece of code. Aside from a small hiccup when 2.0 came around, it ran like a mo...... from his father....
Awesome! It was a pleasure.
(If only my foray into duplicating this with Windows batch+powershell was nearly as fulfilling. But no, I can't even find a reliable way to download a freaking file. Forget about pogrammatically elevating to admin.)

As a matter of pure curiosity, what kind of hiccup? I like perfection and this sounds like it isn't.
eschwartz is online now   Reply With Quote
Reply

Tags
autoupdate, calibre, linux

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Fully automatic Calibre autoupate solution (Windows) Tscherno Related Tools 15 01-02-2014 01:26 AM
Solution: Calibre AutoUpdater [Auto-Updater] megamaniac Calibre 6 08-02-2013 10:47 PM
Linux installer question opitzs Calibre 2 11-09-2011 08:20 AM
Either a userbug or a problem with the generic Linux binary installer. Ingrid Calibre 11 07-16-2008 04:26 AM


All times are GMT -4. The time now is 09:11 PM.


MobileRead.com is a privately owned, operated and funded community.