[{"data":1,"prerenderedAt":1659},["ShallowReactive",2],{"i-lucide:menu":3,"i-lucide:arrow-up-right":8,"i-lucide:moon":10,"i-lucide:sun":12,"i-lucide:rss":14,"i-simple-icons:github":16,"i-simple-icons:linkedin":18,"post-\u002F2011\u002Fpovi-paris-pythoni-progremise-paevad":21,"surround-\u002F2011\u002Fpovi-paris-pythoni-progremise-paevad":1646,"i-lucide:arrow-left":1655,"i-lucide:arrow-right":1657},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19,"hidden":20},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"id":22,"title":23,"body":24,"category":1635,"comments":1636,"date":1637,"description":30,"excerpt":1636,"extension":1638,"image":1636,"meta":1639,"navigation":20,"path":1640,"readingTime":1641,"seo":1642,"stem":1643,"subtitle":1636,"tags":1636,"wordCount":1644,"__hash__":1645},"posts\u002F2011\u002Fpovi-paris-pythoni-progremise-paevad.md","Povi Päris Pythoni Progremise Päevad",{"type":25,"value":26,"toc":1630},"minimark",[27,31,36,41,604,608,861,865,1389,1393,1626],[28,29,30],"p",{},"Povi õpetab Pythonit progema! Kooliõpilastele-õpetajatel?e ja Povisse praktikale tulevatele üliõpilastele tasuta!",[32,33,35],"h1",{"id":34},"day-1-my-solutions","Day #1: My solutions",[37,38,40],"h2",{"id":39},"apache-log-analyzer","Apache log analyzer",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-python shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fpython\n# -*- coding: utf-8 -*-\n__author__ = 'Ando'\n\nprint \"Apache log analyzer\"\n\nlines = 0\n\nos = {'win': 0,\n      'linux': 0,\n      'mac': 0,\n      'unknown': 0\n} # 3 major OS-s\n\npercentages = {'win': 0,\n               'linux': 0,\n               'mac': 0,\n               'unknown': 0\n} # Holds the percentages\n\nfail = '\u002Fvar\u002Flog\u002Fapache2\u002Faccess.log'\nprint \"Logfile is \", fail\n\nfor line in open(fail, 'r').readlines():\n    if (line.find('Linux') != -1):\n        os['linux'] += 1\n    elif (line.find('Windows') != -1):\n        os['win'] += 1\n    elif (line.find('Mac') != -1):\n        os['mac'] += 1\n    else:\n        os['unknown'] += 1\n    lines += 1\n\nprint \"Number of log entries:\", lines\nprint \"\"\n\nfor name in os:\n    if (os[name] > 0 and lines > 0):\n        percentages[name] = (os[name]*1.0 \u002F lines*1.0) * 100\n\n    print name.upper() + ', %i times, %f%%' % (os[name], percentages[name])\n\nprint \"nEND\"\n","python","",[49,50,51,60,66,81,87,97,102,113,118,141,153,165,176,185,190,208,220,232,242,250,255,266,277,282,305,332,350,371,384,404,418,427,441,451,456,467,475,480,493,519,553,558,591,596],"code",{"__ignoreMap":47},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"sJ8bj","#!\u002Fusr\u002Fbin\u002Fpython\n",[52,61,63],{"class":54,"line":62},2,[52,64,65],{"class":58},"# -*- coding: utf-8 -*-\n",[52,67,69,73,77],{"class":54,"line":68},3,[52,70,72],{"class":71},"sVt8B","__author__ ",[52,74,76],{"class":75},"szBVR","=",[52,78,80],{"class":79},"sZZnC"," 'Ando'\n",[52,82,84],{"class":54,"line":83},4,[52,85,86],{"emptyLinePlaceholder":20},"\n",[52,88,90,94],{"class":54,"line":89},5,[52,91,93],{"class":92},"sj4cs","print",[52,95,96],{"class":79}," \"Apache log analyzer\"\n",[52,98,100],{"class":54,"line":99},6,[52,101,86],{"emptyLinePlaceholder":20},[52,103,105,108,110],{"class":54,"line":104},7,[52,106,107],{"class":71},"lines ",[52,109,76],{"class":75},[52,111,112],{"class":92}," 0\n",[52,114,116],{"class":54,"line":115},8,[52,117,86],{"emptyLinePlaceholder":20},[52,119,121,124,126,129,132,135,138],{"class":54,"line":120},9,[52,122,123],{"class":71},"os ",[52,125,76],{"class":75},[52,127,128],{"class":71}," {",[52,130,131],{"class":79},"'win'",[52,133,134],{"class":71},": ",[52,136,137],{"class":92},"0",[52,139,140],{"class":71},",\n",[52,142,144,147,149,151],{"class":54,"line":143},10,[52,145,146],{"class":79},"      'linux'",[52,148,134],{"class":71},[52,150,137],{"class":92},[52,152,140],{"class":71},[52,154,156,159,161,163],{"class":54,"line":155},11,[52,157,158],{"class":79},"      'mac'",[52,160,134],{"class":71},[52,162,137],{"class":92},[52,164,140],{"class":71},[52,166,168,171,173],{"class":54,"line":167},12,[52,169,170],{"class":79},"      'unknown'",[52,172,134],{"class":71},[52,174,175],{"class":92},"0\n",[52,177,179,182],{"class":54,"line":178},13,[52,180,181],{"class":71},"} ",[52,183,184],{"class":58},"# 3 major OS-s\n",[52,186,188],{"class":54,"line":187},14,[52,189,86],{"emptyLinePlaceholder":20},[52,191,193,196,198,200,202,204,206],{"class":54,"line":192},15,[52,194,195],{"class":71},"percentages ",[52,197,76],{"class":75},[52,199,128],{"class":71},[52,201,131],{"class":79},[52,203,134],{"class":71},[52,205,137],{"class":92},[52,207,140],{"class":71},[52,209,211,214,216,218],{"class":54,"line":210},16,[52,212,213],{"class":79},"               'linux'",[52,215,134],{"class":71},[52,217,137],{"class":92},[52,219,140],{"class":71},[52,221,223,226,228,230],{"class":54,"line":222},17,[52,224,225],{"class":79},"               'mac'",[52,227,134],{"class":71},[52,229,137],{"class":92},[52,231,140],{"class":71},[52,233,235,238,240],{"class":54,"line":234},18,[52,236,237],{"class":79},"               'unknown'",[52,239,134],{"class":71},[52,241,175],{"class":92},[52,243,245,247],{"class":54,"line":244},19,[52,246,181],{"class":71},[52,248,249],{"class":58},"# Holds the percentages\n",[52,251,253],{"class":54,"line":252},20,[52,254,86],{"emptyLinePlaceholder":20},[52,256,258,261,263],{"class":54,"line":257},21,[52,259,260],{"class":71},"fail ",[52,262,76],{"class":75},[52,264,265],{"class":79}," '\u002Fvar\u002Flog\u002Fapache2\u002Faccess.log'\n",[52,267,269,271,274],{"class":54,"line":268},22,[52,270,93],{"class":92},[52,272,273],{"class":79}," \"Logfile is \"",[52,275,276],{"class":71},", fail\n",[52,278,280],{"class":54,"line":279},23,[52,281,86],{"emptyLinePlaceholder":20},[52,283,284,287,290,293,296,299,302],{"class":54,"line":5},[52,285,286],{"class":75},"for",[52,288,289],{"class":71}," line ",[52,291,292],{"class":75},"in",[52,294,295],{"class":92}," open",[52,297,298],{"class":71},"(fail, ",[52,300,301],{"class":79},"'r'",[52,303,304],{"class":71},").readlines():\n",[52,306,308,311,314,317,320,323,326,329],{"class":54,"line":307},25,[52,309,310],{"class":75},"    if",[52,312,313],{"class":71}," (line.find(",[52,315,316],{"class":79},"'Linux'",[52,318,319],{"class":71},") ",[52,321,322],{"class":75},"!=",[52,324,325],{"class":75}," -",[52,327,328],{"class":92},"1",[52,330,331],{"class":71},"):\n",[52,333,335,338,341,344,347],{"class":54,"line":334},26,[52,336,337],{"class":71},"        os[",[52,339,340],{"class":79},"'linux'",[52,342,343],{"class":71},"] ",[52,345,346],{"class":75},"+=",[52,348,349],{"class":92}," 1\n",[52,351,353,356,358,361,363,365,367,369],{"class":54,"line":352},27,[52,354,355],{"class":75},"    elif",[52,357,313],{"class":71},[52,359,360],{"class":79},"'Windows'",[52,362,319],{"class":71},[52,364,322],{"class":75},[52,366,325],{"class":75},[52,368,328],{"class":92},[52,370,331],{"class":71},[52,372,374,376,378,380,382],{"class":54,"line":373},28,[52,375,337],{"class":71},[52,377,131],{"class":79},[52,379,343],{"class":71},[52,381,346],{"class":75},[52,383,349],{"class":92},[52,385,387,389,391,394,396,398,400,402],{"class":54,"line":386},29,[52,388,355],{"class":75},[52,390,313],{"class":71},[52,392,393],{"class":79},"'Mac'",[52,395,319],{"class":71},[52,397,322],{"class":75},[52,399,325],{"class":75},[52,401,328],{"class":92},[52,403,331],{"class":71},[52,405,407,409,412,414,416],{"class":54,"line":406},30,[52,408,337],{"class":71},[52,410,411],{"class":79},"'mac'",[52,413,343],{"class":71},[52,415,346],{"class":75},[52,417,349],{"class":92},[52,419,421,424],{"class":54,"line":420},31,[52,422,423],{"class":75},"    else",[52,425,426],{"class":71},":\n",[52,428,430,432,435,437,439],{"class":54,"line":429},32,[52,431,337],{"class":71},[52,433,434],{"class":79},"'unknown'",[52,436,343],{"class":71},[52,438,346],{"class":75},[52,440,349],{"class":92},[52,442,444,447,449],{"class":54,"line":443},33,[52,445,446],{"class":71},"    lines ",[52,448,346],{"class":75},[52,450,349],{"class":92},[52,452,454],{"class":54,"line":453},34,[52,455,86],{"emptyLinePlaceholder":20},[52,457,459,461,464],{"class":54,"line":458},35,[52,460,93],{"class":92},[52,462,463],{"class":79}," \"Number of log entries:\"",[52,465,466],{"class":71},", lines\n",[52,468,470,472],{"class":54,"line":469},36,[52,471,93],{"class":92},[52,473,474],{"class":79}," \"\"\n",[52,476,478],{"class":54,"line":477},37,[52,479,86],{"emptyLinePlaceholder":20},[52,481,483,485,488,490],{"class":54,"line":482},38,[52,484,286],{"class":75},[52,486,487],{"class":71}," name ",[52,489,292],{"class":75},[52,491,492],{"class":71}," os:\n",[52,494,496,498,501,504,507,510,513,515,517],{"class":54,"line":495},39,[52,497,310],{"class":75},[52,499,500],{"class":71}," (os[name] ",[52,502,503],{"class":75},">",[52,505,506],{"class":92}," 0",[52,508,509],{"class":75}," and",[52,511,512],{"class":71}," lines ",[52,514,503],{"class":75},[52,516,506],{"class":92},[52,518,331],{"class":71},[52,520,522,525,527,530,533,536,539,542,544,546,548,550],{"class":54,"line":521},40,[52,523,524],{"class":71},"        percentages[name] ",[52,526,76],{"class":75},[52,528,529],{"class":71}," (os[name]",[52,531,532],{"class":75},"*",[52,534,535],{"class":92},"1.0",[52,537,538],{"class":75}," \u002F",[52,540,541],{"class":71}," lines",[52,543,532],{"class":75},[52,545,535],{"class":92},[52,547,319],{"class":71},[52,549,532],{"class":75},[52,551,552],{"class":92}," 100\n",[52,554,556],{"class":54,"line":555},41,[52,557,86],{"emptyLinePlaceholder":20},[52,559,561,564,567,570,573,576,579,582,585,588],{"class":54,"line":560},42,[52,562,563],{"class":92},"    print",[52,565,566],{"class":71}," name.upper() ",[52,568,569],{"class":75},"+",[52,571,572],{"class":79}," ', ",[52,574,575],{"class":92},"%i",[52,577,578],{"class":79}," times, ",[52,580,581],{"class":92},"%f%%",[52,583,584],{"class":79},"'",[52,586,587],{"class":75}," %",[52,589,590],{"class":71}," (os[name], percentages[name])\n",[52,592,594],{"class":54,"line":593},43,[52,595,86],{"emptyLinePlaceholder":20},[52,597,599,601],{"class":54,"line":598},44,[52,600,93],{"class":92},[52,602,603],{"class":79}," \"nEND\"\n",[37,605,607],{"id":606},"openssh-rünnak","Openssh rünnak",[42,609,611],{"className":44,"code":610,"language":46,"meta":47,"style":47},"#!\u002Fusr\u002Fbin\u002Fpython\n# -*- coding: utf-8 -*-\n__author__ = 'Ando'\n\nfail = 'auth.log'\nprint \"Anal&uuml;&uuml;sin SSH logifaili\", fail\nprint \"\"\n\ncounter = {} # Holds the IP addresses and request counts\n\nfor line in open(fail, 'r'): # Read logfile line by line\n    if ('Failed' in line and 'from' in line):\n        ip = line[line.find('from '):line.find(' port')] # Get the IP address of the attacker\n\n        # Increase counter for that IP\n        if (ip in counter):\n            counter[ip] += 1\n        else:\n            counter[ip] = 1\n\n# Print the results\nfor item in sorted(counter, key=counter.get):\n    print \"Aadressilt %s r&uuml;nnakuid %i\" % (item, counter[item])\n\nprint \"nEND\"\n",[49,612,613,617,621,629,633,642,651,657,661,674,678,698,724,749,753,758,771,780,787,795,799,804,828,851,855],{"__ignoreMap":47},[52,614,615],{"class":54,"line":55},[52,616,59],{"class":58},[52,618,619],{"class":54,"line":62},[52,620,65],{"class":58},[52,622,623,625,627],{"class":54,"line":68},[52,624,72],{"class":71},[52,626,76],{"class":75},[52,628,80],{"class":79},[52,630,631],{"class":54,"line":83},[52,632,86],{"emptyLinePlaceholder":20},[52,634,635,637,639],{"class":54,"line":89},[52,636,260],{"class":71},[52,638,76],{"class":75},[52,640,641],{"class":79}," 'auth.log'\n",[52,643,644,646,649],{"class":54,"line":99},[52,645,93],{"class":92},[52,647,648],{"class":79}," \"Anal&uuml;&uuml;sin SSH logifaili\"",[52,650,276],{"class":71},[52,652,653,655],{"class":54,"line":104},[52,654,93],{"class":92},[52,656,474],{"class":79},[52,658,659],{"class":54,"line":115},[52,660,86],{"emptyLinePlaceholder":20},[52,662,663,666,668,671],{"class":54,"line":120},[52,664,665],{"class":71},"counter ",[52,667,76],{"class":75},[52,669,670],{"class":71}," {} ",[52,672,673],{"class":58},"# Holds the IP addresses and request counts\n",[52,675,676],{"class":54,"line":143},[52,677,86],{"emptyLinePlaceholder":20},[52,679,680,682,684,686,688,690,692,695],{"class":54,"line":155},[52,681,286],{"class":75},[52,683,289],{"class":71},[52,685,292],{"class":75},[52,687,295],{"class":92},[52,689,298],{"class":71},[52,691,301],{"class":79},[52,693,694],{"class":71},"): ",[52,696,697],{"class":58},"# Read logfile line by line\n",[52,699,700,702,705,708,711,713,716,719,721],{"class":54,"line":167},[52,701,310],{"class":75},[52,703,704],{"class":71}," (",[52,706,707],{"class":79},"'Failed'",[52,709,710],{"class":75}," in",[52,712,289],{"class":71},[52,714,715],{"class":75},"and",[52,717,718],{"class":79}," 'from'",[52,720,710],{"class":75},[52,722,723],{"class":71}," line):\n",[52,725,726,729,731,734,737,740,743,746],{"class":54,"line":178},[52,727,728],{"class":71},"        ip ",[52,730,76],{"class":75},[52,732,733],{"class":71}," line[line.find(",[52,735,736],{"class":79},"'from '",[52,738,739],{"class":71},"):line.find(",[52,741,742],{"class":79},"' port'",[52,744,745],{"class":71},")] ",[52,747,748],{"class":58},"# Get the IP address of the attacker\n",[52,750,751],{"class":54,"line":187},[52,752,86],{"emptyLinePlaceholder":20},[52,754,755],{"class":54,"line":192},[52,756,757],{"class":58},"        # Increase counter for that IP\n",[52,759,760,763,766,768],{"class":54,"line":210},[52,761,762],{"class":75},"        if",[52,764,765],{"class":71}," (ip ",[52,767,292],{"class":75},[52,769,770],{"class":71}," counter):\n",[52,772,773,776,778],{"class":54,"line":222},[52,774,775],{"class":71},"            counter[ip] ",[52,777,346],{"class":75},[52,779,349],{"class":92},[52,781,782,785],{"class":54,"line":234},[52,783,784],{"class":75},"        else",[52,786,426],{"class":71},[52,788,789,791,793],{"class":54,"line":244},[52,790,775],{"class":71},[52,792,76],{"class":75},[52,794,349],{"class":92},[52,796,797],{"class":54,"line":252},[52,798,86],{"emptyLinePlaceholder":20},[52,800,801],{"class":54,"line":257},[52,802,803],{"class":58},"# Print the results\n",[52,805,806,808,811,813,816,819,823,825],{"class":54,"line":268},[52,807,286],{"class":75},[52,809,810],{"class":71}," item ",[52,812,292],{"class":75},[52,814,815],{"class":92}," sorted",[52,817,818],{"class":71},"(counter, ",[52,820,822],{"class":821},"s4XuR","key",[52,824,76],{"class":75},[52,826,827],{"class":71},"counter.get):\n",[52,829,830,832,835,838,841,843,846,848],{"class":54,"line":279},[52,831,563],{"class":92},[52,833,834],{"class":79}," \"Aadressilt ",[52,836,837],{"class":92},"%s",[52,839,840],{"class":79}," r&uuml;nnakuid ",[52,842,575],{"class":92},[52,844,845],{"class":79},"\"",[52,847,587],{"class":75},[52,849,850],{"class":71}," (item, counter[item])\n",[52,852,853],{"class":54,"line":5},[52,854,86],{"emptyLinePlaceholder":20},[52,856,857,859],{"class":54,"line":307},[52,858,93],{"class":92},[52,860,603],{"class":79},[32,862,864],{"id":863},"simple-samba-conf","Simple SAMBA conf",[42,866,868],{"className":44,"code":867,"language":46,"meta":47,"style":47},"#!\u002Fusr\u002Fbin\u002Fpython\n# -*- coding: utf-8 -*-\n__author__ = 'Ando'\n\nimport sys\nimport os\nimport ConfigParser\n\n# Reads and modifies smb.conf file\nCONFIG_FILE = 'smb.conf'\nNEW_FILE = 'new_smb.conf'\n\nif (len(sys.argv) == 1):\n    print \"USAGE: .\u002Fsmb.py add|show folder_path\"\n    exit()\n\n# This can be easily expanded\naction = 'show'\nif (sys.argv[1] == 'add'):\n    action = 'add'\n\nprint \"Reading config file\", CONFIG_FILE\nconfig = ConfigParser.RawConfigParser()\nconfig.read(CONFIG_FILE)\n\n# Add a new section to the config file\nif (action == 'add'):\n    try:\n        folder_name = sys.argv[2].split('\u002F')[-1] # Get the last name in the path\n        config.add_section(folder_name)\n        config.set(folder_name, 'browsable', 'true')\n        config.set(folder_name, 'read only', 'false')\n        config.set(folder_name, 'path', sys.argv[2])\n\n        # Write the new file\n        with open(NEW_FILE, 'w+') as configfile:\n            config.write(configfile)\n\n        print \"Wrote new config to\", NEW_FILE\n\n        # Restart SMBD\n        print \"Restarting smbd...\"\n        result = os.popen('service smbd restart').read() # Try to restart Samba\n\n        if ('start\u002Frunning' in result):\n            print \"SAMBA sucesfully restarted with the new settings!\"\n        else:\n            print \"nSAMBA restart failed, must be root!\"\n\n    except IndexError:\n        pass\n\n# List all share sections\nelse:\n    for folder in config.sections():\n        print \"Found shared folder\", folder\n\nprint \"END\"\n",[49,869,870,874,878,886,890,898,905,912,916,921,932,942,946,967,974,982,986,991,1001,1019,1029,1033,1046,1056,1066,1070,1075,1088,1095,1127,1132,1147,1161,1176,1180,1185,1210,1215,1219,1232,1236,1241,1248,1267,1271,1286,1295,1302,1310,1315,1326,1332,1337,1343,1351,1365,1376,1381],{"__ignoreMap":47},[52,871,872],{"class":54,"line":55},[52,873,59],{"class":58},[52,875,876],{"class":54,"line":62},[52,877,65],{"class":58},[52,879,880,882,884],{"class":54,"line":68},[52,881,72],{"class":71},[52,883,76],{"class":75},[52,885,80],{"class":79},[52,887,888],{"class":54,"line":83},[52,889,86],{"emptyLinePlaceholder":20},[52,891,892,895],{"class":54,"line":89},[52,893,894],{"class":75},"import",[52,896,897],{"class":71}," sys\n",[52,899,900,902],{"class":54,"line":99},[52,901,894],{"class":75},[52,903,904],{"class":71}," os\n",[52,906,907,909],{"class":54,"line":104},[52,908,894],{"class":75},[52,910,911],{"class":71}," ConfigParser\n",[52,913,914],{"class":54,"line":115},[52,915,86],{"emptyLinePlaceholder":20},[52,917,918],{"class":54,"line":120},[52,919,920],{"class":58},"# Reads and modifies smb.conf file\n",[52,922,923,926,929],{"class":54,"line":143},[52,924,925],{"class":92},"CONFIG_FILE",[52,927,928],{"class":75}," =",[52,930,931],{"class":79}," 'smb.conf'\n",[52,933,934,937,939],{"class":54,"line":155},[52,935,936],{"class":92},"NEW_FILE",[52,938,928],{"class":75},[52,940,941],{"class":79}," 'new_smb.conf'\n",[52,943,944],{"class":54,"line":167},[52,945,86],{"emptyLinePlaceholder":20},[52,947,948,951,953,956,959,962,965],{"class":54,"line":178},[52,949,950],{"class":75},"if",[52,952,704],{"class":71},[52,954,955],{"class":92},"len",[52,957,958],{"class":71},"(sys.argv) ",[52,960,961],{"class":75},"==",[52,963,964],{"class":92}," 1",[52,966,331],{"class":71},[52,968,969,971],{"class":54,"line":187},[52,970,563],{"class":92},[52,972,973],{"class":79}," \"USAGE: .\u002Fsmb.py add|show folder_path\"\n",[52,975,976,979],{"class":54,"line":192},[52,977,978],{"class":92},"    exit",[52,980,981],{"class":71},"()\n",[52,983,984],{"class":54,"line":210},[52,985,86],{"emptyLinePlaceholder":20},[52,987,988],{"class":54,"line":222},[52,989,990],{"class":58},"# This can be easily expanded\n",[52,992,993,996,998],{"class":54,"line":234},[52,994,995],{"class":71},"action ",[52,997,76],{"class":75},[52,999,1000],{"class":79}," 'show'\n",[52,1002,1003,1005,1008,1010,1012,1014,1017],{"class":54,"line":244},[52,1004,950],{"class":75},[52,1006,1007],{"class":71}," (sys.argv[",[52,1009,328],{"class":92},[52,1011,343],{"class":71},[52,1013,961],{"class":75},[52,1015,1016],{"class":79}," 'add'",[52,1018,331],{"class":71},[52,1020,1021,1024,1026],{"class":54,"line":252},[52,1022,1023],{"class":71},"    action ",[52,1025,76],{"class":75},[52,1027,1028],{"class":79}," 'add'\n",[52,1030,1031],{"class":54,"line":257},[52,1032,86],{"emptyLinePlaceholder":20},[52,1034,1035,1037,1040,1043],{"class":54,"line":268},[52,1036,93],{"class":92},[52,1038,1039],{"class":79}," \"Reading config file\"",[52,1041,1042],{"class":71},", ",[52,1044,1045],{"class":92},"CONFIG_FILE\n",[52,1047,1048,1051,1053],{"class":54,"line":279},[52,1049,1050],{"class":71},"config ",[52,1052,76],{"class":75},[52,1054,1055],{"class":71}," ConfigParser.RawConfigParser()\n",[52,1057,1058,1061,1063],{"class":54,"line":5},[52,1059,1060],{"class":71},"config.read(",[52,1062,925],{"class":92},[52,1064,1065],{"class":71},")\n",[52,1067,1068],{"class":54,"line":307},[52,1069,86],{"emptyLinePlaceholder":20},[52,1071,1072],{"class":54,"line":334},[52,1073,1074],{"class":58},"# Add a new section to the config file\n",[52,1076,1077,1079,1082,1084,1086],{"class":54,"line":352},[52,1078,950],{"class":75},[52,1080,1081],{"class":71}," (action ",[52,1083,961],{"class":75},[52,1085,1016],{"class":79},[52,1087,331],{"class":71},[52,1089,1090,1093],{"class":54,"line":373},[52,1091,1092],{"class":75},"    try",[52,1094,426],{"class":71},[52,1096,1097,1100,1102,1105,1108,1111,1114,1117,1120,1122,1124],{"class":54,"line":386},[52,1098,1099],{"class":71},"        folder_name ",[52,1101,76],{"class":75},[52,1103,1104],{"class":71}," sys.argv[",[52,1106,1107],{"class":92},"2",[52,1109,1110],{"class":71},"].split(",[52,1112,1113],{"class":79},"'\u002F'",[52,1115,1116],{"class":71},")[",[52,1118,1119],{"class":75},"-",[52,1121,328],{"class":92},[52,1123,343],{"class":71},[52,1125,1126],{"class":58},"# Get the last name in the path\n",[52,1128,1129],{"class":54,"line":406},[52,1130,1131],{"class":71},"        config.add_section(folder_name)\n",[52,1133,1134,1137,1140,1142,1145],{"class":54,"line":420},[52,1135,1136],{"class":71},"        config.set(folder_name, ",[52,1138,1139],{"class":79},"'browsable'",[52,1141,1042],{"class":71},[52,1143,1144],{"class":79},"'true'",[52,1146,1065],{"class":71},[52,1148,1149,1151,1154,1156,1159],{"class":54,"line":429},[52,1150,1136],{"class":71},[52,1152,1153],{"class":79},"'read only'",[52,1155,1042],{"class":71},[52,1157,1158],{"class":79},"'false'",[52,1160,1065],{"class":71},[52,1162,1163,1165,1168,1171,1173],{"class":54,"line":443},[52,1164,1136],{"class":71},[52,1166,1167],{"class":79},"'path'",[52,1169,1170],{"class":71},", sys.argv[",[52,1172,1107],{"class":92},[52,1174,1175],{"class":71},"])\n",[52,1177,1178],{"class":54,"line":453},[52,1179,86],{"emptyLinePlaceholder":20},[52,1181,1182],{"class":54,"line":458},[52,1183,1184],{"class":58},"        # Write the new file\n",[52,1186,1187,1190,1192,1195,1197,1199,1202,1204,1207],{"class":54,"line":469},[52,1188,1189],{"class":75},"        with",[52,1191,295],{"class":92},[52,1193,1194],{"class":71},"(",[52,1196,936],{"class":92},[52,1198,1042],{"class":71},[52,1200,1201],{"class":79},"'w+'",[52,1203,319],{"class":71},[52,1205,1206],{"class":75},"as",[52,1208,1209],{"class":71}," configfile:\n",[52,1211,1212],{"class":54,"line":477},[52,1213,1214],{"class":71},"            config.write(configfile)\n",[52,1216,1217],{"class":54,"line":482},[52,1218,86],{"emptyLinePlaceholder":20},[52,1220,1221,1224,1227,1229],{"class":54,"line":495},[52,1222,1223],{"class":92},"        print",[52,1225,1226],{"class":79}," \"Wrote new config to\"",[52,1228,1042],{"class":71},[52,1230,1231],{"class":92},"NEW_FILE\n",[52,1233,1234],{"class":54,"line":521},[52,1235,86],{"emptyLinePlaceholder":20},[52,1237,1238],{"class":54,"line":555},[52,1239,1240],{"class":58},"        # Restart SMBD\n",[52,1242,1243,1245],{"class":54,"line":560},[52,1244,1223],{"class":92},[52,1246,1247],{"class":79}," \"Restarting smbd...\"\n",[52,1249,1250,1253,1255,1258,1261,1264],{"class":54,"line":593},[52,1251,1252],{"class":71},"        result ",[52,1254,76],{"class":75},[52,1256,1257],{"class":71}," os.popen(",[52,1259,1260],{"class":79},"'service smbd restart'",[52,1262,1263],{"class":71},").read() ",[52,1265,1266],{"class":58},"# Try to restart Samba\n",[52,1268,1269],{"class":54,"line":598},[52,1270,86],{"emptyLinePlaceholder":20},[52,1272,1274,1276,1278,1281,1283],{"class":54,"line":1273},45,[52,1275,762],{"class":75},[52,1277,704],{"class":71},[52,1279,1280],{"class":79},"'start\u002Frunning'",[52,1282,710],{"class":75},[52,1284,1285],{"class":71}," result):\n",[52,1287,1289,1292],{"class":54,"line":1288},46,[52,1290,1291],{"class":92},"            print",[52,1293,1294],{"class":79}," \"SAMBA sucesfully restarted with the new settings!\"\n",[52,1296,1298,1300],{"class":54,"line":1297},47,[52,1299,784],{"class":75},[52,1301,426],{"class":71},[52,1303,1305,1307],{"class":54,"line":1304},48,[52,1306,1291],{"class":92},[52,1308,1309],{"class":79}," \"nSAMBA restart failed, must be root!\"\n",[52,1311,1313],{"class":54,"line":1312},49,[52,1314,86],{"emptyLinePlaceholder":20},[52,1316,1318,1321,1324],{"class":54,"line":1317},50,[52,1319,1320],{"class":75},"    except",[52,1322,1323],{"class":92}," IndexError",[52,1325,426],{"class":71},[52,1327,1329],{"class":54,"line":1328},51,[52,1330,1331],{"class":75},"        pass\n",[52,1333,1335],{"class":54,"line":1334},52,[52,1336,86],{"emptyLinePlaceholder":20},[52,1338,1340],{"class":54,"line":1339},53,[52,1341,1342],{"class":58},"# List all share sections\n",[52,1344,1346,1349],{"class":54,"line":1345},54,[52,1347,1348],{"class":75},"else",[52,1350,426],{"class":71},[52,1352,1354,1357,1360,1362],{"class":54,"line":1353},55,[52,1355,1356],{"class":75},"    for",[52,1358,1359],{"class":71}," folder ",[52,1361,292],{"class":75},[52,1363,1364],{"class":71}," config.sections():\n",[52,1366,1368,1370,1373],{"class":54,"line":1367},56,[52,1369,1223],{"class":92},[52,1371,1372],{"class":79}," \"Found shared folder\"",[52,1374,1375],{"class":71},", folder\n",[52,1377,1379],{"class":54,"line":1378},57,[52,1380,86],{"emptyLinePlaceholder":20},[52,1382,1384,1386],{"class":54,"line":1383},58,[52,1385,93],{"class":92},[52,1387,1388],{"class":79}," \"END\"\n",[37,1390,1392],{"id":1391},"gparted","GParted",[42,1394,1396],{"className":44,"code":1395,"language":46,"meta":47,"style":47},"#!\u002Fusr\u002Fbin\u002Fpython\n# -*- coding: utf-8 -*-\n__author__ = 'Ando'\n\nimport parted\n\nprint \"Listing disks and partitions on this machine\"\nprint \"\"\n\ndevices = parted.getAllDevices()\n\nfor device in devices:\n    disk = parted.Disk(device)\n\n    print \"* %i GB device '%s'\" % (device.getSize(unit='GB'), device.model)\n    for partition in disk.partitions:\n\n        type = 'Unknown'\n        try:\n            type = partition.fileSystem.type\n        except:\n            pass\n\n        print \"t* 33[95m%i33[0m GB t33[94m%s33[0m 33[91m%s33[0m\" % (partition.getSize(unit='GB'), type, partition.path)\nprint \"END\"\n",[49,1397,1398,1402,1406,1414,1418,1425,1429,1436,1442,1446,1456,1460,1472,1482,1486,1519,1531,1535,1545,1552,1562,1569,1574,1578,1620],{"__ignoreMap":47},[52,1399,1400],{"class":54,"line":55},[52,1401,59],{"class":58},[52,1403,1404],{"class":54,"line":62},[52,1405,65],{"class":58},[52,1407,1408,1410,1412],{"class":54,"line":68},[52,1409,72],{"class":71},[52,1411,76],{"class":75},[52,1413,80],{"class":79},[52,1415,1416],{"class":54,"line":83},[52,1417,86],{"emptyLinePlaceholder":20},[52,1419,1420,1422],{"class":54,"line":89},[52,1421,894],{"class":75},[52,1423,1424],{"class":71}," parted\n",[52,1426,1427],{"class":54,"line":99},[52,1428,86],{"emptyLinePlaceholder":20},[52,1430,1431,1433],{"class":54,"line":104},[52,1432,93],{"class":92},[52,1434,1435],{"class":79}," \"Listing disks and partitions on this machine\"\n",[52,1437,1438,1440],{"class":54,"line":115},[52,1439,93],{"class":92},[52,1441,474],{"class":79},[52,1443,1444],{"class":54,"line":120},[52,1445,86],{"emptyLinePlaceholder":20},[52,1447,1448,1451,1453],{"class":54,"line":143},[52,1449,1450],{"class":71},"devices ",[52,1452,76],{"class":75},[52,1454,1455],{"class":71}," parted.getAllDevices()\n",[52,1457,1458],{"class":54,"line":155},[52,1459,86],{"emptyLinePlaceholder":20},[52,1461,1462,1464,1467,1469],{"class":54,"line":167},[52,1463,286],{"class":75},[52,1465,1466],{"class":71}," device ",[52,1468,292],{"class":75},[52,1470,1471],{"class":71}," devices:\n",[52,1473,1474,1477,1479],{"class":54,"line":178},[52,1475,1476],{"class":71},"    disk ",[52,1478,76],{"class":75},[52,1480,1481],{"class":71}," parted.Disk(device)\n",[52,1483,1484],{"class":54,"line":187},[52,1485,86],{"emptyLinePlaceholder":20},[52,1487,1488,1490,1493,1495,1498,1500,1503,1505,1508,1511,1513,1516],{"class":54,"line":192},[52,1489,563],{"class":92},[52,1491,1492],{"class":79}," \"* ",[52,1494,575],{"class":92},[52,1496,1497],{"class":79}," GB device '",[52,1499,837],{"class":92},[52,1501,1502],{"class":79},"'\"",[52,1504,587],{"class":75},[52,1506,1507],{"class":71}," (device.getSize(",[52,1509,1510],{"class":821},"unit",[52,1512,76],{"class":75},[52,1514,1515],{"class":79},"'GB'",[52,1517,1518],{"class":71},"), device.model)\n",[52,1520,1521,1523,1526,1528],{"class":54,"line":210},[52,1522,1356],{"class":75},[52,1524,1525],{"class":71}," partition ",[52,1527,292],{"class":75},[52,1529,1530],{"class":71}," disk.partitions:\n",[52,1532,1533],{"class":54,"line":222},[52,1534,86],{"emptyLinePlaceholder":20},[52,1536,1537,1540,1542],{"class":54,"line":234},[52,1538,1539],{"class":92},"        type",[52,1541,928],{"class":75},[52,1543,1544],{"class":79}," 'Unknown'\n",[52,1546,1547,1550],{"class":54,"line":244},[52,1548,1549],{"class":75},"        try",[52,1551,426],{"class":71},[52,1553,1554,1557,1559],{"class":54,"line":252},[52,1555,1556],{"class":92},"            type",[52,1558,928],{"class":75},[52,1560,1561],{"class":71}," partition.fileSystem.type\n",[52,1563,1564,1567],{"class":54,"line":257},[52,1565,1566],{"class":75},"        except",[52,1568,426],{"class":71},[52,1570,1571],{"class":54,"line":268},[52,1572,1573],{"class":75},"            pass\n",[52,1575,1576],{"class":54,"line":279},[52,1577,86],{"emptyLinePlaceholder":20},[52,1579,1580,1582,1585,1587,1590,1592,1595,1597,1600,1602,1605,1607,1609,1611,1614,1617],{"class":54,"line":5},[52,1581,1223],{"class":92},[52,1583,1584],{"class":79}," \"t* 33[95m",[52,1586,575],{"class":92},[52,1588,1589],{"class":79},"33[0m GB t33[94m",[52,1591,837],{"class":92},[52,1593,1594],{"class":79},"33[0m 33[91m",[52,1596,837],{"class":92},[52,1598,1599],{"class":79},"33[0m\"",[52,1601,587],{"class":75},[52,1603,1604],{"class":71}," (partition.getSize(",[52,1606,1510],{"class":821},[52,1608,76],{"class":75},[52,1610,1515],{"class":79},[52,1612,1613],{"class":71},"), ",[52,1615,1616],{"class":92},"type",[52,1618,1619],{"class":71},", partition.path)\n",[52,1621,1622,1624],{"class":54,"line":307},[52,1623,93],{"class":92},[52,1625,1388],{"class":79},[1627,1628,1629],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":47,"searchDepth":62,"depth":62,"links":1631},[1632,1633,1634],{"id":39,"depth":62,"text":40},{"id":606,"depth":62,"text":607},{"id":1391,"depth":62,"text":1392},"Learning",null,"2011-07-25","md",{},"\u002F2011\u002Fpovi-paris-pythoni-progremise-paevad","about 2 minutes",{"title":23,"description":30},"2011\u002Fpovi-paris-pythoni-progremise-paevad",497,"HwR2GxBK4YMzf5M7d8VuChvRTERIyIMNac78fxxQN1o",[1647,1651],{"title":1648,"path":1649,"stem":1650,"children":-1},"Tweet","\u002F2011\u002Ftweet","2011\u002Ftweet",{"title":1652,"path":1653,"stem":1654,"children":-1},"Kohana 3.2 Validation Estonian translation","\u002F2011\u002Fkohana-3-2-validation-estonian-translation","2011\u002Fkohana-3-2-validation-estonian-translation",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1656},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1658},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1790886932894]