Merge pull request #498 from OH1KH/squash_db_select

Change to Cqrlog first start
This commit is contained in:
Petr Hlozek 2022-04-17 17:17:00 +02:00 committed by GitHub
commit 59ca0455f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 1171 additions and 26 deletions

84
help/firsttime.html Normal file
View File

@ -0,0 +1,84 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-us">
<head>
<title>CQRLOG - SUBJECT HERE</title></head>
<body>
<table border="0" cellpadding="5" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><img src="img/exc.png"></td>
<td align="justify" bgcolor="ffffcc" valign="top"><strong>
<font color="red">WARNING!</font></strong>
Backup your data often! BACKUP your log directory at the end of EVERY session!
All that you need to backup and store in a safe place is the log database directory
located in the ~/.config/cqrlog/database folder, or you can enable the autobackup function
in Preferences. This autobackup function creates an ADIF file with a backup of your log.
</td>
</tr>
</tbody>
</table>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td align="center" width="33%">[<a href="index.html" target="_top">Menu</a>]</td>
</tr>
</tbody>
</table>
<br>
<div style="text-align: left;"><strong>CQRLOG for LINUX by OK2CQR &amp; OK1RR</strong></div>
<p align="center"><img src="img/line.png"></p>
<H2>Starting Cqrlog first time</H2>
<p>First start of Cqrlog is important.
<br>Thanks for opening the help to your web browser during this first run. Help has many answers to your future questions and you can open it again from many menus of Cqrlog.
We hope that you at least check now the left frame to see what topics you may find from help if needed.
</p><p> Then you have to decide where you put your logs. You have three ways to save logs and each of them has it's good and bad sides.
<br><br><img src="img/firsts1.png" >
<H4>your Linux user folder</H4>
This is the default way. If you close <b>Select SQL for logs</b> window, without pressing <b>OK</b>, this selection is used.
<br>Log data is saved to ~/.config/cqrlog/database folder. Access to that data is done by starting a new SQL server thread for that.
<br>This makes full backup very easy. Just copy the ~/.config/cqrlog folder with all files and subfolders. You can also move your cqrlog to another PC that uses same version SQL engine, and has Cqrlog installed, by
just copying ~/.config/cqrlog to another PC's user folder. How ever if username (actually user ID) there is different you have to run chown command to set the ownership of all files and folders for current username.
<br><br>Unfortunately using this way to save logs causes most of database connection problems with Cqrlog mostly because of modern Linux security settings.
</p><p>
<h4>local machine's SQL server</h4>
This option uses SQL server already installed to your machine during Cqrlog installation.
<br>When using this option cqrlog tries first to create SQL user with proper privileges to use the SQL server and then set proper values to "Database connection" window.
<br>Cqrlog will create two scripts to your home folder: <b>create_cqr_user.sh</b> and <b>backup_all_cqr.sh</b>
<br>The first one creates database user and is normally used only once. It needs your Linux user password to run this script with sudo.
<br>The second one allows you to make full backup of all cqrlog logs currently in database by starting this scipt in command-line terminal.
This script needs program mysqldump and cqrlog database users username and password to access database same way as Cqrlog itself does.
Backup creates <b>allcqrlogs.sql</b> in <b>/tmp</b> folder. You have to move this file to safe place because most Linuxes do clean up /tmp folder during startup.
<br>It is also recommended to save <b>~/.config/cqrlog folder with allcqrlogs.sql </b>file. Script tells you how you can restore all logs back.
<br><br>Cqrlog tries to open most common terminals <b>xterm, gnome-terminal </b>or<b> lxterminal</b> to execute <b>create_cqr_user.sh</b>. If that fails you have to run script manually from your command-line terminal.
</p>
<h4>external networked SQL server</h4>
With this option you have to define values to connect SQL server by yourself. Address, port, user and passord are required to connect to external SQL server.
<br>SQL user and it's privileges have to be created by SQL server administrator.
<br>It can exist in your home network or in Internet. When using internet SQL servers it is most recommended to use VPN or SSH tunnel connection for security reasons.
</p>
<p><br>
After any of these options is selected, <b>OK</b> button pressed, and connection to SQL database established, Cqrlog tries to create first empty Log. This can take some time, so plese be patient.
<br>When log is ready you can open it and go to <b>NewQSO/File/Preferences</b> to set all station details and other settings affecting to Cqrlog.
In case of local and external SQL servers there might already be a log, or logs. Then no new log is created.<br><br><b>NOTE:</b> All settings are log based. You can have other logs with different settings and station information.
<br>Once you have got all settings ready you can export them to file. It happens at Cqrlog start in <b>Database connection</b> window with <b>Utils/Export/configuration</b>.
<br>When a new log is created you can use <b>Utils/Import/configuration</b> from your file to get all log settings similar with this new log.
</p><p>
<b>NOTE:</b> If you can not get one of these options work then remove <b>~/.config/cqrlog</b> folder to get new fresh start. There is no need to reinstall Cqrlog.
After done that start Cqrlog again to try with another of these options.<b> Removing this folder removes all local logs and settings !</b>
<p align="center"><img src="img/line.png"></p>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td align="center" width="33%">[<a href="index.html" target="_top">Menu</a>]</td>
</tr>
</tbody>
</table>
<br>
</body>
</html>

BIN
help/img/firsts1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -13,6 +13,7 @@
<h3><strong>Quick start</strong></h3>
<ul>
<li><a target="right" href="h1.html">Starting cqrlog</a></li>
<li><a target="right" href="firsttime.html">Running first time</a></li>
<li><a target="right" href="h1.html#ah1">Preferences</a></li>
<li><a target="right" href="h1.html#ah2">Program</a></li>
<li><a target="right" href="h1.html#ah3">Station</a></li>

View File

@ -18,6 +18,11 @@ and
<i>Martin Kratoska, OK1RR
[<a href="http://www.ok1rr.com">http://www.ok1rr.com</a>]</i>
<br><br>
<strong><h3>If you are impatient:</h3></strong>
<div align="justify">
<div>Please check at least left frame <strong>'Starting cqrlog'</strong>,<strong>'Running first time'</strong> and <strong>'Preferences'</strong>.
<br> Thank you !
</div>
<strong><h3>Description:</h3></strong>
<div align="justify">
<div>CQRLOG is an advanced ham radio logging application based

View File

@ -105,7 +105,7 @@
<MinVersion Major="1" Minor="2" Release="1" Valid="True"/>
</Item10>
</RequiredPackages>
<Units Count="120">
<Units Count="121">
<Unit0>
<Filename Value="cqrlog.lpr"/>
<IsPartOfProject Value="True"/>
@ -888,6 +888,13 @@
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit119>
<Unit120>
<Filename Value="fDbSqlSel.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmDbSqlSel"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit120>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -25,7 +25,8 @@ uses
fNewCommentToCall, fFindCommentToCall, frExportPref, fExportPref,
fWorkedGrids, fPropDK0WCY, fRemind, fContest, fMonWsjtx, fXfldigi,
dMembership, dSatellite, uRigControl, uRotControl, azidis3, aziloc, fDOKStat,
fCabrilloExport, uDbUtils, dQTHProfile, uConnectionInfo, znacmech, gline2;
fCabrilloExport, uDbUtils, dQTHProfile, uConnectionInfo, znacmech, gline2,
fDbSqlSel;
var
Splash : TfrmSplash;
@ -99,7 +100,6 @@ begin
Application.CreateForm(TdmMembership, dmMembership);
Application.CreateForm(TdmSatellite, dmSatellite);
Splash.Update;
application.ProcessMessages;
sleep(800);

View File

@ -73,7 +73,6 @@ type
private
RemoteMySQL : Boolean;
AskForDB : Boolean;
procedure SaveLogin;
procedure LoadLogin;
procedure UpdateGridFields;
@ -91,7 +90,7 @@ var
implementation
{$R *.lfm}
uses dData, dUtils, fNewLog;
uses dData, dUtils, fNewLog, fDbSqlSel;
{ TfrmDBConnect }
@ -523,28 +522,47 @@ var
Connect : Boolean = True;
begin
tmrAutoConnect.Enabled := False;
if AskForDB then
begin
if Application.MessageBox('It seems you are trying to run this program for the first time, '+
'are you going to save data to local machine?'#10#13'If you say Yes, '+
'new databases will be created. This may take a while, please be patient.' ,'Question ...',
mb_YesNo+mb_IconQuestion) = idYes then
begin
dmData.StartMysqldProcess;
Sleep(3000)
end
else begin
Connect := False;
RemoteMySQL := True;
chkSaveToLocal.Checked := False;
chkSaveToLocalClick(nil);
edtServer.SetFocus
end
if (frmDbSqlSel = nil) then Application.CreateForm(TfrmDbSqlSel, frmDbSqlSel);
frmDbSqlSel.Show;
repeat //wait for user to make selection on other window
Begin
sleep(100);
Application.ProcessMessages;
end;
until frmDbSqlSel.rdy;
if frmDbSqlSel.loc then
begin
dmData.StartMysqldProcess;
Sleep(3000)
end
else
begin
Connect := True;
RemoteMySQL := True;
edtUser.Text:=frmDbSqlSel.user;
edtPass.Text:=frmDbSqlSel.pass;
edtPort.Text:=frmDbSqlSel.port;
edtServer.Text:=frmDbSqlSel.ip;
chkAutoConn.Checked:= frmDbSqlSel.Acon;
chkSavePass.Checked:= frmDbSqlSel.Rmbr;
chkSaveToLocal.Checked := False;
chkSaveToLocalClick(nil);
end;
FreeAndNil(frmDbSqlSel);
end;
if (not OpenFromMenu) and Connect then
btnConnect.Click;
btnConnect.Click;
if btnOpenLog.Enabled then
btnOpenLog.SetFocus
btnOpenLog.SetFocus
end;
procedure TfrmDBConnect.OpenDefaultLog;

650
src/fDbSqlSel.lfm Normal file
View File

@ -0,0 +1,650 @@
object frmDbSqlSel: TfrmDbSqlSel
Left = 393
Height = 306
Top = 141
Width = 441
Caption = 'Select SQL for logs'
ClientHeight = 306
ClientWidth = 441
Color = clWhite
OnClose = FormClose
OnCreate = FormCreate
LCLVersion = '2.0.12.0'
object gbLocalUser: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = rbExternal
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 6
Height = 89
Top = 176
Width = 429
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
BorderSpacing.Top = 12
BorderSpacing.Right = 6
Caption = 'Define Local SQL user'
ClientHeight = 71
ClientWidth = 427
TabOrder = 6
TabStop = True
Visible = False
object edtUserName: TEdit
AnchorSideTop.Control = gbLocalUser
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = edtPassword
Left = 229
Height = 34
Top = 18
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 12
OnExit = edtUserNameExit
TabOrder = 2
Text = 'cqrlog'
end
object edtPassword: TEdit
AnchorSideTop.Control = gbLocalUser
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = gbLocalUser
AnchorSideRight.Side = asrBottom
Left = 331
Height = 34
Top = 18
Width = 90
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
OnExit = edtPasswordExit
TabOrder = 3
Text = 'cqrlog'
end
object lblPass: TLabel
AnchorSideLeft.Control = edtPassword
AnchorSideBottom.Control = edtPassword
Left = 331
Height = 17
Top = 1
Width = 62
Anchors = [akLeft, akBottom]
Caption = 'Password'
ParentColor = False
end
object lblUsername: TLabel
AnchorSideLeft.Control = edtUserName
AnchorSideBottom.Control = edtUserName
Left = 229
Height = 17
Top = 1
Width = 67
Anchors = [akLeft, akBottom]
Caption = 'Username'
ParentColor = False
end
object lblIp: TLabel
AnchorSideLeft.Control = edtIP
AnchorSideBottom.Control = edtIP
Left = 6
Height = 17
Top = 1
Width = 60
Anchors = [akLeft, akBottom]
Caption = 'IP addres'
ParentColor = False
end
object lblPort: TLabel
AnchorSideLeft.Control = edtPort
AnchorSideBottom.Control = edtPort
Left = 108
Height = 17
Top = 1
Width = 26
Anchors = [akLeft, akBottom]
Caption = 'Port'
ParentColor = False
end
object edtPort: TEdit
AnchorSideLeft.Control = edtIP
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbLocalUser
AnchorSideTop.Side = asrCenter
Left = 108
Height = 34
Top = 18
Width = 90
BorderSpacing.Left = 12
MaxLength = 5
NumbersOnly = True
OnExit = edtPortExit
TabOrder = 1
Text = '3306'
end
object edtIP: TEdit
AnchorSideLeft.Control = gbLocalUser
AnchorSideTop.Control = gbLocalUser
AnchorSideTop.Side = asrCenter
Left = 6
Height = 34
Top = 18
Width = 90
BorderSpacing.Left = 6
OnExit = edtIPExit
TabOrder = 0
Text = 'localhost'
end
end
object lblQuestion: TLabel
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = pnlWelcome
AnchorSideTop.Side = asrBottom
Left = 21
Height = 34
Top = 43
Width = 398
BorderSpacing.Top = 6
Caption = 'It seems you are trying to run this program for '#10'the first time. Do you want to save your Log data to:'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object rbFolder: TRadioButton
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = lblQuestion
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 89
Width = 271
BorderSpacing.Left = 24
BorderSpacing.Top = 12
Caption = 'your linux user folder (Cqrlog default)'
Checked = True
OnClick = rbFolderClick
ParentShowHint = False
TabOrder = 1
TabStop = True
end
object rbLocal: TRadioButton
AnchorSideLeft.Control = rbFolder
AnchorSideTop.Control = rbFolder
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 115
Width = 202
BorderSpacing.Top = 3
Caption = 'local machine''s SQL server'
OnChange = rbLocalChange
ParentShowHint = False
TabOrder = 2
TabStop = True
end
object rbExternal: TRadioButton
AnchorSideLeft.Control = rbFolder
AnchorSideTop.Control = rbLocal
AnchorSideTop.Side = asrBottom
Left = 24
Height = 23
Top = 141
Width = 226
BorderSpacing.Top = 3
Caption = 'external networked SQL server'
OnChange = rbExternalChange
ParentShowHint = False
TabOrder = 3
TabStop = True
end
object btnOK: TButton
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 354
Height = 25
Hint = 'Confirm your selection'
Top = 269
Width = 75
Anchors = [akRight, akBottom]
BorderSpacing.Right = 12
BorderSpacing.Bottom = 12
Caption = 'OK'
OnClick = btnOKClick
TabOrder = 5
end
object pnlWelcome: TPanel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 30
Height = 31
Top = 6
Width = 381
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Left = 30
BorderSpacing.Top = 6
BorderSpacing.Right = 30
ClientHeight = 31
ClientWidth = 381
Color = clWhite
ParentColor = False
TabOrder = 0
object lblWelcome: TLabel
AnchorSideLeft.Control = pnlWelcome
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = pnlWelcome
AnchorSideTop.Side = asrCenter
Left = 52
Height = 30
Top = 0
Width = 277
Caption = 'Welcome to Cqrlog!'
Font.Color = clOlive
Font.Height = 25
Font.Style = [fsBold, fsItalic]
ParentColor = False
ParentFont = False
end
end
object imLogo: TImage
AnchorSideLeft.Control = btnOK
AnchorSideTop.Control = rbFolder
AnchorSideRight.Side = asrBottom
Left = 354
Height = 64
Top = 89
Width = 64
Picture.Data = {
1754506F727461626C654E6574776F726B47726170686963E423000089504E47
0D0A1A0A0000000D4948445200000040000000400806000000AA6971DE00000A
4D6943435050686F746F73686F70204943432070726F66696C65000078DA9D53
775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092006184
101240C585880A561415119C4855C482D50A489D88E2A028B867418A885A8B55
5C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A
003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F003
79787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA50265700209100E022
12E70B01905200C82E54C81400C81800B053B3640A009400006C797C422200AA
0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240BB0060
5581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E58900F
4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F7085B848
0100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729106609
E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEF
F4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B0
75BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C8
3C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF00071
9A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1
E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F11F96FD
0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A
0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185CA89417
4CC608000044A0812AB041070CC114ACC00E9CC11DBCC01702610644400C24C0
3C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C131380D
E7E0125C81EB70170660189EC218BC86090441C8081361213A8811628ED822CE
0817998E04226148349280A420E988145122C5C872A402A9426A915D4823F22D
7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8A
C6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380
D1310E668CD9615C8C87456089581A26C71663E55835568F35631D583776151B
C09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23B412BA
085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE211E219E
255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453A43ED2
10699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC5
88E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A
9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F768
2FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748622819
6B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55582AF6
2A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567D
A64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD
82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D6725603EB2C
6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010E
C6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABE
DA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB
75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F3730
34083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D1
49A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4
A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61
BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E5679
56F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B
6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF
1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67
A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3
F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E2
71CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45B
E0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E
997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A81B303
6B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017F21BF9
6333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F9
4CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B453747174F7
2CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8
AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A
54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23FE58320
42502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695
F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6DEACCF
D971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA
1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78
B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF
45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A
79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A
97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4A
B7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4A
DE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB
56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD45
7DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A
746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC2
41E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC
2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D
283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF
9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E
70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D7
2E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78
AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE
94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CF
CA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9
AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3
D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F3300000006624B474400FF
00FF00FFA0BDA793000000097048597300000B1300000B1301009A9C18000000
0774494D4507E00B180D0E1F23BE4C6B000019184944415478DAE59A69D02557
79DF9FE52CBDDCED5D675F352369461AB4039230428A1196B12C8535E02AC29A
18873521840AC4C4B84C3081220E8905C1612B3621B064CB0A06814162119201
210909493323349A7DE69D77B9EFBDB76FF739E779F261820B2863B619598E7E
9FBA4F777555FFEBFF2CFD9C46F805B8EBDD6BE02FBEB2D23E54395CE5872625
106F52EA624C6FB8F101F9C9FBFFE4B9E7C36BAFFB163C96C1BF6FF13D579F0B
AFBFE13BF0B6CB4F839A8D1781CD407CAEB566E3D10A278F0C70360A4A699302
48451A964075C9B31E6E395D42E403A9893BDF7BEB037313300D0B30072FB8F0
3CF8E46DDF7E6C0BF047579F016FBEE15E000078FD65A74F1BA6B6B7FC9446F0
85FD06679683E901A2393460B334D6AC9BA9384AF5380293D4CA08A396E7501A
89E3A4FB1DA4AFDD3769DF7EDE08D6FED92DF7EC050078C525DBE003B77CFFB1
27C01BAF3C13DE79E3F7E08D976F77E3A45789C01506F5DCB19A3B7A85C1B911
3FBB5FE3F0D0885A4989162A6055858E13A9A3808228431211AA9C0547A0E029
CD753C7C84881F2690952B5BE9BA6BBE7CDF3E0080773CFF1C78D3B5773E7604
F8C08B77E0AEC33023A22F1D047CCA91216D89A21C129402B4B0BA673E75A06F
DE324E3AAA2265E3A832A8D17A03D1629471548EB1498C088A5C1B544602F014
B193FBDF6C62FCC8A48B7BD6B79B6B8AD2FCD516D38C5F79E3AE7F74011800E0
AD57ED3007E7E56C49E9950A78C920D029C72AEA1CABA88D888E088B2AC025AB
3BF0E6A8E63714400CA3515569842DA38A3784519992260534AC80181570D4A0
7A0E8351B4AB176BDDDA727ABE51DDBA7719765F7ECE9AA5AF3F7858FE3105A0
575FF4248CC9AE70DE9CEBAC5949A8BE6342CA299163297A99BA75ED54AE6DA5
D4E6F05FB7CF84F75EB026E1BA9EA48D53AC6DA72A681CA2D1CC1964726C5859
C99261466399E72B7A2D117D569465D7BC59DD083DFD70635EB7B4503DEFE517
6FDEA4BA170000C2B16BA1DAF35F1E5D015A538A75ACAD2459A1A05B54604A25
D9CD9D303E63B28E3399D8AE17EAD950943645A7CD1B3C866F6E9B123963BA49
DB574AEC790520E0DC32786B4881D031309131CE3000710DC43E014F354A78B4
A2F6389AAB86C24F64E4D7BFF2924B77BCE2A95B377DF47F7CD664EBDF04697C
3D1DBEEF3D000010173F737243E02567AFD631F124213E97904E614245420440
973BA6CC215B6642B6C0C65845524971738872C4B1146D9BC05BC05103149392
B3087544420044364A00680D271141639C719CF2A8C8B923BB30C6EE7481DCCE
EDFA26EAFAC5B9E5DE87DEFD8E23575EF504E99DF29A948637A1E95C7DF293E0
DB9E75814F29FE2B44FC3712250B31A1A8A088DA98C425019300398A5A2632ED
D21113031055921A072A727048B873DE6212824641C78D289217C38804126352
9395C54DD08C9E3E9905291DD6470612D775E5A12D5D6847D4DB5C9685237383
AFCDAE9D1813E7DF7CC5BFBFE2D8C4CAD9F4D56F5A7DC6339F070000F5C267C1
4F3CFB8409603EF1CAA7C20BAFB9B5FE83679DF72911ED1843971AC6892892D7
41B351A3746808BE4929B41C7ED332E6735573B60078CFEA8B2CC3DC3B9A2922
1C581CCBD10A09D9251125D40613666A2D710251033AC5D69A22D338D1E25449
5221ECD82C7532363DB4A63739D9398CC26765A53BFF63D77CE31B573EEB095F
BAFC37DF125496A1E9DF0E507F574FB803DEF1FC73E14DD77E07FEF09F9FB32E
89BE3825FD17F323983F3AD45B6BC13D8661FBD1DA6D1E35F01B8E911921882A
D541B08E114310F24E71752F837E15607ED008A09104844039786B94415251E6
777B4A67777D4CA7AC300B833A85DCD9232BB2B0DA5AB3D36459A789F26D63F3
6D93B3ED7E7F44C77C69AFDD71D6A95F6C6DDC213BCE988BA18A90EA9EF8C933
80CCA927AE0F78C7D5E7C19B6EF836FCFE6F9FD58284BE013C7FD8C0EBE72ABE
F8D8D8C42A112725C36C8EA708156A628410023521601DC738AE03784374CACA
0E3C3237D07183EAB21C009D7AA3C9B96CCF644E9BBBA5C453579BA5C271DFDA
72DE6AB59E89F7DB2C77C0F8882F3AB36C69518D07326E3909BEA735B5A239ED
EC6DDFDDBA662F71D68DDC7B61AC8F7E10B2D997FD6A21F0C38337DD70BC4FBF
7CE3E6C1CD3FD81538511112A9AACE21480791909092825214445116414621D6
44040A0A0082C326C89D3F98A3D3D6743125C5438B4329DB16538C24A9318D38
6A65A80681A63BB9A2CD58222742C8B3B2A360A0C8CB0E02A977792E64CBF5C3
AABEDAFB4C0EED3DD0EE9870C7EC8A21C5831FD07EFF8174523E8600007EE7D2
F3AD04BD7AB9A1578D226D5C6EB0AC127B11263686990918110514420898520D
A119430C35C558434A09677B396D9E6DEBDD7B9660DDAA691DF4470B65ABEC9E
B69AE3A6293B5AB56AA60F900DACA749540845776234AE47F3336BD6B4FA0BC3
C1ECBA4E1EA543D5A89A2F27665159EE6F65FAA9BCA30FAC99AE96B3C9756341
A36979A0E5EAE7FD727DC04FBBF0F12F7F2BCC1478C36C11FE67D7350F9726D6
169A6831A885463D36E8305041097B39413777D82D4B2C8BB6E67947B22CD77E
D5E8EE434BF894EDB3D8F48FC2DA559D0994AA6E1A2006A558477445DECB8A52
7DDE322EF3A93D315974263A59D1E96579DE2E26A6275CA7D79EC98BB29D65D9
465FB69F5987F613F71CCA564173982D052E666AD4E183303AF2BE5FAE15FE69
DCBEFB809CBB6AEDF7C9A4FB09751D2AAEAA53324110A21004410D6021815340
0FC84ED91845624432CA6C409460FFD165BCF0CC7518160FC2CCAA358ACD9027
5A1964DE86B23B915B63C07ACF45271FFA56D7F7A60A9B24A376AFC88CCBD1E5
B6E3B38E902593E5D603BA4E1D801616E89115D34D1CCDF573631792CB4FD337
BEE6A9F0F677DD7062040000B873DF01BDFB91C3FB2E3973DD57188013F06C93
B08C820688C830A225446B58ADB16099C19041224622D2940498490F1E5B8633
B7ACA3BC9EE3F59B3651A80658B6BAA9D56B65653B2397B798D9F68B4E9175A7
273262D3CA5B5DF01E8DB145E67397801D9685B3A2A4C430356E6869A19F8EF4
8ADA834405EAC76AB9037FFC27D7FEEA21F0A3BCF4B7CE87F77FFE6F8F74BDFC
F18ABCFEF06C363ED8E2F190A46E343521A690620C12639024008246C9E6EAF3
16F6BA13DA2A5B1212CB37771D13E9ADC56AFE08AEDCB0C5A65417D52871DEEE
DAA2B464F396EB4C946D766DDFEA6485712DF4197A9715602CDB562B6F596B5B
4591CF3AE737B0CD9EB6B8943D757EB9C89B3A1919D5DC9AAE49465FC013E600
00803B1F3C006FF9AD27C27B3EFFADF0E475B377012569926E1F36D01947B588
48806408C913A1C9BCE356E6C859370F64763A671E593D93D9CCAA5F585A864D
A76CC2345CC2755BB731CA08BBB31BB06C0B5ADF4EB6287CABE34AA042AD3762
3892F5DEA06D25366CAD0141B62109B8246C15F4A2AA265CE84BC84D33EFBD82
E93E275587AE833F7AD775BF7C15F849C67BAF85A69C80CEE4E5704E7106AE3C
55AF1846F38648D901247B9B2B5B4B459E77DAADBC638D2D24C14A82746A9EC3
A6588F6749EBD8CB417A2D6BE2A8321B366EB6C610AE3F75ABA20E65E5A6D59A
C40D4DD1E16EBB72C033406406C4A26C4A154904DC16C67E2DE01786A3F1783C
8EA36A3498A99B786F532F2E1F3A3C7EFB39DBD2FE0D9BA6C6D87A8E56F33742
3E79E58911E087D47337619D6A78E7D7FA70F7FBDE6765A97A6904F7AAB1B833
943261EB52BBC853ABB0A9CC314C9626AC992D9A6EDB69BD5C8BA626CB5B5981
4499E1927B933D5C7BEA060568A437DBD6043D2D4A01326D22841AC8D4C69409
30664A1D35540D63D26108218CAA548D86FD6ED3344746A3BE3936577DD299FA
5BDBB684DBA6278A2494007085E6D357EACF6C847E5EFCF43375D5D44A3878EC
10BCEEB26D9E7AAC95A6A3D6C90FAC4B2E90307A34B3D3659AEDE5CDD4441E2D
5B20622AD73967BC3383A55A626862D969837105CF1D3A0AEB4FDF40603275D6
8292576244E48C140C11B351CC10891029F784122CA2E30831CB1B8784655367
9C17E99C710DDBEEBA6FBCEFB28BEA035967A2A997D38975C08FA2AA70CD8B9E
4EFB1617AE12E4FF38487EE3A1B1750D643033D50E176C5F355C3DD3AB26263B
9CB5B25CD2F1F25076BC57341634B1B186159996E6FBB061FB665030607DA986
5981B384C8B5B596158D1212224394047D498D86504B351A9926D4FDC5C51155
C3C587C675E3FB4B4B9F5E3B5D7DE9B44D7CA8B5E1D5CBC3BDFF0DDCC4D9E0DA
97FEEA0EF831F5104175499E73D9E5FF471B59C326BDB8DBCA266726B3B4714D
27AC9C28A06C65E0CBCC32E7A933D97636CF6D8AA04492F276CE31812009B2CB
70EFAE7DB076EB661005143000026C9C310A16008115095411908800843CA57C
34CEFBDE269FE505A88C5B88C44D5D5F72F058A87B5DBDD9BA8F0D7D7B126DFB
D2541FFD28F899179D38018E8BD00555ADFFFCADCFFFB3DD7B1777F9BC7C6ED9
EE6CE94D77D8E7A57179AF85A64CBE5DB2290AB559165B99B3404E43931A9FB1
4506623F066083071FDE0FAB4FD908020E55150C1816554030A00A88A080441E
8111D0AB7360347AE894E252EC7A823E84E0D72E85E6B29D7B9A875CEBE881A9
947B1D7FB5C2ECD7F497EA037E16C383D7C1B3DFF6E9F1E4CAE9AF64EDCE874C
56DC0E9CF5B3B255FA326FE765ABEDB3B2642A0C8227850CC964266F778DC95A
246A955D07CAC929287B6D38F0D05E9058034840D5444D53B38AA0A400AA8031
248B800E90D91A6BD97AF659E6B23C2F7D9E1BE2DC4C74DD36C1FCD7F7EDB5EB
8A896C5CF71FC4139204FF3E5AAB9F07CDE046B4E596FA2FFEF4530F22BBB9BC
6CE5B6EC4493954334AE41E7ADC9AD63E3198C4B80B661E319980C196FC7D5B2
0174D89E98244484437BF6C1CCBA55000D132882AAC7D834681CA9A818224250
6C8C610BE0122250E69B366191DAAD818B751E07E3B423C4E689DFB863E9E859
679F59FDD29DE0CF83CDDA0070BA5EF57B67CD8524D7F7FB83AF2F2F2D2E55C3
01C410383649257122B2C9590FD679464683A0CCCCD06A4F269F950AE4B4D59B
049B59983F7814C2B88F31D4A8123149C4941A044D9C522251604422636D8626
136B30F7CE3A624F79E178B2431B464D7E6A7F09BBE5C404DCFCB95B0100607E
E77FFFC53AC19F590D9A4F82861A8707FFC6A4C1D09EBE3D1F3DB2A75942F693
C665CEE5A5F832579739B5D68A8269102912504236919025C6864368D818A729
25B4D660538F613C1A83CB18880C3231C4D0A0B51E4405090015108818401515
92326AAAEBDA205223AA14A3A4A38BE98EBD7BEE597CC633AF9457BFF4029CDA
FC9213EB00742F002A9EA3C3B943315FF3BB63B7EAF706975CDAF96ED636DF21
8B03E4044CC24C84CC06B2CC1A9F59B4D6281121A01AEB7C6AB52682B15E8DF1
C0C6437BA20B0808D5F23284F112C450638A0DA4D490A440498251150244A3AA
8C600488BCB18EDB593DA1E805C973A79D9D2FB1DBD9BFF373D45BFF2C7DE8FB
5F39F1210000D05BBF0642FF468C47DEC7BEC874CDDAECCB68CDEEA8149B8492
347282C625686C9268130A226144B243501C27899190229B2CB0CD13DB4CDB13
254802A8AB01C43004808092028A08484A28124955304934485614D0650E2CD8
36108223B6CE5BB3CDBB62E39AADCB601061CF5E3CB149F0EFE2C9F4202C3CA4
3CF104B1B9D6A7CE2E1FDCF599E50F57CD5882984D51DDAA52A19B2B9499D78C
317A057180C4880886AD468544AC209288381755A5BC15B1A9049C1B03400E92
1A54604074201208C480A4A4CC6C18926343758C59C8B3A66C9A66534AE660CE
CDCA9DF7084755E1853F3C3902D88917020040357F8B021CA3F1E181B9E03CD9
73D7F7EB5D21B9278538ECC5809978E0268218B40DA6844C0A8060450223221C
1FBA820210025A655B8287118646212F2348AC01D9A3A4A4284A894855051193
414436949C1228336BE6750D08AC1E0DA5DABFDF4F16F4A7736BCFFCFD745242
E08738DE059AD6AA161BC2ECE6978C96FACD5FD7E3EAFAA6AE1F8CA15E884D5D
835400690C4C5A019963487CCC302DA514EAA61E89481091A00800C6668A2657
6280F128029100A1804A449584004292122280052044328E896CE69A56488532
4185ECCFCD7C3A7FC0E70200C091FD0F9E7807FC5D28745F068383FF5B893B18
FB9F6168EAE53BEEA96E018153EB1A56B1C10468463E434E1A2D6172486855C4
000259EF150013A842686A88A122E73D080368125041204AA0AAC06C21860644
0144C40022006680D8CF927662EE964DBFC9D63A1BDB29658FCC1F7CA0ABAAF3
88080FDC77E7C9710000406BD5CB00C82A165B848B7278D6A9F86035ACAFAD46
D591500F41E2424BC27C1BD2C881D6C640ED332736CF7CB4C60404C1181310B1
90F11A2302B25397659092800A00A102112202A2AA804822002240A3C42E0350
62EBC7B90F3D05DF4284A9A4983FB0FB363C7CE0113C6DFB3927C7013FA498BE
1A0040012081F970BAECFC8F7EFD2DFFF9A5C9BAECE964CC99ECDC6A4BA6638C
7564FCB22A66922057490E14C05A42554424924612A4A82498D479874D2D6033
03220A88C7F72400091135A980477448942C53CC158A5936CDFDE351759AB3FC
A5D3B75CA4272509FE83DF0B0F23DE76D795D4D40BFBEA51DAE54C3C2D9871C6
E21D789FA9B116C95A22624056000A2981A69828A548CCAC402CAA099208B105
6C6A00EB048808D8182044101112516B08A231069A8612198732AE5BC670AF69
AA0A00E0AE7BBE0267ED78DAA323C0FCAEF7819B3A432F79CA2E3DB26FFEF0DE
23E1DED8341754E37C8328F782FA606CDE186B959888101C917A2235CA6414C0
8A4416397E999821C6A8488A2110382FC0E830A5A48880CC8422A844CAD65872
66345733AEA91AB9ADD5993EA6F512017A05007D540498DCF2BBFF6F80F27559
B9661047E3D1CEB9C5F8374D33B64DBE3C9BE5ED6E59966D83AE6D29CB883300
B451002581082828A065643121345604D5398F755D41D38C41C440515A002454
11456440F2ACD8242235929093CAC0FBECF0B05A30E8BBD5492D833F7D767031
08CF6AB7C31124ED26943E114DB231280A4E555D8C439FE250635C164943AF52
172154793D5ECE9A7175DC1F883A1E574ACC8A84508DC620E978694F2902A101
4981D86408C489ACCD8A3CDB9D52B8BBEB3BB27FFFDDFCBD073E0FFDD1CE472F
07FC5DB3D4FE6D9DD3AF35ABAB7B1EE90F9B9B535C827A142F945428483EF479
59297206C425A21B596B466C14AAE1721153F4A1694441C93ACB8488CEA08A05
5C5A5A86A2CC61341A61A7434A6C3086618A510135EE2382DBBCB338DF5FC4C9
04B461C519DA2ED60A3FDA0254735F826274BF751C69614197E707669502AD54
E458476BC635FB26444A292968040591109A165B720A101121309101158E31A8
F30E091597874348512049046B2C02AA12214A6C8E89C8EDAAA9DF2AFD3D9393
B352CC6C1C4C7457CB68B4F0E83B209FFE6700000100C2C2DE8F5647EF1E5DB7
B008BBED48AECAB26695F7E319487ECA702E680D21107BE70621240B020911BD
88F489A070967282084CA4ADC2C170149008A0694650981255D2988D038AB015
0516EA201BBBCEDE323E3A540080A298787473C04F32B1EE457A6C797E213483
43A11E7EB1AE4641D3B0E7CCB0D138ACAB61BDB038BF385C5898AFEA66FC5096
FB5DADB2757796676311A8EB0697EA00B5AA883108DE1128200C07CB52554389
210E42080F11A49B2D854F38676E4F64A5D54EB47BD7C3BFFA58FC840C53F401
D87FFFCDF6DE07D2E9C6954FF6DEADB2D69DC7860A6B4C27CB73B0367FB82CDB
07C9640791F93200CA538A456C469B4043C10C6858ED68142044C0A64950B68B
DA5BB793887757E3C16D4D35BAD3E2C22D939D2AB4D7FE4B3D21FB022782E6D8
F538AC024CAC7D9E7EE1C6F7AF71969E45A4EBADB181ADDD9E67D9C39DCEC46E
76E5619B153329E9246AAA8D91CB9A68D7A14A8F74C08834610C6A88C80B8B95
218243ED4E5B9B7175538A4BEF767977E07C313F33D31E933D4D1E1302A4C52F
00F72E87F77EFA2668DC00CE7547332469A56835CBE8CC76BB2C9DCF45A97B3F
A2854EAF5520F091A2E0678CC7D213D173484756807688C8B4B3101532B7DC5F
E27DFBE6DCD6AD6BFE03B2D1BA0EF396E63FD776BBEBDBDFF33ABDF06D7BA055
6E786C38E047B9E5B61BE1920B8F6F661E3B70933F74309170C9EDF6CC78C3E6
1D0960644275645B5D8FDB21360BB15A3CAB3F92686C7BDADBFA3283548DA355
C3C97DFF7BBB9F3CBB6AF20F564EDBBF44DBE54670E0F34E3339B1359DB0ADB1
93C95F7DE98BB86126A71D4FB838A9F6A13FDF87B215A710A049314068FA082A
BA7BCF21DBEBAD9AF43C7C86A1746C7ED90F732FAD7D3FD8DD7FF007FD67FEFA
1517FD27A76E916DAE132BB68AAA00229D9C99E089E48A4B9FAA3B9E70713ADE
4176A0D50166E79786836A908406D675968BB2359A9ADE80DFBE77B05B217D8D
A1FFD713ADE57BCA5CBEF0A4CB2EFAAA23B362F59AF38F8D23406F768B1C7F16
C13F0907FC24A3FE6E704E41C2006218631396B4B7E219F0C0CEEFF0695BCF4D
3AFE18253D1D511791B229397228645FFDE2779E361C87B52F7AC5ABFE17E23F
9957FD39FF5358BAEDC7CEF7DCFFB9E365353D024B073E09F5E04E0400F8E487
AEB9E357FE47E8B188EF5EF863E71B4EBFE2B8A5793D7457BF000E1C8E7A7C52
6D6E7DE79BFFED96B7BEF625F0B8E45D6F7ECDDAEB3FF5E18FC1E3993FFFC407
FFF6A70E701F0F02FCEB97BFD8FFDA93CE9BBEE8FCB3767EF1D66F3C0EC3E075
BFD3FECBEB3E76FDE33A0CAEFDC8FBEFFAFFAA0AFCC273C99999EFFDBB97BF60
EBE35680E5A5FEB7B69DF3C48B1FB7027CEFDE7BEF5FEAF78BC7AD002D4AF785
A5231FFCF8C73FF063EBFF173FD6EBA9961184F10000000049454E44AE426082
}
end
object pnlInfo: TPanel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = rbExternal
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 30
Height = 89
Top = 176
Width = 381
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 30
BorderSpacing.Top = 12
BorderSpacing.Right = 30
ClientHeight = 89
ClientWidth = 381
Color = clWhite
ParentColor = False
TabOrder = 4
Visible = False
object lblInfo: TLabel
AnchorSideLeft.Control = pnlInfo
AnchorSideTop.Control = pnlInfo
AnchorSideRight.Control = pnlInfo
Left = 1
Height = 34
Top = 1
Width = 366
Caption = 'Cqrlog is creatng your first log, it might take some time.'#10'Please be patient!'
Font.Color = clMaroon
ParentColor = False
ParentFont = False
ShowAccelChar = False
WordWrap = True
end
end
object lblError: TLabel
AnchorSideLeft.Control = Owner
AnchorSideBottom.Control = btnOK
AnchorSideBottom.Side = asrBottom
Left = 6
Height = 1
Top = 293
Width = 1
Anchors = [akLeft, akBottom]
BorderSpacing.Left = 6
Font.Color = clRed
ParentColor = False
ParentFont = False
end
object btnHelp: TSpeedButton
AnchorSideTop.Control = btnOK
AnchorSideRight.Control = btnOK
Left = 232
Height = 25
Top = 269
Width = 116
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = '(Please read)'
Glyph.Data = {
F6030000424DF6030000000000003600000028000000100000000F0000000100
200000000000C003000064000000640000000000000000000000FFFFFF00FFFF
FF0095564AFB89463BFF8A4437FF8B4437FF8C4538FF8D4639FF8E4739FF8F48
3AFF90493BFF914A3CFF924B3DFF985346F8FFFFFF00FFFFFF00FFFFFF00FFFF
FF00784641F5DBDCDCFFD4DCDCFFD4DCDCFFD4DCDCFFD3DCDCFFD3DCDCFFD3DC
DCFFD3DCDCFFD3DCDCFFD6DCDCFFB0928B8BFFFFFF00FFFFFF00FFFFFF00FFFF
FF0096574BF589463BFF8A4437FF8B4437FF8C4538FF8D4639FF8E4739FF8F48
3AFF90493BFF914A3CFF924B3DFF9A5547F0FFFFFF00FFFFFF00FFFFFF00FFFF
FF00AF7467F5AD7568FFB0705EFFB27160FFB47462FFB36E5CFFB56F5DFFBB78
66FFBD7B68FFBF7D6BFFC17F6BFFB87563F7FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B4776AF5AE7568FFB37362FFB57462FFB4705DFFDDBEB4FFE7D1CCFFBB79
66FFBF7D69FFC17F6CFFC3816DFFBA7664F7FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DAB2AAFAAF7668FFB97865FFBB7967FFB76F5AFFFDFAFAFFFFFFFFFFC485
73FFC3826EFFC68470FFC88672FFBD7966E1FFFFFF00FFFFFF00FFFFFF00FFFF
FF00AD7062F5B87D70FFBE7D69FFC07E6BFFBF7A66FFDFBCB1FFD9B5ACFFC67F
68FFCA8873FFCC8A75FFCE8C76FFBF7D69E2FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B17668F5BC8373FFC3826FFFC5836FFFC27A64FFFDFBFAFFFFFFFFFFC07B
68FFCF8B73FFD18F79FFD3917BFFC37F6CE2FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B27769F5C08676FFCA8773FFC88470FFCA846EFFE7C7BCFFFFFFFFFFFBF8
F7FFCF9888FFD69178FFD8967FFFC6846FE2FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B2796AF5C58A7BFFCC866FFFE0B8ABFFC8856FFFCF876FFFE3B7A8FFFEFB
FAFFFFFFFFFFD19A89FFDE9A81FFCB8772E2FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B07465F5C88C7AFFDFAC9CFFFFFFFFFFF8F2F0FFD28970FFD6896DFFEBC2
B6FFFFFFFFFFEED8D1FFE19B82FFCE8B76E2FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDB6AFFACB8E7BFFD58B73FFFBF4F1FFFFFFFFFFF9F5F3FFF9EAE5FFFFFF
FFFFFFFFFFFFE8B8A4FFEAA48AFFCE8A74E7FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B27667F5D29784FFDE9B82FFDD9981FFEFCABBFFFBF1EEFFFBEFEBFFF9E9
E3FFEDB6A2FFEAA589FFEFAC91FFCE8B75E7FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B67A6CF5D79B88FFE5A088FFE5A288FFE6A086FFE79F84FFE8A185FFEAA4
88FFEEAA8EFFF0AE93FFF4B297FFCE8C76E7FFFFFF00FFFFFF00FFFFFF00FFFF
FF00E2A289A4D0927FD7D49078DAD39079DAD5927BDAD7947CDAD8947DDADB96
7FDADB9880DADC9A81DAE19F86DBD4937CAEFFFFFF00FFFFFF00
}
OnClick = btnHelpClick
ShowHint = True
ParentShowHint = False
end
end

383
src/fDbSqlSel.pas Normal file
View File

@ -0,0 +1,383 @@
unit fDbSqlSel;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Buttons;
type
{ TfrmDbSqlSel }
TfrmDbSqlSel = class(TForm)
btnHelp: TSpeedButton;
btnOK: TButton;
edtPort: TEdit;
edtIP: TEdit;
edtUserName: TEdit;
edtPassword: TEdit;
gbLocalUser: TGroupBox;
imLogo: TImage;
lblError: TLabel;
lblIp: TLabel;
lblPort: TLabel;
lblInfo: TLabel;
lblUsername: TLabel;
lblPass: TLabel;
lblQuestion: TLabel;
lblWelcome: TLabel;
pnlWelcome: TPanel;
pnlInfo: TPanel;
rbFolder: TRadioButton;
rbLocal: TRadioButton;
rbExternal: TRadioButton;
procedure btnHelpClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure edtIPExit(Sender: TObject);
procedure edtPasswordExit(Sender: TObject);
procedure edtPortExit(Sender: TObject);
procedure edtUserNameExit(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure rbExternalChange(Sender: TObject);
procedure rbFolderClick(Sender: TObject);
procedure rbLocalChange(Sender: TObject);
private
procedure ChkValues;
procedure MakeScript1;
procedure MakeScript2;
procedure ExecuteScript;
public
ip,port,
user,pass :String;
loc,rdy,
Acon,Rmbr :Boolean;
end;
const
C_PATH ='/bin:/usr/bin/:/usr/local/bin/:~/.local/bin:/sbin:/usr/sbin:/usr/local/sbin';
C_HEIGHT = 230;
var
frmDbSqlSel: TfrmDbSqlSel;
implementation
{ TfrmDbSqlSel }
uses fDBConnect, dUtils;
procedure TfrmDbSqlSel.rbLocalChange(Sender: TObject);
begin
if rbLocal.Checked then
Begin
btnOK.Enabled:=True;
lblError.Caption:='';
lblError.Visible:=False;
gbLocalUser.Visible:=True;
frmDbSqlSel.Height:=C_HEIGHT+ gbLocalUser.Height+btnOK.Height;
edtIp.ReadOnly:=True;
edtIp.Font.Color:=clGray;
edtport.ReadOnly:= True;
edtport.Font.Color:=clGray;
edtIP.Text:='localhost';
edtPort.Text:='3306';
repaint;
edtUsername.SetFocus;
edtUsername.SelectAll;
end
else
frmDbSqlSel.Height:=C_HEIGHT;
end;
procedure TfrmDbSqlSel.rbExternalChange(Sender: TObject);
begin
if rbExternal.Checked then
Begin
btnOK.Enabled:=True;
lblError.Caption:='';
lblError.Visible:=False;
gbLocalUser.Visible:=True;
frmDbSqlSel.Height:=C_HEIGHT+ gbLocalUser.Height+btnOK.Height;
edtIp.ReadOnly:=False;
edtIp.Font.Color:=clDefault;
edtport.ReadOnly:= False;
edtport.Font.Color:=clDefault;
edtIP.Text:='';
edtPort.Text:='3306';
repaint;
edtIP.SetFocus;
edtIP.SelectAll;
end
else
frmDbSqlSel.Height:=C_HEIGHT;
end;
procedure TfrmDbSqlSel.rbFolderClick(Sender: TObject);
begin
rbFolder.SetFocus;
lblError.Caption:='';
lblError.Visible:=False;
gbLocalUser.Visible:=False;
btnOK.Enabled:=True;
end;
procedure TfrmDbSqlSel.MakeScript1; //"create_cqr_user.sh"
var
UsrHome:string;
f :TextFile;
Begin
UsrHome:=dmUtils.GetHomeDirectory;
AssignFile(f,UsrHome+'create_cqr_user.sh');
rewrite(f);
Writeln(f,'#!/bin/bash');
Writeln(f);
Writeln(f,'echo -e "\nCreating user '+user+'@localhost for Cqrlog use\n"');
Writeln(f,'sudo -p "Give user %u password for sudo: " mysql<<EOFSQL');
Writeln(f);
Writeln(f,'CREATE USER IF NOT EXISTS '+#$27+user+#$27+'@'+#$27+'localhost'+#$27+' IDENTIFIED BY '+#$27+pass+#$27+';');
Writeln(f,'GRANT ALL PRIVILEGES ON *.* TO '+#$27+user+#$27+'@'+#$27+'localhost'+#$27+';');
Writeln(f,'FLUSH PRIVILEGES;');
Writeln(f,'EOFSQL');
Writeln(f);
Writeln(f,'status=$?');
Writeln(f,'[ $status -eq 0 ] && echo -e "\nUser creation SUCCESS !"');
Writeln(f,'[ $status -eq 0 ] && echo $status > /tmp/cqrSQLUsrCreate');
Writeln(f,'[ $status -ne 0 ] && echo -e "\nUser creation FAILED !\n\nCheck error !"');
Writeln(f,'read -p "Press enter to continue"');
Writeln(f,'echo Done! > /tmp/cqrBashDone');
Writeln(f,'exit $status');
closeFile(f);
dmUtils.ExecuteCommand('chmod a+rwx '+UsrHome+'create_cqr_user.sh');
end;
procedure TfrmDbSqlSel.MakeScript2; //"backup_all_cqr.sh"
var
UsrHome:string;
f :TextFile;
Begin
UsrHome:=dmUtils.GetHomeDirectory;
AssignFile(f,UsrHome+'backup_all_cqr.sh');
rewrite(f);
Writeln(f,'#!/bin/bash');
Writeln(f);
Writeln(f,'echo -e "\nCreating backup of all Cqrlog logs in database to /tmp/allcqrlogs.sql\n"');
Writeln(f,'$(mysql -u'+user+' -p'+pass+' -B -N -h'+ip+' -P'+port+' -e " show databases like '+#$27+'cqr%'+#$27+'" |\');
Writeln(f,'xargs echo -n mysqldump -q -h'+ip+' -P'+port+' -u'+user+' -p'+pass+' --databases) > /tmp/allcqrlogs.sql');
Writeln(f,'echo -e "Done!\nCopy backup file to your safe place.\nIt will be erased from /tmp at next Linux start\n\nTo restore all Cqrlog logs use command:\n"');
Writeln(f,'echo "mysql -h'+ip+' -P'+port+' -u'+user+' -p'+pass+' < /tmp/allcqrlogs.sql"');
closeFile(f);
dmUtils.ExecuteCommand('chmod a+rwx '+UsrHome+'backup_all_cqr.sh');
end;
Procedure TfrmDbSqlSel.ExecuteScript;
var
UsrHome,
msg :string;
c :integer;
Begin
UsrHome:=dmUtils.GetHomeDirectory;
//try to find three well-known terminals
msg:=FileSearch('xterm',C_PATH,true);
if msg='' then
msg:=FileSearch('gnome-terminal',C_PATH,true);
if msg='' then
msg:=FileSearch('lxterminal',C_PATH,true);
if msg='' then
ShowMessage('Cqrlog did not find command-line terminal from your system!')
else
dmUtils.ExecuteCommand(msg+' -e '+UsrHome+'create_cqr_user.sh');
c:=60; //max timeout in seconds
repeat //we need this stupid wait because [poWaitOnExit] did not work with Mint 20 !
Begin
sleep(1000);
Application.ProcessMessages;
dec(c);
end;
until ((msg='') or (c<1) or (FileExists('/tmp/cqrBashDone')));
if FileExists('/tmp/cqrSQLUsrCreate') then
Begin
msg:= 'It looks like SQL user addition went ok.'
+LineEnding+'You can press OK now.'
+LineEnding+LineEnding;
end
else
Begin
msg:= 'If you did not see terminal and enter your password there'
+LineEnding+ 'then do this:'
+LineEnding+'Open linux command-line terminal and type:'+LineEnding+UsrHome+'create_cqr_user.sh (and press enter)'
+LineEnding+LineEnding+'After that is done without errors close terminal and press OK here'
+LineEnding+LineEnding;
end;
msg:=msg+'Backup of all Cqrlog SQL databases can be done at any '
+LineEnding+'time from command-line terminal by typing:'
+LineEnding+UsrHome+'backup_all_cqr.sh (and pressing enter)';
ShowMessage(msg);
Application.ProcessMessages;
end;
procedure TfrmDbSqlSel.btnOKClick(Sender: TObject);
begin
btnOK.SetFocus;
gbLocalUser.Visible:=True; //these lines are needed for RPi graphics
frmDbSqlSel.Height:=C_HEIGHT+ gbLocalUser.Height+btnOK.Height; //to show lblInfo ok in default selection !?!?!
gbLocalUser.SendToBack;
gbLocalUser.Visible:=False;
frmDbSqlSel.Height:=C_HEIGHT+pnlInfo.Height;
if rbExternal.Checked then
begin
//set info text and return value
lblInfo.Caption:='Cqrlog is connecting to SQL server and '+LineEnding
+'creating a new log if needed. Please be patient!';
pnlInfo.Visible:=true;
pnlInfo.BringToFront;
pnlInfo.Repaint;
ip :=edtIp.Text;
port:=edtPort.Text;
user:=edtUsername.Text;
pass:=edtPassword.Text;
loc:=False;
Acon:=True;
Rmbr:=True;
MakeScript2;
end;
if rbLocal.Checked then
Begin
lblInfo.Caption:='Cqrlog is connecting to SQL server and '+LineEnding
+'creating a new log if needed. Please be patient!';
pnlInfo.Visible:=true;
pnlInfo.BringToFront;
pnlInfo.Repaint;
ip :=edtIp.Text;
port:=edtPort.Text;
user:=edtUsername.Text;
pass:=edtPassword.Text;
loc:=False;
Acon:=True;
Rmbr:=True;
//create script for making sql user, save it and then exceute it
//set values to database connect and exit
MakeScript1;
MakeScript2;
ExecuteScript;
end;
btnOK.Visible:=False;
btnHelp.Visible:=False;
pnlInfo.Visible:=True;
pnlInfo.BringToFront;
pnlInfo.Repaint;
rdy:=true;
Application.ProcessMessages;
sleep(4000);
Close;
end;
procedure TfrmDbSqlSel.btnHelpClick(Sender: TObject);
var
wb :string;
begin
wb:=FileSearch('xdg-open',C_PATH,true);
if wb<>'' then dmUtils.RunOnBackground(wb+' /usr/share/cqrlog/help/firsttime.html');
end;
procedure TfrmDbSqlSel.ChkValues;
Begin
btnOK.Enabled:=True;
lblError.Caption:='';
lblError.Visible:=False;
if edtIP.Text='' then
Begin
btnOK.Enabled:=False;
lblError.Caption:='IP address can not be empty !';
lblError.Visible:=True;
exit;
end;
if edtPort.Text='' then
Begin
btnOK.Enabled:=False;
lblError.Caption:='Port can not be empty !';
lblError.Visible:=True;
exit;
end;
if length(edtUsername.Text)<4 then
Begin
btnOK.Enabled:=False;
lblError.Caption:='Username must be at least 4 characters long !';
lblError.Visible:=True;
exit;
end;
if edtPassword.Text='' then
Begin
btnOK.Enabled:=False;
lblError.Caption:='Password can not be empty !';
lblError.Visible:=True;
exit;
end;
end;
procedure TfrmDbSqlSel.edtIPExit(Sender: TObject);
begin
ChkValues;
end;
procedure TfrmDbSqlSel.edtPasswordExit(Sender: TObject);
begin
ChkValues;
end;
procedure TfrmDbSqlSel.edtPortExit(Sender: TObject);
begin
ChkValues;
end;
procedure TfrmDbSqlSel.edtUserNameExit(Sender: TObject);
begin
ChkValues;
end;
procedure TfrmDbSqlSel.FormClose(Sender: TObject; var CloseAction: TCloseAction
);
begin
rdy := True;
end;
procedure TfrmDbSqlSel.FormCreate(Sender: TObject);
begin
ip :='localhost';
port:='64000';
user:='cqrlog';
pass:='cqrlog';
loc :=True;
rdy := False;
Acon:=False;
Rmbr:=False;
frmDbSqlSel.Height:=C_HEIGHT;
lblError.Caption:='';
lblError.Visible:=False;
DeleteFile('/tmp/cqrSQLUsrCreate');
DeleteFile('/tmp/cqrBashDone');
end;
initialization
{$I fDbSqlSel.lrs}
end.

View File

@ -18,10 +18,7 @@ const
cRELEAS = 2;
cBUILD = 1;
cBUILD_DATE = '2022-04-06';
cBUILD_DATE = '2022-04-09';
implementation