Meeskond "Tartu rõõm": Difference between revisions

From ICO wiki
Jump to navigationJump to search
Iromanen (talk | contribs)
Sarnus (talk | contribs)
 
(47 intermediate revisions by 5 users not shown)
Line 1: Line 1:
== Liikmed ==
== Liikmed ==
*Inger Romanenko
*Inger Romanenko A31
*Sander Saveli
*Sander Saveli A22
*Sander Arnus
*Sander Arnus A22
*Kalmer Tart
*Kalmer Tart D22
*Kristjan Rõõm
*Kristjan Rõõm A32


==Meie eesmärk intensiivõppe raames==
==Meie eesmärk intensiivõppe raames==
Line 15: Line 15:
=== Esmaspäev 26.03.2012 ===
=== Esmaspäev 26.03.2012 ===
'''Eesmärgid:'''
'''Eesmärgid:'''
* Tutvuda olukorraga
* Tutvuda olukorraga ja tehnoloogiatega
* Kohtuda Ericssoni inimesega
* Kohtuda Ericssoni esindajaga, saada täpne ülevaade ülesandest.
* Otsida lahendusi, kuidas teha kindlaks erinevaid võrguliideseid
* Panna paika algne tegevuskava.


Küsimused Ericssonile:
Küsimused Ericssonile:
*Kuidas teha vahet eop-l ja ethernetil?
* Kuidas teha vahet eop-l ja ethernetil?
*Kui valmis peame tegema?
* Mis tehnoloogiaid kasutada
*Miks peab tegema läbi androidi?
* Miks selline ülesanne?
*etc/interface?
* Kus seda kasutama võidakse hakata?
 
 


'''Edusammud:'''
'''Edusammud:'''
* Leidsime badVPN NCD ning proovime sellega prioritiseerida erinevaid võrguliideseid
* Leidsime badVPN NCD http://code.google.com/p/badvpn/wiki/NCD, nimelise võrguhaldustarkvara ning proovime sellega prioritiseerida erinevaid võrguliideseid.
* Kohtusime Ericssoni inimesega ning arutasime, kuidas oleks võimalik ülesannet lahendada. Peaks määrama prioriteedid ning valima parima võrgu vastavalt prioriteedile. Wifi puhul võiks ühenduda public wifisse ning kui on mitu, proovima erinevaid. Võrgutegevust logitakse. Saime kaasa miniarvuti, G3 internetipulga, bluetooth adapteri, ethernet over powerline jms.
* Kohtusime Ericssoni esindajaga ning saime täpsema ülevaate ülesandest. Peame määrama ühendustele prioriteedid ning valima parima ühenduse liigi vastavalt prioriteedile. Wifi puhul peame ühenduma public wifisse ning kui on mitu erinevat võrku saadaval, proovima erinevaid. Võrgutegevust logitakse.  
 
''Ericssonist saime katsetamiseks kaasa järgneva tehnika :''
* nettop PC FIT-PC2
* 3G EMT mobiilse internetimodemi
* bluetooth adapteri
* ethernet over powerline seadmed


'''Küsimus:''' Kas kasutame enda leitud badVPN NCD-d või kasutame by default olemasolevat Network Manageri?
'''Küsimus:''' Kas kasutame enda leitud badVPN NCD-d või kasutame Linuxis vaikimisi töös olevat Network Manageri?


'''Materjalid badVPN NCD kohta:'''
'''Materjalid badVPN NCD kohta:'''
Line 35: Line 43:
* http://code.google.com/p/badvpn/wiki/Installation
* http://code.google.com/p/badvpn/wiki/Installation


Katsetame virtuaalmasinas. Hetkel suudab NCD switchida kahe etherneti vahel. Kui on prioriteet 1. olemas paneb 1. kui 1. pole paneb 2. Kui siis tuleb 1. tagasi ja 2. kaob paneb jälle 1. AGA kui 1 tuleb tagasi aga 2 ka alles, siis ei pane 1.
Tegime katseid virtualiseeritud keskkonnas. Hetkel suudab NCD prioriteetide alusel ühenduda erinevatesse ethernet liidestega.
 
'''Otsustasime enda leitud lahenduse kasuks, sest badVPN NCD teeb täpselt seda mis meil vaja - ühendub erinevatesse võrkudesse prioriteedide alusel.'''
'''Hetkel tundub, et Network Manageri kasutades peaksime tunduvalt rohkem loogikat ise valmis kirjutama.'''
 
Läksime üle katsetustele päris masinas. Installeerisime nettopi peale Lubuntu Linuxi.
 
 
''Hakkame modifitseerima badVPN-i, et saada tööle ka Wi-Fi ja 3G.''
 
'''Tulemus:''' NCD suudab prioriteedide alusel valida parima ühenduse wifi ja etherneti vahel. Hetkel aga on probleem wifi public võrkudega, nimelt ühendub wifi adapter ainult etteantud võrku. Tuleks kirjutada skript, mis otsib avatud wifi võrke. Alustasime ka mobiilse interneti lahendusega, kuid hetkel tunudb, et NCD seda võimalust ei toeta.
 
====NCD konfiguratsioon====
<source lang="cfm">
 
#
# Example NCD program.
# All interfaces are disabled by default.
# Remove/comment the first line of a process to activate the interface.
#
 
process ethernet1 {
  # Set device.
  var("eth1") dev;
 
  # Wait for device and link.
  net.backend.waitdevice(dev);
  net.up(dev);
  net.backend.waitlink(dev);
 
  # DHCP configuration.
  # net.ipv4.dhcp() will block here until it obtaines an IP address.
  # It doesn't check the obtained address in any way,
  # so as a basic security measure, do not proceed if it is local.
  net.ipv4.dhcp(dev) dhcp;
  ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
  ifnot(test_local);
  var(dhcp.addr) addr;
  var(dhcp.prefix) addr_prefix;
  var(dhcp.gateway) gateway;
  var(dhcp.dns_servers) dns_servers;
 
  # Static configuration.
  # To use, comment/remove the DHCP configuration above and uncomment this.
  #var("192.168.111.116") addr;
  #var("24") addr_prefix;
  #var("192.168.111.1") gateway;
  #list("192.168.111.14", "193.2.1.66") dns_servers;
 
  # Assign IP address.
  net.ipv4.addr(dev, addr, addr_prefix);
 
  # Go on configuring the network.
  multiprovide("NET-ethernet");
}


Avastasime, et olime valesti manuali lugenud ning kood oli vigane.  
process eop  {
Nüüd parandasime ära vea ning saime veast lahti. Kui tuleb 1. prioriteet tagasi võtab selle üle.
  # Set device.
  var("eth2") dev;


'''Otsustasime enda leitud lahenduse kasuks, sest on juba osa koodist tehtud ning saab seda muuta enda soovide järgi.'''
  # Wait for device.
'''Network Manageriga peaks kõik nullist tegema ning seda varianti tegi ka ericcsoni inimene, seega meie lahendus tundus meile huvitavam.''' Network Manageri panime kinni, et see ei segaks.
  net.backend.waitdevice(dev);
  net.up(dev);
  net.backend.waitlink(dev);


Proovisime installeerida arvutisse Ubuntu, kuid lõpuks jäime ikkagi Lubuntu juurde, mis juba oli olemas. Proovime päris arvutis teha seda, mis tegime virtuaalmasinas.
  # DHCP configuration.
  # net.ipv4.dhcp() will block here until it obtaines an IP address.
  # It doesn't check the obtained address in any way,
  # so as a basic security measure, do not proceed if it is local.
  net.ipv4.dhcp(dev) dhcp;
  ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
  ifnot(test_local);
  var(dhcp.addr) addr;
  var(dhcp.prefix) addr_prefix;
  var(dhcp.gateway) gateway;
  var(dhcp.dns_servers) dns_servers;


Hakkame modifitseerima badVPN-i, et saada tööle ka wifi ja 3G.
  # Assign IP address.
  net.ipv4.addr(dev, addr, addr_prefix);


'''Tulemus:''' Saime tööle Wifi ning kui tekib Ethernet vahetab selleks ümber. Hetkel aga on probleem public võrkudega, sest ühendub ainult etteantud võrku. Samuti oleme alustanud 3G-ga, kuid hetkel see konfliktib NCD-ga ja vajab eraldi konfi.
  # Go on configuring the network.
  multiprovide("NET-eop");
}
 
 
process pp {
  # Set device.
  var("ppp0") dev;
 
  # Wait for device.
  net.backend.waitdevice(dev);
  net.up(dev);
  net.backend.waitlink(dev);
 
  # DHCP configuration.
  # net.ipv4.dhcp() will block here until it obtaines an IP address.
  # It doesn't check the obtained address in any way,
  # so as a basic security measure, do not proceed if it is local.
  net.ipv4.dhcp(dev) dhcp;
  ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
  ifnot(test_local);
  #var(dhcp.addr) addr;
  #var(dhcp.prefix) addr_prefix;
  #var(dhcp.gateway) gateway;
  #var(dhcp.dns_servers) dns_servers;
 
  # Assign IP address.
  #net.ipv4.addr(dev, addr, addr_prefix);
 
  # Go on configuring the network.
  multiprovide("NET-pp");
}
 
 
 
process wlan {
 
  # Set device.
  var("wlan1") dev;
 
  # Wait for device and rfkill.
  net.backend.waitdevice(dev);
  net.backend.rfkill("wlan", dev);
 
  # Connect to wireless network.
  list() args;
  net.backend.wpa_supplicant(dev, "/etc/wpa_supplicant/all.conf", "/sbin/wpa_supplicant", args);
 
  # DHCP configuration. See above for static configuration.
  net.ipv4.dhcp(dev) dhcp;
  ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
  ifnot(test_local);
  var(dhcp.addr) addr;
  var(dhcp.prefix) addr_prefix;
  var(dhcp.gateway) gateway;
  var(dhcp.dns_servers) dns_servers;
 
  # Assign IP address to interface.
  net.ipv4.addr(dev, addr, addr_prefix);
 
  # Go on configuring the network.
  multiprovide("NET-wlan");
}
 
process NETCONF {
  # Wait for some network connection. Order by priority.
  list("NET-wlan", "NET-eop", "NET-pp", "NET-ethernet") pnames;
  multidepend(pnames) ifdep;
 
  #if(pnames == "NET-pp")
 
  var(ifdep.dev) dev;
  var(ifdep.addr) addr;
  var(ifdep.addr_prefix) addr_prefix;
  var(ifdep.gateway) gateway;
  var(ifdep.dns_servers) dns_servers;
 
  # Add default route.
  net.ipv4.route("0.0.0.0", "0", gateway, "20", dev);
 
  # Configure DNS servers.
  net.dns(dns_servers, "20");
}
 
</source>


===Teisipäev 27.03.2012===
===Teisipäev 27.03.2012===


'''Eesmärgid:'''  
'''Eesmärgid:'''  
*Saada valmis prioritiseerimine
* Saada valmis prioritiseerimine
*Saada tööle 3G
* Kirjutada skript, mis otsiks avatud wifi võrke
*Alustada logimisega ning androidiga
* Saada tööle 3G
* Alustada logimisega ning androidi rakenduse kirjutamisega.
 
'''Hakkame lähemalt uurima Network Manageri alternatiivina, sest badVPN-il NCD ja 3G konfiguratsioonid satuvad konflikti, mis teeb 3G ühenduse initsialiseerimise keerukaks.'''
 
Selgus lõplikult, et NCD-ga ei õnnestu meil töötavat 3G-ga funktsionaalsust luua.
Hakkasime ülesannet lahendama linuxi '''Network Manageri''' abil.
Network Manageris toimib vaikimisi võrkude prioritiseerimine, esialgu tundub et ei ole võimalik ise prioriteete määrata, ilma source koodi muutmata.
 
''Hakkame uurima erinevaid võimalusi kuidas võrke Network manageriga prioritiseerida''
Network Manageril on sisseehitatud kindlad prioriteedid ja selle raames toimib kõik väga hästi, aga probleem tekib sellestm et Network Manageris ei saa muuta prioriteete.
 
'''Lahendus: hakkasime meetrikute alusel prioritiseerima routing tables erinevate ühenduste default route, mille tulemusena saame luua ühenduste prioriteetide järjekorra.'''
 
Kirjutasime iga Interfacei üles ja allaminemise korral skriptid, mis lisavad ja kustutavad vastava default gateway ja metricuga routi IP route tabelist.
Default gateway saame kätte Network Manageri käsurea tööriista - '''nmcli''' päringu kaudu. Nmcli on kõige kiirem võimalus, sest kliendi poole pealt küsib DHCP infot Network Manager.
 
====IF UP skript====
 
<source lang="bash">
 
#!/bin/bash
 
 
 
if [ "$IFACE" = "eth1" ]; then
ADR=$(nmcli dev list iface eth1 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev eth1 metric 5
fi;
if [ "$IFACE" = "eth2" ]; then
ADR=$(nmcli dev list iface eth2 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev eth2 metric 2
fi;
if [ "$IFACE" = "wlan1" ]; then
ADR=$(nmcli dev list iface wlan1 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev wlan1 metric 3
fi;
if [ "$IFACE" = "ppp0" ]; then
ADR=$(nmcli dev list iface ttyUSB0 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev ppp0 metric 6
fi;
</source>
 
==== IF DOWN skript====
<source lang="bash">
if [ "$IFACE" = "eth1" ]; then
sleep 3
ip route del default
fi;
if [ "$IFACE" = "eth2" ]; then
sleep 3
ip route del default
fi;
 
</source>


Hakkame uurima Network Manageri alternatiivvariandina, sest badVPN-il NCD ja 3G konfiguratsioonid võivad sattuda konflikti.


Selgus, et NCD-ga ei õnnestu meil ikkagi teha ülesannet, sest 3G-ga on keeruline funktsionaalsust luua.
Võtsime kasutusele nm, millel algselt toimib prioritiwseerimne väga hästi, ainuke probleem on, et ei ole võimalik ise prioriteete määrata.


Kalmer hakkab tegema androidi bluetooth ühendust (javas), et saaks ühendada telefoni ja arvuti vahel.


Tegime skripti wifi jaoks, mis otsib kõik avalikud wifi võrgud, mis on läheduses ja koostab nende kohta individuaalfailid mida kasutab Network Maganager võrkudesse automaatseks ühendamiseks.
''Kalmer hakkab uurima võimalusi kuidas teha androidi rakendust, millega saaks ühenduda bluetoothiga arvutiga ning konfigureerida võrgu prioriteete.''


===WiFi skript===


Tegime skripti wifi jaoks, mis otsib kõik avalikud wifi võrgud, mis on läheduses ja koostab nende kohta individuaalfailid mida kasutab Network Maganager võrkudesse automaatseks ühendamiseks.
==== Avalike wifi võrkude otsimise skript ====
<source lang="bash">
<source lang="bash">
<source lang="bash">
#!/bin/bash
#!/bin/bash
Line 80: Line 297:
if [ $UID -ne 0  ]
if [ $UID -ne 0  ]
then
then
    echo "K2ivita skript $(basename $0) juurkasutaja 6igustes"
  echo "K2ivita skript $(basename $0) juurkasutaja 6igustes"
exit 1
exit 1
fi
fi
#Suvaline arv UUID lõppu
I=18290


#Leiame arvuti wlan seadme mac aadressi
#Leiame arvuti wlan seadme mac aadressi
MAC=$(ifconfig | grep wlan | cut -d " " -f10)
MAC=$(ifconfig | grep wlan | cut -d " " -f10)
echo $MAC
echo "Arvuti mac: $MAC"


# Otsime avalikud võrgud
# Otsime avalikud võrgud
for line in $(nmcli -p dev wifi | grep [--] | grep s | cut -d "'" -f2); do
for line in $(nmcli -p dev wifi | grep "\-\-" | grep s | cut -d "'" -f2); do
    SSID=$line
      SSID=$line
    echo $SSID


    # Loome igale access pointile ssid faili
  #Suvaline arv UUID
    touch /etc/NetworkManager/system-connections/$SSID
  HEX="0123456789abcdef"
  BEGIN=$( for i in {1..8} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
  KAKS=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
  KOLM=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
  NELI=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
  END=$( for i in {1..12} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
  UUID="$BEGIN-$KAKS-$KOLM-$NELI-$END"


    I=$(($I+1))
  echo "SSID: $SSID"
 
      # Loome igale access pointile ssid faili
      touch /etc/NetworkManager/system-connections/$SSID


cat > /etc/NetworkManager/system-connections/$SSID << LOPP
cat > /etc/NetworkManager/system-connections/$SSID << LOPP
Line 105: Line 327:
[connection]
[connection]
id=$SSID
id=$SSID
uuid=76e42b6b-a79d-4e7d-bd27-5d19f54$I
uuid=$UUID
type=802-11-wireless
type=802-11-wireless


Line 121: Line 343:
LOPP
LOPP


    chmod 600 /etc/NetworkManager/system-connections/$SSID
      chmod 600 /etc/NetworkManager/system-connections/$SSID


done
done


service network-manager restart
#service network-manager restart
 
</source>
 
===Kolmapäev 28.03.2012===
 
'''Eesmärgid:'''
* Saada tööle 3G prioritiseerimine
* arendada Androidi rakendust
* Teha logimine
* Korrastada dokumentatsioon
* Valmistuda presentatsiooniks
 
'''Probleem'''
Vaikimisi 3G ühendus ei tule ise ülesse. Oleks vaja teada kuhu ja millal USB modem ühendatakse, Lisaks selle oleks vaja automaatlselt luua ühendus, mille alusel saaks kätte default gateway ning saaks teha sissekirjutuse routing tabelisse.
 
'''Lahendus'''
 
Lisasime /lib/udev/rules.d/40-usb_modeswitch.rules faili RUN käsu järele skripti, mis vastava mudeli USB modemi korral initsialiseerib ühenduse.
 
==== Mobiilse internetiühenduse automaatse loomise skript====
 
<source lang="bash">
#!/bin/bash
export LC_ALL=C
 
sleep 30
nmcli con up id "EMT Default"
sleep 2
usb_modeswitch '%b/%k'
</source>
</source>


Nüüd on vaja luua prioritiseerimine vastavalt meie vajadusele.
====Loggimise skript====
Network Manageril on sisseehitatud kindlad prioriteedid ja selle raames toimib kõik väga hästi, aga probleem tekib sellestm et Network Manageris ei saa muuta prioriteete.
<source lang="bash">
DATE=$(date +%Y-%m-%d)
mkdir /var/log/nm
less /var/log/syslog | grep NetworkManager > /var/log/nm/nmlog$DATE.txt
</source>
 
 
 


Leidsime Kristjan Kaldre abiga lahenduse: hakkasime meetrikute alusel määrama routing tables default gatewaysid, mille tulemusena saime prioritiseerida võrguühendused.


Probleem, mis tekkis oli see, et Network Manager hakkas ise oma tahtmist mööda käituma, kuid lahendasime probleemi Network Manageri skriptidega.
Millegi pärast, peale arvuti restarti ei tule eth2 kohe üles. Lahendasime probleemi skriptiga, msi teeb interfacile restardi.


===Kolmapäev 28.03.2012===
===Neljapäev 29.03.2012===


'''Eesmärgid:'''
'''Eesmärgid:'''
* Teha bluetooth ühendus
* luua ping test
* arendada Androidi rakendust
* Teha logimine
* Teha logimine
* Korrastada dokumentatsioon
* Korrastada dokumentatsioon
* Valmistuda presentatsiooniks
* Valmistuda presentatsiooniks
Kuna ühendus võib olla üleval, kuid sidet internetiga pole, otsustasime teha skripti , mis pingi kaudu kontrollib internetiühendust.
Pingitakse kõige madalama metricuga default gatewayd, ehk gatewayd, mida kasutatakse. Kui ping ei vasta, suurendatakse merticut 10 võrra, 30min pärast tehakse interfacile restart ning interface tuleb esialge metricuga tagasi, mille peale käivitatske ping test.
====Ping test skript====
<source lang= "bash">
#!/bin/bash
#/etc/nmskript/pingtest.sh
export LC_ALL=C
# Lõputu tsükkel
while [ true ]; do
  echo "while algus"
      #Kui ping õnnestub siis magab 5min (hetkel 5s)
      PACKETS=$(ping -c 5 8.8.8.8 | grep packets | cut -d " " -f4)
      sleep 5
      echo “$PACKETS pakki läks läbi”
      #Kui üle kolme paki viiest läks läbi, siis magab
      if [ $PACKETS -gt 3 ]; then
          echo "Ping t66tab, magan 10s"
          sleep 10
      #Kui ping ei toimi võtab muutujad, kustutab rea, annab esimesele suurema meetriku
      else
             
          IFACE=$(ip route | grep default | grep metric | head -n 1 | cut -d " " -f5)
        echo "$IFACE ping ei toimi!"
          METER=$(ip route | grep default | grep metric | head -n 1 | cut -d " " -f8)
          METER=$(($METER + 10))
          ADR=$(nmcli dev list iface $IFACE | grep GATEWAY | cut -d " " -f20)
          ip route del default
        sleep 1
          ip route add default via $ADR dev $IFACE metric $METER
              sleep 10         
      fi
done
</source>
Androidi rakenduse arendamine jääb hetkel seisma, kuna pole piisavalt aega ega teadmisi.
==Arvamus==
===Sander Saveli===
Üldiselt loen intensiivõppe nädalat enda jaoks korda läinuks. Väga huvitava kogemuse andis reaalse projekti juures kindla tiimiga töötamine, kus ajakava oli kindlalt määratud. Kuna ajakava oli tihe ja tööd palju, pidid kõik tiimi liikmeid kandma vastavalt vajadusele erinevaid rolle, näiteks polnud võimalik, et keegi tegeleks ainult skriptimisega ning keegi ainut routing tableiga. Korraldusliku poole pealt soovitan kindlasti iga tiimi juurde kohe algusest peale saata tuutori, kellel oleks teadmisi ja aega tiimiga tegeleda. Ilma tuutorita pole sageli piisavat ülevaadet ning liiga palju aega kulub erinevate tehnoloogiate googeldamisele ning arusaamisele, kuhu nad süsteemis positsioneeruksid ning kuidas süsteemi mõjutaksid. Koostöö Ericssoniga loen väga sujuvaks - leiti aega meile isiklikult ülesanne ära seletada, tagati tööks vajalik tehnika, anti võimalus terve tööprotsessi jooksul neilt küsida täiendavaid küsimusi ning oldi valmis ka näljaste tudengite mõttetööd pitsaga toetama. Mulle tegi erilist rõõmu, et lõpuks suutmise valmis teha reaalselt töötava lahenduse.
===Kristjan Rõõm===
Intensiivõppe nädal oli huvitav ning asjalik kogemus. Korraldus oli suhtelist hea, kuigi vahepeal tuli juhendajatest puudus. Peamiselt sai uuritud Network Manageri käitumist ning võrguühenduste prioritiseerimist. Lisaks sai rakendada ka skriptimisoskust. Palju teadmisi kogunes linuxi (Ubuntu) võrguühenduste kohta (kaustad, kust automaatselt skripte käivitatakse ning ühenduste konfigureeimisfailid). Kasulik kogemus ja pitsa maitses hästi.
===Sander Arnus===
Intensiivõppe nädal oli kokkuvõttes huvitav kogemus. Õppisin palju uut ja kordasin juba õpitut, näiteks Network Manageris wifi seadistamist ja bash skriptide kirjutamist. Ürituse puhul oleks võinud igal meeskonnal olla mentor, kes antud teemast rohkem teab ja aitab juhtida lahendust õiges suunas. Esialgu meie meeskonnal mentorit ei olnud ja tänu sellele läks üks päev tehnoloogia õppimiseks, mida lõpuks ei kasutanud.
Nädal on ühe projekti jaoks lühike aeg ja isiklikult ei saa lõpplahendusega täiesti rahul olla. Palju oleks veel teha. Kokkuvõttes oli üritus igati kasulik ja soovitan sellest kõigil osa võtta.
===Inger Romanenko===
Intensiivõppenädalal osalemist soovitasid mulle kursusekaaslased, kes eelmisel aastal osa võtsid. Nädala jooksul sai proovile panna enda vastupidavust, sest koolis veetsime esimestel päevadel pea 12 tundi. Sain juurde uusi teadmisi ning kindlasti palju meeskonnatöö kogemust. Korralduse koha pealt paistis alguses, et inimesed ei olnud enne intensiivõppenädalat üldse ülesannetega tutvunud ning mul oli väike kahtlus, kuidas nad siis ülesannetega valmis jõuavad, kuid esitluste päeval nägin, et kõik tiimid olid teinud head tööd :) Jäin intensiivõppenädalaga rahule ja soovitan seda teistelegi.
===Kalmer Tart===
Intensiivõppe nädal oli huvitav, sai tegeleda reaalse projektiga, mille käigus oli võimalik varasemalt õpitu proovile panna ja sai juurde palju uusi teadmisi. Tutvusin Network Manageri võrkude prioritiseerimisega ning sain palju uusi teadmisi skriptimisest, ühtlasi tutvusin Androidi rakenduste arendamise võimalustega. Korraldusega võis rahule jääda, kuigi meeskonnal oleks võinud algusest peale olla konkreetne juhendaja.

Latest revision as of 11:34, 17 April 2012

Liikmed

  • Inger Romanenko A31
  • Sander Saveli A22
  • Sander Arnus A22
  • Kalmer Tart D22
  • Kristjan Rõõm A32

Meie eesmärk intensiivõppe raames

Automaatne võrguühenduste konfigureerimine erinevate võrkudega

Konfigureerida arvuti, millel on 3G, Wifi, Ethernet-over-Powerline ja Etherneti pordid ning mille operatsioonisüsteemiks on Ubuntu Linux. Võrguühendust vahetataks ühenduse olemasolu ja prioriteetide alusel üle erinevate tehnoloogiate võimalikult lihtsalt ja kiirelt. IP aadress ei pea samaks jääma. Wifi adapter valib ise parima avaliku võrgu, kui ei ole konfigureeritud teisiti. Kui Wifi ühendus kaob, proovib teisi ka taustal. Kõik ümberlülitamised logitakse. Näiteks: Prioriteetideks on Ethernet:1; EoP:2; Wifi:3; 3G:4. Ühendatakse kõikidesse võimalikesse võrkudesse ning kui Ethernet ära kukub ning pole võimalik ühenduda ka läbi EoP, toimub ühenduse ümberlülitamine Wifi võrku. Kui Wifi ära kukub, siis ühendutakse 3G võrku. Kui tuleb suvaline public wifi tagasi, ühendutakse sinna jne. Luua lihtne kasutajaliides Android telefonile, mis lubab üle bluetooth ühenduse erinevaid võrke ja prioriteete konfigureerida ning vaadata ühenduste ajalugu.

Ajakava/progress

Esmaspäev 26.03.2012

Eesmärgid:

  • Tutvuda olukorraga ja tehnoloogiatega
  • Kohtuda Ericssoni esindajaga, saada täpne ülevaade ülesandest.
  • Panna paika algne tegevuskava.

Küsimused Ericssonile:

  • Kuidas teha vahet eop-l ja ethernetil?
  • Mis tehnoloogiaid kasutada
  • Miks selline ülesanne?
  • Kus seda kasutama võidakse hakata?


Edusammud:

  • Leidsime badVPN NCD http://code.google.com/p/badvpn/wiki/NCD, nimelise võrguhaldustarkvara ning proovime sellega prioritiseerida erinevaid võrguliideseid.
  • Kohtusime Ericssoni esindajaga ning saime täpsema ülevaate ülesandest. Peame määrama ühendustele prioriteedid ning valima parima ühenduse liigi vastavalt prioriteedile. Wifi puhul peame ühenduma public wifisse ning kui on mitu erinevat võrku saadaval, proovima erinevaid. Võrgutegevust logitakse.

Ericssonist saime katsetamiseks kaasa järgneva tehnika :

  • nettop PC FIT-PC2
  • 3G EMT mobiilse internetimodemi
  • bluetooth adapteri
  • ethernet over powerline seadmed

Küsimus: Kas kasutame enda leitud badVPN NCD-d või kasutame Linuxis vaikimisi töös olevat Network Manageri?

Materjalid badVPN NCD kohta:

Tegime katseid virtualiseeritud keskkonnas. Hetkel suudab NCD prioriteetide alusel ühenduda erinevatesse ethernet liidestega.

Otsustasime enda leitud lahenduse kasuks, sest badVPN NCD teeb täpselt seda mis meil vaja - ühendub erinevatesse võrkudesse prioriteedide alusel. Hetkel tundub, et Network Manageri kasutades peaksime tunduvalt rohkem loogikat ise valmis kirjutama.

Läksime üle katsetustele päris masinas. Installeerisime nettopi peale Lubuntu Linuxi.


Hakkame modifitseerima badVPN-i, et saada tööle ka Wi-Fi ja 3G.

Tulemus: NCD suudab prioriteedide alusel valida parima ühenduse wifi ja etherneti vahel. Hetkel aga on probleem wifi public võrkudega, nimelt ühendub wifi adapter ainult etteantud võrku. Tuleks kirjutada skript, mis otsib avatud wifi võrke. Alustasime ka mobiilse interneti lahendusega, kuid hetkel tunudb, et NCD seda võimalust ei toeta.

NCD konfiguratsioon

#
# Example NCD program.
# All interfaces are disabled by default.
# Remove/comment the first line of a process to activate the interface.
#

process ethernet1 {
   # Set device.
   var("eth1") dev;

   # Wait for device and link.
   net.backend.waitdevice(dev);
   net.up(dev);
   net.backend.waitlink(dev);

   # DHCP configuration.
   # net.ipv4.dhcp() will block here until it obtaines an IP address.
   # It doesn't check the obtained address in any way,
   # so as a basic security measure, do not proceed if it is local.
   net.ipv4.dhcp(dev) dhcp;
   ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
   ifnot(test_local);
   var(dhcp.addr) addr;
   var(dhcp.prefix) addr_prefix;
   var(dhcp.gateway) gateway;
   var(dhcp.dns_servers) dns_servers;

   # Static configuration.
   # To use, comment/remove the DHCP configuration above and uncomment this.
   #var("192.168.111.116") addr;
   #var("24") addr_prefix;
   #var("192.168.111.1") gateway;
   #list("192.168.111.14", "193.2.1.66") dns_servers;

   # Assign IP address.
   net.ipv4.addr(dev, addr, addr_prefix);

   # Go on configuring the network.
   multiprovide("NET-ethernet");
}

process eop  {
   # Set device.
   var("eth2") dev;

   # Wait for device.
   net.backend.waitdevice(dev);
   net.up(dev);
   net.backend.waitlink(dev);

   # DHCP configuration.
   # net.ipv4.dhcp() will block here until it obtaines an IP address.
   # It doesn't check the obtained address in any way,
   # so as a basic security measure, do not proceed if it is local.
   net.ipv4.dhcp(dev) dhcp;
   ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
   ifnot(test_local);
   var(dhcp.addr) addr;
   var(dhcp.prefix) addr_prefix;
   var(dhcp.gateway) gateway;
   var(dhcp.dns_servers) dns_servers;

   # Assign IP address.
   net.ipv4.addr(dev, addr, addr_prefix);

   # Go on configuring the network.
   multiprovide("NET-eop");
}


process pp {
   # Set device.
   var("ppp0") dev;

   # Wait for device.
   net.backend.waitdevice(dev);
   net.up(dev);
   net.backend.waitlink(dev);

   # DHCP configuration.
   # net.ipv4.dhcp() will block here until it obtaines an IP address.
   # It doesn't check the obtained address in any way,
   # so as a basic security measure, do not proceed if it is local.
   net.ipv4.dhcp(dev) dhcp;
   ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
   ifnot(test_local);
   #var(dhcp.addr) addr;
   #var(dhcp.prefix) addr_prefix;
   #var(dhcp.gateway) gateway;
   #var(dhcp.dns_servers) dns_servers;

   # Assign IP address.
   #net.ipv4.addr(dev, addr, addr_prefix);

   # Go on configuring the network.
   multiprovide("NET-pp");
}



process wlan {

   # Set device.
   var("wlan1") dev;

   # Wait for device and rfkill.
   net.backend.waitdevice(dev);
   net.backend.rfkill("wlan", dev);

   # Connect to wireless network.
   list() args;
   net.backend.wpa_supplicant(dev, "/etc/wpa_supplicant/all.conf", "/sbin/wpa_supplicant", args);

   # DHCP configuration. See above for static configuration.
   net.ipv4.dhcp(dev) dhcp;
   ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
   ifnot(test_local);
   var(dhcp.addr) addr;
   var(dhcp.prefix) addr_prefix;
   var(dhcp.gateway) gateway;
   var(dhcp.dns_servers) dns_servers;

   # Assign IP address to interface.
   net.ipv4.addr(dev, addr, addr_prefix);

   # Go on configuring the network.
   multiprovide("NET-wlan");
}

process NETCONF {
   # Wait for some network connection. Order by priority.
   list("NET-wlan", "NET-eop", "NET-pp", "NET-ethernet") pnames;
   multidepend(pnames) ifdep;
   
   #if(pnames == "NET-pp")
   
   var(ifdep.dev) dev;
   var(ifdep.addr) addr;
   var(ifdep.addr_prefix) addr_prefix;
   var(ifdep.gateway) gateway;
   var(ifdep.dns_servers) dns_servers;

   # Add default route.
   net.ipv4.route("0.0.0.0", "0", gateway, "20", dev);

   # Configure DNS servers.
   net.dns(dns_servers, "20");
}

Teisipäev 27.03.2012

Eesmärgid:

  • Saada valmis prioritiseerimine
  • Kirjutada skript, mis otsiks avatud wifi võrke
  • Saada tööle 3G
  • Alustada logimisega ning androidi rakenduse kirjutamisega.

Hakkame lähemalt uurima Network Manageri alternatiivina, sest badVPN-il NCD ja 3G konfiguratsioonid satuvad konflikti, mis teeb 3G ühenduse initsialiseerimise keerukaks.

Selgus lõplikult, et NCD-ga ei õnnestu meil töötavat 3G-ga funktsionaalsust luua. Hakkasime ülesannet lahendama linuxi Network Manageri abil. Network Manageris toimib vaikimisi võrkude prioritiseerimine, esialgu tundub et ei ole võimalik ise prioriteete määrata, ilma source koodi muutmata.

Hakkame uurima erinevaid võimalusi kuidas võrke Network manageriga prioritiseerida Network Manageril on sisseehitatud kindlad prioriteedid ja selle raames toimib kõik väga hästi, aga probleem tekib sellestm et Network Manageris ei saa muuta prioriteete.

Lahendus: hakkasime meetrikute alusel prioritiseerima routing tables erinevate ühenduste default route, mille tulemusena saame luua ühenduste prioriteetide järjekorra.

Kirjutasime iga Interfacei üles ja allaminemise korral skriptid, mis lisavad ja kustutavad vastava default gateway ja metricuga routi IP route tabelist. Default gateway saame kätte Network Manageri käsurea tööriista - nmcli päringu kaudu. Nmcli on kõige kiirem võimalus, sest kliendi poole pealt küsib DHCP infot Network Manager.

IF UP skript

#!/bin/bash



if [ "$IFACE" = "eth1" ]; then
ADR=$(nmcli dev list iface eth1 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev eth1 metric 5
fi;
if [ "$IFACE" = "eth2" ]; then
ADR=$(nmcli dev list iface eth2 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev eth2 metric 2
fi;
if [ "$IFACE" = "wlan1" ]; then
ADR=$(nmcli dev list iface wlan1 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev wlan1 metric 3
fi;
if [ "$IFACE" = "ppp0" ]; then
ADR=$(nmcli dev list iface ttyUSB0 | grep GATEWAY | cut -d " " -f20)
ip route del default
ip route add default via $ADR dev ppp0 metric 6
fi;

IF DOWN skript

if [ "$IFACE" = "eth1" ]; then
sleep 3
ip route del default
fi;
if [ "$IFACE" = "eth2" ]; then
sleep 3
ip route del default
fi;



Kalmer hakkab uurima võimalusi kuidas teha androidi rakendust, millega saaks ühenduda bluetoothiga arvutiga ning konfigureerida võrgu prioriteete.


Tegime skripti wifi jaoks, mis otsib kõik avalikud wifi võrgud, mis on läheduses ja koostab nende kohta individuaalfailid mida kasutab Network Maganager võrkudesse automaatseks ühendamiseks.

Avalike wifi võrkude otsimise skript

<source lang="bash">
#!/bin/bash
# Autor: Tartu Rõõm
# Kirjeldus, mida skript teeb
##
# Versioon 1.0

# Kontrollib kas juurkasutajana k2ivitati skript
export LC_ALL=C


if [ $UID -ne 0  ]
then
  echo "K2ivita skript $(basename $0) juurkasutaja 6igustes"
exit 1
fi

#Leiame arvuti wlan seadme mac aadressi
MAC=$(ifconfig | grep wlan | cut -d " " -f10)
echo "Arvuti mac: $MAC"

# Otsime avalikud võrgud
for line in $(nmcli -p dev wifi | grep "\-\-" | grep s | cut -d "'" -f2); do
      SSID=$line

   #Suvaline arv UUID
   HEX="0123456789abcdef"
   BEGIN=$( for i in {1..8} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
   KAKS=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
   KOLM=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
   NELI=$( for i in {1..4} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
   END=$( for i in {1..12} ; do echo -n ${HEX:$(( $RANDOM % 16 )):1} ; done )
   UUID="$BEGIN-$KAKS-$KOLM-$NELI-$END"

   echo "SSID: $SSID"

      # Loome igale access pointile ssid faili
      touch /etc/NetworkManager/system-connections/$SSID

cat > /etc/NetworkManager/system-connections/$SSID << LOPP

[connection]
id=$SSID
uuid=$UUID
type=802-11-wireless

[802-11-wireless]
ssid=$SSID
mode=infrastructure
mac-address=$MAC

[ipv6]
method=auto

[ipv4]
method=auto

LOPP

      chmod 600 /etc/NetworkManager/system-connections/$SSID

done

#service network-manager restart

Kolmapäev 28.03.2012

Eesmärgid:

  • Saada tööle 3G prioritiseerimine
  • arendada Androidi rakendust
  • Teha logimine
  • Korrastada dokumentatsioon
  • Valmistuda presentatsiooniks

Probleem Vaikimisi 3G ühendus ei tule ise ülesse. Oleks vaja teada kuhu ja millal USB modem ühendatakse, Lisaks selle oleks vaja automaatlselt luua ühendus, mille alusel saaks kätte default gateway ning saaks teha sissekirjutuse routing tabelisse.

Lahendus

Lisasime /lib/udev/rules.d/40-usb_modeswitch.rules faili RUN käsu järele skripti, mis vastava mudeli USB modemi korral initsialiseerib ühenduse.

Mobiilse internetiühenduse automaatse loomise skript

#!/bin/bash
export LC_ALL=C

sleep 30
nmcli con up id "EMT Default"
sleep 2
usb_modeswitch '%b/%k'

Loggimise skript

DATE=$(date +%Y-%m-%d)
mkdir /var/log/nm
less /var/log/syslog | grep NetworkManager > /var/log/nm/nmlog$DATE.txt



Millegi pärast, peale arvuti restarti ei tule eth2 kohe üles. Lahendasime probleemi skriptiga, msi teeb interfacile restardi.

Neljapäev 29.03.2012

Eesmärgid:

  • luua ping test
  • arendada Androidi rakendust
  • Teha logimine
  • Korrastada dokumentatsioon
  • Valmistuda presentatsiooniks

Kuna ühendus võib olla üleval, kuid sidet internetiga pole, otsustasime teha skripti , mis pingi kaudu kontrollib internetiühendust. Pingitakse kõige madalama metricuga default gatewayd, ehk gatewayd, mida kasutatakse. Kui ping ei vasta, suurendatakse merticut 10 võrra, 30min pärast tehakse interfacile restart ning interface tuleb esialge metricuga tagasi, mille peale käivitatske ping test.

Ping test skript

#!/bin/bash
#/etc/nmskript/pingtest.sh
export LC_ALL=C
# Lõputu tsükkel
while [ true ]; do
  echo "while algus"

      #Kui ping õnnestub siis magab 5min (hetkel 5s)
      PACKETS=$(ping -c 5 8.8.8.8 | grep packets | cut -d " " -f4)
      sleep 5
      echo $PACKETS pakki läks läbi”
      #Kui üle kolme paki viiest läks läbi, siis magab
      if [ $PACKETS -gt 3 ]; then
          echo "Ping t66tab, magan 10s"
          sleep 10

      #Kui ping ei toimi võtab muutujad, kustutab rea, annab esimesele suurema meetriku
      else
              
           IFACE=$(ip route | grep default | grep metric | head -n 1 | cut -d " " -f5)
         echo "$IFACE ping ei toimi!"
           METER=$(ip route | grep default | grep metric | head -n 1 | cut -d " " -f8)
           METER=$(($METER + 10))
           ADR=$(nmcli dev list iface $IFACE | grep GATEWAY | cut -d " " -f20)
           ip route del default
         sleep 1
           ip route add default via $ADR dev $IFACE metric $METER

              sleep 10          
      fi
done


Androidi rakenduse arendamine jääb hetkel seisma, kuna pole piisavalt aega ega teadmisi.

Arvamus

Sander Saveli

Üldiselt loen intensiivõppe nädalat enda jaoks korda läinuks. Väga huvitava kogemuse andis reaalse projekti juures kindla tiimiga töötamine, kus ajakava oli kindlalt määratud. Kuna ajakava oli tihe ja tööd palju, pidid kõik tiimi liikmeid kandma vastavalt vajadusele erinevaid rolle, näiteks polnud võimalik, et keegi tegeleks ainult skriptimisega ning keegi ainut routing tableiga. Korraldusliku poole pealt soovitan kindlasti iga tiimi juurde kohe algusest peale saata tuutori, kellel oleks teadmisi ja aega tiimiga tegeleda. Ilma tuutorita pole sageli piisavat ülevaadet ning liiga palju aega kulub erinevate tehnoloogiate googeldamisele ning arusaamisele, kuhu nad süsteemis positsioneeruksid ning kuidas süsteemi mõjutaksid. Koostöö Ericssoniga loen väga sujuvaks - leiti aega meile isiklikult ülesanne ära seletada, tagati tööks vajalik tehnika, anti võimalus terve tööprotsessi jooksul neilt küsida täiendavaid küsimusi ning oldi valmis ka näljaste tudengite mõttetööd pitsaga toetama. Mulle tegi erilist rõõmu, et lõpuks suutmise valmis teha reaalselt töötava lahenduse.

Kristjan Rõõm

Intensiivõppe nädal oli huvitav ning asjalik kogemus. Korraldus oli suhtelist hea, kuigi vahepeal tuli juhendajatest puudus. Peamiselt sai uuritud Network Manageri käitumist ning võrguühenduste prioritiseerimist. Lisaks sai rakendada ka skriptimisoskust. Palju teadmisi kogunes linuxi (Ubuntu) võrguühenduste kohta (kaustad, kust automaatselt skripte käivitatakse ning ühenduste konfigureeimisfailid). Kasulik kogemus ja pitsa maitses hästi.

Sander Arnus

Intensiivõppe nädal oli kokkuvõttes huvitav kogemus. Õppisin palju uut ja kordasin juba õpitut, näiteks Network Manageris wifi seadistamist ja bash skriptide kirjutamist. Ürituse puhul oleks võinud igal meeskonnal olla mentor, kes antud teemast rohkem teab ja aitab juhtida lahendust õiges suunas. Esialgu meie meeskonnal mentorit ei olnud ja tänu sellele läks üks päev tehnoloogia õppimiseks, mida lõpuks ei kasutanud. Nädal on ühe projekti jaoks lühike aeg ja isiklikult ei saa lõpplahendusega täiesti rahul olla. Palju oleks veel teha. Kokkuvõttes oli üritus igati kasulik ja soovitan sellest kõigil osa võtta.

Inger Romanenko

Intensiivõppenädalal osalemist soovitasid mulle kursusekaaslased, kes eelmisel aastal osa võtsid. Nädala jooksul sai proovile panna enda vastupidavust, sest koolis veetsime esimestel päevadel pea 12 tundi. Sain juurde uusi teadmisi ning kindlasti palju meeskonnatöö kogemust. Korralduse koha pealt paistis alguses, et inimesed ei olnud enne intensiivõppenädalat üldse ülesannetega tutvunud ning mul oli väike kahtlus, kuidas nad siis ülesannetega valmis jõuavad, kuid esitluste päeval nägin, et kõik tiimid olid teinud head tööd :) Jäin intensiivõppenädalaga rahule ja soovitan seda teistelegi.

Kalmer Tart

Intensiivõppe nädal oli huvitav, sai tegeleda reaalse projektiga, mille käigus oli võimalik varasemalt õpitu proovile panna ja sai juurde palju uusi teadmisi. Tutvusin Network Manageri võrkude prioritiseerimisega ning sain palju uusi teadmisi skriptimisest, ühtlasi tutvusin Androidi rakenduste arendamise võimalustega. Korraldusega võis rahule jääda, kuigi meeskonnal oleks võinud algusest peale olla konkreetne juhendaja.