1
0
Fork 0

Merge branch 'sharding' of https://github.com/triAGENS/ArangoDB into sharding

This commit is contained in:
Claudius Weinberger 2014-02-28 21:16:08 +01:00
commit 515f46ebfb
20 changed files with 3230 additions and 64 deletions

View File

@ -19,8 +19,22 @@ v2.0.0-alpha1 (2014-02-28)
FOR doc IN docs FILTER doc.value == [ 1, 2, 3 ] RETURN doc
FOR doc IN docs FILTER doc.value == { foo: "bar" } RETURN doc
* INCOMPATIBLE CHANGE: removed undocumented method `collection.saveOrReplace`
this feature was never advertised nor documented nor tested.
* INCOMPATIBLE CHANGE: removed undocumented REST API method `/_api/simple/BY-EXAMPLE-HASH`
this feature was never advertised nor documented nor tested.
* added explicit startup parameter `--server.reuse-address`
This flag can be used to control whether sockets should be acquired with the SO_REUSEADDR
flag.
Regardless of this setting, sockets on Windows are always acquired using the
SO_EXCLUSIVEADDRUSE flag.
* removed undocumented REST API method GET `/_admin/database-name`
* added user validation API at POST `/_api/user/<username>`
@ -152,7 +166,7 @@ v2.0.0-alpha1 (2014-02-28)
* database selection is moved to the bottom right corner of the web interface
* removed priority queues
* removed priority queue index type
this feature was never advertised nor documented nor tested.
@ -202,8 +216,7 @@ v2.0.0-alpha1 (2014-02-28)
* added collection status "loading"
v1.4.11 (XXXX-XX-XX)
--------------------
v1.4.11 (2014-02-27)
* added SHORTEST_PATH AQL function

View File

@ -251,11 +251,16 @@ include_directories(${PROJECT_SOURCE_DIR})
macro (generate_root_config name)
FILE(READ ${PROJECT_SOURCE_DIR}/etc/arangodb/${name}.conf.in FileContent)
STRING(REPLACE "@PKGDATADIR@" "@ROOTDIR@/share/arangodb"
SET(SHARE_DIR "@ROOTDIR@/share/arangodb")
SET(VAR_DIR "@ROOTDIR@/var")
if (MSVC)
SET(SHARE_DIR "@ROOTDIR@/share/arangodb")
SET(VAR_DIR "@ROOTDIR@/var")
endif ()
STRING(REPLACE "@PKGDATADIR@" ${SHARE_DIR}
FileContent "${FileContent}")
STRING(REPLACE "@LOCALSTATEDIR@" "@ROOTDIR@/var"
STRING(REPLACE "@LOCALSTATEDIR@" ${VAR_DIR}
FileContent "${FileContent}")
if (MSVC)
@ -748,22 +753,32 @@ if (MSVC)
##############################################################################
set(CPACK_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Installation/Windows/Templates")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL 1)
set(BITS 64)
IF(CMAKE_CL_64)
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")
SET(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "SetRegView 64")
# this variable was defined by eld and included in NSIS.template.in
SET(CPACK_NSIS_EXTRA_PREUNINSTALL_COMMANDS "SetRegView 64")
SET(BITS 64)
ELSE()
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")
SET(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "SetRegView 32")
SET(CPACK_NSIS_EXTRA_PREUNINSTALL_COMMANDS "SetRegView 32")
SET(BITS 32)
ENDIF()
file(TO_NATIVE_PATH "${PROJECT_SOURCE_DIR}/Installation/Windows/arangodb.bmp" ARANGO_IMG)
file(TO_NATIVE_PATH "${PROJECT_SOURCE_DIR}/Installation/Windows/arangodb.ico" ARANGO_ICON)
SET(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "SetRegView ${BITS}")
# SetRegView controlls where die regkeys are written to
# SetRegView 32 writes the keys into Wow6432
# this variable was defined by eld and included in NSIS.template.in
SET(CPACK_NSIS_EXTRA_PREUNINSTALL_COMMANDS
" SetRegView ${BITS}
SimpleSC::StopService 'ArangoDB' 0 30
SimpleSC::RemoveService 'ArangoDB'
"
)
file(TO_NATIVE_PATH "${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.bmp" ARANGO_IMG)
file(TO_NATIVE_PATH "${PROJECT_SOURCE_DIR}/Installation/Windows/Icons/arangodb.ico" ARANGO_ICON)
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_IMG "${ARANGO_IMG}")
STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARANGO_ICON "${ARANGO_ICON}")
@ -772,7 +787,7 @@ if (MSVC)
message(STATUS "ARANGO_ICON: ${ARANGO_ICON}")
install(
DIRECTORY "${PROJECT_SOURCE_DIR}/Installation/Windows/"
DIRECTORY "${PROJECT_SOURCE_DIR}/Installation/Windows/Icons"
DESTINATION ${TRI_RESOURCEDIR})
set(CPACK_PACKAGE_ICON ${ARANGO_ICON})
@ -783,12 +798,12 @@ if (MSVC)
set(CPACK_NSIS_INSTALLED_ICON_NAME ${ARANGO_ICON})
set(CPACK_NSIS_CREATE_ICONS_EXTRA
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Arango Shell.lnk' '$INSTDIR\\\\bin\\\\arangosh.exe' '' '$INSTDIR\\\\Uninstall.exe'
"CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Arango Shell.lnk' '$INSTDIR\\\\bin\\\\arangosh.exe' '' '$INSTDIR\\\\resources\\\\arangodb.ico' '0' SW_SHOWMAXIMIZED
CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Arango Server.lnk' '$INSTDIR\\\\bin\\\\arangod.exe' '' '$INSTDIR\\\\resources\\\\arangodb.ico' '0' SW_SHOWMAXIMIZED
")
# Note, short cuts are created in $SMPROGRAMS\$STARTMENU_FOLDER but
# they are deleted from '$SMPROGRAMS\$MUI_TEMP
# Note, short cuts are created in $SMPROGRAMS\$STARTMENU_FOLDER but
# they are deleted from '$SMPROGRAMS\$MUI_TEMP
set(CPACK_NSIS_DELETE_ICONS_EXTRA
"Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Arango Server.lnk'
Delete '$SMPROGRAMS\\\\$MUI_TEMP\\\\Arango Shell.lnk'

View File

Before

Width:  |  Height:  |  Size: 906 B

After

Width:  |  Height:  |  Size: 906 B

View File

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 200 KiB

View File

@ -0,0 +1,27 @@
SimpleSC - NSIS Service Control Plugin - License Agreement
This plugin is subject to the Mozilla Public License Version 1.1 (the "License");
You may not use this plugin except in compliance with the License. You may
obtain a copy of the License at http://www.mozilla.org/MPL.
Alternatively, you may redistribute this library, use and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 2.1 of the License,
or (at your option) any later version. You may obtain a copy
of the LGPL at www.gnu.org/copyleft.
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the License.
Copyright
Portions of this software are Copyright (C) 2001 - Peter Windridge, 2003 by
Bernhard Mayer, Fixed and formatted by Brett Dever http://editor.nfscheats.com/
The original code is ServiceControl.pas, released April 16, 2007.
The initial developer of the original code is Rainer Budde (http://www.speed-soft.de).
SimpleSC - NSIS Service Control Plugin is written, published and maintaned by
Rainer Budde (rainer@speed-soft.de).

View File

@ -0,0 +1,335 @@
NSIS Simple Service Plugin
This plugin contains basic service functions like start, stop the
service or checking the service status. It also contains advanced
service functions for example setting the service description, changed
the logon account, granting or removing the service logon privilege.
== Short Reference ==
SimpleSC::InstallService [name_of_service] [display_name] [service_type] [start_type] [binary_path] [dependencies] [account] [password]
SimpleSC::RemoveService [name_of_service]
SimpleSC::StartService [name_of_service] [arguments] [timeout]
SimpleSC::StopService [name_of_service] [wait_for_file_release] [timeout]
SimpleSC::PauseService [name_of_service] [timeout]
SimpleSC::ContinueService [name_of_service] [timeout]
SimpleSC::RestartService [name_of_service] [arguments] [timeout]
SimpleSC::ExistsService [name_of_service]
SimpleSC::GetServiceDisplayName [name_of_service]
SimpleSC::GetServiceName [display_name]
SimpleSC::GetServiceStatus [name_of_service]
SimpleSC::GetServiceDescription [name_of_service]
SimpleSC::GetServiceStartType [name_of_service]
SimpleSC::GetServiceBinaryPath [name_of_service]
SimpleSC::GetServiceLogon [name_of_service]
SimpleSC::GetServiceFailure [name_of_service]
SimpleSC::GetServiceFailureFlag [name_of_service]
SimpleSC::GetServiceDelayedAutoStartInfo [name_of_service]
SimpleSC::SetServiceDescription [name_of_service] [service_description]
SimpleSC::SetServiceStartType [name_of_service] [start_type]
SimpleSC::SetServiceBinaryPath [name_of_service] [binary_path]
SimpleSC::SetServiceLogon [name_of_service] [account] [password]
SimpleSC::SetServiceFailure [name_of_service] [reset_period] [reboot_message] [command] [action_type_1] [action_delay_1] [action_type_2] [action_delay_2] [action_type_3] [action_delay_3]
SimpleSC::SetServiceFailureFlag [name_of_service] [failure_actions_on_non_crash_failures]
SimpleSC::SetServiceDelayedAutoStartInfo [name_of_service] [delayed_autostart]
SimpleSC::GrantServiceLogonPrivilege [account]
SimpleSC::RemoveServiceLogonPrivilege [account]
SimpleSC::ServiceIsPaused [name_of_service]
SimpleSC::ServiceIsRunning [name_of_service]
SimpleSC::ServiceIsStopped [name_of_service]
SimpleSC::GetErrorMessage [error_code]
Parameters:
name_of_service - The name of the service used for Start/Stop commands and all further commands
display_name - The name as shown in the service control manager applet in system control
service_type - One of the following codes
1 - SERVICE_KERNEL_DRIVER - Driver service.
2 - SERVICE_FILE_SYSTEM_DRIVER - File system driver service.
16 - SERVICE_WIN32_OWN_PROCESS - Service that runs in its own process. (Should be used in most cases)
32 - SERVICE_WIN32_SHARE_PROCESS - Service that shares a process with one or more other services.
256 - SERVICE_INTERACTIVE_PROCESS - The service can interact with the desktop.
Note: If you specify either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS,
and the service is running in the context of the LocalSystem account,
you can also specify this value.
Example: SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS - (16 or 256) = 272
Note: Services cannot directly interact with a user as of Windows Vista.
Therefore, this technique should not be used in new code.
See for more information: http://msdn2.microsoft.com/en-us/library/ms683502(VS.85).aspx
start_type - one of the following codes
0 - SERVICE_BOOT_START - Driver boot stage start
1 - SERVICE_SYSTEM_START - Driver scm stage start
2 - SERVICE_AUTO_START - Service auto start (Should be used in most cases)
3 - SERVICE_DEMAND_START - Driver/service manual start
4 - SERVICE_DISABLED - Driver/service disabled
service_status - one of the following codes
1 - SERVICE_STOPPED
2 - SERVICE_START_PENDING
3 - SERVICE_STOP_PENDING
4 - SERVICE_RUNNING
5 - SERVICE_CONTINUE_PENDING
6 - SERVICE_PAUSE_PENDING
7 - SERVICE_PAUSED
binary_path - The path to the binary including all necessary parameters
dependencies - Needed services, controls which services have to be started before this one; use the forward slash "/" to add more more than one service
account - The username/account which should be used
password - Password of the aforementioned account to be able to logon as a service
Note: If you do not specify account/password, the local system account will be used to run the service
arguments - Arguments passed to the service main function.
Note: Driver services do not receive these arguments.
reset_period - The time after which to reset the failure count to zero if there are no failures, in seconds. Specify 0 (INFINITE) to indicate that this value should never be reset
reboot_message - The message to be broadcast to server users before rebooting
command - The command line of the process to execute in response to the SC_ACTION_RUN_COMMAND service controller action. This process runs under the same account as the service
timeout - Timeout in seconds of the function
action_type_x - one of the following codes for the action to be performed
0 - SC_ACTION_NONE - No action
1 - SC_ACTION_RESTART - Restart the service
2 - SC_ACTION_REBOOT - Reboot the computer (Note: The service user must have the SE_SHUTDOWN_NAME privilege)
3 - SC_ACTION_RUN_COMMAND - Run a command
action_delay_x - The time to wait before performing the specified action, in milliseconds
failure_actions_on_non_crash_failures - This setting determines when failure actions are to be executed
0 - The failure actions executed only if the service terminates without reporting a status of SERVICE_STOPPED
1 - The failure actions executed if the status of a service is SERVICE_STOPPED but the exit code of the service is not 0
delayed_autostart - The delayed auto-start setting of an auto-start service
0 - The service will be started during system boot.
1 - The service will be started after other auto-start services are started plus a short delay
error_code - Error code of a function
service_description - The description as shown in the service control manager applet in system control
wait_for_file_release - Wait for file release after the service is stopped. This is useful if the binary file will be overwritten after stopping the service.
0 - NO_WAIT - No wait for file release
1 - WAIT - Wait for file release
Note: If SERVICE_WIN32_OWN_PROCESS is used this option should be set to WAIT.
If SERVICE_WIN32_SHARE_PROCESS is used this option should only be set to WAIT if the last service
in the process is stopped.
== The Sample Script ==
; Install a service - ServiceType own process - StartType automatic - NoDependencies - Logon as System Account
SimpleSC::InstallService "MyService" "My Service Display Name" "16" "2" "C:\MyPath\MyService.exe" "" "" ""
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Install a service - ServiceType interact with desktop - StartType automatic - Dependencies on "Windows Time Service" (w32time) and "WWW Publishing Service" (w3svc) - Logon as System Account
SimpleSC::InstallService "MyService" "My Service Display Name" "272" "2" "C:\MyPath\MyService.exe" "w32time/w3svc" "" ""
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Remove a service
SimpleSC::RemoveService "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Start a service
SimpleSC::StartService "MyService" "" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Start a service with two arguments "/param1=true" "/param2=1"
SimpleSC::StartService "MyService" "/param1=true /param2=1" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Start a service with two arguments "-p param1" "-param2"
SimpleSC::StartService "MyService" '"-p param1" -param2' 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Stop a service and waits for file release
SimpleSC::StopService "MyService" 1 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Stops two services and waits for file release after the last service is stopped
SimpleSC::StopService "MyService1" 0 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
SimpleSC::StopService "MyService2" 1 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Pause a service
SimpleSC::PauseService "MyService" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Continue a service
SimpleSC::ContinueService "MyService" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Restart a service
SimpleSC::RestartService "MyService" "" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Restart a service with two arguments "/param1=true" "/param2=1"
SimpleSC::RestartService "MyService" "/param1=true /param2=1" 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Start a service with two arguments "-p param1" "-param2"
SimpleSC::RestartService "MyService" '"-p param1" -param2' 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Check if the service exists
SimpleSC::ExistsService "MyService"
Pop $0 ; returns an errorcode if the service doesn´t exists (<>0)/service exists (0)
; Get the displayname of a service
SimpleSC::GetServiceDisplayName "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the displayname of the service
; Get the servicename of a service by the displayname
SimpleSC::GetServiceName "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the servicename of the service
; Get the current status of a service
SimpleSC::GetServiceStatus "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; return the status of the service (See "service_status" in the parameters)
; Get the description of a service
SimpleSC::GetServiceDescription "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the description of the service
; Get the start type of the service
SimpleSC::GetServiceStartType "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the start type of the service (see "start_type" in the parameters)
; Get the binary path of a service
SimpleSC::GetServiceBinaryPath "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the binary path of the service
; Get the logon user of the service
SimpleSC::GetServiceLogon "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the logon username of the service
; Get the failure configuration of a service
SimpleSC::GetServiceFailure "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the reset period
Pop $2 ; returns the reboot message
Pop $3 ; returns the command
Pop $4 ; returns the first action (See "action_type_x" in the parameters)
Pop $5 ; returns the first action delay
Pop $6 ; returns the second action (See "action_type_x" in the parameters)
Pop $7 ; returns the second action delay
Pop $8 ; returns the third action (See "action_type_x" in the parameters)
Pop $9 ; returns the third action delay
; Get the failure flag configuration of a service
SimpleSC::GetServiceFailureFlag "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the service flag
; Get the delayed auto-start configuration of a service
SimpleSC::GetServiceDelayedAutoStartInfo "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns the delayed auto-start configuration
; Set the description of a service
SimpleSC::SetServiceDescription "MyService" "Sample Description"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Set the starttype to automatic of a service
SimpleSC::SetServiceStartType "MyService" "2"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Sets the service binary path
SimpleSC::SetServiceBinaryPath "MyService" "C:\MySoftware\MyService.exe"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Sets the service logon to a user and grant the user the "SeServiceLogonPrivilege"
SimpleSC::SetServiceLogon "MyService" "MyServiceUser" "MyServiceUserPassword"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
IntCmp $0 0 +1 Done Done ; If successful grant the service logon privilege to "MyServiceUser"
; Note: Every serviceuser must have the ServiceLogonPrivilege to start the service
SimpleSC::GrantServiceLogonPrivilege "MyServiceUser"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Done:
; Sets the service failure configuration - First action: Restart the service after one minute - Second action: Reboot the computer after five minutes
SimpleSC::SetServiceFailure "MyService" "0" "" "" "1" "60000" "2" "300000" "0" "0"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Sets the failure flag configuration of a service
SimpleSC::SetServiceFailureFlag "MyService" "1"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Sets the delayed auto-start configuration of a service
SimpleSC::SetServiceDelayedAutoStartInfo "MyService" "1"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Remove the "SeServiceLogonPrivilege" from a user
SimpleSC::RemoveServiceLogonPrivilege "MyServiceUser"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
; Check if the service is paused
SimpleSC::ServiceIsPaused "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns 1 (service is paused) - returns 0 (service is not paused)
; Check if the service is running
SimpleSC::ServiceIsRunning "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns 1 (service is running) - returns 0 (service is not running)
; Check if the service is stopped
SimpleSC::ServiceIsStopped "MyService"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns 1 (service is stopped) - returns 0 (service is not stopped)
; Show the error message if a function fails
SimpleSC::StopService "MyService" 1 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
IntCmp $0 0 Done +1 +1
Push $0
SimpleSC::GetErrorMessage
Pop $0
MessageBox MB_OK|MB_ICONSTOP "Stopping fails - Reason: $0"
Done:
== Important Notes ==
- The function "SetServiceLogon" only works if the servicetype is
"SERVICE_WIN32_OWN_PROCESS".
- The functions "GetServiceDescription", "SetServiceDescription", "GetServiceFailure" and
"SetServiceFailure" are only available on systems higher than Windows NT.
- The function "GetServiceFailureFlag", "SetServiceFailureFlag", "GetServiceDelayedAutoStartInfo" and
"SetServiceDelayedAutoStartInfo" are only available on systems higher than Windows 2003.
- If you change the logon of an service to a new user you have to grant him
the Service Logon Privilege. Otherwise the service cannot be started by
the user you have assigned.
- The functions StartService, StopService, PauseService and ContinueService uses
a timeout of 30 seconds. This means the function must be executed within 30 seconds,
otherwise the functions will return an error.

View File

@ -0,0 +1,258 @@
{
License Agreement
This content is subject to the Mozilla Public License Version 1.1 (the "License");
You may not use this plugin except in compliance with the License. You may
obtain a copy of the License at http://www.mozilla.org/MPL.
Alternatively, you may redistribute this library, use and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation; either version 2.1 of the License,
or (at your option) any later version. You may obtain a copy
of the LGPL at www.gnu.org/copyleft.
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the License.
The original code is LSASecurityControl.pas, released April 16, 2007.
The initial developer of the original code is Rainer Budde (http://www.speed-soft.de).
SimpleSC - NSIS Service Control Plugin is written, published and maintaned by
Rainer Budde (rainer@speed-soft.de).
}
unit LSASecurityControl;
interface
uses
Windows, SysUtils;
function GrantPrivilege(AccountName: String; PrivilegeName: String): Integer;
function RemovePrivilege(AccountName: String; PrivilegeName: String): Integer;
function EnablePrivilege(PrivilegeName: String): Integer;
function DisablePrivilege(PrivilegeName: String): Integer;
implementation
type
LSA_HANDLE = Pointer;
TLSAHandle = LSA_HANDLE;
LSA_UNICODE_STRING = record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
TLSAUnicodeString = LSA_UNICODE_STRING;
PLSAUnicodeString = ^TLSAUnicodeString;
LSA_OBJECT_ATTRIBUTES = record
Length: ULONG;
RootDirectory: THandle;
ObjectName: PLSAUnicodeString;
Attributes: ULONG;
SecurityDescriptor: Pointer;
SecurityQualityOfService: Pointer;
end;
TLsaObjectAttributes = LSA_OBJECT_ATTRIBUTES;
PLsaObjectAttributes = ^TLsaObjectAttributes;
function LsaOpenPolicy(SystemName: PLSAUnicodeString; var ObjectAttributes: TLsaObjectAttributes; DesiredAccess: ACCESS_MASK; var PolicyHandle: LSA_HANDLE): DWORD; stdcall; external 'advapi32.dll';
function LsaAddAccountRights(PolicyHandle: LSA_HANDLE; AccountSid: PSID; UserRights: PLSAUnicodeString; CountOfRights: ULONG): DWORD; stdcall; external 'advapi32.dll';
function LsaRemoveAccountRights(PolicyHandle: LSA_HANDLE; AccountSid: PSID; AllRights: Boolean; UserRights: PLSAUnicodeString; CountOfRights: ULONG): DWORD; stdcall; external 'advapi32.dll';
function LsaClose(ObjectHandle: LSA_HANDLE): DWORD; stdcall; external 'advapi32.dll';
function GetAccountSid(const AccountName: String; var Sid: PSID): Integer;
var
DomainSize: LongWord;
SidSize: LongWord;
Domain: String;
Use: SID_NAME_USE;
begin
Result := 0;
SidSize := 0;
DomainSize := 0;
if not LookupAccountName(nil, PChar(AccountName), nil, SidSize, nil, DomainSize, Use) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
SetLength(Domain, DomainSize);
Sid := AllocMem(SidSize);
if not LookupAccountName(nil, PChar(AccountName), Sid, SidSize, PChar(Domain), DomainSize, Use) then
begin
Result := GetLastError;
FreeMem(Sid);
Sid := nil;
end;
end
else
Result := GetLastError;
end;
function GrantPrivilege(AccountName: String; PrivilegeName: String): Integer;
const
UNICODE_NULL = WCHAR(0);
POLICY_CREATE_ACCOUNT = $00000010;
POLICY_LOOKUP_NAMES = $00000800;
var
SID: PSID;
PolicyHandle: TLSAHandle;
LSAPrivilegeName: TLSAUnicodeString;
LSAObjectAttributes: TLsaObjectAttributes;
pwszPrivilegeName: PWideChar;
PrivilegeNameLength: Cardinal;
Status: DWORD;
begin
Result := 0;
GetMem(pwszPrivilegeName, Length(PrivilegeName) * SizeOf(WideChar) + 1);
StringToWideChar(PrivilegeName, pwszPrivilegeName, Length(PrivilegeName) * SizeOf(WideChar) + 1);
ZeroMemory(@LSAObjectAttributes, SizeOf(TLsaObjectAttributes));
PrivilegeNameLength := Length(pwszPrivilegeName);
if PrivilegeNameLength > 0 then
begin
Result := GetAccountSid(AccountName, SID);
if Result = 0 then
begin
LSAPrivilegeName.Length := PrivilegeNameLength * SizeOf(WideChar);
LSAPrivilegeName.MaximumLength := LSAPrivilegeName.Length + SizeOf(UNICODE_NULL);
LSAPrivilegeName.Buffer := pwszPrivilegeName;
Status := LsaOpenPolicy(nil, LSAObjectAttributes, POLICY_LOOKUP_NAMES or POLICY_CREATE_ACCOUNT, PolicyHandle);
try
if Status = 0 then
Result := LsaAddAccountRights(PolicyHandle, Sid, @LSAPrivilegeName, 1)
else
Result := Status;
finally
LsaClose(PolicyHandle);
end;
end;
end;
FreeMem(pwszPrivilegeName);
end;
function RemovePrivilege(AccountName: String; PrivilegeName: String): Integer;
const
UNICODE_NULL = WCHAR(0);
POLICY_CREATE_ACCOUNT = $00000010;
POLICY_LOOKUP_NAMES = $00000800;
var
SID: PSID;
PolicyHandle: TLSAHandle;
LSAPrivilegeName: TLSAUnicodeString;
LSAObjectAttributes: TLsaObjectAttributes;
pwszPrivilegeName: PWideChar;
PrivilegeNameLength: Cardinal;
Status: DWORD;
begin
Result := 0;
GetMem(pwszPrivilegeName, Length(PrivilegeName) * SizeOf(WideChar) + 1);
StringToWideChar(PrivilegeName, pwszPrivilegeName, Length(PrivilegeName) * SizeOf(WideChar) + 1);
ZeroMemory(@LSAObjectAttributes, SizeOf(TLsaObjectAttributes));
PrivilegeNameLength := Length(pwszPrivilegeName);
if PrivilegeNameLength > 0 then
begin
Result := GetAccountSid(AccountName, SID);
if Result = 0 then
begin
LSAPrivilegeName.Length := PrivilegeNameLength * SizeOf(WideChar);
LSAPrivilegeName.MaximumLength := LSAPrivilegeName.Length + SizeOf(UNICODE_NULL);
LSAPrivilegeName.Buffer := pwszPrivilegeName;
Status := LsaOpenPolicy(nil, LSAObjectAttributes, POLICY_LOOKUP_NAMES or POLICY_CREATE_ACCOUNT, PolicyHandle);
try
if Status = 0 then
Result := LsaRemoveAccountRights(PolicyHandle, Sid, False, @LSAPrivilegeName, 1)
else
Result := Status;
finally
LsaClose(PolicyHandle);
end;
end;
end;
FreeMem(pwszPrivilegeName);
end;
function EnablePrivilege(PrivilegeName: String): Integer;
var
TokenHandle: THandle;
TokenPrivileges: TOKEN_PRIVILEGES;
PreviousState: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := 0;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
begin
try
if LookupPrivilegeValue(nil, PChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid) then
begin
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, SizeOf(TokenPrivileges), PreviousState, ReturnLength) then
Result := System.GetLastError;
end
else
Result := System.GetLastError;
finally
CloseHandle(TokenHandle);
end;
end
else
Result := System.GetLastError;
end;
function DisablePrivilege(PrivilegeName: String): Integer;
var
TokenHandle: THandle;
TokenPrivileges: TOKEN_PRIVILEGES;
PreviousState: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := 0;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
begin
try
if LookupPrivilegeValue(nil, PChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid) then
begin
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, SizeOf(TokenPrivileges), PreviousState, ReturnLength) then
Result := System.GetLastError;
end
else
Result := System.GetLastError;
finally
CloseHandle(TokenHandle);
end;
end
else
Result := System.GetLastError;
end;
end.

View File

@ -0,0 +1,126 @@
{
Original Code from
(C) 2001 - Peter Windridge
Code in seperate unit and some changes
2003 by Bernhard Mayer
Fixed and formatted by Brett Dever
http://editor.nfscheats.com/
simply include this unit in your plugin project and export
functions as needed
}
unit nsis;
interface
uses
windows;
type
VarConstants = (
INST_0, // $0
INST_1, // $1
INST_2, // $2
INST_3, // $3
INST_4, // $4
INST_5, // $5
INST_6, // $6
INST_7, // $7
INST_8, // $8
INST_9, // $9
INST_R0, // $R0
INST_R1, // $R1
INST_R2, // $R2
INST_R3, // $R3
INST_R4, // $R4
INST_R5, // $R5
INST_R6, // $R6
INST_R7, // $R7
INST_R8, // $R8
INST_R9, // $R9
INST_CMDLINE, // $CMDLINE
INST_INSTDIR, // $INSTDIR
INST_OUTDIR, // $OUTDIR
INST_EXEDIR, // $EXEDIR
INST_LANG, // $LANGUAGE
__INST_LAST
);
TVariableList = INST_0..__INST_LAST;
pstack_t = ^stack_t;
stack_t = record
next: pstack_t;
text: PChar;
end;
var
g_stringsize: integer;
g_stacktop: ^pstack_t;
g_variables: PChar;
g_hwndParent: HWND;
procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
function PopString(): string;
procedure PushString(const str: string='');
function GetUserVariable(const varnum: TVariableList): string;
procedure SetUserVariable(const varnum: TVariableList; const value: string);
procedure NSISDialog(const text, caption: string; const buttons: integer);
implementation
procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
begin
g_stringsize := string_size;
g_hwndParent := hwndParent;
g_stacktop := stacktop;
g_variables := variables;
end;
function PopString(): string;
var
th: pstack_t;
begin
if integer(g_stacktop^) <> 0 then begin
th := g_stacktop^;
Result := PChar(@th.text);
g_stacktop^ := th.next;
GlobalFree(HGLOBAL(th));
end;
end;
procedure PushString(const str: string='');
var
th: pstack_t;
begin
if integer(g_stacktop) <> 0 then begin
th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
lstrcpyn(@th.text, PChar(str), g_stringsize);
th.next := g_stacktop^;
g_stacktop^ := th;
end;
end;
function GetUserVariable(const varnum: TVariableList): string;
begin
if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
Result := g_variables + integer(varnum) * g_stringsize
else
Result := '';
end;
procedure SetUserVariable(const varnum: TVariableList; const value: string);
begin
if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
end;
procedure NSISDialog(const text, caption: string; const buttons: integer);
begin
MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
end;
begin
end.

View File

@ -0,0 +1,35 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O-
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"c:\programme\borland\delphi6\Projects\Bpl"
-LN"c:\programme\borland\delphi6\Projects\Bpl"

View File

@ -0,0 +1,92 @@
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=0
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;VclSmp;vclshlctrls;dbrtl;adortl;vcldb;qrpt;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;teeqr;ibxpress;visualclx;visualdbclx;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;dbexpress;dbxcds;dclOffice2k;soaprtl;Jcl;VirtualTreesD6;VirtualShellToolsD6;VirtualExplorerListviewExD6;ThemeManagerD6;JclVcl;JvCoreD6R;JvSystemD6R;JvStdCtrlsD6R;JvAppFrmD6R;JvBandsD6R;JvDBD6R;JvDlgsD6R;JvBDED6R;JvCmpD6R;JvCryptD6R;JvCtrlsD6R;JvCustomD6R;JvDockingD6R;JvDotNetCtrlsD6R;JvEDID6R;JvGlobusD6R;JvHMID6R;JvInterpreterD6R;JvJansD6R;JvManagedThreadsD6R;JvMMD6R;JvNetD6R;JvPageCompsD6R;JvPluginD6R;JvPrintPreviewD6R;JvRuntimeDesignD6R;JvTimeFrameworkD6R;JvUIBD6R;JvValidatorsD6R;JvWizardD6R;JvXPCtrlsD6R;FModPackage;NetBrowserPackage;ThreadCopyPackage;TMSMenusD6;DSPack_D6;SNTPServer
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=C:\Programme\Borland\Delphi6\Lib\Usr\RB\NSIS Simple Service Control\Project1.exe
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
c:\programme\borland\delphi6\Projects\Bpl\SNTPServer.bpl=(Unbenannt)
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;

View File

@ -0,0 +1,601 @@
library SimpleSC;
uses
NSIS, Windows, ServiceControl, LSASecurityControl, SysUtils;
function BoolToStr(Value: Boolean): String;
begin
if Value then
Result := '1'
else
Result := '0';
end;
function StrToBool(Value: String): Boolean;
begin
Result := Value = '1';
end;
procedure InstallService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
DisplayName: String;
ServiceType: Cardinal;
StartType: Cardinal;
BinaryPath: String;
Dependencies: String;
Username: String;
Password: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
DisplayName := PopString;
ServiceType := StrToInt(PopString);
StartType := StrToInt(PopString);
BinaryPath := PopString;
Dependencies := PopString;
Username := PopString;
Password := PopString;
ServiceResult := IntToStr(ServiceControl.InstallService(ServiceName, DisplayName, ServiceType, StartType, BinaryPath, Dependencies, Username, Password));
PushString(ServiceResult);
end;
procedure RemoveService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.RemoveService(ServiceName));
PushString(ServiceResult);
end;
procedure StartService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ServiceArguments: String;
Timeout: Integer;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceArguments := PopString;
Timeout := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.StartService(ServiceName, ServiceArguments, Timeout));
PushString(ServiceResult);
end;
procedure StopService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
WaitForFileRelease: Boolean;
Timeout: Integer;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
WaitForFileRelease := StrToBool(PopString);
Timeout := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.StopService(ServiceName, WaitForFileRelease, Timeout));
PushString(ServiceResult)
end;
procedure PauseService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Timeout: Integer;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
Timeout := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.PauseService(ServiceName, Timeout));
PushString(ServiceResult)
end;
procedure ContinueService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Timeout: Integer;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
Timeout := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.ContinueService(ServiceName, Timeout));
PushString(ServiceResult)
end;
procedure GetServiceName(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
Var
DisplayName: String;
ServiceResult: String;
ServiceName: String;
begin
Init(hwndParent, string_size, variables, stacktop);
DisplayName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceName(DisplayName, ServiceName));
PushString(ServiceName);
PushString(ServiceResult);
end;
procedure GetServiceDisplayName(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
Var
ServiceName: String;
DisplayName: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceDisplayName(ServiceName, DisplayName));
PushString(DisplayName);
PushString(ServiceResult);
end;
procedure GetServiceStatus(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Status: DWORD;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceStatus(ServiceName, Status));
PushString(IntToStr(Status));
PushString(ServiceResult);
end;
procedure GetServiceBinaryPath(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
BinaryPath: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceBinaryPath(ServiceName, BinaryPath));
PushString(BinaryPath);
PushString(ServiceResult);
end;
procedure GetServiceDescription(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Description: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceDescription(ServiceName, Description));
PushString(Description);
PushString(ServiceResult);
end;
procedure GetServiceStartType(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
StartType: DWORD;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceStartType(ServiceName, StartType));
PushString(IntToStr(StartType));
PushString(ServiceResult);
end;
procedure GetServiceLogon(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Username: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceLogon(ServiceName, Username));
PushString(Username);
PushString(ServiceResult);
end;
procedure GetServiceFailure(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ResetPeriod: DWORD;
RebootMessage: String;
Command: String;
Action1: Integer;
ActionDelay1: DWORD;
Action2: Integer;
ActionDelay2: DWORD;
Action3: Integer;
ActionDelay3: DWORD;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceFailure(ServiceName, ResetPeriod, RebootMessage, Command, Action1, ActionDelay1, Action2, ActionDelay2, Action3, ActionDelay3));
PushString(IntToStr(ActionDelay3));
PushString(IntToStr(Action3));
PushString(IntToStr(ActionDelay2));
PushString(IntToStr(Action2));
PushString(IntToStr(ActionDelay1));
PushString(IntToStr(Action1));
PushString(Command);
PushString(RebootMessage);
PushString(IntToStr(ResetPeriod));
PushString(ServiceResult);
end;
procedure GetServiceFailureFlag(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
FailureActionsOnNonCrashFailures: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceFailureFlag(ServiceName, FailureActionsOnNonCrashFailures));
PushString(BoolToStr(FailureActionsOnNonCrashFailures));
PushString(ServiceResult);
end;
procedure GetServiceDelayedAutoStartInfo(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
DelayedAutostart: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.GetServiceDelayedAutoStartInfo(ServiceName, DelayedAutostart));
PushString(BoolToStr(DelayedAutostart));
PushString(ServiceResult);
end;
procedure SetServiceDescription(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Description: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
Description := PopString;
ServiceResult := IntToStr(ServiceControl.SetServiceDescription(ServiceName, Description));
PushString(ServiceResult);
end;
procedure SetServiceStartType(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ServiceStartType: DWORD;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceStartType := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.SetServiceStartType(ServiceName, ServiceStartType));
PushString(ServiceResult);
end;
procedure SetServiceLogon(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
Username: String;
Password: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
Username := PopString;
Password := PopString;
ServiceResult := IntToStr(ServiceControl.SetServiceLogon(ServiceName, Username, Password));
PushString(ServiceResult);
end;
procedure SetServiceBinaryPath(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
BinaryPath: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
BinaryPath := PopString;
ServiceResult := IntToStr(ServiceControl.SetServiceBinaryPath(ServiceName, BinaryPath));
PushString(ServiceResult);
end;
procedure SetServiceFailure(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ResetPeriod: DWORD;
RebootMessage: String;
Command: String;
Action1: Integer;
ActionDelay1: DWORD;
Action2: Integer;
ActionDelay2: DWORD;
Action3: Integer;
ActionDelay3: DWORD;
ServiceResult: Integer;
PrivilegeResult: Integer;
const
SE_SHUTDOWN_PRIVILEGE = 'SeShutdownPrivilege';
SC_ACTION_REBOOT = 2;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ResetPeriod := StrToInt(PopString);
RebootMessage := PopString;
Command := PopString;
Action1 := StrToInt(PopString);
ActionDelay1 := StrToInt(PopString);
Action2 := StrToInt(PopString);
ActionDelay2 := StrToInt(PopString);
Action3 := StrToInt(PopString);
ActionDelay3 := StrToInt(PopString);
if (Action1 = SC_ACTION_REBOOT) or (Action2 = SC_ACTION_REBOOT) or (Action3 = SC_ACTION_REBOOT) then
begin
PrivilegeResult := LSASecurityControl.EnablePrivilege(SE_SHUTDOWN_PRIVILEGE);
if not PrivilegeResult = 0 then
begin
PushString(IntToStr(PrivilegeResult));
Exit;
end;
end;
ServiceResult := ServiceControl.SetServiceFailure(ServiceName, ResetPeriod, RebootMessage, Command, Action1, ActionDelay1,
Action2, ActionDelay2, Action3, ActionDelay3);
if (Action1 = SC_ACTION_REBOOT) or (Action2 = SC_ACTION_REBOOT) or (Action3 = SC_ACTION_REBOOT) then
begin
PrivilegeResult := LSASecurityControl.DisablePrivilege(SE_SHUTDOWN_PRIVILEGE);
if not PrivilegeResult = 0 then
begin
PushString(IntToStr(PrivilegeResult));
Exit;
end;
end;
PushString(IntToStr(ServiceResult));
end;
procedure SetServiceFailureFlag(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
FailureActionsOnNonCrashFailures: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
FailureActionsOnNonCrashFailures := StrToBool(PopString);
ServiceResult := IntToStr(ServiceControl.SetServiceFailureFlag(ServiceName, FailureActionsOnNonCrashFailures));
PushString(ServiceResult)
end;
procedure SetServiceDelayedAutoStartInfo(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
DelayedAutostart: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
DelayedAutostart := StrToBool(PopString);
ServiceResult := IntToStr(ServiceControl.SetServiceDelayedAutoStartInfo(ServiceName, DelayedAutostart));
PushString(ServiceResult)
end;
procedure ServiceIsRunning(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
IsRunning: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.ServiceIsRunning(ServiceName, IsRunning));
PushString(BoolToStr(IsRunning));
PushString(ServiceResult);
end;
procedure ServiceIsStopped(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
IsStopped: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.ServiceIsStopped(ServiceName, IsStopped));
PushString(BoolToStr(IsStopped));
PushString(ServiceResult);
end;
procedure ServiceIsPaused(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
IsPaused: Boolean;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.ServiceIsPaused(ServiceName, IsPaused));
PushString(BoolToStr(IsPaused));
PushString(ServiceResult);
end;
procedure RestartService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ServiceArguments: String;
Timeout: Integer;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceArguments := PopString;
Timeout := StrToInt(PopString);
ServiceResult := IntToStr(ServiceControl.RestartService(ServiceName, ServiceArguments, Timeout));
PushString(ServiceResult);
end;
procedure ExistsService(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ServiceName: String;
ServiceResult: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ServiceName := PopString;
ServiceResult := IntToStr(ServiceControl.ExistsService(ServiceName));
PushString(ServiceResult);
end;
procedure GrantServiceLogonPrivilege(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
AccountName: String;
LSAResult: String;
const
SE_SERVICE_LOGON_RIGHT = 'SeServiceLogonRight';
begin
Init(hwndParent, string_size, variables, stacktop);
AccountName := PopString;
LSAResult := IntToStr(LSASecurityControl.GrantPrivilege(AccountName, SE_SERVICE_LOGON_RIGHT));
PushString(LSAResult);
end;
procedure RemoveServiceLogonPrivilege(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
AccountName: String;
LSAResult: String;
const
SE_SERVICE_LOGON_RIGHT = 'SeServiceLogonRight';
begin
Init(hwndParent, string_size, variables, stacktop);
AccountName := PopString;
LSAResult := IntToStr(LSASecurityControl.RemovePrivilege(AccountName, SE_SERVICE_LOGON_RIGHT));
PushString(LSAResult);
end;
procedure GetErrorMessage(const hwndParent: HWND; const string_size: integer;
const variables: PChar; const stacktop: pointer); cdecl;
var
ErrorCode: Integer;
ErrorMessage: String;
begin
Init(hwndParent, string_size, variables, stacktop);
ErrorCode := StrToInt(PopString);
ErrorMessage := ServiceControl.GetErrorMessage(ErrorCode);
PushString(ErrorMessage);
end;
exports InstallService;
exports RemoveService;
exports StartService;
exports StopService;
exports PauseService;
exports ContinueService;
exports GetServiceName;
exports GetServiceDisplayName;
exports GetServiceStatus;
exports GetServiceBinaryPath;
exports GetServiceDescription;
exports GetServiceStartType;
exports GetServiceLogon;
exports GetServiceFailure;
exports GetServiceFailureFlag;
exports GetServiceDelayedAutoStartInfo;
exports SetServiceDescription;
exports SetServiceStartType;
exports SetServiceLogon;
exports SetServiceBinaryPath;
exports SetServiceFailure;
exports SetServiceFailureFlag;
exports SetServiceDelayedAutoStartInfo;
exports ServiceIsRunning;
exports ServiceIsStopped;
exports ServiceIsPaused;
exports RestartService;
exports ExistsService;
exports GrantServiceLogonPrivilege;
exports RemoveServiceLogonPrivilege;
exports GetErrorMessage;
end.

View File

@ -0,0 +1,7 @@
Every sub directory has to be a plugin directory which is
inlcluded in to the installation script of arango.
The plugins are NOT needed for compilation of any arango component
At moment we use only the plugin SimpleSerice whic help us to start
as service

View File

@ -0,0 +1,46 @@
[Settings]
NumFields=5
[Field 1]
Type=label
Text=By default @CPACK_PACKAGE_INSTALL_DIRECTORY@ does not add its directory to the system PATH.
Left=0
Right=-1
Top=0
Bottom=20
[Field 2]
Type=radiobutton
Text=Install @CPACK_PACKAGE_NAME@ as Service into default directory
Left=0
Right=-1
Top=30
Bottom=40
State=1
[Field 3]
Type=radiobutton
Text=Install @CPACK_PACKAGE_NAME@ as into configurable directory
Left=0
Right=-1
Top=40
Bottom=50
State=0
[Field 4]
Type=radiobutton
Text=install @CPACK_PACKAGE_NAME@ for current user
Left=0
Right=-1
Top=50
Bottom=60
State=0
[Field 5]
Type=CheckBox
Text=Create @CPACK_PACKAGE_NAME@ Desktop Icon
Left=0
Right=-1
Top=80
Bottom=90
State=0

View File

@ -1,4 +1,11 @@
; CPack install script designed for a nmake build
;!addplugindir 'c:\\\\Program Files (x86)\\\\NSIS\Plugins\\\\Simple_Service'
!addplugindir '..\..\..\..\Installation\Windows\Plugins\NSIS_Simple_Service_Plugin_1.30'
;--------------------------------
; Include LogicLib for more readable code
!include "LogicLib.nsh"
;--------------------------------
; You must define these values
@ -19,6 +26,9 @@
Var ADD_TO_PATH_CURRENT_USER
Var INSTALL_DESKTOP
Var IS_DEFAULT_INSTALLDIR
; Variables for definition of instdir
VAR TRI_INSTALL_AS_SERVICE
VAR TRI_INSTALL_SINGLE_USER
;--------------------------------
;Include Modern UI
@ -551,6 +561,7 @@ FunctionEnd
!insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
Page custom InstallOptionsPage
!define MUI_PAGE_CUSTOMFUNCTION_PRE default_installation_directory
!insertmacro MUI_PAGE_DIRECTORY
;Start Menu Folder Page Configuration
@ -721,7 +732,14 @@ Section "-Core installation"
!insertmacro MUI_STARTMENU_WRITE_END
@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
StrCmp $TRI_INSTALL_AS_SERVICE '1' 0 nothing
SimpleSC::StopService 'ArangoDB' 0 30
SimpleSC::RemoveService 'ArangoDB'
SimpleSC::InstallService 'ArangoDB' 'ArangoDB' '16' '2' '"$INSTDIR\bin\arangod.exe" --start-service' '' '' ''
SimpleSC::StartService 'ArangoDB' '' 30
nothing:
SectionEnd
@ -740,31 +758,68 @@ Function InstallOptionsPage
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"
FunctionEnd
;------------------------
; Create
Function ArangoPreInstallationOptionsPage
!insertmacro MUI_HEADER_TEXT "@CPACK_NSIS_PACKAGE_NAME@ als Service?" "Install @CPACK_NSIS_PACKAGE_NAME@ as Service?"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.ArangoDB.ini"
FunctionEnd
;--------------------------------
Function default_installation_directory
; Read variables which defines if arango should be installed as Service
!insertmacro MUI_INSTALLOPTIONS_READ $TRI_INSTALL_AS_SERVICE "NSIS.InstallOptions.ini" "Field 2" "State"
!insertmacro MUI_INSTALLOPTIONS_READ $0 "NSIS.InstallOptions.ini" "Field 2" "State"
!insertmacro MUI_INSTALLOPTIONS_READ $TRI_INSTALL_SINGLE_USER "NSIS.InstallOptions.ini" "Field 4" "State"
StrCmp $TRI_INSTALL_AS_SERVICE '1' 0 checkSingleUser
WriteRegExpandStr HKCC "Software\@CPACK_NSIS_PACKAGE_NAME@" "type" "Service"
SetShellVarContext all
Abort
checkSingleUser:
StrCmp $TRI_INSTALL_SINGLE_USER '1' 0 all_users
WriteRegExpandStr HKCC "Software\@CPACK_NSIS_PACKAGE_NAME@" "type" "SingleUser"
SetShellVarContext current
StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
Return
all_users:
WriteRegExpandStr HKCC "Software\@CPACK_NSIS_PACKAGE_NAME@" "type" "Service"
SetShellVarContext all
StrCpy $TRI_INSTALL_AS_SERVICE '1'
FunctionEnd
;--------------------------------
; determine admin versus local install
Function un.onInit
ClearErrors
UserInfo::GetName
IfErrors noLM
Pop $0
UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" 0 +3
; ClearErrors
; UserInfo::GetName
; IfErrors noLM
; Pop $0
; UserInfo::GetAccountType
; Pop $1
; StrCmp $1 "Admin" 0 +3
; SetShellVarContext all
; MessageBox MB_OK 'User "$0" is in the Admin group'
; Goto done
; StrCmp $1 "Power" 0 +3
; SetShellVarContext all
; MessageBox MB_OK 'User "$0" is in the Power Users group'
; Goto done
;
; noLM:
; ;Get installation folder from registry if available
;
; done:
ReadRegStr $0 HKCC "Software\@CPACK_NSIS_PACKAGE_NAME@" "type"
StrCmp $0 "Service" 0 +3
SetShellVarContext all
;MessageBox MB_OK 'User "$0" is in the Admin group'
Goto done
StrCmp $1 "Power" 0 +3
SetShellVarContext all
;MessageBox MB_OK 'User "$0" is in the Power Users group'
Goto done
noLM:
;Get installation folder from registry if available
done:
Goto tri_done
SetShellVarContext current
tri_done:
FunctionEnd
;--- Add/Remove callback functions: ---
@ -823,6 +878,17 @@ Section "Uninstall"
;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
StrCmp $TRI_INSTALL_AS_SERVICE '1' 0 nothing
SimpleSC::StopService 'ArangoDB' 0 30
SimpleSC::RemoveService 'ArangoDB'
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
IntCmp $0 0 Done +1 +1
Push $0
SimpleSC::GetErrorMessage
Pop $0
MessageBox MB_OK 'Stopping ArangoDB fails - Reason: $0'
Done:
nothing:
;Remove files we installed.
;Keep the list of directories here in sync with the File commands above.
@ -886,6 +952,7 @@ Section "Uninstall"
secondStartMenuDeleteLoopDone:
DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
DeleteRegKey HKCC "Software\@CPACK_NSIS_PACKAGE_NAME@"
Push $INSTDIR\bin
StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0

View File

@ -134,7 +134,7 @@ bool V8PeriodicJob::beginShutdown () {
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
void V8PeriodicJob::handleError (triagens::basics::TriagensError const& ex) {
void V8PeriodicJob::handleError (TriagensError const& ex) {
}
// -----------------------------------------------------------------------------

View File

@ -45,16 +45,16 @@
})
if (!self.isSymmetric) {
if (!foundDBServer) {
alert("Please provide at least one DBServer");
alert("Please provide at least one database server");
return;
}
if (!foundCoordinator) {
alert("Please provide at least one Coordinator");
alert("Please provide at least one coordinator");
return;
}
} else {
if ( data.dispatchers.length === 0) {
alert("Please provide at least one Host");
alert("Please provide at least one host");
return;
}
@ -62,7 +62,7 @@
data.type = this.isSymmetric ? "symmetricalSetup" : "asymmetricalSetup";
$('#waitModalLayer').modal('show');
$('#waitModalMessage').html('Please be patient while your cluster will be launched');
$('#waitModalMessage').html('Please be patient while your cluster is being launched');
this.model.save(
data,
{

View File

@ -17,25 +17,25 @@
startPlan: function() {
$('#waitModalLayer').modal('show');
$('#waitModalMessage').html('Please be patient while your cluster will be launched');
$('#waitModalMessage').html('Please be patient while your cluster is being launched');
var h = $("#host").val(),
p = $("#port").val(),
c = $("#coordinators").val(),
d = $("#dbs").val();
if (!h) {
alert("Please define a Host");
alert("Please define a host");
return;
}
if (!p) {
alert("Please define a Port");
alert("Please define a port");
return;
}
if (!c) {
alert("Please define a number of Coordinators");
if (!c || c < 0) {
alert("Please define a number of coordinators");
return;
}
if (!d) {
alert("Please define a number of DBServers");
if (!d || d < 0) {
alert("Please define a number of database servers");
return;
}
this.model.save(

View File

@ -1969,14 +1969,13 @@ void TRI_SetUserTempPath (char* path) {
}
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the installation directory
///
/// @brief locate the installation directory in the given rootKey
/// @param rootKey should be: either HKEY_CURRENT_USER or HKEY_LOCAL_MASCHINE
/// Will always end in a directory separator.
////////////////////////////////////////////////////////////////////////////////
#if _WIN32
char* TRI_LocateInstallDirectory () {
char * __LocateInstallDirectory_In(HKEY rootKey) {
DWORD dwType;
char szPath[1023];
DWORD dwDataSize;
@ -1987,25 +1986,45 @@ char* TRI_LocateInstallDirectory () {
// open the key for reading
long lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\triAGENS GmbH\\ArangoDB " TRI_VERSION,
0,
KEY_READ,
&key);
rootKey,
"SOFTWARE\\triAGENS GmbH\\ArangoDB " TRI_VERSION,
0,
KEY_READ,
&key);
if (lResult == ERROR_SUCCESS) {
// read the version value
lResult = RegQueryValueEx(key, "", NULL, &dwType, (BYTE*)szPath, &dwDataSize);
// read the version value
lResult = RegQueryValueEx(key, "", NULL, &dwType, (BYTE*)szPath, &dwDataSize);
if (lResult == ERROR_SUCCESS) {
return TRI_Concatenate2String(szPath, "\\"); // TODO check if it already ends in \\ or /
}
if (lResult == ERROR_SUCCESS) {
return TRI_Concatenate2String(szPath, "\\"); // TODO check if it already ends in \\ or /
RegCloseKey(key);
}
RegCloseKey(key);
}
return NULL;
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief locate the installation directory
/// we look for the configuration first in HKEY_CURRENT_USER (arango was installed
/// for a single user)
/// when we don't find anything when look in HKEY_LOCAL_MACHINE (arango was
/// installed as service)
/// Will always end in a directory separator.
////////////////////////////////////////////////////////////////////////////////
#if _WIN32
char* TRI_LocateInstallDirectory () {
char * directory = __LocateInstallDirectory_In(HKEY_CURRENT_USER);
if (!directory) {
directory = __LocateInstallDirectory_In(HKEY_LOCAL_MACHINE);
}
return directory;
}
#else