Zobrazují se příspěvky se štítkemsoftware. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemsoftware. Zobrazit všechny příspěvky

2019-11-11

Jednoduchý proxy server s IPTABLES

Řešil jsem nutnost vytvoření super jednoduchého - jednoúčelového - proxy serveru, kvůli chybějícímu otevření firewallu a jak jinak než urgentnímu požadavku na zprovoznění mimo pracovní dobu.

Použil se na to virtuální stroj s Ubuntu a minimální velikostí. Jako proxy sloužil nástroj iptables, ale dalo by to udělat i s nginx proxy nebo apache2 proxy.

Prvnotní kontrolu prázdných iptables lze provést příkazem 
iptables-save
kde by nemělo být žádné pravidlo

Nejjednodušší je vytvoření skriptu s pravidlem transparentní proxy příkazem
nano natscript.sh

kam přijde text
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination  10.10.10.10:8080
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.10 --dport 8080 -j SNAT --to-source 11.11.11.11


přičemž 10.10.10.10 je cílová adresa, kam se vlastně chceme připojit a 11.11.11.11 je adresa hostitelského serveru, aby se provoz dostal zpátky k odesilateli požadavku. Překlad portu neprobíhá a zůstává na 8080.

Pojďme na to a spustit skript, který založí vytvořená pravidla
sudo chmod +x natscript.sh
sudo ./natscript.sh

Po vykonání tohoto příkazu už bude vidět pravidlo v kontrolním logu s příkazem iptables-save

# Generated by iptables-save v1.6.1
*nat
:PREROUTING ACCEPT
:INPUT ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:8080
-A POSTROUTING -d 10.10.10.10/32 -p tcp -m tcp --dport 8080 -j SNAT --to-source 11.11.11.11
COMMIT
# Generated by iptables-save v1.6.1


Nyní je potřeba uložit tuto konfiguraci permanentně
sudo su root
sudo apt-get install iptables-persistent


případně při změně
recall dpkg-reconfigure iptables-persistent


Nicméně tato konfigurace stále nezůstane zachována při restartu serveru, je potřeba v souboru 
sudo nano /etc/sysctl.conf
odkomentovat řádek 
net.ipv4.ip_forward=1
a uložit

Namísto směřování požadavků na adresu 10.10.10.10:8080/path/file provádíte nyní dotazování adresy 11.11.11.11:8080/path/file se stejným výsledkem.

Pokud si přejete debugovat pravidla při překladu, doporučuji příkaz  tcpdump
sudo tcpdump dst port 8080 or src port 8080

To by bylo vytvoření jednoduchého proxy serveru obcházející chybějící ACL pravidlo na firewallu.

2019-08-19

Klonování Resource Group v Azure

Zadání bylo jednoduché, naklonujte resource group (něco jako složka ve které jsou součástky patřící k sobě v rámci nějakého projektu). První zádrhel je, že na to nemá webový Azure Resource Manager žádné klikátko - taková funkce v rozhraní chybí. Co s tím tedy?

Nejprve jsem našel skript Clone-AzureRMresourceGroup.ps1, který ovšem vyžaduje vypnutí původní infrastruktury, což je i v předprodukčním prostředí poněkud nechtěná vlastnost a nápad opustil.

Dalším pokusem bylo znovu zkopírování RG pomocí ARM template, kterou umí Azure RM ve webovém rozhraní snadno vyexportovat. Dokonce mnoho ostatních uživatelů jde touto cestou. Zádrhel je ve velikosti RG, kterou kopírujete. Jeden virtuální server s příslušenství asi jde, ale jakmile byl zahrnut Availability Set či Load Balancer, vytváří se ve schématech kruhové závislosti přes položku dependsOn a vůbec se konfigurační soubory nedají zrecyklovat pro nový i když identický deployment. 

Co se děje v template.json a parameters.json? Čekali byste, že všechno co se nastavuje bude v parameterech a v template jenom schéma, ale ono ne! Některé položky jsou po exportování v template natvrdo zapsané, typicky třeba lokalita, takže změnou parametrů se dostanou do schématu ještě větší zmatky. Další unikátní zdroje jako IP adresy či DNS názvy najdete v template.json také, což je samozřejmě špatně, pokud nevytváříte identickou RG znovu po smazání té předchozí, ale chcete klonovat.


Taktéž se mi celý template v jednom kuse nechtěl ani po úpravách nasadit do Azure, protože závislosti jako VM potřebuje IP, kterou chce NIC, ale NIC bez VM nejde apod. Řešením mohlo být vyexportovat jednotlivé šablony a hodnoty samostatně tak, jak byly vytvářeny chronologicky a to přes boční panel Deployments v RG.  Získal jsem tak 25x2 souborů, které bylo nutné ručně projít a zpracovat uvedené hodnoty, které měly navíc všelijaké nehomogenní identifikátory. Šlo by to u pár stupňové implementace, já se ztratil u 4. template z 25.

Takže zpátky k rýsovacími prknu. Dostal jsem povolení udělat odstávku běžících serverů a znovu použil výše zmíněný skript Jeffa Bowa, který asi za 20 minut vytvořil klon běžící RB bez nutnosti do toho nikterak více zasahovat a bez možnosti třeba přejmenovat zdroje v RG obsažené.

Pozor, po dokončení činnosti skriptu je potřeba zkontrolovat, zda-li se zkopírovalo všechno. Application gateway nebo SQL server se mi při použití skriptu nenaklonovaly. Taktéž chyběl diagnostický storage account, ale to zjevně nevadí.

Závěr? Buď si připravte velmi detailně ARM šablonu, zejména v případě, že budete RG vytvářet vícekrát nebo použijte script, ale počítejte s výpadkem.

Poznámka pod čarou: je těžké v česky psaném příspěvku hledat slova, tak aby nebyl text plný anglicismů, ale zároveň aby odborníci věděli o čem je řeč. Deploymnout je krásné, ale v obou jazycích špatně. Nadruhou stranu nad přepínáním a směrováním je třeba se pokaždé zamyslet, co je switching a co routing. Ale to jen tak na okraj...

2019-06-12

Zabbix agent installation

There are many good tutorials how to install Zabbix-agent to Ubuntu machine and how to interconnect it with Zabbix-server. I am adding some notes since I had troubles.

If you do
sudo apt-get install zabbix-agent
You can get error
zabbix-agent : Depends: libcurl4 (>= 7.16.2) but it is not installable
How to fix it?
sudo nano /etc/apt/sources.list
 and append to end following paragraph
###### Ubuntu Main Repos
deb http://us.archive.ubuntu.com/ubuntu/ bionic main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main universe 

###### Ubuntu Update Repos
deb http://us.archive.ubuntu.com/ubuntu/ bionic-security main universe 
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-security main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-updates main universe 
After that just 
sudo apt-get update
It should be ready for install now, so do again
sudo apt-get install zabbix-agent
When it's done, you can configure zabbix agent by adding server address and match hostname name in WebUI and your agent machine. Don't forget to use encryption!
sudo nano /etc/zabbix/zabbix_agentd.conf
You need to restart the server after configuration
sudo systemctl restart zabbix-agent
If troubles continue check log file
cat /var/log/zabbix-agent/zabbix_agentd.log
Following error I received mostly when configuration was wrong. It helps to comment new modification and try to start the service again.
Job for zabbix-agent.service failed because the control process exited with error code. See "systemctl status zabbix-agent.service" and "journalctl -xe" for details.
invoke-rc.d: initscript zabbix-agent, action "start" failed.
OK, these are my notes if I need to install it and configure ever again.

If it doesn't help, just install older version
sudo apt-get install zabbix-agent=1:3.0.12+dfsg-1

2019-03-08

Používání SonarQube pro DevOps

Zprovozňoval jsem analytický nástroj SonarQube pro použití v Jenkins pipeline, nicméně jako standalone instanci tedy bez pluginu. K použití GetCodeflow s jehož autorem se znám jsem nedosal povolení od správce repozitáře, je potřeba tedy udělat analytiku lokálně. Kdybych náhodou instaloval nový server, píšu si následující poznámky.


Stažený instalátor SonarQube není instalátor. Složku je potřeba rozumně pojmenovat a někam permanentně umístit jako třeba C:\Program Files\sonarqube

Nejprve je nutné nainstalovat 64 bitovou Javu (JRE) a složku propojit s konfiguračním souborem C:\Program Files\sonarqube\conf\wrapper.conf, kam je třeba vložit řádek 
wrapper.java.command=C:\Program Files\Java\jre1.8.0_202\bin\java
Dále můžete vyzkoušet spuštění StartSonar.bat ze složky bin/windows-x86-64 přes command line (uvidíte případné chyby), pokud se načítá aplikace http://localhost:9000 (login admin/admin) je vše v pořádku. Kdyby byl větší problém, otevřete C:\Program Files\sonarqube\logs\sonar.log a koukněte na konec souboru co bylo příčinou pádu.
wrapper  | Waiting to start...
wrapper  | The SonarQube service was launched, but failed to start.
Před plným používáním je třeba doladit několik detailů. Zejména instalace samospouštěcí služby. Otevřete příkazový řádek v admin režimu, nalistujte C:\Program Files\sonarqube\bin\windows-x86-64\ a spusťte InstallNTService.bat, poté by se měla v systémových službách (services.msc) objevit služba SonarQube s automatickým startem.

V průběhu prvního testovacího buildu jsem se vinou obrovského solution (3 miliony řádku kódu ve 4,5 GB zdrojových kódů) potýkal s nedostatkem paměti, kterou bylo potřeba rozšířit. 32 bitová aplikace zvládá alokovat maximálně 2 GB paměti, proto je potřeba používat 64 bitovou. 
INFO: EXECUTION FAILURE
INFO: Final Memory: 15M/247M
ERROR: Error during SonarQube Scanner execution
ERROR: Java heap space
ERROR: The SonarQube Scanner did not complete successfully. Post-processing failed. Exit code: 1 
Nastavení se provádí v C:\Program Files\sonarqube\conf\sonar.properities. Hodnota sonar.web.javaOpts=-Xmx<číslo>m uvádí maximální možnou paměť a -Xms<číslo>m hodnotu při startu, rozpětí je tedy žádoucí velké.

Funkční nastavení: wrapper.conf
wrapper.java.additional.1=-Xms2048m
wrapper.java.additional.1=-Xmx%WRAPPER_SYSMEM_80.0%
Funkční nastavení: sonar.properties
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.ce.javaOpts=-Xmx8192m -Xms1024m -XX:+HeapDumpOnOutOfMemoryError
Jak vystavit SonarQube do sítě? Na mém serveru běží také IIS, takže je potřeba rezervovat adresu v IIS a nastavit redirect podle návodu. Pro samotné přepnutí aplikace pak stačilo nastavit DNS záznamy a uvnitř v aplikaci položku sonar.core.serverBaseURL => Administration/Server base URL. Navíc je potřeba zvýšit limit pro uploadované soubory, jinak končí analýza chybou "ERROR: Failed to upload report - HTTP code 404: "

Jak mít permamentní výsledky v databázi? Je potřeba C:\Program Files\sonarqube\conf\sonar.properities propojit s DB serverem a to následujícím způsobem. V DB (MSSQL) vytvořit databázi (v options zvolit Collation = Latin1_General_CS_AS), vytvořit uživatele, přiřadit mu db_owner právo a zrušit expiraci jeho hesla. (ideální je zkusit se připojit přes Microsoft SQL Server Management Studio). A vlastní konfigurace tedy
sonar.jdbc.username=sonarqube
sonar.jdbc.password=password

sonar.jdbc.url=jdbc:sqlserver://<IPorDNS>:1433;databaseName=sonarqube
A to je vše, restartovat službu SonarQube a nechat nástroj znovu načíst. Případné chyby jsou ve web.log.

Jak propojit přihlášení do rozhraní SonarQube přes Active Directory? Předně je třeba vytvořit uživatele (?) ve zmíněné doméně, který bude sloužit pro přístup samotného SonarQube. Konfigurace v sonar.properities je pak následující
sonar.security.realm=LDAP
sonar.security.savePassword=true
#sonar.security.localUsers=admin
ldap.url=ldap://DOMAIN.local:389
ldap.bindDn=sonarqube@DOMAIN.local
ldap.bindPassword=PASSinPLAINTEXT
#ldap.bindPassword={aes}passhashed
ldap.user.baseDn=cn=users,dc=DOMAIN,dc=local
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
ldap.group.baseDn=DC=inpulsetest,DC=local
ldap.group.request=(&(objectClass=group)(memberUid={uid}))
Není potřeba dalšího pluginu a přihlašování pak probíhá jen zadáním username bez domény. Pokud chcete mít z uživatelů administrátory, jde to snadno přes položku Administration/Security/Global permission a zaškrtnout příslušná oprávnění v sonar-users skupině.
 
Každopádně po této konfiguraci funguje nástroj v enterprise režimu a podporuje DevOps proces.

2019-02-01

Doporučená instalace softwaru a používání služeb

Affiliate sekce, aneb za doporučení výhody pro mě i pro vás.

Programy do počítače:

Služby:

Cestování
Obchody:
  • Alza.cz s návodem na poslání Alzáků
  • EuroOil při nákupu paliva nad 300 Kč a platbě Era platební kartou mi na pokladně přizná slevu 0,40 Kč / litr  

2018-11-23

Nastavení spouštění Jenkins úlohy na webhook z Gitu

Hrál jsem si s nastavováním automatického spouštění úlohy v Jenkins po commitu do GitHubu. Čistě teoreticky jde o triviální věc, kterou popisuje spousta videí, nicméně v praxi jsem narazil na několik problémů, které si tady odložím, abych to příště nemusel řešit. Třeba to pomůže i někomu dalšímu.

Na začátek hezké video, které popisuje úlohu bez nastavení tajného hesla:

Nejprve je třeba připravit Jenkins, předpokládám, že už vám joby a integrace s GitHubem funguje, jen pro informaci je třeba mít nainstalovaný plugin GitHubu.

Dále musí být dostupná adresa JENKINS_URL/github-webhook/ z veřejného internetu (nebo filtru podle GitHub IP adres), případně přenastavena na jinou v JENKINS_URL/configure sekce GitHub/Advanced (to druhé advanced) a políčko "Override Hook URL/Specify another hook URL for GitHub configuration" 

Manage webhooks zůstane nezaškrtnuto (sekce A.3) pro manuální instalaci webhooku na GitHubu.

Protože nechceme, aby každý, kdo se dostane k odkazu webhooku, spouštěl úlohu, je třeba nastavit heslo neboli "shared secret", respektive jej vytvořit v JENKINS_URL/credentials/add/secret text/system/ a pak nalinkovat "Shared secret". Nicméně je taky fajn to nejdříve vyzkoušet, že to funguje a secret přidat později (nezapomněout na to!).

Poté je třeba registrovat job, který se na webhook spustí. Zpátky na seznam úloh, rozklinout ho a možnost configure, pak checkbox GitHub project a do Project url vložit https://github.com/<user>/<repository>/ toto musí být uděláno manuálně.
Níže pak ještě zaškrtnout "GitHub hook trigger for GITScm polling", nebo to přidat do pipeline definice úlohy jako triggers{githubPush()}.

Poslední částí je nastavit URL webook na GitHubu, link: https://github.com/<user>/<repository>/settings/hooks/new, kde se vloží Payload URL: JENKINS_URL/github-webhook/ včetně lomítka na konci, content type jako application/json a secret je ten námi zvolený a uložený string.

Poté je výhodné udělat testovací ping a počkat na zelenou fajku, nicméně vlastní run jobu začně až po prvním commitu. Zejména na začátku nespěchtejte, občas to chce čas na reakci.


2018-11-19

Namespace Microsoft.SqlServer (are you missing an assembly reference?)

Chvíli jsem bojoval s chybovou hlášku u SW buildu na novém serveru, která se při sestavování stejného řešení na starším serveru neprojevovala, což bylo zjevně podezřelé. 


Její znění:
error CS0234: The type or namespace name 'Management' does not exist in the 
namespace 'Microsoft.SqlServer' (are you missing an assembly reference?) 
[...Installer.csproj]
Nepomohlo ruční doinstalování přes Nuget, ani doinstalování Microsoft SQL Server Feature Packu, ale bylo potřeba přidat celý SQL Server 2017 Developer edition, který zjevně deplnil některou závislost do systému Windows Server.

Ještě zkusím i odinstalování...
 

2018-10-24

Jenkins stops pipeline from Powershell

When you realize inside some job that you want to terminate running job in Jenkins you need to find way, hot to pass message to proper level where is Jenkins actually able to terminate the job. I am using this way with calling authorized URL which is terminating the job.

Jenkinsfile pipline is calling powershell and passing there API token from credentials (manually inserted to Jenkins => Credentials)
script
{
    if(env.GIT_PREVIOUS_SUCCESSFUL_COMMIT !=  null)
    {
        withCredentials([string(credentialsId: 'JenkinsAPIcredentials', variable: 'apistring')])
        {
            echo 'checking number of changes and stopping job if nothing new happened'
            powershell 'powershell -File $env:WORKSPACE\\stop-script.ps1 -phrase "stop-job" -buildNumber $env:BUILD_NUMBER -gitprevious $env:GIT_PREVIOUS_SUCCESSFUL_COMMIT -gitcurrent $env:GIT_COMMIT -jenkinsUrl $env:JENKINS_URL -buildIDurl $env:BUILD_URL -apistring $env:apistring'
        }
    }
}
What is happening inside powershell script? There is needed to generate authorized POST call to Jenkins server, luckily is process few lines of code. Part of code is missing definition of parameters in Powershell.
if($phrase -eq "stop-job")
{       
    $commitsnumprevious = (git rev-list --count $gitprevious)
    $commitsnumactual = (git rev-list --count $gitcurrent)
    $difference =  $commitsnumactual-$commitsnumprevious

    if($difference -le 0)
    {
        $url = $buildIDurl+'stop'
        $Bytes = [System.Text.Encoding]::UTF8.GetBytes($apistring)
        $Base64bytes = [System.Convert]::ToBase64String($Bytes)
        $Headers = @{ "Authorization" = "Basic $Base64bytes"}
        $CrumbIssuer = "$jenkinsUrl/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,`":`",//crumb)"
        $Crumb = Invoke-WebRequest -UseBasicParsing $CrumbIssuer -Headers $Headers
        $Regex = '^Jenkins-Crumb:([A-Z0-9]*)'
        $Matches = @([regex]::matches($Crumb, $Regex, 'IgnoreCase'))
        $RegCrumb = $Matches.Groups[1].Value
        $Headers.Add("Jenkins-Crumb", "$RegCrumb")

        try
        {
            $response = Invoke-WebRequest -Uri $url -Headers $Headers -Method POST
        }
        catch
        {           
            Write-Error "Stopping of job failed! " $_.Exception.Response.StatusCode.Value__
        }       
    }
}
I hope this few lines of code can make your day easier.
 

2018-10-16

Jenkins checkout git by commit id parameter

Discussion forums on Internet are providing answers for your question "how to check out specific git hash in Jenkins" quite easily for a manual procedure, but if you want to do it programmatically inside pipeline defined in Jenkins file or even by parameter problems raise.


It makes sense to check out specific git hash because it's unique inside repository and if you add git sha in job configuration GUI (Branch Specifier (blank for 'any')) then you really get the specific version in your workspace, so where is the problem?


Inside pipeline, block checkout you need to echo this commit from the variable by only one syntax even there are at least 3 other different ways usually works for printing the variable.

checkout([$class: 'GitSCM', branches: [[name: "ECHO GIT SHA HERE"]], userRemoteConfigs: [[credentialsId: 'string', url: 'string']]])

So the only one correct way is to use:
  • branches: [[name: "${params.BRANCH_NAME}"]],

because this are not working (but they are still printing value):
  • branches: [[name: env.BRANCH_NAME]], 
  • branches: [[name: ${env.BRANCH_NAME}]], 
  • branches: [[name: "${BRANCH_NAME}"]],


So to solve this I burned many hours. The syntax of Groovy is not enough mature yet, anyway I hope this can help you and if you need to do more magic with parameters as git values, I can recommend this plugin.

2018-09-10

Jenkins pipeline if-else for null variable

I was struggling few days with solving scripting problem in Jenkins Pipeline job definition. Since my Powershell scripts are using parameters from Jenkins and accepting of zero lenght / null values is problem in command line. So how to secure the script?

It was about variable $env:GIT_PREVIOUS_SUCCESSFUL_COMMIT whis is empty unless first run was actually successful, but you need to think about it in script definition. It's about one ternary operation in any normal scripting language, but not in Groovy which is used in Jenkins pipeline.

So how to do? Option one is stage based:
stage('First-run')
{
when { environment name: 'GIT_PREVIOUS_SUCCESSFUL_COMMIT', value: ''
}
steps
{
echo 'There is no successful previous build, need to run completely.'
}
}

stage('Regular-run')
{
when { not { environment name: 'GIT_PREVIOUS_SUCCESSFUL_COMMIT', value: '' }}
steps
{
echo "Regular run with ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}"
powershell 'powershell -File $env:WORKSPACE\\script.ps1 -phrase "start" -buildNumber $env:BUILD_NUMBER -gitprevious $env:GIT_PREVIOUS_SUCCESSFUL_COMMIT -gitcurrent $env:GIT_COMMIT -jenkinsUrl $env:JENKINS_URL'
}
}
There you see that variable is checked for step block and block is executed only when variable fits. This solution sometimes not fulfill all requirements of condition, so there is also another solution for inside if-else expression.

stage('Everytime-run')
{
steps
{
script
{
if(env.GIT_PREVIOUS_SUCCESSFUL_COMMIT !=  null)
{
echo "PREVIOUS COMMIT IS NOT NULL - ${GIT_PREVIOUS_SUCCESSFUL_COMMIT}"
powershell 'powershell -File $env:WORKSPACE\\script.ps1 -phrase "start" -buildNumber $env:BUILD_NUMBER -gitprevious $env:GIT_PREVIOUS_SUCCESSFUL_COMMIT -gitcurrent $env:GIT_COMMIT -jenkinsUrl $env:JENKINS_URL'
}
else
{
echo 'PREVIOUS COMMIT IS NULL'
}
}
}

}
Exploration of these constructions took me lot of time, so I hope you can solve it without issues.

2018-08-07

Jenkins pipeline calls cmd command

When you need to call cmd command from Jenkins pipeline script you can do it in following way. I am just storing that piece of code here.
steps
  {  
   script
    {
     env.GitCurrentHash=bat(returnStdout: true, script: "@echo off | git --git-dir=${WORKSPACE}\\.git rev-parse origin/${branch}").trim()
    }
  
echo "Current Git Hash: ${GitCurrentHash}"
   echo "Current Git Hash: ${GIT_COMMIT}"
  }
 Sub-command "@echo off |" is there to eliminate repetition of command to system output console, so we see only command result.

If you want to collect git hash from file level use construction:
env.gitcurrent=bat(returnStdout: true, script: "@echo off | git --git-dir=${WORKSPACE}\\.git rev-parse HEAD 2> nul || echo githash").trim()

If you want to know branch name from file level use construction:
env.gitbranch=bat(returnStdout: true, script: "@echo off | git --git-dir=${WORKSPACE}\\.git name-rev --name-only HEAD 2> nul || echo gitbranch").trim()

 That's all... 

2018-04-16

Přesměrování IIS stránky na localhost

Na testovacím Windows serveru s IIS beží aplikace, která používá Apache na lokálním portu 8080, jak zpřístupnit tuto webovou stránku uživatelům, kteří se nenacházejí na serveru lokálně?

Server IIS (ver 10) hostí nějaké testovací aplikace pro platformu .Net a je potřeba mít IIS server funkční, zároveň to znamená, že IIS přebije konfiguraci standalone aplikace s Apache a je tedy potřeba předávat požadavek z vnějšího rozhraní na localhost a zpátky. 

Tohoto je možné dosáhnout založením "site" webové aplikace v konfiguraci IIS. Pod jejím jménem, které by mělo být v DNS bude aplikace přístupná světu. Poté v konfiguraci nalezněte URL Rewrite => Add Rule(s) => Reverse Proxy. Příchozí pravidlo obsahuje místo, kam bude požadavek přesměrován, tedy na localhost:8080 bez http, odchozí pravidlo zůstane nevyplněno.

V případě, že editujete existující pravidlo je nastavení, "Matches the Pattern", "Regular Expressions" a Pattern "(.*)" - bez uvozovek. Rewrite URL tak bude "http://localhost:8080/{R:1}", zaškrknuto Append Query String a Stop Processing subsequent rules.

Případně to lze také zařídit konfiguračním souborem web.config v kořenovém adresáři této webové aplikace. Stránka localhost:8080 je ta lokální a veřejné jméno se v konfiguraci nevyskytuje.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:8080/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
Ověření konfigurace je prostým otevřením webovky. Objevuje-li se chyba 500 či obecně 5xx, pak je něco nakonfigurováno špatně na IIS, jde-li stránka na localhostu.

2018-03-15

Chyba Attempting to recover installation a oprava

Tak jako mnoha jiným uživatelům se na jednom notebooku o který se starám zobrazila hláška
Attempting to recover installation, Restoring your version of Windows
Kdy se počítač neustále restartuje, ale nic se neděje. Tato chyba se zobrazuje po pokusu o aktualizaci Windows 10 na verzi Creators Update vydání 16229. Aktualizace se jako všem zasekla na 33%. Všechny zajímá, jak se této hlášky zbavit:

Postupoval jsem vložením instačního média Windows 10 (USB Creation Tool) a nabootování z něj jsem zkoušel automatickou opravu, bod obnovené nebo návrat k předchozí verzi. Něco z toho musí zafungovat jinak je problém většího rázu. Podstatné je znovu spustit předchozí systém.

Jak se vyvarovat chyby znovu? U mě zafungovala aktualizace všech starých ovladačů ve Windows pomocí utility Lenovo System Update část Driver check - to bylo značně důležité. Taktéž jsem provedl kontrolu nástrojem DISM - příkazy v tomto odkazu část 12.

Poté již aktualizace proběhla bez obtíží a systém dále funguje.

2017-12-30

Aktualizace Windows 10 chybí ovladače

U staršího, ale vcelku obstojně fungujícího notebooku Toshiba proběhl automatický upgrade Windows 10 na aktuální verzi s podtitulem Fall Creators Update. 


Po dokončení aktualizace však přestaly fungovat téměř všechny periferie v počítači, zejména síťová rozhraní WiFi a Ethernet, čímž se stal počítač nepoužitelný.

Vložka: protože OS byl ještě z původních z Windows 7, podezříval jsem nějaký starý nepořádek, že dělá neplechu. Po reinstalaci na aktuální verzi W10 a opětovném doinstalování všech aktualizací se situace opakovala, takže chyba je zjevně softwarového charakteru na úrovni ovladačů, nicméně se nedá vyřešit přeinstalací driverů.


Řešení: je potřeba zapnout zámek PCI sběrnice. To se provede příkazy:

  • Spustit nebo klávesovou zkratkou Win + R
  • msconfig.exe
  • záložka Spouštění počítače
  • při vybrání výchozí položky (pokud je jich více) klepnout na Upřesnit možnosti
  • zvolit a zaškrtnout Uzamčení PCI
  • OK, OK, OK, restartovat



Po restartu již většina zařízení nepíše chybu "Zařízení se nepodařilo spustit (Kód 10)", zamykání PCI sběrnice totiž zajistí, že se při spouštění OS nezmění IRQ adresa a systém ví, kde daný hardware je. Hlavně, že to funguje...

2017-09-17

Intel HAXM is required to run this AVD a vůbec VT-x u Android Studia

Vyčerpané místo na disku mě donutilo reinstalovat Windows a s tím i všechny mé vývojářské nástroje, což je vždycky peklo, neboť po reinstalaci Visual Studia a Android Studia jsem byl opět téměř bez místa na disku (ach ten 128 GB oddíl kvůli SSD).


Při té příležitosti jsem si vzpomněl na 3 roky starý problém s během Android Virtual Device a vůbec virtuálních strojů pod Windows (10). První návod zní zapnout podporu VT-x (tedy běhu instrukcí pro virtualizaci na CPU) v BIOSu, ale to dělám standardně. Přesto se AVD stále nechtělo spustit a akci blokovalo s hláškou:
Intel HAXM is required to run this AVD. Enable VT-x in your BIOS security settings...
Rychlý test toho, že problém je na systémové úrovni se dá provést například pokusem o spuštění nějakého virtuálního počítače skrz VirtualBox, kde vyskakuje stejná hláška.


Nicméně fakt, že problém není HW charakteru, ověří utilita Intel HAXM (předpokládám, že jej máte nainstalovaný), kdy s pomocí příkazového řádku nalistujete do složky:
cd C:\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager
a spustíte nástroj haxm_check.exe, viz obrázek.


Příčinu bychom měli diagnostikovánu, ale jak ji odstranit? V mém případě je na vině mnou doporučovaný antivir Avast, který instrukce VT-x blokuje z bezpečnostních důvodů. Jako důvod  je dobrý, ale hláška o takové akci by byla více než vhodná.

Je tedy nutné otevřít okno antiviru, klepnout na položku Nastavení (vlevo dole), přejít do části Řešení problémů a zaškrtnout položku "Povolit hardwarovou virtualizaci". 



Po restartu se problém s VirtualBoxem vyřeší, ale Android studio stále nespolupracuje, protože přišlo s druhou hláškou:
/dev/kvm not found
Tato zpráva je na Windows zařízení více než podezřelá, nicméně internetová fóra si s ní již umí poradit. 


Nutností je odstranit přes Ovládací panely předchozí instalaci Intel HAXM a nainstalovat ji ručně ze stránek Intelu. Po stáhnutí haxm-windows_v6_2_1 a úspěšné instalaci se již Android Emulator spouští bez komplikací a je možné se tedy vrátit k původní činnosti.


2017-05-31

CoolPad Porto E560 drivers & firmware

I get this phone for free from friend because it had broken screen but after some time I decide to use motherboard in another phone, so I have to turn device on but I found that phone is locked by pattern and I need to get rid off it. So how to remove forgotten lock gesture?



First I tried one of milion advices on the Internet but they didnt work especially "wipe data/factory reset" method, so I decided that I need to reflash firmware inside. You need to download driver + firmware package (mirror), marked also as Coolpad_Sky_Mini_E560 5.1.222.38.P1.151022.KMINI.ap. Password is www.firmwarelink.com

What to do next? Install driver from ZIP file. Basically it is same package as is located on phone virtual CD-ROM drive. It contains regular MTP driver, but also ADB and Bootrecord driver, so you need all of them. 

Next is instalation of YGDP tool. When is installed enter it by "password" 369. Then click to Config and select 5.1.222.38.P1.151022.KMINI.ap.CPB file from ZIP - no more selection needed. After this click on start and software starts to wait for phone in proper bootmode.

How to put device to right mode? First is nessesary to turn it off and start it with magic combination with holding VOLUME UP and POWER button until special menu is selected.

Usually it is enought on Android device to only press "wipe data/factory reset" and phone is correctly deleted with all user data but I dont know why but it didnt work on my CoolPad Porto E560.

So we are in recovery mode where you should go to option "Restart to bootloader mode" and wait until computer recognize correct driver. At the same time when is installed YGDP app starts to be ready for upload firmware file. 

In next step phone asks you for confirmation of flashing and after this it takes 10 minutes to upload to phone, install and restart. So this is all how to reinstall firmware on this already old phone. This step helped me to remove forgotten locking pattern.

Immediately when I connected device to internet it asked me for downloading OTA update, so I did it and phone is now in most updated version. I hope it helped you!

2017-05-20

Samsung NX 1000 a cloudové funkce

Pořídil jsem si bezzrcadlovku Samsung NX 1000 z druhé ruky a než mi ji stihli ukradnout, tak jsem zjistil, že přítomná WiFi je sice funkční, ale že nyní již nepodporované aplikace nefungují. 


Přesněji po spuštění, asi nejužitečnější utility, Skydrive vyškočí hláška:
Security Error: The server certificate could not be verified
Předpokládám, že jde o problém způsobený přejmenováním služby Skydrive na současný OneDrive a nedá se s tím nic udělat... Aktualizace firmware nepomůže a na jiný způsob update jsem nepřišel. Přítomný upload fotek na Facebook i přímo do telefonu funguje bez zvláštních obtíží...