UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE...
Transcript of UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE...
![Page 1: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/1.jpg)
UNDERCOVER CODESupporting PHP With Non-Web Tools
Sean Coates(for ConFoo 2010, Montréal)
![Page 2: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/2.jpg)
WHAT WE’LL LEARN TODAY
•Input/Output, Pipes, Redirection•Using Cron•Processing mail•Workers•Creating dæmons
•Intentionally top-heavy
![Page 3: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/3.jpg)
UNIX PHILOSOPHY
This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.
“
”–Doug McIlroy Creator of the Unix pipe
![Page 4: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/4.jpg)
UNIX PHILOSOPHY
Write programs that do one thing and do it well.
“
”–Doug McIlroy Creator of the Unix pipe
![Page 5: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/5.jpg)
UNIX PHILOSOPHY
Write programs to work together.
“
”–Doug McIlroy Creator of the Unix pipe
![Page 6: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/6.jpg)
UNIX PHILOSOPHY
Write programs to handle text streams, because that is a universal interface.
“
”–Doug McIlroy Creator of the Unix pipe
![Page 7: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/7.jpg)
UNIX PHILOSOPHY
Write programs to handle text streams, because that is a universal interface.
“
”–Doug McIlroy Creator of the Unix pipe
*
![Page 8: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/8.jpg)
*ASIDE: TEXT IS A
UNIVERSAL INTERFACE•Theoretical•From A Quarter Century of Unix (1994) (I think)•Read: before most people cared about Unicode•Unicode makes this less true
![Page 9: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/9.jpg)
*ASIDE: TEXT IS A
UNIVERSAL INTERFACE•Theoretical•From A Quarter Century of Unix (1994)•Read: before most people cared about Unicode•Unicode makes this less true•…and by that, I mean painful
![Page 10: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/10.jpg)
*ASIDE: TEXT IS A
UNIVERSAL INTERFACE•Theoretical•From A Quarter Century of Unix (1994)•Read: before most people cared about Unicode•Unicode makes this less true•…and by that, I mean painful•…and by that, I mean torture
Photo: http://www.flickr.com/photos/guydonges/2826698176/
![Page 11: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/11.jpg)
*ASIDE: TEXT IS A
UNIVERSAL INTERFACE•Theoretical•From A Quarter Century of Unix (1994)•Read: before most people cared about Unicode•Unicode makes this less true•…and by that, I mean painful•…and by that, I mean torture•Rant: http://seancoates.com/utf-wtf
Photo: http://www.flickr.com/photos/guydonges/2826698176/
![Page 12: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/12.jpg)
*ASIDE: TEXT IS A
UNIVERSAL INTERFACE
Photo: http://www.flickr.com/photos/guydonges/2826698176/
$ echo -n "25c" | wc -c 3
$ echo -n "25¢" | wc -c 4
$ echo -n “25c” | wc -c-bash: $: command not found 0
![Page 13: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/13.jpg)
*TEXT IS A
UNIVERSAL INTERFACE
Let’s just assume this is true.
![Page 14: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/14.jpg)
WRITE PROGRAMS THAT DO ONE THING AND DO IT WELL.•Many Unixy utilities work like this:•wc - word count (character and line count, too)•sort - sorts input by line•uniq - remove duplicate lines, making output unique•tr - character translate•sed - stream editor•Unitaskers
![Page 15: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/15.jpg)
WRITE PROGRAMS TO WORK TOGETHER.
•Simple tools = large toolbox•Unitaskers are only bad in the physical world•Unlimited toolbox size•(Busybox)
![Page 16: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/16.jpg)
WRITE PROGRAMS TO WORK TOGETHER.
$ cat sounds.txtoinkmoooink
$ cat sounds.txt | uniqoinkmoooink
$ cat sounds.txt | sort | uniqmoo oink
![Page 17: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/17.jpg)
WRITE PROGRAMS TO HANDLE TEXT STREAMS.•Power and simplicity for free•Great for simple data•Harder for highly structured data•Chaining is wonderfully powerful, and iterative
![Page 18: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/18.jpg)
$ cat /usr/share/dict/words | wc -l 234936
WRITE PROGRAMS TO HANDLE TEXT STREAMS.
$ cat /usr/share/dict/words | grep '^f' | wc -l 6384
$ cat /usr/share/dict/words | grep '^f' | egrep '([aeiou])\1' | wc -l 461
![Page 19: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/19.jpg)
TEXT STREAMS
•“Standard” file descriptors•Input (#1)•Output (#1)•Error (#2)
•fopen() returns a file descriptor•Redirection•Pipelining
![Page 20: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/20.jpg)
$ echo -n "foo"
TEXT STREAMS:STANDARD OUTPUT
Input Program Output
(null) echo -n "foo" foo
ConsoleConsoleConsole
![Page 21: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/21.jpg)
$ php<?phpecho "woof\n";
woof
TEXT STREAMS:STANDARD INPUT
Input Program Output
<?phpecho "woof\n";
php woof
ctrl-d
Keyboard
![Page 22: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/22.jpg)
$ echo -n "foo" > bar.txt
REDIRECTSTANDARD OUTPUT
Input Program Output
(null) echo -n "foo" foo
bar.txtbar.txtbar.txt
$ cat bar.txtfoo
![Page 23: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/23.jpg)
$ cat sounds.php<?phpecho "oink\n";echo "moo\n";
$ php sounds.phpoinkmoo
$ echo '<?php echo "woof\n";' | phpwoof
REDIRECTSTANDARD INPUT
![Page 24: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/24.jpg)
$ php < sounds.phpoinkmoo
REDIRECTSTANDARD INPUT
Input Program Output
<?phpecho "oink\n";echo "moo\n";
phpoinkmoo
ConsoleConsoleConsole
$ cat sounds.php | php
![Page 25: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/25.jpg)
$ echo -n "foo" | wc -c 3
PIPELINING
![Page 26: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/26.jpg)
$ echo -n "foo" | wc -c 3
PIPELINING
Input Program Output
(null) echo -n "foo" foo
PipePipePipe
foo wc -c 3
ConsoleConsoleConsole
![Page 27: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/27.jpg)
$ grep moo sounds.txt moo
TEXT STREAMS:STANDARD ERROR
Input Program Output
(null) grep moo sounds.txt moo
$ cat sounds.txtoinkmoooink
![Page 28: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/28.jpg)
$ grep moo nofile.txt grep: nofile.txt: No such file or directory
TEXT STREAMS:STANDARD ERROR
Input Program Output Error
(null) grep moo sounds.txt (null) grep: nofile.txt: No such file or directory
![Page 29: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/29.jpg)
$ curl example.com<HTML><HEAD> (etc.)
$ curl example.com | grep TITLE <TITLE>Example Web Page</TITLE>
TEXT STREAMS:STANDARD ERROR
![Page 30: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/30.jpg)
$ curl fake.example.comcurl: (6) Couldn't resolve host 'fake.example.com'
$ curl fake.example.com | grep TITLE
curl: (6) Couldn't resolve host 'fake.example.com'
TEXT STREAMS:STANDARD ERROR
![Page 31: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/31.jpg)
$ curl fake.example.com | grep TITLEcurl: (6) Couldn't resolve host 'fake.example.com'
TEXT STREAMS:STANDARD ERROR
Input Program Output Error
(null) curl fake.example.com (null) curl: (6) Couldn't resolve host 'fake.example.com'
Pipe Pipe Pipe Console
(null) grep TITLE (null) (null)
ConsoleConsoleConsoleConsole
![Page 32: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/32.jpg)
TEXT STREAMS(MORE ADVANCED)
•tee•curl example.com | tee example.txt | grep TITLE•redirect stderr•curl fake.example.com 2 > error.log•combine streams•curl fake.example.com 2>&1 > combined.log•(assumes bash)
![Page 33: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/33.jpg)
WHY?
•Much better languages to do this•Go to a Python talk
•Reasons to use PHP:•existing code•existing talent•== low(er) development time, faster debugging
![Page 34: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/34.jpg)
CRON
•Time-based job scheduler (Unixy)•Schedule is called a crontab•Each user can have a crontab•System has a crontab
![Page 35: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/35.jpg)
$ crontab [email protected] * * * * php blog-hourly.php
CRON
CommandDay of WeekMonthDay of MonthHourMinute
![Page 36: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/36.jpg)
* * * * *2 * * * *
*/5 * * * *0 */2 * * *
0 0 * * 1
15 20 9 2 *15,45 * * * *
CRON(SCHEDULING)
•Every minute•On the 2nd minute of every hour
•Every 5 minutes•Top of every 2nd Hour
•Every Monday at midnight
•Feb 9th at 8:15PM•The 15th and 45th minute of every hour
![Page 37: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/37.jpg)
CRON(PATHS & PERMISSIONS)
• Runs as the crontab’s owner *• (www-data, nobody, www, etc.)• Caution: web root permissions
• Paths can be tricky• specify an explicit PATH• use explicit paths in commands
![Page 38: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/38.jpg)
CRON(EDITING)
$ crontab -e(editor opens, save, exit)crontab: installing new crontab
• Use the crontab -e mechanism• System launched $EDITOR to edit the file
![Page 39: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/39.jpg)
CRON(SYSTEM)
• Often: /etc/crontab• Sixth schedule field: user ( m h dom m dow user cmd )• Better for centralizing (e.g. for deployment and version
control)• /etc/cron.d/* (daily, monthly, weekly, etc.)
• Caution: avoid time-slam
![Page 40: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/40.jpg)
•Mail = headers + body•Body can contain many “parts” (as in MIME/multipart)•Multipurpose Internet Mail Extensions•MIME = much too complicated to discuss here•Sending mail is hard; so is receiving it•Focus on simple mail•Or let someone else do the hard parts
![Page 41: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/41.jpg)
•At its core, mail looks a bit like HTTP:•headers•key: value•blank line•body
![Page 42: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/42.jpg)
MAILReturn-Path: <[email protected]>X-Original-To: [email protected]: [email protected]: from localhost (localhost [127.0.0.1]) by iconoclast.caedmon.net (Postfix) with ESMTP id 2D9CC78406F for <[email protected]>; Mon, 8 Mar 2010 14:58:20 -0500 (EST)X-Virus-Scanned: Debian amavisd-new at iconoclast.caedmon.netReceived: from iconoclast.caedmon.net ([127.0.0.1]) by localhost (iconoclast.caedmon.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Hjx8HGZQ1RAY for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST)Received: from [192.168.145.200] (unknown [24.2.2.2]) by iconoclast.caedmon.net (Postfix) with ESMTPSA id BAB3A78405F for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST)From: Sean Coates <[email protected]>Content-Type: text/plain; charset=us-asciiContent-Transfer-Encoding: 7bitSubject: Test SubjectDate: Mon, 8 Mar 2010 14:55:50 -0500Message-Id: <[email protected]>To: Sean Coates <[email protected]>Mime-Version: 1.0 (Apple Message framework v1077)X-Mailer: Apple Mail (2.1077)
Test Body
![Page 43: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/43.jpg)
MAIL#!/usr/bin/env php<?php$mail = stream_get_contents(STDIN);// transpose possible CRLF:$mail = str_replace(array("\r\n", "\r"), "\n", $mail);list($tmpheaders, $body) = explode("\n\n", $mail, 2);
$tmpheaders = preg_split( "/\n(\S+):\s+/", "\n" . $tmpheaders, -1, PREG_SPLIT_DELIM_CAPTURE);
$count = count($tmpheaders);$headers = array();for ($i=1; $i<$count; $i+=2) { $k = $tmpheaders[$i]; $v = $tmpheaders[$i+1]; if (isset($headers[$k])) { $headers[$k] = (array)$headers[$k]; $headers[$k][] = $v; } else { $headers[$k] = $v; }}
var_dump($headers);
![Page 44: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/44.jpg)
MAILarray(14) { ["Return-Path"]=> string(21) "<[email protected]>" ["X-Original-To"]=> string(19) "[email protected]" ["Delivered-To"]=> string(16) "[email protected]" ["Received"]=> array(3) { [0]=> string(167) "from localhost (localhost [127.0.0.1]) by iconoclast.caedmon.net (Postfix) with ESMTP id 2D9CC78406F for <[email protected]>; Mon, 8 Mar 2010 14:58:20 -0500 (EST)" [1]=> string(212) "from iconoclast.caedmon.net ([127.0.0.1]) by localhost (iconoclast.caedmon.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Hjx8HGZQ1RAY for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST)" [2]=> string(174) "from [192.168.145.200] (unknown [24.2.2.2]) by iconoclast.caedmon.net (Postfix) with ESMTPSA id BAB3A78405F for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST)" }
(1/2 Continued…)
![Page 45: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/45.jpg)
["X-Virus-Scanned"]=> string(44) "Debian amavisd-new at iconoclast.caedmon.net" ["From"]=> string(33) "Sean Coates <[email protected]>" ["Content-Type"]=> string(28) "text/plain; charset=us-ascii" ["Content-Transfer-Encoding"]=> string(4) "7bit" ["Subject"]=> string(12) "Test Subject" ["Date"]=> string(30) "Mon, 8 Mar 2010 14:55:50 -0500" ["Message-Id"]=> string(53) "<[email protected]>" ["To"]=> string(33) "Sean Coates <[email protected]>" ["Mime-Version"]=> string(35) "1.0 (Apple Message framework v1077)" ["X-Mailer"]=> string(19) "Apple Mail (2.1077)"}
(…2/2)
![Page 46: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/46.jpg)
#!/usr/bin/env php<?php$mail = stream_get_contents(STDIN);// transpose possible CRLF:$mail = str_replace(array("\r\n", "\r"), "\n", $mail);list($tmpheaders, $body) = explode("\n\n", $mail, 2);
$tmpheaders = preg_split( "/\n(\S+):\s+/", "\n" . $tmpheaders, -1, PREG_SPLIT_DELIM_CAPTURE);// continued...
![Page 47: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/47.jpg)
// continued...$count = count($tmpheaders);$headers = array();for ($i=1; $i<$count; $i+=2) { $k = $tmpheaders[$i]; $v = $tmpheaders[$i+1]; if (isset($headers[$k])) { $headers[$k] = (array)$headers[$k]; $headers[$k][] = $v; } else { $headers[$k] = $v; }}
![Page 48: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/48.jpg)
print_r($headers[$argv[1]]);
$ cat test.mail | ./simplemail.php SubjectTest Subject
$ cat test.mail | ./simplemail.php ReceivedArray( [0] => from localhost (localhost [127.0.0.1]) by iconoclast.caedmon.net (Postfix) with ESMTP id 2D9CC78406F for <[email protected]>; Mon, 8 Mar 2010 14:58:20 -0500 (EST) [1] => from iconoclast.caedmon.net ([127.0.0.1]) by localhost (iconoclast.caedmon.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Hjx8HGZQ1RAY for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST) [2] => from [192.168.145.200] (unknown [24.2.2.2]) by iconoclast.caedmon.net (Postfix) with ESMTPSA id BAB3A78405F for <[email protected]>; Mon, 8 Mar 2010 14:58:14 -0500 (EST))
![Page 49: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/49.jpg)
•Easier to just let King Wez handle it•Mailparse•http://pecl.php.net/mailparse•Also handles MIME
![Page 50: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/50.jpg)
MAIL#!/usr/bin/env php<?php$mm = mailparse_msg_create();mailparse_msg_parse($mm, stream_get_contents(STDIN));$msg = mailparse_msg_get_part($mm, 1);$info = mailparse_msg_get_part_data($msg);
// print_r($info);
print_r($info['headers'][$argv[1]]);
$ cat test.mail | ./mailparse.php subjectTest Subject
![Page 51: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/51.jpg)
ALIAS
•How is this useful?(habari)$ cat /etc/aliases | grep securitysecurity: |"/var/spool/postfix/bin/security"
•Beware:•chroots•allowed bin directories•newaliases•See your MTA’s docs on how to make this work.
![Page 52: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/52.jpg)
GEARMAN
•Offload heavy processes from web machines•Synchronous or Asynchronous•Examples•Mail queueing•Image resize•Very configurable•(We’ll barely scratch the surface)
![Page 53: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/53.jpg)
GEARMAN
gearmand
web server
worker
worker worker
worker
web server
web server
![Page 54: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/54.jpg)
GEARMAN
gearmand
web server
worker
worker worker
worker
![Page 55: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/55.jpg)
GEARMAN
gearmand
web server
worker
web server
web server
![Page 56: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/56.jpg)
GEARMAN
gearmand
web server
worker
![Page 57: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/57.jpg)
GEARMAN
gearmand
web server
worker
(same hardware)
![Page 58: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/58.jpg)
GEARMAN
gearmand
web server
worker
(same hardware)
![Page 59: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/59.jpg)
GEARMANWORKER
#!/usr/bin/env php<?phprequire 'complicated_app/bootstrap.php';
$worker = new GearmanWorker();$worker->addServer('127.0.0.1');$worker->addFunction("send_invoice_mail", "send_mail");
function send_mail($to, $params) { return ComplicatedApp::send_invoice_email( $to, $params['amount'], $params['due'] );}
![Page 60: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/60.jpg)
GEARMANCLIENT
// ...
$client = new GearmanClient();$client->addServer('127.0.0.1');
$task = $client->addTaskBackground( 'send_invoice_mail', $params);
![Page 61: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/61.jpg)
DÆMONS
•Long-running processes•Cron is a dæmon•Often socket-listeners
•Screen•Supervisord•(X)Inetd, Launchctl
![Page 62: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/62.jpg)
DÆMONSSCREEN
•Terminal multiplexer (multiple terminals from one console)•Screens persist between logins (doesn’t close on
logout)•Useful for dæmons•A bit hackish
![Page 63: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/63.jpg)
DÆMONSSCREEN
(sarcasmic)$ ssh adnagaporp.local(adnagaporp)$ screen -S demo
(adnagaporp)$ php -r '$i=0; while(true) { echo ++$i . "\n"; sleep(2); }'12345
ctrl-a d
(adnagaporp)$ exit(sarcasmic)$
![Page 64: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/64.jpg)
DÆMONSSCREEN
(sarcasmic)$ ssh adnagaporp.local(adnagaporp)$ screen -r demo
(adnagaporp)$ php -r '$i=0; while(true) { echo ++$i . "\n"; sleep(2); }'1234567891011…
![Page 65: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/65.jpg)
DÆMONSSCREEN
•A bit crude•have to manually log in•no crash protection / respawn•no implicit logging•Doesn’t always play well with sudo or su•Does allow two terminals to control one screen•Very simple and easy to use
•(see also tmux http://tmux.sourceforge.net/ )
![Page 66: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/66.jpg)
DÆMONSSUPERVISORD
•Runs dæmons within a subsystem•Handles:•crashes•concurrency•logging•Friendly control interface
![Page 67: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/67.jpg)
DÆMONSSUPERVISORD
[program:phergie-brewbot]command=/usr/local/bin/php Bot.phpnumprocs=1directory=/home/phergie/Phergie-brewbotstdout_logfile=/home/phergie/Phergie-brewbot/phergie_supervisor.logautostart=trueautorestart=trueuser=phergie
phergie-brewbot.ini:
![Page 68: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/68.jpg)
DÆMONSSUPERVISORD
![Page 69: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/69.jpg)
DÆMONSINIT.D
•Debian systems (Ubuntu, too), maybe others•/etc/init.d/*•/etc/rc*.d•update-rc.d•Use The Debian Way™ when on Debian
![Page 70: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/70.jpg)
DÆMONSLAUNCHCTL
•Mac only•Similar to inetd/xinetd•Avoid writing socket code•Extremely simple to network
![Page 71: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/71.jpg)
DÆMONSLAUNCHCTL
#!/usr/bin/env php<?phpecho date('r') . "\n";
![Page 72: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/72.jpg)
DÆMONSLAUNCHCTL
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>localhost.demodaemon</string> <key>ProgramArguments</key> <array> <string>/path/to/demodaemon.php</string> </array> <key>inetdCompatibility</key> <dict> <key>Wait</key> <false/> </dict> <key>Sockets</key> <dict> <key>Listeners</key> <dict> <key>SockServiceName</key> <string>60001</string> <key>SockNodeName</key> <string>127.0.0.1</string> </dict> </dict></dict></plist> ~/Library/LaunchAgents/demodaemon.plist
![Page 73: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/73.jpg)
DÆMONSLAUNCHCTL
$ launchctl load ~/Library/LaunchAgents/demodaemon.plist
$ telnet localhost 60001Mon, 08 Mar 2010 19:50:46 -0500$
![Page 74: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/74.jpg)
OTHER NON-CONSOLE TRICKS / TOOLS
•Subversion hook to lint (syntax check) code•IRC bot (see http://phergie.org/)•Twitter bot / interface (see @beerscore)
![Page 75: UNDERCOVER CODE - Sean Coatesfiles.seancoates.com/sean-coates_undercover-php.pdf · UNDERCOVER CODE Supporting PHP With Non-Web Tools Sean Coates (for ConFoo 2010, Montréal)](https://reader036.fdocuments.us/reader036/viewer/2022071210/6021f31caea2186bb5119cb4/html5/thumbnails/75.jpg)
QUESTIONS?
•Always available to answer questions and to entertain strange ideas (-:•[email protected]•@coates•http://seancoates.com/
•Please comment: http://joind.in/1296•…and see my talk on Friday: Interfacing with Twitter
•Also: beer.