1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
---|
2 | <html xmlns="http://www.w3.org/1999/xhtml"> |
---|
3 | <head> |
---|
4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
---|
5 | <meta http-equiv="Content-Style-Type" content="text/css" /> |
---|
6 | <meta name="generator" content="pandoc" /> |
---|
7 | <meta name="author" content="Brian Candler, Network Startup Resource Center" /> |
---|
8 | <title>Install standalone maddash</title> |
---|
9 | <style type="text/css">code{white-space: pre;}</style> |
---|
10 | <link href="data:text/css,%2F%2A%0A%20%20%20%20Buttondown%0A%20%20%20%20A%20Markdown%2FMultiMarkdown%2FPandoc%20HTML%20output%20CSS%20stylesheet%0A%20%20%20%20Author%3A%20Ryan%20Gray%0A%20%20%20%20Date%3A%2015%20Feb%202011%0A%20%20%20%20Revised%3A%2021%20Feb%202012%0A%20%20%20%0A%20%20%20%20General%20style%20is%20clean%2C%20with%20minimal%20re%2Ddefinition%20of%20the%20defaults%20or%20%0A%20%20%20%20overrides%20of%20user%20font%20settings%2E%20The%20body%20text%20and%20header%20styles%20are%20%0A%20%20%20%20left%20alone%20except%20title%2C%20author%20and%20date%20classes%20are%20centered%2E%20A%20Pandoc%20TOC%20%0A%20%20%20%20is%20not%20printed%2C%20URLs%20are%20printed%20after%20hyperlinks%20in%20parentheses%2E%20%0A%20%20%20%20Block%20quotes%20are%20italicized%2E%20Tables%20are%20lightly%20styled%20with%20lines%20above%20%0A%20%20%20%20and%20below%20the%20table%20and%20below%20the%20header%20with%20a%20boldface%20header%2E%20Code%20%0A%20%20%20%20blocks%20are%20line%20wrapped%2E%20%0A%20%0A%20%20%20%20All%20elements%20that%20Pandoc%20and%20MultiMarkdown%20use%20should%20be%20listed%20here%2C%20even%20%0A%20%20%20%20if%20the%20style%20is%20empty%20so%20you%20can%20easily%20add%20styling%20to%20anything%2E%0A%20%20%20%20%0A%20%20%20%20There%20are%20some%20elements%20in%20here%20for%20HTML5%20output%20of%20Pandoc%2C%20but%20I%20have%20not%20%0A%20%20%20%20gotten%20around%20to%20testing%20that%20yet%2E%0A%2A%2F%0A%20%0A%2F%2A%20NOTES%3A%0A%20%0A%20%20%20%20Stuff%20tried%20and%20failed%3A%0A%20%20%20%20%0A%20%20%20%20It%20seems%20that%20specifying%20font%2Dfamily%3Aserif%20in%20Safari%20will%20always%20use%20%0A%20%20%20%20Times%20New%20Roman%20rather%20than%20the%20user%27s%20preferences%20setting%2E%0A%20%20%20%20%0A%20%20%20%20Making%20the%20font%20size%20different%20or%20a%20fixed%20value%20for%20print%20in%20case%20the%20screen%20%0A%20%20%20%20font%20size%20is%20making%20the%20print%20font%20too%20big%3A%20Making%20font%2Dsize%20different%20for%20%0A%20%20%20%20print%20than%20for%20screen%20causes%20horizontal%20lines%20to%20disappear%20in%20math%20when%20using%20%0A%20%20%20%20MathJax%20under%20Safari%2E%0A%2A%2F%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Front%20Matter%20%2D%2D%2D%2D%20%2A%2F%0A%20%0A%2F%2A%20Pandoc%20header%20DIV%2E%20Contains%20%2Etitle%2C%20%2Eauthor%20and%20%2Edate%2E%20Comes%20before%20div%23TOC%2E%20%0A%20%20%20Only%20appears%20if%20one%20of%20those%20three%20are%20in%20the%20document%2E%0A%2A%2F%0A%20%0Adiv%23header%2C%20header%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Put%20border%20on%20bottom%2E%20Separates%20it%20from%20TOC%20or%20body%20that%20comes%20after%20it%2E%20%2A%2F%0A%20%20%20%20border%2Dbottom%3A%201px%20solid%20%23aaa%3B%0A%20%20%20%20margin%2Dbottom%3A%200%2E5em%3B%0A%20%20%20%20%7D%0A%20%0A%2Etitle%20%2F%2A%20Pandoc%20title%20header%20%28h1%2Etitle%29%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20text%2Dalign%3A%20center%3B%0A%20%20%20%20%7D%0A%20%0A%2Eauthor%2C%20%2Edate%20%2F%2A%20Pandoc%20author%28s%29%20and%20date%20headers%20%28h2%2Eauthor%20and%20h3%2Edate%29%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20text%2Dalign%3A%20center%3B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20Pandoc%20table%20of%20contents%20DIV%20when%20using%20the%20%2D%2Dtoc%20option%2E%0A%20%20%20NOTE%3A%20this%20doesn%27t%20support%20Pandoc%27s%20%2D%2Did%2Dprefix%20option%20for%20%23TOC%20and%20%23header%2E%20%0A%20%20%20Probably%20would%20need%20to%20use%20div%5Bid%24%3D%27TOC%27%5D%20and%20div%5Bid%24%3D%27header%27%5D%20as%20selectors%2E%0A%2A%2F%0A%20%0Adiv%23TOC%2C%20nav%23TOC%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Put%20border%20on%20bottom%20to%20separate%20it%20from%20body%2E%20%2A%2F%0A%20%20%20%20border%2Dbottom%3A%201px%20solid%20%23aaa%3B%0A%20%20%20%20margin%2Dbottom%3A%200%2E5em%3B%0A%20%20%20%20%7D%0A%20%0A%40media%20print%0A%20%20%20%20%7B%0A%20%20%20%20div%23TOC%2C%20nav%23TOC%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20Don%27t%20display%20TOC%20in%20print%20%2A%2F%0A%20%20%20%20%20%20%20%20display%3A%20none%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Headers%20and%20sections%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Ah1%2C%20h2%2C%20h3%2C%20h4%2C%20h5%2C%20h6%0A%7B%0A%20%20%20%20font%2Dfamily%3A%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20%22Liberation%20Sans%22%2C%20Calibri%2C%20Arial%2C%20sans%2Dserif%3B%20%2F%2A%20Sans%2Dserif%20headers%20%2A%2F%0A%20%0A%20%20%20%20%2F%2A%20font%2Dfamily%3A%20%22Liberation%20Serif%22%2C%20%22Georgia%22%2C%20%22Times%20New%20Roman%22%2C%20serif%3B%20%2F%2A%20Serif%20headers%20%2A%2F%0A%20%0A%20%20%20%20page%2Dbreak%2Dafter%3A%20avoid%3B%20%2F%2A%20Firefox%2C%20Chrome%2C%20and%20Safari%20do%20not%20support%20the%20property%20value%20%22avoid%22%20%2A%2F%0A%7D%0A%20%0A%2F%2A%20Pandoc%20with%20%2D%2Dsection%2Ddivs%20option%20%2A%2F%0A%20%0Adiv%20div%2C%20section%20section%20%2F%2A%20Nested%20sections%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20margin%2Dleft%3A%202em%3B%20%2F%2A%20This%20will%20increasingly%20indent%20nested%20header%20sections%20%2A%2F%0A%20%20%20%20%7D%0A%20%0Ap%20%7B%7D%0A%20%0Ablockquote%0A%20%20%20%20%7B%20%0A%20%20%20%20font%2Dstyle%3A%20italic%3B%0A%20%20%20%20%7D%0A%20%0Ali%20%2F%2A%20All%20list%20items%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Ali%20%3E%20p%20%2F%2A%20Loosely%20spaced%20list%20item%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20margin%2Dtop%3A%201em%3B%20%2F%2A%20IE%3A%20lack%20of%20space%20above%20a%20%3Cli%3E%20when%20the%20item%20is%20inside%20a%20%3Cp%3E%20%2A%2F%0A%20%20%20%20%7D%0A%20%0Aul%20%2F%2A%20Whole%20unordered%20list%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Aul%20li%20%2F%2A%20Unordered%20list%20item%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Aol%20%2F%2A%20Whole%20ordered%20list%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Aol%20li%20%2F%2A%20Ordered%20list%20item%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Ahr%20%7B%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Some%20span%20elements%20%2D%2D%2D%20%2A%2F%0A%20%0Asub%20%2F%2A%20Subscripts%2E%20Pandoc%3A%20H%7E2%7EO%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Asup%20%2F%2A%20Superscripts%2E%20Pandoc%3A%20The%202%5End%5E%20try%2E%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20%0Aem%20%2F%2A%20Emphasis%2E%20Markdown%3A%20%2Aemphasis%2A%20or%20%5Femphasis%5F%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20%0Aem%20%3E%20em%20%2F%2A%20Emphasis%20within%20emphasis%3A%20%2AThis%20is%20all%20%2Aemphasized%2A%20except%20that%2A%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20font%2Dstyle%3A%20normal%3B%0A%20%20%20%20%7D%0A%20%0Astrong%20%2F%2A%20Markdown%20%2A%2Astrong%2A%2A%20or%20%5F%5Fstrong%5F%5F%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Links%20%28anchors%29%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Aa%20%2F%2A%20All%20links%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Keep%20links%20clean%2E%20On%20screen%2C%20they%20are%20colored%3B%20in%20print%2C%20they%20do%20nothing%20anyway%2E%20%2A%2F%0A%20%20%20%20text%2Ddecoration%3A%20none%3B%0A%20%20%20%20%7D%0A%20%0A%40media%20screen%0A%20%20%20%20%7B%0A%20%20%20%20a%3Ahover%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20On%20hover%2C%20we%20indicate%20a%20bit%20more%20that%20it%20is%20a%20link%2E%20%2A%2F%0A%20%20%20%20%20%20%20%20text%2Ddecoration%3A%20underline%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%0A%40media%20print%0A%20%20%20%20%7B%0A%20%20%20%20a%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20In%20print%2C%20a%20colored%20link%20is%20useless%2C%20so%20un%2Dstyle%20it%2E%20%2A%2F%0A%20%20%20%20%20%20%20%20color%3A%20black%3B%0A%20%20%20%20%20%20%20%20background%3A%20transparent%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20a%5Bhref%5E%3D%22http%3A%2F%2F%22%5D%3Aafter%2C%20a%5Bhref%5E%3D%22https%3A%2F%2F%22%5D%3Aafter%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20However%2C%20links%20that%20go%20somewhere%20else%2C%20might%20be%20useful%20to%20the%20reader%2C%0A%20%20%20%20%20%20%20%20%20%20%20so%20for%20http%20and%20https%20links%2C%20print%20the%20URL%20after%20what%20was%20the%20link%20%0A%20%20%20%20%20%20%20%20%20%20%20text%20in%20parens%0A%20%20%20%20%20%20%20%20%2A%2F%0A%20%20%20%20%20%20%20%20content%3A%20%22%20%28%22%20attr%28href%29%20%22%29%20%22%3B%0A%20%20%20%20%20%20%20%20font%2Dsize%3A%2090%25%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Images%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Aimg%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Let%20it%20be%20inline%20left%2Fright%20where%20it%20wants%20to%20be%2C%20but%20verticality%20make%20%0A%20%20%20%20%20%20%20it%20in%20the%20middle%20to%20look%20nicer%2C%20but%20opinions%20differ%2C%20and%20if%20in%20a%20multi%2Dline%20%0A%20%20%20%20%20%20%20paragraph%2C%20it%20might%20not%20be%20so%20great%2E%20%0A%20%20%20%20%2A%2F%0A%20%20%20%20vertical%2Dalign%3A%20middle%3B%0A%20%20%20%20%7D%0A%20%0Adiv%2Efigure%20%2F%2A%20Pandoc%20figure%2Dstyle%20image%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Center%20the%20image%20and%20caption%20%2A%2F%0A%20%20%20%20margin%2Dleft%3A%20auto%3B%0A%20%20%20%20margin%2Dright%3A%20auto%3B%0A%20%20%20%20text%2Dalign%3A%20center%3B%0A%20%20%20%20font%2Dstyle%3A%20italic%3B%0A%20%20%20%20%7D%0A%20%0Ap%2Ecaption%20%2F%2A%20Pandoc%20figure%2Dstyle%20caption%20within%20div%2Efigure%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Inherits%20div%2Efigure%20props%20by%20default%20%2A%2F%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Code%20blocks%20and%20spans%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Apre%2C%20code%20%0A%20%20%20%20%7B%0A%20%20%20%20background%2Dcolor%3A%20%23fdf7ee%3B%0A%20%20%20%20%2F%2A%20BEGIN%20word%20wrap%20%2A%2F%0A%20%20%20%20%2F%2A%20Need%20all%20the%20following%20to%20word%20wrap%20instead%20of%20scroll%20box%20%2A%2F%0A%20%20%20%20%2F%2A%20This%20will%20override%20the%20overflow%3Aauto%20if%20present%20%2A%2F%0A%20%20%20%20white%2Dspace%3A%20pre%2Dwrap%3B%20%2F%2A%20css%2D3%20%2A%2F%0A%20%20%20%20white%2Dspace%3A%20%2Dmoz%2Dpre%2Dwrap%20%21important%3B%20%2F%2A%20Mozilla%2C%20since%201999%20%2A%2F%0A%20%20%20%20white%2Dspace%3A%20%2Dpre%2Dwrap%3B%20%2F%2A%20Opera%204%2D6%20%2A%2F%0A%20%20%20%20white%2Dspace%3A%20%2Do%2Dpre%2Dwrap%3B%20%2F%2A%20Opera%207%20%2A%2F%0A%20%20%20%20word%2Dwrap%3A%20break%2Dword%3B%20%2F%2A%20Internet%20Explorer%205%2E5%2B%20%2A%2F%0A%20%20%20%20%2F%2A%20END%20word%20wrap%20%2A%2F%0A%20%20%20%20%7D%0A%20%0Apre%20%2F%2A%20Code%20blocks%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Distinguish%20pre%20blocks%20from%20other%20text%20by%20more%20than%20the%20font%20with%20a%20background%20tint%2E%20%2A%2F%0A%20%20%20%20padding%3A%200%2E5em%3B%20%2F%2A%20Since%20we%20have%20a%20background%20color%20%2A%2F%0A%20%20%20%20border%2Dradius%3A%205px%3B%20%2F%2A%20Softens%20it%20%2A%2F%0A%20%20%20%20%2F%2A%20Give%20it%20a%20some%20definition%20%2A%2F%0A%20%20%20%20border%3A%201px%20solid%20%23aaa%3B%0A%20%20%20%20%2F%2A%20Set%20it%20off%20left%20and%20right%2C%20seems%20to%20look%20a%20bit%20nicer%20when%20we%20have%20a%20background%20%2A%2F%0A%20%20%20%20margin%2Dleft%3A%20%200%2E5em%3B%0A%20%20%20%20margin%2Dright%3A%200%2E5em%3B%0A%20%20%20%20%7D%0A%20%0A%40media%20screen%0A%20%20%20%20%7B%0A%20%20%20%20pre%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20On%20screen%2C%20use%20an%20auto%20scroll%20box%20for%20long%20lines%2C%20unless%20word%2Dwrap%20is%20enabled%20%2A%2F%0A%20%20%20%20%20%20%20%20white%2Dspace%3A%20pre%3B%0A%20%20%20%20%20%20%20%20overflow%3A%20auto%3B%0A%20%20%20%20%20%20%20%20%2F%2A%20Dotted%20looks%20better%20on%20screen%20and%20solid%20seems%20to%20print%20better%2E%20%2A%2F%0A%20%20%20%20%20%20%20%20border%3A%201px%20dotted%20%23777%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%0Acode%20%2F%2A%20All%20inline%20code%20spans%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Ap%20%3E%20code%2C%20li%20%3E%20code%20%2F%2A%20Code%20spans%20in%20paragraphs%20and%20tight%20lists%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Pad%20a%20little%20from%20adjacent%20text%20%2A%2F%0A%20%20%20%20padding%2Dleft%3A%20%202px%3B%0A%20%20%20%20padding%2Dright%3A%202px%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0Ali%20%3E%20p%20code%20%2F%2A%20Code%20span%20in%20a%20loose%20list%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20We%20have%20room%20for%20some%20more%20background%20color%20above%20and%20below%20%2A%2F%0A%20%20%20%20padding%3A%202px%3B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Math%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Aspan%2Emath%20%2F%2A%20Pandoc%20inline%20math%20default%20and%20%2D%2Djsmath%20inline%20math%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%2F%2A%20Tried%20font%2Dstyle%3Aitalic%20here%2C%20and%20it%20messed%20up%20MathJax%20rendering%20in%20some%20browsers%2E%20Maybe%20don%27t%20mess%20with%20at%20all%2E%20%2A%2F%0A%20%20%20%20%7D%0A%20%20%20%20%0Adiv%2Emath%20%2F%2A%20Pandoc%20%2D%2Djsmath%20display%20math%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20%0Aspan%2ELaTeX%20%2F%2A%20Pandoc%20%2D%2Dlatexmathml%20math%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%20%0A%20%0Aeq%20%2F%2A%20Pandoc%20%2D%2Dgladtex%20math%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%20%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Tables%20%2D%2D%2D%2D%20%2A%2F%0A%20%0A%2F%2A%20%20A%20clean%20textbook%2Dlike%20style%20with%20horizontal%20lines%20above%20and%20below%20and%20under%20%0A%20%20%20%20the%20header%2E%20Rows%20highlight%20on%20hover%20to%20help%20scanning%20the%20table%20on%20screen%2E%0A%2A%2F%0A%20%0Atable%0A%20%20%20%20%7B%0A%20%20%20%20border%2Dcollapse%3A%20collapse%3B%0A%20%20%20%20border%2Dspacing%3A%200%3B%20%2F%2A%20IE%206%20%2A%2F%0A%20%0A%20%20%20%20border%2Dbottom%3A%202pt%20solid%20%23000%3B%0A%20%20%20%20border%2Dtop%3A%202pt%20solid%20%23000%3B%20%2F%2A%20The%20caption%20on%20top%20will%20not%20have%20a%20bottom%2Dborder%20%2A%2F%0A%20%0A%20%20%20%20%2F%2A%20Center%20%2A%2F%0A%20%20%20%20margin%2Dleft%3A%20auto%3B%0A%20%20%20%20margin%2Dright%3A%20auto%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0Athead%20%2F%2A%20Entire%20table%20header%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20border%2Dbottom%3A%201pt%20solid%20%23000%3B%0A%20%20%20%20background%2Dcolor%3A%20%23eee%3B%20%2F%2A%20Does%20this%20BG%20print%20well%3F%20%2A%2F%0A%20%20%20%20%7D%0A%20%0Atr%2Eheader%20%2F%2A%20Each%20header%20row%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%20%0A%20%0Atbody%20%2F%2A%20Entire%20table%20%20body%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20Table%20body%20rows%20%2A%2F%0A%20%0Atr%20%20%7B%0A%20%20%20%20%7D%0Atr%2Eodd%3Ahover%2C%20tr%2Eeven%3Ahover%20%2F%2A%20Use%20%2Eodd%20and%20%2Eeven%20classes%20to%20avoid%20styling%20rows%20in%20other%20tables%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20background%2Dcolor%3A%20%23eee%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%2F%2A%20Odd%20and%20even%20rows%20%2A%2F%0Atr%2Eodd%20%7B%7D%0Atr%2Eeven%20%7B%7D%0A%20%0Atd%2C%20th%20%2F%2A%20Table%20cells%20and%20table%20header%20cells%20%2A%2F%0A%20%20%20%20%7B%20%0A%20%20%20%20vertical%2Dalign%3A%20top%3B%20%2F%2A%20Word%20%2A%2F%0A%20%20%20%20vertical%2Dalign%3A%20baseline%3B%20%2F%2A%20Others%20%2A%2F%0A%20%20%20%20padding%2Dleft%3A%20%20%200%2E5em%3B%0A%20%20%20%20padding%2Dright%3A%20%200%2E5em%3B%0A%20%20%20%20padding%2Dtop%3A%20%20%20%200%2E2em%3B%0A%20%20%20%20padding%2Dbottom%3A%200%2E2em%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%2F%2A%20Removes%20padding%20on%20left%20and%20right%20of%20table%20for%20a%20tight%20look%2E%20Good%20if%20thead%20has%20no%20background%20color%2A%2F%0A%2F%2A%0Atr%20td%3Alast%2Dchild%2C%20tr%20th%3Alast%2Dchild%0A%20%20%20%20%7B%0A%20%20%20%20padding%2Dright%3A%200%3B%0A%20%20%20%20%7D%0Atr%20td%3Afirst%2Dchild%2C%20tr%20th%3Afirst%2Dchild%20%0A%20%20%20%20%7B%0A%20%20%20%20padding%2Dleft%3A%200%3B%0A%20%20%20%20%7D%0A%2A%2F%0A%20%0Ath%20%2F%2A%20Table%20header%20cells%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20font%2Dweight%3A%20bold%3B%20%0A%20%20%20%20%7D%0A%20%0Atfoot%20%2F%2A%20Table%20footer%20%28what%20appears%20here%20if%20caption%20is%20on%20top%3F%29%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0Acaption%20%2F%2A%20This%20is%20for%20a%20table%20caption%20tag%2C%20not%20the%20p%2Ecaption%20Pandoc%20uses%20in%20a%20div%2Efigure%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20caption%2Dside%3A%20top%3B%0A%20%20%20%20border%3A%20none%3B%0A%20%20%20%20font%2Dsize%3A%200%2E9em%3B%0A%20%20%20%20font%2Dstyle%3A%20italic%3B%0A%20%20%20%20text%2Dalign%3A%20center%3B%0A%20%20%20%20margin%2Dbottom%3A%200%2E3em%3B%20%2F%2A%20Good%20for%20when%20on%20top%20%2A%2F%0A%20%20%20%20padding%2Dbottom%3A%200%2E2em%3B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20%2D%2D%2D%2D%20Definition%20lists%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Adl%20%2F%2A%20The%20whole%20list%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20border%2Dtop%3A%202pt%20solid%20black%3B%0A%20%20%20%20padding%2Dtop%3A%200%2E5em%3B%0A%20%20%20%20border%2Dbottom%3A%202pt%20solid%20black%3B%0A%20%20%20%20%7D%0A%20%0Adt%20%2F%2A%20Definition%20term%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%20%20%7D%0A%20%0Add%2Bdt%20%2F%2A%202nd%20or%20greater%20term%20in%20the%20list%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20border%2Dtop%3A%201pt%20solid%20black%3B%0A%20%20%20%20padding%2Dtop%3A%200%2E5em%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0Add%20%2F%2A%20A%20definition%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20margin%2Dbottom%3A%200%2E5em%3B%0A%20%20%20%20%7D%0A%20%0Add%2Bdd%20%2F%2A%202nd%20or%20greater%20definition%20of%20a%20term%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20border%2Dtop%3A%201px%20solid%20black%3B%20%2F%2A%20To%20separate%20multiple%20definitions%20%2A%2F%0A%20%20%20%20%7D%0A%20%20%20%20%0A%2F%2A%20%2D%2D%2D%2D%20Footnotes%20%2D%2D%2D%2D%20%2A%2F%0A%20%0Aa%2Efootnote%2C%20a%2EfootnoteRef%20%7B%20%2F%2A%20Pandoc%2C%20MultiMarkdown%20footnote%20links%20%2A%2F%0A%20%20%20%20font%2Dsize%3A%20small%3B%20%0A%20%20%20%20vertical%2Dalign%3A%20text%2Dtop%3B%0A%7D%0A%20%0Aa%5Bhref%5E%3D%22%23fnref%22%5D%2C%20a%2Ereversefootnote%20%2F%2A%20Pandoc%2C%20MultiMarkdown%2C%20%3F%3F%20footnote%20back%20links%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0A%40media%20print%0A%20%20%20%20%7B%0A%20%20%20%20a%5Bhref%5E%3D%22%23fnref%22%5D%2C%20a%2Ereversefootnote%20%2F%2A%20Pandoc%2C%20MultiMarkdown%20%2A%2F%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2A%20Don%27t%20display%20these%20at%20all%20in%20print%20since%20the%20arrow%20is%20only%20something%20to%20click%20on%20%2A%2F%0A%20%20%20%20%20%20%20%20display%3A%20none%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0Adiv%2Efootnotes%20%2F%2A%20Pandoc%20footnotes%20div%20at%20end%20of%20the%20document%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20%0Adiv%2Efootnotes%20li%5Bid%5E%3D%22fn%22%5D%20%2F%2A%20A%20footnote%20item%20within%20that%20div%20%2A%2F%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%0A%2F%2A%20You%20can%20class%20stuff%20as%20%22noprint%22%20to%20not%20print%2E%20%0A%20%20%20Useful%20since%20you%20can%27t%20set%20this%20media%20conditional%20inside%20an%20HTML%20element%27s%20%0A%20%20%20style%20attribute%20%28I%20think%29%2C%20and%20you%20don%27t%20want%20to%20make%20another%20stylesheet%20that%20%0A%20%20%20imports%20this%20one%20and%20adds%20a%20class%20just%20to%20do%20this%2E%0A%2A%2F%0A%20%0A%40media%20print%0A%20%20%20%20%7B%0A%20%20%20%20%2Enoprint%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20display%3Anone%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A" rel="stylesheet" type="text/css" /> |
---|
11 | </head> |
---|
12 | <body> |
---|
13 | <div id="header"> |
---|
14 | <h1 class="title">Install standalone maddash</h1> |
---|
15 | <h2 class="author">Brian Candler, Network Startup Resource Center</h2> |
---|
16 | <h3 class="date">Last Update 20 Sep 2015</h3> |
---|
17 | </div> |
---|
18 | <div id="TOC"> |
---|
19 | <ul> |
---|
20 | <li><a href="#install-standalone-maddash"><span class="toc-section-number">1</span> Install standalone maddash</a><ul> |
---|
21 | <li><a href="#install-centos"><span class="toc-section-number">1.1</span> Install CentOS</a></li> |
---|
22 | <li><a href="#disable-selinux"><span class="toc-section-number">1.2</span> Disable SELinux</a></li> |
---|
23 | <li><a href="#enable-repositories"><span class="toc-section-number">1.3</span> Enable repositories</a></li> |
---|
24 | <li><a href="#install-maddash"><span class="toc-section-number">1.4</span> Install maddash</a></li> |
---|
25 | <li><a href="#open-firewall"><span class="toc-section-number">1.5</span> Open firewall</a></li> |
---|
26 | </ul></li> |
---|
27 | <li><a href="#configuration---full-mesh"><span class="toc-section-number">2</span> Configuration - full mesh</a><ul> |
---|
28 | <li><a href="#create-configuration-file"><span class="toc-section-number">2.1</span> Create configuration file</a></li> |
---|
29 | <li><a href="#build-and-publish-configuration"><span class="toc-section-number">2.2</span> Build and publish configuration</a></li> |
---|
30 | <li><a href="#configure-maddash-to-consume-the-configuration"><span class="toc-section-number">2.3</span> Configure maddash to consume the configuration</a></li> |
---|
31 | </ul></li> |
---|
32 | <li><a href="#test-and-troubleshooting"><span class="toc-section-number">3</span> Test and troubleshooting</a><ul> |
---|
33 | <li><a href="#continuous-spinner"><span class="toc-section-number">3.1</span> Continuous spinner</a></li> |
---|
34 | <li><a href="#no-dashboard-selected"><span class="toc-section-number">3.2</span> No dashboard selected</a></li> |
---|
35 | </ul></li> |
---|
36 | <li><a href="#configure-perfsonar-nodes"><span class="toc-section-number">4</span> Configure perfsonar nodes</a></li> |
---|
37 | <li><a href="#configuration---disjoint-mesh"><span class="toc-section-number">5</span> Configuration - disjoint mesh</a><ul> |
---|
38 | <li><a href="#update-configuration"><span class="toc-section-number">5.1</span> Update configuration</a></li> |
---|
39 | <li><a href="#redeploy-configuration"><span class="toc-section-number">5.2</span> Redeploy configuration</a></li> |
---|
40 | </ul></li> |
---|
41 | <li><a href="#optional-additional-tweaking-of-maddash-server"><span class="toc-section-number">6</span> Optional: additional tweaking of maddash server</a><ul> |
---|
42 | <li><a href="#auto-start"><span class="toc-section-number">6.1</span> Auto-start</a></li> |
---|
43 | <li><a href="#redirect"><span class="toc-section-number">6.2</span> Redirect</a></li> |
---|
44 | <li><a href="#change-thresholds"><span class="toc-section-number">6.3</span> Change thresholds</a></li> |
---|
45 | <li><a href="#admin-password-for-maddash"><span class="toc-section-number">6.4</span> Admin password for maddash</a></li> |
---|
46 | </ul></li> |
---|
47 | </ul> |
---|
48 | </div> |
---|
49 | <h1 id="install-standalone-maddash"><a href="#install-standalone-maddash"><span class="header-section-number">1</span> Install standalone maddash</a></h1> |
---|
50 | <p>This document shows the steps to install a standalone maddash server, for example on a VM.</p> |
---|
51 | <p>NOTE: all the commands must be run as the "root" user.</p> |
---|
52 | <blockquote> |
---|
53 | <p>Additional information can be found via <a href="http://software.es.net/maddash/">http://software.es.net/maddash/</a></p> |
---|
54 | </blockquote> |
---|
55 | <h2 id="install-centos"><a href="#install-centos"><span class="header-section-number">1.1</span> Install CentOS</a></h2> |
---|
56 | <p>Install a vanilla CentOS 6.x minimal. Suggested parameters: 1G RAM, 8G disk.</p> |
---|
57 | <p>If possible, configure it with a meaningful hostname and put that in the DNS.</p> |
---|
58 | <p>Bring it up to date:</p> |
---|
59 | <pre><code>yum update</code></pre> |
---|
60 | <h2 id="disable-selinux"><a href="#disable-selinux"><span class="header-section-number">1.2</span> Disable SELinux</a></h2> |
---|
61 | <p>Currently, maddash does not work properly with SELinux (there are problems proxying to port 8881, and possibly others). So for now, disable SELinux:</p> |
---|
62 | <pre><code>vi /etc/selinux/config |
---|
63 | ... |
---|
64 | SELINUX=permissive |
---|
65 | ...</code></pre> |
---|
66 | <p>and either reboot, or run this:</p> |
---|
67 | <pre><code>echo "0" >/selinux/enforce</code></pre> |
---|
68 | <h2 id="enable-repositories"><a href="#enable-repositories"><span class="header-section-number">1.3</span> Enable repositories</a></h2> |
---|
69 | <p>We need the Internet2 and EPEL repositories for pulling maddash and its dependencies.</p> |
---|
70 | <pre><code>yum install wget |
---|
71 | wget http://software.internet2.edu/rpms/el6/x86_64/RPMS.main/Internet2-repo-0.4-2.noarch.rpm |
---|
72 | wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm |
---|
73 | yum localinstall Internet2-repo-0.4-2.noarch.rpm epel-release-6-8.noarch.rpm |
---|
74 | yum clean all</code></pre> |
---|
75 | <h2 id="install-maddash"><a href="#install-maddash"><span class="header-section-number">1.4</span> Install maddash</a></h2> |
---|
76 | <pre><code>yum install maddash</code></pre> |
---|
77 | <p>This will install a large number of dependencies, including apache (httpd)</p> |
---|
78 | <h2 id="open-firewall"><a href="#open-firewall"><span class="header-section-number">1.5</span> Open firewall</a></h2> |
---|
79 | <p>At this point, you should be able to access the webserver at <a href="http://x.x.x.x/">http://x.x.x.x/</a>. If not, you probably need to open the firewall to allow http/https traffic.</p> |
---|
80 | <p>If you normally use <code>system-config-firewall-tui</code> then use that, otherwise just edit the config directly and add two lines after the <code>--dport 22</code> rule:</p> |
---|
81 | <pre><code>vi /etc/sysconfig/iptables |
---|
82 | ... |
---|
83 | -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT |
---|
84 | -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT |
---|
85 | ...</code></pre> |
---|
86 | <p>Then:</p> |
---|
87 | <pre><code>/etc/init.d/iptables restart</code></pre> |
---|
88 | <p>(Repeat for ip6tables if you are also running IPv6)</p> |
---|
89 | <h1 id="configuration---full-mesh"><a href="#configuration---full-mesh"><span class="header-section-number">2</span> Configuration - full mesh</a></h1> |
---|
90 | <p>A central configuration file can be used to build both the maddash config and to configure the remote personar collector nodes. If you don't already have one, you need to create one now. This file can be created in whatever directory you like with whatever name you like - e.g. <code>sample.conf</code></p> |
---|
91 | <p>To start with we will configure a "full mesh", which means that every node tests to every other node. It requires you to have administrative control to all the nodes, so you can configure them to be part of the mesh.</p> |
---|
92 | <h2 id="create-configuration-file"><a href="#create-configuration-file"><span class="header-section-number">2.1</span> Create configuration file</a></h2> |
---|
93 | <p>Create your configuration file (e.g. <code>sample.conf</code>) with the following contents and then edit it to make sense for your environment. Replace the hostnames e.g. <code>pop1.sample.example</code> with the hostnames of the nodes in your mesh.</p> |
---|
94 | <pre><code>description Sample Mesh Config |
---|
95 | |
---|
96 | <administrator> |
---|
97 | name Sample NOC |
---|
98 | email noc@sample.example |
---|
99 | </administrator> |
---|
100 | |
---|
101 | <organization> |
---|
102 | description Sample |
---|
103 | |
---|
104 | <site> |
---|
105 | <host> |
---|
106 | description POP1 |
---|
107 | address pop1.sample.example |
---|
108 | <measurement_archive> |
---|
109 | type perfsonarbuoy/bwctl |
---|
110 | read_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
111 | write_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
112 | </measurement_archive> |
---|
113 | <measurement_archive> |
---|
114 | type traceroute |
---|
115 | read_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
116 | write_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
117 | </measurement_archive> |
---|
118 | <measurement_archive> |
---|
119 | type perfsonarbuoy/owamp |
---|
120 | read_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
121 | write_url http://pop1.sample.example/esmond/perfsonar/archive |
---|
122 | </measurement_archive> |
---|
123 | </host> |
---|
124 | </site> |
---|
125 | |
---|
126 | <site> |
---|
127 | <host> |
---|
128 | description POP2 |
---|
129 | address pop2.sample.example |
---|
130 | <measurement_archive> |
---|
131 | type perfsonarbuoy/bwctl |
---|
132 | read_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
133 | write_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
134 | </measurement_archive> |
---|
135 | <measurement_archive> |
---|
136 | type traceroute |
---|
137 | read_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
138 | write_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
139 | </measurement_archive> |
---|
140 | <measurement_archive> |
---|
141 | type perfsonarbuoy/owamp |
---|
142 | read_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
143 | write_url http://pop2.sample.example/esmond/perfsonar/archive |
---|
144 | </measurement_archive> |
---|
145 | </host> |
---|
146 | </site> |
---|
147 | |
---|
148 | <site> |
---|
149 | <host> |
---|
150 | description POP3 |
---|
151 | address pop3.sample.example |
---|
152 | <measurement_archive> |
---|
153 | type perfsonarbuoy/bwctl |
---|
154 | read_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
155 | write_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
156 | </measurement_archive> |
---|
157 | <measurement_archive> |
---|
158 | type traceroute |
---|
159 | read_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
160 | write_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
161 | </measurement_archive> |
---|
162 | <measurement_archive> |
---|
163 | type perfsonarbuoy/owamp |
---|
164 | read_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
165 | write_url http://pop3.sample.example/esmond/perfsonar/archive |
---|
166 | </measurement_archive> |
---|
167 | </host> |
---|
168 | </site> |
---|
169 | </organization> |
---|
170 | |
---|
171 | <test_spec bwctl_test> |
---|
172 | type perfsonarbuoy/bwctl # Perform a bwctl test (i.e. achievable bandwidth) |
---|
173 | tool bwctl/iperf3 # Use 'iperf' to do the bandwidh test |
---|
174 | protocol tcp # Run a TCP bandwidth test |
---|
175 | interval 21600 # Run the test every 6 hours |
---|
176 | duration 20 # Perform a 20 second test |
---|
177 | force_bidirectional 1 # do bidirectional test |
---|
178 | random_start_percentage 10 # randomize start time |
---|
179 | omit_interval 5 # ignore first few seconds of test |
---|
180 | </test_spec> |
---|
181 | |
---|
182 | <test_spec owamp_test> |
---|
183 | type perfsonarbuoy/owamp # Perform a constant low-bandwidth OWAMP test |
---|
184 | packet_interval 0.1 # Send 10 packets every second (i.e. pause 0.1 seconds between each packet) |
---|
185 | loss_threshold 10 # Wait no more than 10 seconds for a response |
---|
186 | session_count 10800 # Refresh the test every half hour (once every 18000 packets) |
---|
187 | sample_count 600 # Send results back every 60 seconds (once every 600 packets) |
---|
188 | packet_padding 0 # The size of the packets (not including the IP/UDP headers) |
---|
189 | bucket_width 0.0001 # The granularity of the measurements |
---|
190 | force_bidirectional 1 # do bidirectional test |
---|
191 | </test_spec> |
---|
192 | |
---|
193 | <group core_group> |
---|
194 | type mesh |
---|
195 | |
---|
196 | member pop1.sample.example |
---|
197 | member pop2.sample.example |
---|
198 | member pop3.sample.example |
---|
199 | </group> |
---|
200 | |
---|
201 | <test> |
---|
202 | description Core Throughput Testing |
---|
203 | group core_group |
---|
204 | test_spec bwctl_test |
---|
205 | </test> |
---|
206 | |
---|
207 | <test> |
---|
208 | description Core OWAMP Testing |
---|
209 | group core_group |
---|
210 | test_spec owamp_test |
---|
211 | </test></code></pre> |
---|
212 | <p>What you have done is:</p> |
---|
213 | <ul> |
---|
214 | <li>Define some hosts</li> |
---|
215 | <li>Define some test settings</li> |
---|
216 | <li>Define a group containing your hosts</li> |
---|
217 | <li>State which tests you want to run between the hosts in that group</li> |
---|
218 | </ul> |
---|
219 | <p>For a much bigger example see the <a href="https://github.com/esnet/esnet-perfsonar-mesh/tree/master/conf">ESNet configuration</a> which generates the <a href="http://ps-dashboard.es.net/">ESNet dashboard</a></p> |
---|
220 | <blockquote> |
---|
221 | <p>Note: "force_bidirectional" means that every host runs tests both ways. For example, host A runs and stores tests from A to B and B to A; host B will also run and store tests from B to A and A to B. This means every test is run twice. If you set this to zero it will halve the amount of test traffic. However host A's database will only store the measurements from A to B, and host B's database will only store the measurements from B to A.</p> |
---|
222 | </blockquote> |
---|
223 | <h2 id="build-and-publish-configuration"><a href="#build-and-publish-configuration"><span class="header-section-number">2.2</span> Build and publish configuration</a></h2> |
---|
224 | <p>This can be published at whatever URL you like - using the webserver on the maddash server itself is the easiest approach.</p> |
---|
225 | <p>First install the tool to convert the config to JSON format:</p> |
---|
226 | <pre><code>yum install perl-perfSONAR_PS-MeshConfig-JSONBuilder</code></pre> |
---|
227 | <p>Run this tool, putting the results in a directory which your webserver will serve:</p> |
---|
228 | <pre><code>/opt/perfsonar_ps/mesh_config/bin/build_json -o /var/www/html/sample.json sample.conf</code></pre> |
---|
229 | <p>Now check that the JSON you have created is visible at your chosen URL, e.g. <a href="http://x.x.x.x/sample.json">http://x.x.x.x/sample.json</a></p> |
---|
230 | <blockquote> |
---|
231 | <p>More details at <a href="http://docs.perfsonar.net/multi_server_config.html">http://docs.perfsonar.net/multi_server_config.html</a></p> |
---|
232 | </blockquote> |
---|
233 | <h2 id="configure-maddash-to-consume-the-configuration"><a href="#configure-maddash-to-consume-the-configuration"><span class="header-section-number">2.3</span> Configure maddash to consume the configuration</a></h2> |
---|
234 | <p>Still on your maddash server:</p> |
---|
235 | <pre><code>yum install perl-perfSONAR_PS-MeshConfig-GUIAgent</code></pre> |
---|
236 | <p>Edit <code>/opt/perfsonar_ps/mesh_config/etc/gui_agent_configuration.conf</code> to tell it where to find the JSON file you have published:</p> |
---|
237 | <pre><code><mesh> |
---|
238 | ... |
---|
239 | configuration_url http://x.x.x.x/sample.json |
---|
240 | ... |
---|
241 | </mesh> |
---|
242 | ... |
---|
243 | restart_services 0 |
---|
244 | ... |
---|
245 | use_toolkit 0</code></pre> |
---|
246 | <p><strong>NOTE</strong> Since we are running on a host without the pS toolkit, it is essential to change <code>use_toolkit</code> and <code>restart_services</code> as shown.</p> |
---|
247 | <p>Some additional work is required for maddash running standalone. Install an extra cron file:</p> |
---|
248 | <pre><code>cp /opt/perfsonar_ps/mesh_config/doc/cron-restart_gui_services /etc/cron.d/cron-restart_gui_services</code></pre> |
---|
249 | <p>Also edit the existing mesh_config_gui_agent cron job:</p> |
---|
250 | <pre><code>vi /etc/cron.d/cron-mesh_config_gui_agent |
---|
251 | ... |
---|
252 | change it so that it runs as "root" instead of "perfsonar"</code></pre> |
---|
253 | <p>Before we regenerate the configuration, we need to remove the existing configuration (since the old dashboards are merged with the new ones).</p> |
---|
254 | <pre><code>cd /etc/maddash/maddash-server/ |
---|
255 | mv maddash.yaml maddash.yaml.orig</code></pre> |
---|
256 | <p>Create a new <code>maddash.yaml</code> with just the following contents:</p> |
---|
257 | <pre><code># Set the directory where the database will be stored |
---|
258 | database: /var/lib/maddash/ |
---|
259 | ## |
---|
260 | # Set the host where the REST server listens |
---|
261 | serverHost: "localhost" |
---|
262 | ## |
---|
263 | # Activate http and set the port where it listens |
---|
264 | http: |
---|
265 | port: 8881</code></pre> |
---|
266 | <p>Finally we can generate the configuration:</p> |
---|
267 | <pre><code>/opt/perfsonar_ps/mesh_config/bin/generate_gui_configuration |
---|
268 | /etc/init.d/maddash-server restart</code></pre> |
---|
269 | <blockquote> |
---|
270 | <p>More details at <a href="http://software.es.net/maddash/mesh_config.html">http://software.es.net/maddash/mesh_config.html</a></p> |
---|
271 | </blockquote> |
---|
272 | <h1 id="test-and-troubleshooting"><a href="#test-and-troubleshooting"><span class="header-section-number">3</span> Test and troubleshooting</a></h1> |
---|
273 | <p>At this point you should be able to go to <a href="http://x.x.x.x/maddash-webui/">http://x.x.x.x/maddash-webui/</a></p> |
---|
274 | <p>There won't be any useful data to display until you have perfsonar nodes running, but you should see the grid with grey boxes for unknown data.</p> |
---|
275 | <h2 id="continuous-spinner"><a href="#continuous-spinner"><span class="header-section-number">3.1</span> Continuous spinner</a></h2> |
---|
276 | <p>If the page contains a "spinner" indefinitely, it may be that Apache has <a href="https://github.com/esnet/maddash/issues/21">disabled proxying to the Java backend</a> because it was down for a short time. Check for the following error:</p> |
---|
277 | <pre><code>tail /var/log/httpd/error_log |
---|
278 | ... |
---|
279 | [Tue Sep 08 16:38:35 2015] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 127.0.0.1:8881 (localhost) fa |
---|
280 | [Tue Sep 08 16:38:35 2015] [error] ap_proxy_connect_backend disabling worker for (localhost) |
---|
281 | [Tue Sep 08 16:38:35 2015] [error] proxy: HTTP: disabled connection for (localhost) |
---|
282 | [Tue Sep 08 16:39:24 2015] [error] proxy: HTTP: disabled connection for (localhost) |
---|
283 | [Tue Sep 08 16:39:24 2015] [error] proxy: HTTP: disabled connection for (localhost)</code></pre> |
---|
284 | <p>The quick solution is just to restart apache:</p> |
---|
285 | <pre><code>/etc/init.d/httpd restart</code></pre> |
---|
286 | <p>However this does not stop the problem recurring. To do this, edit <code>/etc/httpd/conf.d/apache-maddash.conf</code> and add <code>status=+i</code> to the end of the ProxyPass line, like this:</p> |
---|
287 | <pre><code> ProxyPass /maddash http://localhost:8881/maddash status=+i</code></pre> |
---|
288 | <p>and then restart Apache.</p> |
---|
289 | <blockquote> |
---|
290 | <p>To debug other errors where the page does not load, it can be helpful to go to your browser's Javascript Console and look for error messages there. In Chrome this is <code>View > Developer > Javascript Console</code></p> |
---|
291 | </blockquote> |
---|
292 | <h2 id="no-dashboard-selected"><a href="#no-dashboard-selected"><span class="header-section-number">3.2</span> No dashboard selected</a></h2> |
---|
293 | <p>If the page is empty apart from menu bar, click on "Dashboards" and select the first dashboard.</p> |
---|
294 | <p>You can make this dashboard selected automatically by editing <code>/opt/maddash/maddash-webui/etc/config.json</code> and setting the default dashboard to match the name of your dashboard:</p> |
---|
295 | <pre><code>... |
---|
296 | "defaultDashboard": "Sample Mesh Config", |
---|
297 | ...</code></pre> |
---|
298 | <h1 id="configure-perfsonar-nodes"><a href="#configure-perfsonar-nodes"><span class="header-section-number">4</span> Configure perfsonar nodes</a></h1> |
---|
299 | <p>The perfsonar nodes can now be configured to read the published maddash configuration.</p> |
---|
300 | <p>On each node, install the package:</p> |
---|
301 | <pre><code>yum install perl-perfSONAR_PS-MeshConfig-Agent</code></pre> |
---|
302 | <p>Edit <code>/opt/perfsonar_ps/mesh_config/etc/agent_configuration.conf</code> and change the configuration URL:</p> |
---|
303 | <pre><code><mesh> |
---|
304 | ... |
---|
305 | configuration_url http://x.x.x.x/sample.json |
---|
306 | ... |
---|
307 | </mesh></code></pre> |
---|
308 | <p>Run this command to pick up the configuration:</p> |
---|
309 | <pre><code>sudo -u perfsonar /opt/perfsonar_ps/mesh_config/bin/generate_configuration</code></pre> |
---|
310 | <p>It will be refreshed nightly from cron in any case.</p> |
---|
311 | <p>Your dashboard should start to be populated with test data. Also if you go to the web interface of your perfsonar nodes and click "Configure Tests" you should see the tests which the mesh configuration has added.</p> |
---|
312 | <blockquote> |
---|
313 | <p>More details at <a href="http://docs.perfsonar.net/multi_agent_config.html">http://docs.perfsonar.net/multi_agent_config.html</a></p> |
---|
314 | </blockquote> |
---|
315 | <h1 id="configuration---disjoint-mesh"><a href="#configuration---disjoint-mesh"><span class="header-section-number">5</span> Configuration - disjoint mesh</a></h1> |
---|
316 | <p>We will now extend the dashboard to include a second grid with tests from the hosts we control to some remote hosts which we do not control. These remote hosts or "beacons" respond to bwctl and owamp tests which we request, but they do not consume our mesh configuration and do not store any of the results in their database.</p> |
---|
317 | <blockquote> |
---|
318 | <p>Please remember to ask permission from the operator of any node which you would like to run regular testing to. You can find the contact details by looking for "Administrator Email" in their node's perfsonar web interface.</p> |
---|
319 | </blockquote> |
---|
320 | <h2 id="update-configuration"><a href="#update-configuration"><span class="header-section-number">5.1</span> Update configuration</a></h2> |
---|
321 | <p>Edit your mesh configuration and <em>add</em> the following sections - don't remove or change anything you already have.</p> |
---|
322 | <pre><code><organization> |
---|
323 | description ESnet |
---|
324 | <site> |
---|
325 | <host> |
---|
326 | description London |
---|
327 | address lond-pt1.es.net |
---|
328 | no_agent 1 |
---|
329 | </host> |
---|
330 | <host> |
---|
331 | description London |
---|
332 | address lond-owamp.es.net |
---|
333 | no_agent 1 |
---|
334 | </host> |
---|
335 | </site> |
---|
336 | <site> |
---|
337 | <host> |
---|
338 | description Amsterdam |
---|
339 | address amst-pt1.es.net |
---|
340 | no_agent 1 |
---|
341 | </host> |
---|
342 | <host> |
---|
343 | description Amsterdam |
---|
344 | address amst-owamp.es.net |
---|
345 | no_agent 1 |
---|
346 | </host> |
---|
347 | </site> |
---|
348 | <organization> |
---|
349 | |
---|
350 | <organization> |
---|
351 | description University of Oregon |
---|
352 | <site> |
---|
353 | <host> |
---|
354 | description University of Oregon |
---|
355 | address perfsonar.uoregon.edu |
---|
356 | no_agent 1 |
---|
357 | </host> |
---|
358 | </site> |
---|
359 | </organization></code></pre> |
---|
360 | <p>The flag <code>no_agent 1</code> means that this node isn't reading our mesh configuration, it's just a passive endpoint.</p> |
---|
361 | <p>Now add some more test specifications. Again, this is in addition to the tests you have already defined. We are making new test specifications so that you can tweak the settings separately to those for your internal mesh.</p> |
---|
362 | <pre><code><test_spec bwctl_test_external> |
---|
363 | type perfsonarbuoy/bwctl # Perform a bwctl test (i.e. achievable bandwidth) |
---|
364 | tool bwctl/iperf3 # Use 'iperf' to do the bandwidh test |
---|
365 | protocol tcp # Run a TCP bandwidth test |
---|
366 | interval 28800 # Run the test every 8 hours |
---|
367 | duration 20 # Perform a 20 second test |
---|
368 | force_bidirectional 1 # do bidirectional test |
---|
369 | random_start_percentage 10 # randomize start time |
---|
370 | omit_interval 5 # ignore first few seconds of test |
---|
371 | </test_spec> |
---|
372 | |
---|
373 | <test_spec owamp_test_external> |
---|
374 | type perfsonarbuoy/owamp # Perform a constant low-bandwidth OWAMP test |
---|
375 | packet_interval 0.1 # Send 10 packets every second (i.e. pause 0.1 seconds between each packet) |
---|
376 | loss_threshold 10 # Wait no more than 10 seconds for a response |
---|
377 | session_count 10800 # Refresh the test every half hour (once every 18000 packets) |
---|
378 | sample_count 600 # Send results back every 60 seconds (once every 600 packets) |
---|
379 | packet_padding 0 # The size of the packets (not including the IP/UDP headers) |
---|
380 | bucket_width 0.0001 # The granularity of the measurements |
---|
381 | force_bidirectional 1 # do bidirectional test |
---|
382 | </test_spec></code></pre> |
---|
383 | <p>Note that we must use <code>force_bidirectional 1</code>, since only our hosts will be running these tests, and we want them to be run both ways.</p> |
---|
384 | <p>Now add groups to define the tests. A "disjoint" group runs tests from the a_members to the b_members and vice versa, but not from <code>a_member</code> to <code>a_member</code> or <code>b_member</code> to <code>b_member</code>.</p> |
---|
385 | <pre><code><group core_to_external_group_bwctl> |
---|
386 | type disjoint |
---|
387 | |
---|
388 | a_member lond-pt1.es.net |
---|
389 | a_member amst-pt1.es.net |
---|
390 | a_member perfsonar.uoregon.edu |
---|
391 | |
---|
392 | b_member pop1.sample.example |
---|
393 | b_member pop2.sample.example |
---|
394 | b_member pop3.sample.example |
---|
395 | </group> |
---|
396 | |
---|
397 | <group core_to_external_group_owamp> |
---|
398 | type disjoint |
---|
399 | |
---|
400 | a_member lond-owamp.es.net |
---|
401 | a_member amst-owamp.es.net |
---|
402 | a_member perfsonar.uoregon.edu |
---|
403 | |
---|
404 | b_member pop1.sample.example |
---|
405 | b_member pop2.sample.example |
---|
406 | b_member pop3.sample.example |
---|
407 | </group></code></pre> |
---|
408 | <p>In the dashboard, the a_members will be displayed down the left side of the grid, and the b_members will be displayed along the top of the grid.</p> |
---|
409 | <p>Note that we have defined two groups, one for bwctl and one for owamp tests; this is because ESNet provides <a href="http://docs.perfsonar.net/manage_dual_xface.html">different test endpoints</a> for throughput and latency tests.</p> |
---|
410 | <p>Finally, link the groups to the test specifications</p> |
---|
411 | <pre><code><test> |
---|
412 | description Core to External Throughput Testing |
---|
413 | group core_to_external_group_bwctl |
---|
414 | test_spec bwctl_test_external |
---|
415 | </test> |
---|
416 | |
---|
417 | <test> |
---|
418 | description Core to External OWAMP Testing |
---|
419 | group core_to_external_group_owamp |
---|
420 | test_spec owamp_test_external |
---|
421 | </test></code></pre> |
---|
422 | <h2 id="redeploy-configuration"><a href="#redeploy-configuration"><span class="header-section-number">5.2</span> Redeploy configuration</a></h2> |
---|
423 | <p>Now you will need to repeat some of the steps you did before.</p> |
---|
424 | <ul> |
---|
425 | <li><p>On the maddash server: Build and publish configuration</p> |
---|
426 | <pre><code>/opt/perfsonar_ps/mesh_config/bin/build_json -o /var/www/html/sample.json sample.conf</code></pre></li> |
---|
427 | <li><p>On the maddash server: Consume the configuration</p> |
---|
428 | <pre><code>/opt/perfsonar_ps/mesh_config/bin/generate_gui_configuration |
---|
429 | /etc/init.d/maddash-server restart</code></pre></li> |
---|
430 | <li><p>On the perfsonar nodes:</p> |
---|
431 | <pre><code>sudo -u perfsonar /opt/perfsonar_ps/mesh_config/bin/generate_configuration</code></pre> |
---|
432 | <p>(Otherwise you have to wait until they pick it up overnight)</p></li> |
---|
433 | </ul> |
---|
434 | <p>Go to your maddash server webpage and check that the new grid is visible. Go to your perfsonar node web interfaces, click "Configure Tests" and check that they are configured with the new tests.</p> |
---|
435 | <h1 id="optional-additional-tweaking-of-maddash-server"><a href="#optional-additional-tweaking-of-maddash-server"><span class="header-section-number">6</span> Optional: additional tweaking of maddash server</a></h1> |
---|
436 | <h2 id="auto-start"><a href="#auto-start"><span class="header-section-number">6.1</span> Auto-start</a></h2> |
---|
437 | <p>Check that the maddash-server and httpd services are configured to come up on server start:</p> |
---|
438 | <pre><code>chkconfig --list</code></pre> |
---|
439 | <p>If not, then configure them so they do, e.g.</p> |
---|
440 | <pre><code>chkconfig --add httpd 2345 on</code></pre> |
---|
441 | <h2 id="redirect"><a href="#redirect"><span class="header-section-number">6.2</span> Redirect</a></h2> |
---|
442 | <p>If this is a dedicated server, then it's friendly to have a redirect from the front page. Create <code>/var/www/html/index.html</code> containing:</p> |
---|
443 | <pre><code><html> |
---|
444 | <head> |
---|
445 | <meta http-equiv="refresh" content="0; url=http://x.x.x.x/maddash-webui/"> |
---|
446 | </head> |
---|
447 | <body> |
---|
448 | Redirecting <a href="http://x.x.x.x/maddash-webui/">here</a>... |
---|
449 | </body> |
---|
450 | </html></code></pre> |
---|
451 | <h2 id="change-thresholds"><a href="#change-thresholds"><span class="header-section-number">6.3</span> Change thresholds</a></h2> |
---|
452 | <p>You can change the thresholds at which warnings (yellow) or errors (red) are displayed.</p> |
---|
453 | <p>Edit <code>/opt/perfsonar_ps/mesh_config/etc/gui_agent_configuration.conf</code> and look for these settings:</p> |
---|
454 | <pre><code> acceptable_loss_rate 0 |
---|
455 | critical_loss_rate 0.01 |
---|
456 | ... |
---|
457 | acceptable_throughput 900 |
---|
458 | critical_throughput 500</code></pre> |
---|
459 | <p>Edit as required. Then rebuild the <code>maddash.yaml</code> configuration:</p> |
---|
460 | <pre><code>/opt/perfsonar_ps/mesh_config/bin/generate_gui_configuration |
---|
461 | /etc/init.d/maddash-server restart</code></pre> |
---|
462 | <p>Notice also these settings for the bwctl (throughput) tests:</p> |
---|
463 | <pre><code> check_interval 28800 |
---|
464 | check_time_range 86400</code></pre> |
---|
465 | <p>This means that <code>check_throughput.pl</code> is run every 8 hours, and it averages the throughput results over the last 24 hours. This means you're looking at an average throughput, not the results of the most recent test.</p> |
---|
466 | <p>The corresponding parameters for owamp are 30 minutes and 15 minutes, so it responds much more quickly to changes in packet loss.</p> |
---|
467 | <h2 id="admin-password-for-maddash"><a href="#admin-password-for-maddash"><span class="header-section-number">6.4</span> Admin password for maddash</a></h2> |
---|
468 | <p>Maddash also has a <a href="http://software.es.net/maddash/admin_ui.html">settings/admin page</a> which can be used to mark hosts as down for maintenance, and force immediate re-tests.</p> |
---|
469 | <p>To enable this, you need to create a username and password - none is set by default, and it does not have to be the same as your perfsonar UI username/passwords.</p> |
---|
470 | <p>The following command will create a user called "admin" and prompt you for the password:</p> |
---|
471 | <pre><code>htpasswd /etc/maddash/maddash-webui/admin-users admin</code></pre> |
---|
472 | <p>Once this is done, go to the dashboard, click on <code>Settings > Server Settings...</code> and you will be prompted for this username and password.</p> |
---|
473 | <p>Should you wish to remove a user from the password file, you can either edit the file directly, or use this command:</p> |
---|
474 | <pre><code>htpasswd /etc/maddash/maddash-webui/admin-users -D admin</code></pre> |
---|
475 | </body> |
---|
476 | </html> |
---|