table of contents - download center · pdf filesynology dsm6.0 developer guide this document...
TRANSCRIPT
0
1
1.1
2
2.1
2.1.1
2.1.2
2.1.3
2.2
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.3
2.4
2.5
2.6
3
3.1
3.2
3.2.1
3.2.2
3.3
3.4
3.4.1
3.5
3.6
4
4.1
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.3
4.4
4.5
4.6
TableofContentsPackageDeveloperGuide
GettingStarted
SystemRequirements
CreatePackage
Preparation
InstallToolkit
PrepareBuildEnvironment
PrepareGPGKey
HelloWorldPackage
BuildStage
PackStage
SignPackage
EssentialRunTimeFiles
Summary
CompileOpenSourceProject:tmux
CompileOpenSourceProject:nmap
CompileKernelModules
Advanced
SynologyPackage
PackageStructure
INFO
NecessaryFields
OptionalFields
package.tgz
scripts
ScriptEnvironmentVariables
conf
WIZARD_UIFILES
IntegrateYourPackageintoDSM
ManageStorageforApplicationFiles
IntegrateYourPackageintoDSMWebGUI
Startup
Config
IntegrateHelpDocumentintoDSMHelp
IntegratewithDSMWebAuthentication
DSMBackwardCompatibility
ShowMessagestoUsers
CreatePHPApplication
RunScriptsWhentheSystemBoots
SynologyDSM6.0DeveloperGuide
2
4.7
4.8
4.9
4.9.1
4.9.2
4.9.3
4.9.3.1
4.10
4.10.1
4.10.2
4.10.3
4.10.4
4.10.4.1
4.10.4.2
4.10.4.3
4.10.4.4
4.10.4.5
4.10.4.6
4.10.4.7
4.10.4.8
5
5.1
5.2
5.3
6
6.1
7
7.1
7.2
7.3
7.4
LocaleSupport
InstallPackageRelatedPortsInformationintoDSM
LowerPrivilege
PackageUser&Group
Mechanism
PrivilegeSpecification
Categories
ResourceAcquisition
ResourceSpecification
Timing
ConfigUpdate
AvailableWorkers
/usr/locallinker
Apache2.2Config
DataShare
IndexDB
MariaDB
PHPINI
PortConfig
SyslogConfig
PublishSynologyPackages
GetStartedwithPublishing
SubmittingthePackageforApproval
RespondingtoUserIssues
AppendixA:PlatformandArchValueMappingTable
RevisionHistory
AppendixB:CompileApplicationsManually
DownloadDSMToolChain
Compile
CompileOpenSourceProjects
CompileKernelModules
SynologyDSM6.0DeveloperGuide
3
SynologyDSM6.0DeveloperGuideTHISDOCUMENTCONTAINSPROPRIETARYTECHNICALINFORMATIONWHICHISTHEPROPERTYOFSYNOLOGYINCORPORATEDANDSHALLNOTBEREPRODUCED,COPIED,ORUSEDASTHEBASISFORDESIGN,MANUFACTURING,ORSALEOFAPPARATUSWITHOUTWRITTENPERMISSIONOFSYNOLOGYINCORPORATED
Copyright
SynologyInc.®2016SynologyInc.Allrightsreserved.
Nopartofthispublicationmaybereproduced,storedinaretrievalsystem,ortransmitted,inanyformorbyanymeans,mechanical,electronic,photocopying,recording,orotherwise,withoutpriorwrittenpermissionofSynologyInc.,withthefollowingexceptions:AnypersonisherebyauthorizedtostoredocumentationonasinglecomputerforpersonaluseonlyandtoprintcopiesofdocumentationforpersonaluseprovidedthatthedocumentationcontainsSynology’scopyrightnotice.
TheSynologylogoisatrademarkofSynologyInc.
Nolicenses,expressorimplied,aregrantedwithrespecttoanyofthetechnologydescribedinthisdocument.Synologyretainsallintellectualpropertyrightsassociatedwiththetechnologydescribedinthisdocument.ThisdocumentisintendedtoassistapplicationdeveloperstodevelopapplicationsonlyforSynology-labeledcomputers.
Everyefforthasbeenmadetoensurethattheinformationinthisdocumentisaccurate.Synologyisnotresponsiblefortypographicalerrors.
SynologyInc.3F-3,No.106,Chang-AnW.Rd.Taipei103,Taiwan
SynologyandtheSynologylogoaretrademarksofSynologyInc.,registeredintheUnitedStatesandothercountries.
MarvellisregisteredtrademarksofMarvellSemiconductor,Inc.oritssubsidiariesintheUnitedStatesandothercountries.
FreescaleisregisteredtrademarksofFreescale.IntelandAtomisregisteredtrademarksofIntel.
Semiconductor,Inc.oritssubsidiariesintheUnitedStatesandothercountries.
Otherproductsandcompanynamesmentionedhereinaretrademarksoftheirrespectiveholders.
EventhoughSynologyhasreviewedthisdocument,SYNOLOGYMAKESNOWARRANTYORREPRESENTATION,EITHEREXPRESSORIMPLIED,WITHRESPECTTOTHISDOCUMENT,ITSQUALITY,ACCURACY,MERCHANTABILITY,ORFITNESSFORAPARTICULARPURPOSE.ASARESULT,THISDOCUMENTISPROVIDED“ASIS,”ANDYOU,THEREADER,AREASSUMINGTHEENTIRERISKASTOITSQUALITYANDACCURACY.INNOEVENTWILLSYNOLOGYBELIABLEFORDIRECT,INDIRECT,SPECIAL,INCIDENTAL,ORCONSEQUENTIALDAMAGESRESULTINGFROMANYDEFECTORINACCURACYINTHISDOCUMENT,evenifadvisedofthepossibilityofsuchdamages.
THEWARRANTYANDREMEDIESSETFORTHABOVEAREEXCLUSIVEANDINLIEUOFALLOTHERS,ORALORWRITTEN,EXPRESSORIMPLIED.NoSynologydealer,agent,oremployeeisauthorizedtomakeanymodification,extension,oradditiontothiswarranty.
Somestatesdonotallowtheexclusionorlimitationofimpliedwarrantiesorliabilityforincidentalorconsequentialdamages,sotheabovelimitationorexclusionmaynotapplytoyou.Thiswarrantygivesyouspecificlegalrights,andyoumayalsohaveotherrightswhichvaryfromstatetostate.
SynologyDSM6.0DeveloperGuide
4PackageDeveloperGuide
GettingStartedSynologyoffersthisdeveloperguidewithinstructionsonhowtodevelopandinstall3rd-partyapplicationsonSynologyNASproductsoralineofnetworkattachedstoragedevicesdevelopedontheLinuxkernel.Withthisguide,youcanfamiliarizeyourselfwiththefollowingprocedures:
CompileprogramstorunonaSynologyNAS.IntegrateapplicationswithSynologyDiskStationManager(DSM).InstallapplicationfilestotherecommendedpathtokeepthemintactwhenDSMisupgraded.IntegrateapplicationswiththeSynologywebauthenticationinterface.Createapackagefileformanualorone-clickinstallationinSynologyPackageCenter.
ThisdocumentiswrittenforSynologyusersandsystemintegratorswhoareinterestedinaddingtheirapplicationstotheirSynologyNAS.ThosewhoreadthisdocumentareassumedtohavesomebasicunderstandingofLinuxprogramming.
SynologyDSM6.0DeveloperGuide
5GettingStarted
SystemRequirementsInordertocompileprogramstorunontheSynologyNAS,thesystemmustmeetthefollowingrequirements.
64bitlinuxenvironment.bash(>=4.1.5)Python(>=2.7.3)Requirerootpermission.(Ourtoolkitwillusechrootcommand)DSM6.0orlaterisrequiredonSynologyNAS.
SynologyDSM6.0DeveloperGuide
6SystemRequirements
CreatePackageInthissection,wewillexplainhowtocreateaSynologyPackageusingPackageToolkit.
IfyouwanttobuildaSynologyPackagewithoutusingPackageToolkit,youmust:
PrepareacrosscompiletoolchainPrepareabuildenvironmentPreparemetadataCompilesourcecodeCreateandsignthepackage
Creatingapackagemanuallycanbeverycomplexformostdevelopers,sowerecommendedusingthePackageToolkittomakethepackagecreationprocesseasier.Tomakethepackagecreationprocessgosmoothly,youwillstillneedtowritesomescriptsdescribinghowyouwanttobuildandcreateyourpackages.
Inthefollowingsub-sections,thenecessaryscriptswillbestatedindetail.
Youcandownloadtheexamplesourcefromgithub:SynologyOpenSource
SynologyDSM6.0DeveloperGuide
7CreatePackage
Preparation:Inthissection,wewillguideyouthroughhowtosetupanenvironmentforbuildingaSynologyPackage.Detailedstepsinclude:
InstallToolkitPrepareBuildEnvironmentPrepareGPGKey
SynologyDSM6.0DeveloperGuide
8Preparation
InstallToolkitThistutorialconsistsoftwoparts:
Pre-builtenvironmentFront-endscripts
Requirements:
TomakethePackageToolkitworkproperly,youwillneedtomakesurethedevelopmentsystemmeetsthefollowingrequirements:
64bitlinuxenvironment.Bash(>=4.1.5)Python(>=2.7.3)
ToolkitInstallation:Toinstallthetookit,simplyrefertothefollowingsteps.First,youneedtoclonethefront-endscriptsfromheretoyourtoolkitbase(wewilluse/toolkitastoolkitbaseinthisdocumentfromnowon).
mkdir-p/toolkit
gitclone{{book.externalLinks.pkgscripts}}.git
Pre-buildEnvironment:Forfasterdevelopment,wehavepreparedseveralbuildenvironmentsthatdependondifferentarchitecturesforpackagedevelopers.Youdon'thavetoworryaboutthenecessarybuilt-timelibraries(.aand.so)andheaderfiles(.hand.hpp)whenyouaredevelopingyourpackage.Thisisbecausethebuildenvironmentsalreadycontainsomepre-builtprojectswhoseexecutablebinariesorsharedlibrariesarebuiltonDSM,forexample,zlib,libxml2,andsoon.
Frond-endScripts:
Wehavealsoprovidedfront-endscriptsinafoldernamed“pkgscripts”tomaketheenvironmentdeployment,packagecompilation,andcreationofthefinalpackageSPKfileeasier.Inmostcases,youonlyneedtousethesethreescriptswhiledevelopingapackage:
EnvDeployPkgCreate.pyinclude/pkg_utils.sh
ThenextsectionwillguideyouthroughhowtoestablishabuildenvironmentandcreateaSynologyPackagebyusingPackageToolkit.
SynologyDSM6.0DeveloperGuide
9InstallToolkit
PrepareBuildEnvironmentYoucandownloadandsetuppre-builtenvironmentsbyusingEnvDeploywiththefollowingcommands.Use-vtospecifyDSMversion,-ptospecifydesiredplatform,and-ttospecifythefilelocationwhenyoustoredthetoolkitlocallyonyourdevelopmentmachine.If-pisnotgiven,allavailableplatformsforgivenversionswillbesetup.
cd/toolkit/pkgscripts-ng/
./EnvDeploy-v6.0-px64#forexample
Theworkingdirectorywilllooklikethefollowingfigure.Thechrootenvironmenttobuildyourownprojectswillbeds.${platform}-${version}.Asmentionedbefore,thistoolkitcontainssomepre-builtlibrariesandheaderswhichcanbefoundundercrossgccsysroot.Sysrootisdefaultsearchpathofcompiler.Ifgcccannotfindheaderorlibraryfrompathusergiven,gccwillsearchsysroot/usr/{lib,include}.
AvailablePlatformsYoucanuseoneofthefollowingcommandstoshowavailableplatforms.If-visnotgiven,availableplatformsforallversionswillbelisted.
./EnvDeploy-v6.0--list
./EnvDeploy-v6.0--infoplatform
UpdateEnvironmentUseEnvDeployagaintoupdateyourenvironments.Forexample,youcanupdatex64forDSM6.0byusingthefollowingcommand.
./EnvDeploy-v6.0-px64
RemoveEnvironmentToremoveabuildenvironment,youneedtoapplychroottothebuildenvironment.Unmountthe/procfolderandexitchroot.Afterthat,removethebuildenvironmentfolder.Thefollowingcommandsillustratehowtoremoveabuildenvironmentwithversion6.0andplatformx64.
chroot/toolkit/build_env/ds.x64-6.0umount/proc
rm-rf/toolkit/build_env/ds.x64-6.0
SynologyDSM6.0DeveloperGuide
10PrepareBuildEnvironment
PrepareGPGKeyIfthebuildenvironmentis5.0orabove,thePackageToolkitwilluseagpgkeytosignthepackagewhencreatingthespkfile.PleaserefertoPackageSignatureformoredetailsaboutpackagesignatures.
IfyouhaveyourownGPGkey(withoutapassphrase)already,youwillneedtoputtheprivatekeyin/root/.gnupgundereachplatform(/toolkit/build_env/ds.${platform}-6.0/root/.gnupg/).
GeneratetheGPGkey
Requirement:gpg,gpg-agent
gpg--gen-key
>Pleaseselectwhatkindofkeyyouwant:
(1)RSAandRSA(default)
>choosekeysizeandenteryourname,email
>enterapassphrase:justpressEnterwithouttypinganycharacter
WARNING:Pleasemakesurethatyoudonottypeanycharactersinthepassphrasefield,otherwisethebuildprocesswillFAIL.
Aftercompletingthestepsabove,thekeywillbegeneratedunder~/.gnupg.Movethemwiththechrootenvironment.
cp~/.gnupg/*/toolkit/build_env/ds.${platform}-6.0/root/.gnupg/
Youcanalsousethefollowingcommandstoverifywhetherthekeywassuccessfullyimportedornot.
cd/toolkit/build_env/ds.${platform}-6.0/
chroot.
gpg-K
Theoutputmayproducethefollowingmessage.
/root/.gnupg/secring.gpg
------------------------
sec2048R/145E0AFD2015-12-21
uidSynologyInc.<[email protected]>
ssb2048R/E0C20F112015-12-21
SynologyDSM6.0DeveloperGuide
11PrepareGPGKey
HelloWorldPackageWeusethefront-endscriptPkgCreate.pytohelpuscompilesourcecodeandpackaSynologyPackageoraSPKfile.SPKisthefileformatusedbySynologyPackageCentertoproperlyinstallyourapplication.FormoredetailsaboutthestructuralformatofanSPKfile,youmayrefertoSynologyPackage.
Inthefollowingsections,wewillguideyouonhowtocreateasimpleutilityprogramthatcanprintoutsystemmemory,andpackitintoanSPKfilebyusingPkgCreate.py.
Formorecomplicatedcases,youcanrefertothefollowingexamplesprovided:
CompileOpenSourceProject:tmux:IfyouareinterestedinportinganopensourceprojecttoDSMsystemusingtmuxorsettingupanyadvancedconfigurations,youmayrefertothissection.CompileOpenSourceProject:nmap:IfyouareinterestedinportinganopensourceprojecttoDSMsystemusingnmaporsettingupanyadvancedconfigurations,youmayrefertothissection.CompileKernelModule:IfyouareinterestedininstallingmorekernelmodulestoyourDSMsystem,youmayrefertothissection.
CreatePackageWorkflow:
TherearetwostagesinthePkgCreate.pypackagecreationprocess,theBuildStageandthePackStage.
IntheBuildStage,PkgCreate.pywillcompileyourprojectandalldependentprojectsinthecorrectorder.InthePackStage,PkgCreate.pywillpackyourprojectintoanSPKfile.
TocreateyourSPKfilewithPkgCreate.pyproperly,youwillneedtoprovideadditionalconfigurationfilesandbuildscriptstodescribehowtobuildyourproject.Thesefilesareputinafoldernamed“SynoBuildConf”underyourproject.Thesefilesandtheirpurposearelistedinbelow.
SynoBuildConf/depends:definesthedependencyofyourproject.Forfurtherdetails,pleaserefertoBuildStageSynoBuildConf/build:specifiesPkgCreate.pyonhowtocompileyourproject.Forfurtherdetails,pleaserefertoBuildStageSynoBuildConf/install:specifiesPkgCreate.pyonhowtopackyourSPKfile.Forfurtherdetails,pleaserefertoPackStageSynoBuildConf/install-dev:similartoSynoBuildConf/install,butthiswillpackyourSPKfileinchrootenvironmentratherthangeneralDSMsystem.Forfurtherdetails,pleaserefertoCompileOpenSourceProject:nmap.
Formoredetailsabouttheseconfigurationfiles,pleaserefertoBuildStageandPackStage.Thefollowingfigureshowstheworkflowofthesetwostages.
SynologyDSM6.0DeveloperGuide
12HelloWorldPackage
YoucanusethefollowingcommandstotellPkgCreate.pyhowtorunthroughbothstages.
cd/toolkit
pkgscripts/PkgCreate.py-x0-c${project}
The-coptiontellsPkgCreate.pytobuild,pack,andsignyourproject.The-x0optionismeanttotraverseandbuildalldependentprojectsinthecorrectorder.EachprojectisbuiltaccordingtotheirownSynoBuildConf/build.
Note:PkgCreate.pycompilessourcecodeandpacksyourpackageunderchrootenvironment.Therefore,youmustrunallcommandswithrootpermissionorwithsudo.
PkgCreate.pyhasmanyotheroptionstocontrolthebuildflow.ThefollowingsubsectionswillexploredeeperintothoseoptionsoryoumaydirectlyrefertotheAdvancedsectionformoredetails.
SourceCodeLayout:InBuildStage,PkgCreate.pywilltrytolinkalltheprojectstothebuildenvironment.Asaresult,yourprojectsourcecodemustbeputinafolder(wecallita“project”)under/toolkit/source.Thefollowingfigureshowsthewholeworkingdirectoryasanexample.
SynologyDSM6.0DeveloperGuide
13HelloWorldPackage
toolkit/
├──build_env/
│└──ds.${platform}-${version}/
│└──/usr/syno/
│├──bin
│├──include
│└──lib
├──pkgscripts/
└──source/
└──minimalPkg/
├──minimalPkg.c
├──INFO.sh
├──Makefile
├──PACKAGE_ICON.PNG
├──PACKAGE_ICON_256.PNG
├──scripts/
│├──postinst
│├──postuninst
│├──postupgrade
│├──preinst
│├──preuninst
│├──preupgrade
│└──start-stop-status
└──SynoBuildConf/
├──build
├──depends
└──install
Note:YoumayorganizethesourcecodeinanystructureyoulikeaslongasSynoBuildConfiseditedcorrectly.Thefollowingsectionswillexplainthisindetail.
Belowissomesamplecodethatwewilluseasanexample.
//Copyright(c)2000-2016SynologyInc.Allrightsreserved.
#include<sys/sysinfo.h>
#include<syslog.h>
#include<stdio.h>
intmain(intargc,char**argv){
structsysinfoinfo;
intret;
if(ret!=0){
syslog(LOG_SYSLOG,"Failedtogetinfo\n");
return-1;
}
syslog(LOG_SYSLOG,"[MinimalPkg]%ssamplepackage...",argv[1]);
syslog(LOG_SYSLOG,"[MinimalPkg]TotalRam:%u\n",(unsignedint)info.totalram);
syslog(LOG_SYSLOG,"[MinimalPkg]FreeRAM:%u\n",(unsignedint)info.freeram);
return0;
}
EnvironmentVariablesinBuildandInstallScriptFront-endscriptswillpasssomeenvironmentvariablestoSynoBuildConf/buildandSynoBuildConf/install.Youcanutilizethemtobuildandinstallyourprojects.Youcanalsofindmostofthemin/toolkit/build_env/ds.${platform}-${version}/{env.mak,env32/64.mak}.Someoftheenvironmentvariablesarelistedinbelow.
CC:pathofgcccrosscompiler.CXX:pathofg++crosscompiler.LD:pathofcrosscompilerlinker.
SynologyDSM6.0DeveloperGuide
14HelloWorldPackage
CFLAGS:globalcflagsincludes.AR:pathofcrosscompilerar.NM:pathofcrosscompilernm.STRIP:pathofcrosscompilerstrip.RANLIB:pathofcrosscompilerranlib.OBJDUMP:pathofcrosscompilerobjdump.LDFLAGS:globalldflagsincludes.ConfigOpt:optionsforconfigure.ARCH:processorarchitecture.SYNO_PLATFORM:Synologyplatform.DSM_SHLIB_MAJOR:majornumberofDSM(integer).DSM_SHLIB_MINOR:minornumberofDSM(integer).DSM_SHLIB_NUM:buildnumberofDSM(integer).ToolChainSysRoot:crosscompilersysrootpath.SysRootPrefix:crosscompilersysrootconcatwithprefix/usr.SysRootInclude:crosscompilersysrootconcatwithinclude_dir/usr/include.SysRootLib:crosscompilersysrootconcatwithlib_dir/usr/lib.
SynologyDSM6.0DeveloperGuide
15HelloWorldPackage
BuildStage:IntheBuildStage,PkgCreate.pywillcompiletheprojectanditsdependentprojects.Pleasenotethatinthisstage,PkgCreate.pydependsontwobuildscripts(SynoBuildConf/buildandSynoBuildConf/depend)togetthenecessaryinformation.
PkgCreate.py${project}#buildproject
BuildStageWorkflow:
TheworkflowoftheBuildStageisasfollows.
1. BasedonyourSynoBuildConf/depend,PkgCreate.pywilllocatethetargetDSMversionfrom[default]section.2. PkgCreate.pywillresolvetheprojectsyoudependon.3. Yourprojectandthedependentprojectswhichareplacedunder/toolkit/sourcewillbehard-linkedto
/toolkit/build_env/ds.${platform}/source.4. TheirSynoBuildConf/buildwillbeexecutedinorderaccordingtotheirdependencybasedoneachSynoBuildConf/depend.5. Ifyourprojectisneededbyotherprojectforcrosscompiling,youmayaddSynoBuildConf/install-devscript.install-devscript
willinstallcrosscompiledproductintoplatformchroot.
Note:SynoBuildConf/buildisexecutedunderchrootenvironment/toolkit/build_env/ds.${platform}.
SynoBuildConf/depends
PkgCreate.pywillresolveyourdependencyaccordingtothisconfigurationfile.Youneedtospecifyyourprojectdependencyandthebuildenvironmentofyourprojectinthisfile.Forexample:
SynologyDSM6.0DeveloperGuide
16BuildStage
[BuildDependent]
#eachlinehereisadependentproject
[ReferenceOnly]
#eachlinehereisaprojectforreferenceonlybutnoneedtobebuilt
[default]
all="6.0"#toolkitenvironmentversionofspecificplatform.(allplatformuse6.0toolkitenvironment)
TherearethreefieldsinSynoBuildConf/depends.
BuildDependent:Describesotherprojectswhicharedependentonthisproject.Forfurtherdetailsaboutthisfield,pleaserefertoCompileOpenSourceProject:nmap.ReferenceOnly:Describesotherprojectswhicharereferredbythisproject,withoutthebuildprocess.default:Describesthetoolkitenvironment.Thissectionisanecessaryfield.ItindicateseachplatformtobuildagainstsomeDSMversionandthekey"all"meansallplatformusethisversionbydefault.
YoucanuseProjDepends.pyfront-endscriptstoseewhetherthedependencyorderofyourprojectsiscorrect.Option-x0willtraversealldependentprojectsof${project}.
cd/toolkit/pkgscripts
./ProjDepends.py-x0${project}
Ifyourapplicationcontainsmorethanoneproject,putthemin/toolkit/sourceandeditSynoBuildConfaccordinglyforeachofthem.
Formoreadvancedusageofthisfile,youmayrefertoCompileOpenSourceProjectandAdvanced.
SynoBuildConf/build
SynoBuildConf/buildisashellscriptthattellsPkgCreate.pyhowtocompileyourproject.Thecurrentworkingdirectoryofthisshellscriptislocatedin/source/${project}underchrootenvironment.
Allpre-builtbinaries,headers,andlibrariesareundercrosscompilersysrootinchrootenvironment.Sincesysrootisthedefaultsearchpathofcrosscompiler,youdonotneedtoprovide-Ior-LtoCFLAGSorLDFLAGS.
Variables:
AllvariableyoucanuseinSynoBuildConf/build:
CC:pathofgcccrosscompiler.CXX:pathofg++crosscompiler.LD:pathofcrosscompilerlinker.CFLAGS:globalcflagsincludes.AR:pathofcrosscompilerar.NM:pathofcrosscompilernm.STRIP:pathofcrosscompilerstrip.RANLIB:pathofcrosscompilerranlib.OBJDUMP:pathofcrosscompilerobjdump.LDFLAGS:globalldflagsincludes.ConfigOpt:optionsforconfigure.ARCH:processorarchitecture.SYNO_PLATFORM:Synologyplatform.DSM_SHLIB_MAJOR:majornumberofDSM(integer).DSM_SHLIB_MINOR:minornumberofDSM(integer).DSM_SHLIB_NUM:buildnumberofDSM(integer).ToolChainSysRoot:crosscompilersysrootpath.
SynologyDSM6.0DeveloperGuide
17BuildStage
SysRootPrefix:crosscompilersysrootconcatwithprefix/usr.SysRootInclude:crosscompilersysrootconcatwithinclude_dir/usr/include.SysRootLib:crosscompilersysrootconcatwithlib_dir/usr/lib.
Theexamplebuildscriptsislike:
#SynoBuildConf/build
case${MakeClean}in
[Yy][Ee][Ss])
makedistclean
;;
esac
make${MAKE_FLAGS}
TheaboveexamplecallsthemakecommandandcompilesyourprojectaccordingtoyourMakefilelocatedin/source/${project}.
Synologytoolkitenvironmenthasincludedselectedprebuildprojects.Youcanenterthechrootandusefollowingcommandtocheckifneededheaderorprojectisprovidedbytoolkit.
##innerchroot
dpkg-l#listalldpkgprojects.
dpkg-L{projectdev}#listprojectinstallfiles
dpkg-S{header/librarypattern}#searchheader/librarypattern.
Forexample,theprojectneedszlib.handlibz.sointhebuildstage.Usefollowingcommandtocheckifzlibanditscomponentareinstalledinchroot.
chroot/tookit/build_env/ds.x64-6.0/
##innerchroot
>>dpkg-l|grepzlib
iizlib-1.x-x64-dev6.0-7274allSynologybuild-timelibrary
>>dpkg-Lzlib-1.x-x64-dev
/.
/usr
/usr/local
/usr/local/x86_64-pc-linux-gnu
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.a
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/pkgconfig
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/pkgconfig/zlib.pc
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so.1
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so.1.2.8
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/include
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/include/zconf.h
/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/include/zlib.h
>>dpkg-Szlib.so
zlib-1.x-x64-dev:/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so
zlib-1.x-x64-dev:/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so.1.2.8
zlib-1.x-x64-dev:/usr/local/x86_64-pc-linux-gnu/x86_64-pc-linux-gnu/sys-root/usr/lib/libz.so.1
Allfilehasbeeninstalledintosysroot,crossgcccanfindzlib.handlibz.sodirectly.
Someopensourcerequiretouseotherprojects'crosscompiledproductwhilebuildingtheirown.Forexample,pythonneedslibffiandzlibwhileconfigure,weneedtoprovidethosetwoprojectbeforebuildpython.Youcaninstallthecrosscompiledproductintothedestinationyouwantinbuildscript.PleaserefertoCompileOpenSourceProject:nmapformoreinformation.
SynologyDSM6.0DeveloperGuide
18BuildStage
Makefile
ThefollowingexampleshowsaMakefile.Mostofthecontentcontainstypicalmakefilerules.NotethatwhenwritingyourprojectMakefile,youcanutilizepre-definedvariablesin/env.mak.
#Copyright(c)2000-2016SynologyInc.Allrightsreserved.
##YoucanuseCCCFALGSLDLDFLAGSCXXCXXFLAGSARRANLIBREADELFSTRIPafterincludeenv.mak
include/env.mak
EXEC=minimalPkg_2
OBJS=minimalPkg.o
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC)$(CFLAGS)$<-o$@$(LDFLAGS)
install:$(EXEC)
mkdir-p$(DESTDIR)/usr/bin/
install$<$(DESTDIR)/usr/bin/
clean:
rm-rf*.o$(EXEC)
Formoredetaileddescriptionsaboutmakefile,pleaserefertohere.Forafulllistofenvironmentvariablesthatareprovidedby/env.mak,pleaserefertoCreatePackage.
SynologyDSM6.0DeveloperGuide
19BuildStage
PackStage:InthePackStage,PkgCreate.pypacksallthenecessaryfilesaccordingtoyourmetadataandcreatesafinalSynologyPackageintheresult_spkfolder.IfyouwantPkgCreate.pytoenterthePackStagewithouttheBuildStage,simplyrunPkgCreate.pywiththe-ioption.
Forexample,thefollowingcommandwillexecute${project}/SynoBuildConf/installwithoutsigningandputtingthefinalpackageSPKfile(ifany)to/toolkit/result_spk.
cd/toolkit
pkgscripts/PkgCreate.py-i--no-sign${project}
PackStageWorkFlow:
TheworkflowofthePackStageisasfollows.
1. PkgCreate.pywillexecutethebuildscriptSynoBuildConf/install.i. CreateINFOfilebyusingINFO.sh.ii. Movenecessaryfilestoatemporaryfolder,/tmp/_install,forinstance,andcreatepackagetgz.iii. Movenecessarymetadataandresourcestothetemporaryfolder,/tmp/_pkg,forinstance,andcreatethefinalSynology
Package.2. PkgCreate.pywillsignthenewlycreatedSynologyPackagefilewithagpgkeywhichisplacedunder/root/.
ThefollowingfigureshowstheworkflowofthePackStage.
SynoBuildConf/install
SynologyDSM6.0DeveloperGuide
20PackStage
Thisfilemustbewritteninbashandindicatesthefront-endscriptonhowtopackyourproject.Thecurrentworkingdirectoryis/source/${project}underchrootenvironment.Ifthisisthetopprojectofyourpackage,thisfilewilldefinehowtocreatethefinalpackageSPKfile,includingdirectorystructureandtheINFOfileinyourSPK.(PleaserefertoINFOchapter)
DefineSynoBuildConf/installforinstallationmetadata,resourcefilesandpackingyourpackage.
#!/bin/bash
#Copyright(C)2000-2016SynologyInc.Allrightsreserved.
###UsePKG_DIRasworkingdirectory.
PKG_DIR=/tmp/_test_spk
rm-rf$PKG_DIR
mkdir-p$PKG_DIR
###getspkpackingfunctions
source/pkgscripts/include/pkg_util.sh
create_package_tgz(){
localfirewere_version=
localpackage_tgz_dir=/tmp/_package_tgz
localbinary_dir=$package_tgz_dir/usr/bin
###cleardestinationdirectory
rm-r$package_tgz_dir&&mkdir-p$package_tgz_dir
###installneededfileintoPKG_DIR
mkdir-p$binary_dir
cp-avminimalPkg$binary_dir
makeinstallDESTDIR="$package_tgz_dir"
###createpackage.tgz$1:source_dir$2:dest_dir
pkg_make_package$package_tgz_dir"${PKG_DIR}"
}
create_spk(){
localscripts_dir=$PKG_DIR/scripts
###CopyPackageCenterscriptstoPKG_DIR
mkdir-p$scripts_dir
cp-avscripts/*$scripts_dir
###Copypackageicon
cp-avPACKAGE_ICON*.PNG$PKG_DIR
###GenerateINFOfile
./INFO.sh>INFO
cpINFO$PKG_DIR/INFO
###Createthefinalspk.
#pkg_make_spk<sourcepath><destpath><spkfilename>
#Pleaseputtheresultspkinto/image/packages
#spknamefunctions:pkg_get_spk_namepkg_get_spk_unified_namepkg_get_spk_family_name
mkdir-p/image/packages
pkg_make_spk${PKG_DIR}"/image/packages"$(pkg_get_spk_family_name)
}
main(){
create_package_tgz
create_spk
}
main"$@"
Wewillbrieflyexplainthescriptsabove.
Inthebeginning,thescriptwillcallthePrepareDirsfunctionwhichwillpreparethenecessaryfolderfortheproject.
SynologyDSM6.0DeveloperGuide
21PackStage
Aftercreatingthefolder,thescriptcalledSetupPackageFileswillmovethenecessaryresourcefilesto$INST_DIRand$PKG_DIR.Inthisstep,wehavecalledtheINFO.shfiletocreatetheINFOfile.AlthoughyoumayputthecodesthatwillgeneratetheINFOfileintheSynoBuildConf/installscript,wehighlyrecommendthatyoucreatetheINFOseperately.Generally,wenameitINFO.sh.YoucanseehowtowriteINFO.shinthefollowingsubsections.
INFOscriptsbinary
Aftermovingtheresourcefiletotheproperlocation,wewillcalltheMakePackagefunctiontocreatethepackageforus.Wehaveincluded/sourcedahelperscriptcalledpkg_util.shwhichislocatedin/pkgscripts/include.ThisscriptcreatesthefinalpackageSPKfileinthecorrectformat.Thepkg_make_packageandpkg_make_spk,whicharedefinedin*pkg_util.sh,createtheSynologyPackage.Youcanseehowtousethishelperfunctionbelow.
pkg_make_package$1$2:Create$2/packages.tgzfromfilesin$1.pkg_make_spk$1$2:Create$2/spkfromfilesin$1.
INFO.sh
Asmentionedearlier,INFO.shisjustanoptionalscript.YoucancreatetheINFOfilebyhandormovethecodetoSynoBuildConf/install.However,westronglyrecommendthatyouutilizeINFO.shsothatyoucancreatetheINFOfileseparatelyfromSynoBuildConf/install.
#!/bin/bash
#Copyright(c)2000-2016SynologyInc.Allrightsreserved.
source/pkgscripts/include/pkg_util.sh
package="minimalPkg"
version="1.0.0000"
displayname="MinimalPackage"
maintainer="SynologyInc."
arch="$(pkg_get_unified_platform)"
description="thisisaminimalpackage"
["$(caller)"!="0NULL"]&&return0
pkg_dump_info
Note:Theabovecodeisjustanexampletoshowsomeimportantvariablesforpkg_dump_info.IfyouwanttoknowmoredetailsabouttheINFOfileandeachofthefields,pleaserefertoINFO.
SimilartoSynoBuildConf/install,wemustfirstincludepkg_util.sh.Afterthat,wecansetupthepropervariablesandcallthepkg_dump_infotocreatetheINFOfilecorrectly.
Asyoumayhavenoticed,weusedanotherhelperfunctioncalledpkg_get_platformtosetthearchvariable.Thisvariableindicatesthecurrentplatformwearebuilding.
Thefollowingstatementsindicatehowtousethehelperfunctions.
pkg_get_spk_platform:Returnplatformfor“arch”inINFO.pkg_dump_info:DumpINFOaccordingtogivenvariables.
AftercreatingtheINFO.shfile,remembertoaddexecutablebitinINFO.sh.
chmod+xINFO.sh
SynologyDSM6.0DeveloperGuide
22PackStage
SignPackageInDSM5.1andonward,thePackageCenterhasabuilt-incodesignmechanismtoensurethepackage'spublisherintegrity.ThetoolkitbasedonDSM5.0andonwardhastheCodeSign.phpscripttosignthepackagewithGnuPGkeys.IfyoudonothaveaGPGkey,youwillneedtogenerateone.PleaserefertoPrepareGPGKeyformoreinformation.
IfyouwantPkgCreate.pytosignthepackageautomatically,youcanusethePkgCreate.pywithoutthe--no-signoption.Forexample,thefollowingcommandindicatesPkgCreate.pytobuildandinstallyourprojectwithoutasignature.
PkgCreate.py-i${project}
Inaddition,ifyouwanttosignthepackageonyourown,youcanusethefollowingcommandtosignyourpackagemanually.
chroot/toolkit/build_env/ds.${platform}-${version}
php/pkgscripts-ng/CodeSign.php[option]--sign=package-path
Options:
--keydir=keyringsdirectory(defaultis/root/.gnupg)
--keyfpr=key'sfingerprint(defaultis"".Underthiscircumstances,wewillusingthefirstkeyinthekeydirectorytosignthepackage)
Examples:
php/pkgscripts-ng/CodeSign.php--sign=phpBB-3.0.12-0031.spk
php/pkgscripts-ng/CodeSign.php--keydir=/root/.gpg--keyfpr=C1BF63CD--sign=phpBB-3.0.12-0031.spk
SynologyDSM6.0DeveloperGuide
23SignPackage
EssentialRunTimeFiles
Scripts:
The“scripts”foldercontainsshellscriptswhichareexecutedduringtheinstallation,uninstallation,upgrading,starting,andstoppingofpackages.Therearesevenscriptfilesstoredinthe“scripts”folder:
postinstpostuninstpostupgradepreinstpreuninstpreupgradestart-stop-status
Note:Evenifyoudonotprovideanyofthesescriptfiles,thepackagewillbecreatedwithoutanyerrors.However,whenyoutrytoinstallyourpackageonyourDSMsystem,PackageCenterwillnotbeabletoinstallyourpackage.
Forsimplicity,thescriptswilllooklikethefollowingexample.
#!/bin/sh
exit0
Moredetailsaboutthesescriptswillbeexplainedinthescriptssection.
Icon:
YoucanaddanicontoyourpackagesothatwhenPackageCentershowstheinformationofyourpackage,itwillusetheiconyouhaveprovidedinsteadofthedefaultone.
Toaddanicontoyourpackage,puttheimageyourwantintoyourprojectsourcefolder,thenslightlymodifyyourSynoBuildConf/installscript.ThefollowingisanexampleofamodifiedSynoBuildConf/installfromthepreviousexample.Forfurtherdetailsregardingpackageicons,pleaserefertothePackageStructuresection.
Theonlydifferencefromthepreviousexampleisthatwecopiedourimagefilesintothe$PKG_DIRandrenamedittoPACKAGE_ICON.PNGandPACKAGE_ICON_256.PNG.insidetheSetupPackageFilesfunction.
Note:RemembertorenameyourimagetoPACKAGE_ICON.PNGandPACKAGE_ICON_256.PNGinallCAPS;otherwise,PackageCenterwillnotrendertheiconproperly.
SynologyDSM6.0DeveloperGuide
24EssentialRunTimeFiles
#!/bin/bash
#Copyright(C)2000-2016SynologyInc.Allrightsreserved.
###UsePKG_DIRasworkingdirectory.
PKG_DIR=/tmp/_test_spk
rm-rf$PKG_DIR
mkdir-p$PKG_DIR
###getspkpackingfunctions
source/pkgscripts/include/pkg_util.sh
create_package_tgz(){
localfirewere_version=
localpackage_tgz_dir=/tmp/_package_tgz
localbinary_dir=$package_tgz_dir/usr/bin
###cleardestinationdirectory
rm-r$package_tgz_dir&&mkdir-p$package_tgz_dir
###installneededfileintoPKG_DIR
mkdir-p$binary_dir
cp-avminimalPkg$binary_dir
makeinstallDESTDIR="$package_tgz_dir"
###createpackage.tgz$1:source_dir$2:dest_dir
pkg_make_package$package_tgz_dir"${PKG_DIR}"
}
create_spk(){
localscripts_dir=$PKG_DIR/scripts
###CopyPackageCenterscriptstoPKG_DIR
mkdir-p$scripts_dir
cp-avscripts/*$scripts_dir
###Copypackageicon
cp-avPACKAGE_ICON*.PNG$PKG_DIR
###GenerateINFOfile
./INFO.sh>INFO
cpINFO$PKG_DIR/INFO
###Createthefinalspk.
#pkg_make_spk<sourcepath><destpath><spkfilename>
#Pleaseputtheresultspkinto/image/packages
#spknamefunctions:pkg_get_spk_namepkg_get_spk_unified_namepkg_get_spk_family_name
mkdir-p/image/packages
pkg_make_spk${PKG_DIR}"/image/packages"$(pkg_get_spk_family_name)
}
main(){
create_package_tgz
create_spk
}
main"$@"
SynologyDSM6.0DeveloperGuide
25EssentialRunTimeFiles
SummaryInprevioussections,welearnedhowtousePackageTooltocompileandpackyourproject.Wewilllistsomeimportantnoteshere.
SourceCodeLayout:
toolkit/
├──pkgscripts-ng/
├──build_env/
│└──ds.${platform}-${version}
│└──/usr/syno
│├──lib
│├──bin
│└──include
├──result_spk/
│└──${package}-${version}/
│└──*.spk
└──source/
└──${project}/
├──sourcecode,Makefile...
├──INFO.sh
├──PACKAGE_ICON.PNG
├──PACKAGE_ICON_256.PNG
├──scripts/
│├──postinst
│├──postuninst
│├──postupgrade
│├──preinst
│├──preuninst
│├──preupgrade
│└──start-stop-status
└──SynoBuildConf/
├──build
├──depends
└──install
ThenecessaryfilesrequiredbyPkgCreate.pyarelistedbelow.
INFOSynoBuildConf/buildSynoBuildConf/installSynoBuildConf/dependsscripts/postinstscripts/postuninstscripts/postupgradescripts/preinstscripts/preuninstscripts/preupgradescripts/start-stop-status
Walk-ThroughofCreatePackage1. InstallPackageToolkit2. ListAvailableEnvironments3. CreateBuildingEnvironmentusingEnvDeploy4. CreateGPGkey5. CreateSynoBuildConf/buildSynoBuildConf/installSynoBuildConf/depends
SynologyDSM6.0DeveloperGuide
26Summary
6. Createscriptsfolderandscripts7. BuildpackagewithPkgCreate.py
CommandWalk-Through
#InstallPackageToolkit
mkdir-p/toolkit
cd/toolkit
gitclonehttps://github.com/SynologyOpenSource/pkgscripts-ng
#MakeBuildEnvironment
./pkgscripts-ng/EnvDeploy-v6.0--list
./pkgscripts-ng/EnvDeploy-v6.0--infoplatform
./pkgscripts-ng/EnvDeploy-v6.0-p6281#forexample
#PrepareGPGkey
gpg--gen-key
>Pleaseselectwhatkindofkeyyouwant:
(1)RSAandRSA(default)
>choosekeysizeandenteryourname,email
>enterapassphrase:justpressEnterwithouttypinganycharacter
cp~/.gnupg/*/toolkit/build_env/ds.6281-6.0/root/.gnupg/
#PrepareProjectfolder
mkdir-p./source/${project}
#addsourcecode,Makefile,SynoBuildConfandscripts
...
#CompileandBuildSynologyPackage
./pkgscripts-ng/PkgCreate.py-x0-c${project}
SynologyDSM6.0DeveloperGuide
27Summary
CompileOpenSourceProjectThischapterwillshowyouhowtobuildanopensourceprojectforyourDSMsystemusingPackageToolkit.Ifyouwishtocompiletheopensourceprojectmanually,pleaserefertoAppendixB:CompileOpenSourceProjectManually.
AsmentionedinCreatePackage,youhavetocreateSynoBuildConf/build,SynoBuildConf/install,andSynoBuildConf/dependsbeforeusingPackageToolkit.
Unlikethepreviousexample,compilinganapplicationonmostopensourceprojectsmayrequireexecutingthefollowingthreesteps:
1. configure2. make3. makeinstall
Theconfigurescriptconsistsofmanylineswhichareusedtochecksomedetailsaboutthemachinewherethesoftwareisgoingtobeinstalled.Thisscriptwillalsocheckalotofdependenciesonyoursystem.Whenyouruntheconfigurescript,youwillseealotofoutputonthescreen,eachbeingsomesortofquestionwitharespectiveyes/noasareply.Ifanyofthemajorrequirementsaremissingonyoursystem,theconfigurescriptwillexitandyouwillnotbeabletoproceedwiththeinstallationuntilyoumeettherequiredconditions.Inmostcases,compileapplicationsonsomeparticulartargetmachineswillrequireyoutomodifytheconfigurescriptmanuallytoprovidethecorrectvalues.
Whenrunningtheconfigurescripttoconfiguresoftwarepackagesforcross-compiling,youwillneedtospecifytheCC,LD,RANLIB,CFLAGS,LDFLAGS,host,target,andbuild.
Inthischapter,wewilluseplatform6281asourexample.
Preparation:
Firstdownloadthetmuxsourcecodefromtheofficialgithubsiteoryoucandownloadtmuxfromthislink.
Note:Thearchivefileyou'vedownloadedfromtheabovelinksisdifferentfromtheofficialtmuxsourcecode.Wehaveaddedthenecessarybuildscripts.
ProjectLayout:
tmux/
├──tmuxrelatedsourcecode
├──INFO.sh
├──scripts/
└──SynoBuildConf/
├──build
├──depends
└──install
SynoBuildConf/depends:Thefollowingisthedependsfileforthisexample.Thereisnothingspecialaboutthedependsfile.
[default]
all="6.0"
SynoBuildConf/build:
SynologyDSM6.0DeveloperGuide
28CompileOpenSourceProject:tmux
Thebuildscriptisslightlydifferentfromthepreviousone.Hereyouwillhavetopassthefollowingenvironmentvariablestoconfigure:
CCARCFLAGSLDFLAGS
Inaddition,sincetmuxisdependentonncurses,youwillneedtousepkg-configtoresolvethenecessaryheaderfilesandlibrariesfortmux.
ThefollowingisanexampleofSynoBuildConf/build:
#!/bin/sh
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
include/env.mak
case${MakeClean}in
[Yy][Ee][Ss])
makedistclean
;;
esac
NCURSES_INCS="`pkg-configncurses--cflags`"
NCURSES_LIBS="`pkg-configncurses--libs`"
CFLAGS+="${CFLAGS}${NCURSES_INCS}"
LDFLAGS+="${LDFLAGS}${NCURSES_LIBS}"
envCC="${CC}"AR=${AR}CFLAGS="${CFLAGS}"LDFLAGS="${LDFLAGS}"\
./configure${ConfigOpt}
make${MAKE_FLAGS}
SynoBuildConf/install
Insteadofcopyingthebinarytothedestinationfolder,mostbigprojectswillusemakeinstalltoinstallthebinariesandlibraries.YoucanpasstheDESTDIRenvironmentvariabletospecifywhereyouwanttoinstallthebinariesandlibraries.
SynologyDSM6.0DeveloperGuide
29CompileOpenSourceProject:tmux
#!/bin/bash
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
PKG_NAME="tmux"
INST_DIR="/tmp/_${PKG_NAME}"
PKG_DIR="/tmp/_${PKG_NAME}_pkg"
PKG_DEST="/image/packages"
PrepareDirs(){
fordirin$INST_DIR$PKG_DIR;do
rm-rf"$dir"
done
fordirin$INST_DIR$PKG_DIR$PKG_DEST;do
mkdir-p"$dir"
done
}
SetupPackageFiles(){
DESTDIR="${INST_DIR}"makeinstall
./INFO.sh>INFO
cpINFO"${PKG_DIR}"
cp-rscripts/"${PKG_DIR}"
}
MakePackage(){
source/pkgscripts/include/pkg_util.sh
pkg_make_package$INST_DIR$PKG_DIR
pkg_make_spk$PKG_DIR$PKG_DEST
}
main(){
PrepareDirs
SetupPackageFiles
MakePackage
}
main"$@"
INFO.shAsmentionedbefore,wewilluseINFO.shtogeneratetheINFOfile.
#!/bin/sh
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
./pkgscripts/include/pkg_util.sh
package="tmux"
version="1.9-a"
displayname="tmux"
arch="$(pkg_get_platform)"
maintainer="SynologyInc."
description="ThispackagewillinstalltmuxinyourDSMsystem."
["$(caller)"!="0NULL"]&&return0
pkg_dump_info
Note:RemembertosettheexecutablebitofINFO.shfile.
BuildandCreatePackage:
Runthefollowingcommandstocompilethesourcecodeandbuildthepackage.
/toolkit/pkgscripts-ng/PkgCreate.py-p6281-ctmux
SynologyDSM6.0DeveloperGuide
30CompileOpenSourceProject:tmux
Afterthebuildprocess,youcanchecktheresultin/toolkit/result_spk.
VerifytheResult
Ifthebuildingprocesswassuccessful,youwillseethatthe.spkfilehasbeenplacedunderresult_spkfolder.Totestthespkfile,YoucanusemanualinstallinPackageCentertoinstallyourpackage.
Warning:RemembertoimportyourkeystotheDSMsystemorselectAnypublisherinPackageCenter->Settings->General->TrustLevel.Otherwise,theinstallationwillfail.
YoucanthentrytoconnecttotheDSMusingsshandtypethefollowingcommandtofullyscanyourDSMmachine.
cd/var/packages/"${PKG_NAME}"/target/usr/local/bin
./tmux
SynologyDSM6.0DeveloperGuide
31CompileOpenSourceProject:tmux
CompileOpenSourceProject:nmapThischapterwillshowyouhowtobuildanopensourceprojectforyourDSMsystemusingPackageToolkit.Theopensourceprojectthatwearegoingtobuildinthisexampleisnmap,anetworkscanningprogram.Wewilluse6281asourbuildenvironmentplatform.
Ifyouwishtocompileanopensourceprojectmanually,pleaserefertoAppendixB:CompileOpenSourceProjectManually.
AswehavementionedinHelloWorldPackage,youhavetocreatetheSynoBuildConf/build,SynoBuildConf/install,andSynoBuildConf/dependsbeforeusingPackageToolkit.
Unlikethepreviousexample,compilinganapplicationonmostopensourceprojectsmayrequireexecutingthefollowingthreesteps:
1. configure2. make3. makeinstall
Theconfigurescriptconsistsofmanylineswhichareusedtochecksomedetailsaboutthemachinewherethesoftwareisgoingtobeinstalled.Thisscriptwillalsocheckalotofdependenciesonyoursystem.Whenyouruntheconfigurescript,youwillseealotofoutputonthescreen,eachbeingsomesortofquestionwitharespectiveyes/noasareply.Ifanyofthemajorrequirementsaremissingonyoursystem,theconfigurescriptwillexitandyouwillnotbeabletoproceedwiththeinstallationuntilyoumeettherequiredconditions.Inmostcases,compileapplicationsonsomeparticulartargetmachineswillrequireyoutomodifytheconfigurescriptmanuallytoprovidethecorrectvalues.
Whenrunningtheconfigurescripttoconfiguresoftwarepackagesforcross-compiling,youwillneedtospecifytheCC,LD,RANLIB,CFLAGS,LDFLAGS,host,target,andbuild.
Preparation:
First,youwillneedtodownloadthenmapsourcecodefromtheofficialgithubsite.Youwillalsoneedtodownloadthelibpcapsourcecodesincenmapdependsonlibpcap.Thelibpcapsourcecodecanbefoundhere.
Thefollowingcommandswilldownloadthesourcecodeforlibpacpandnmap.
wgethttps://nmap.org/dist/nmap-7.01.tar.bz2
tarxvfnmap-7.01.tar.bz2-C/toolkit/source
mv/toolkit/source/nmap-7.01/toolkit/source/nmap
wgethttp://www.tcpdump.org/release/libpcap-1.6.2.tar.gz
tarxvflibpcap-1.6.2.tar.gz-C/toolkit/source
mv/toolkit/source/libpcap-1.6.2/toolkit/source/libpcap
#Orusinggittodownloadsourcecode
cd/toolkit/source
gitclonehttps://github.com/nmap/nmap
gitclonehttps://github.com/the-tcpdump-group/libpcap
cdlibpcap
gitcheckoutorigin/libpcap-1.6
Pleaseremembertoupgradethelibpacptoversion1.6orthebuildpackageprocesswillfail.
ProjectLayout:Afteryoudownloadthesourcecode,yourtoolkitlayoutshouldlooklikethefollowingfigure.
SynologyDSM6.0DeveloperGuide
32CompileOpenSourceProject:nmap
toolkit/
├──build_env/
│└──ds.${platform}-${version}/
│└──/usr/syno/
│├──bin
│├──include
│└──lib
├──pkgscripts-ng/
└──source/
├──nmap/
│├──nmaprelatedsourcecode
│├──INFO.sh
│├──Makefile
│├──Synoscripts/#nmaphasit'sownscriptsfolder
│└──SynoBuildConf/
│├──build
│├──depends
│└──install
└──libpcap/
├──libpcaprelatedsourcecode
├──Makefile
└──SynoBuildConf/
├──build
├──depends
├──install-dev
└──install
Thefile,install-dev,isaspecialfilewhichwewillbecoveredinthefollowingsection.
SynoBuildConf/depends:
TheSynoBuildConf/dependsfornmapisslightlydifferentfromthepreviousexample.Sincenmapdependsonlibpcap,wehavetoaddthevaluetotheBuildDependentfield,sothatthePkgCreate.pycanresolvethedependencyandcompiletheprojectinthecorrectorder.
Thedependsfilefornmapisasfollows.
[BuildDependent]
libpcap
[default]
all="6.0"
However,theSynoBuildConf/dependsforlibpcapisthesameastheHelloWorldExample.
[BuildDependent]
[default]
all="6.0"
SynoBuildConf/build:
TheSynoBuildConf/buildscriptisalsodifferentfromthepreviousone.
Hereyouwillhavetopassseveralenvironmentvariablestoconfigure,sothatnmapcanbecompiledproperly
CCCXXLDARSTRIPRANLIB
SynologyDSM6.0DeveloperGuide
33CompileOpenSourceProject:nmap
NMCFLAGSCXXFLAGSLDFLAGS
Sincenmapwillbecompiledwithmanyfeaturesbydefault,wewillneedtodisablesomeofthemtomakeitclean.Thefollowinglistcontainsthefeaturesthatwillbedisabled:
ndiffzenmapnpingncatnmap-updateliblua
Note:Ifyouareinterestedinsomeoftheabovefeaturesandyouwanttoenablethem,justchangethe--without-${feature}into--with-${feature}.
ThefollowingistheSynoBuildConf/buildfornmap
#!/bin/sh
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
include/env.mak
PKG_NAME=nmap
INST_DIR=/tmp/_${PKG_NAME}
case${MakeClean}in
[Yy][Ee][Ss])
makedistclean
;;
esac
envCC="${CC}"CXX="${CXX}"LD="${LD}"AR=${AR}STRIP=${STRIP}RANLIB=${RANLIB}NM=${NM}\
CFLAGS="${CFLAGS}"CXXFLAGS="$CXXFLAGS$CFLAGS"\
LDFLAGS="${LDFLAGS}-lnl-lnl-genl-ldbus-1"\
./configure${ConfigOpt}\
--prefix=${INST_DIR}\
--without-ndiff\
--without-zenmap\
--without-nping\
--without-ncat\
--without-nmap-update\
--without-liblua\
--with-libpcap=/usr/local
make${MAKE_FLAGS}
Inthisexample,--with-libpcapisassignedwithvalue/usr/local.Weneedtoinstalllibpcap'scrosscompiledproductinto"/usr/local"sothatnmap'sconfigurecanretrievelibpcapcorrectly.
ThefollowingistheSynoBuildConf/buildforlibpcap.
SynologyDSM6.0DeveloperGuide
34CompileOpenSourceProject:nmap
#!/bin/bash
#Copyright(c)2000-2012SynologyInc.Allrightsreserved.
case${MakeClean}in
[Yy][Ee][Ss])
makedistclean
;;
esac
case${CleanOnly}in
[Yy][Ee][Ss])
return
;;
esac
#prefixwith/usr/local,allfileswillbeinstalledinto/usr/local
envCC="${CC}"CXX="${CXX}"LD="${LD}"AR=${AR}STRIP=${STRIP}RANLIB=${RANLIB}NM=${NM}\
CFLAGS="${CFLAGS}-Os"CXXFLAGS="${CXXFLAGS}"LDFLAGS="${LDFLAGS}"\
./configure${ConfigOpt}\
--with-pcap=linux--prefix=/usr/local
make${MAKE_FLAGS}
makeinstall
Theabovescriptwillinstalllibpcaprelatedfilesinto/usr/local/inchrootenvironment.Afterinstallinglibpcap,nmapcanfindlibpcap'scrosscompiledproductsin/usr/local.
Synologytoolkitprovideslibpcapinchroot.
>dpkg-l|greplibpcap
iilibpcap-x64-dev6.0-7274allSynologybuild-timelibrary
nmapcanusechroot'slibpcapbyusing${SysRootPrefix}variable.
--with-libpcap=${SysRootPrefix}
SynoBuildConf/install
Insteadofcopyingthebinarytothedestinationfolder,mostbigprojectswillusemakeinstalltoinstallthebinariesandlibraries.Sincewehaveusedthe--prefixflagwhenconfiguringthenmapproject,wecanjustexecutemakeinstallanditwillinstallthenmaprelatedfilestothefolderspecifiedby--prefix.
SynologyDSM6.0DeveloperGuide
35CompileOpenSourceProject:nmap
#!/bin/bash
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
PKG_NAME="nmap"
INST_DIR="/tmp/_${PKG_NAME}"
PKG_DIR="/tmp/_${PKG_NAME}_pkg"
PKG_DEST="/image/packages"
PrepareDirs(){
fordirin$INST_DIR$PKG_DIR;do
rm-rf"$dir"
done
fordirin$INST_DIR$PKG_DIR$PKG_DEST;do
mkdir-p"$dir"
done
}
SetupPackageFiles(){
makeinstall
./INFO.sh>INFO
cpINFO"${PKG_DIR}"
cp-rscripts/"${PKG_DIR}"
}
MakePackage(){
source/pkgscripts/include/pkg_util.sh
pkg_make_package$INST_DIR$PKG_DIR
pkg_make_spk$PKG_DIR$PKG_DEST
}
main(){
PrepareDirs
SetupPackageFiles
MakePackage
}
main"$@"
INFO.shAsmentionedbefore,wewilluseINFO.shtogeneratetheINFOfile.
#!/bin/sh
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
./pkgscripts/include/pkg_util.sh
package="nmap"
version="7.01"
displayname="nmap"
arch="$(pkg_get_platform)"
maintainer="SynologyInc."
description="ThispackagewillinstallnmapinyourDSMsystem."
["$(caller)"!="0NULL"]&&return0
pkg_dump_info
Note:RemembertosettheexecutablebitofINFO.shfile.
BuildandCreatePackage:
Lastly,runthefollowingcommandstocompilethesourcecodeandbuildthepackage.
/toolkit/pkgscripts-ng/PkgCreate.py-p6281-x0-cnmap
SynologyDSM6.0DeveloperGuide
36CompileOpenSourceProject:nmap
Afterthebuildprocess,youcanchecktheresultin/toolkit/result_spk.
VerifytheResult
Ifthepackingprocesswassuccessful,youwillseeanspkfileplacedintheresult_spkfolder.Totestthespkfile,youcanusemanualinstallinDSMPackageCentertoinstallyourpackage.
Warning:RemembertoimportyourkeystotheDSMsystemorselectAnypublisherinPackageCenter->Settings->General->TrustLevel.Otherwise,theinstallationwillfail.
YoucanthentrytoconnecttotheDSMusingsshandtypethefollowingcommandtofullyscanyourDSMmachine.
cd/var/packages/nmap/target/usr/local/bin
./nmap-v-Alocalhost
SynologyDSM6.0DeveloperGuide
37CompileOpenSourceProject:nmap
CompileKernelModulesThischapterwillshowyouhowtobuildlinuxkernelmodulesforyourDSMsystemusingPackageToolkit.IfyouwishtocompilethekernelmoduleswithoutusingPackageToolkit,pleaserefertoAppendixB:CompileKernelModulesManually.
Asmentionedbefore,youhavetocreatetheSynoBuildConf/build,SynoBuildConf/install,andSynoBuildConf/dependsbeforeusingPackageToolkit.
Inthischapter,wewilluseplatform6281asourexample.
Preparation:First,youwillneedtodownloadtheGPLsourcecodeofyourplatform.Youcandownloadthesourcecodefromthislink.
AfterdownloadingtheSynologyGPLkernelsourcecode,movethefiletoyourtoolkitfolder.
SynoBuildConf/depends:
Thereisnothingspecialaboutthedependsfile.Thefollowingisthedependsfileforthe6281platform.
[default]
all="6.0"
SynoBuildConf/build:
Beforecompilingthekernelmodules,youwillneedtosetuptheconfigfilefirst.
Inthekernelsourcecode,thereareconfigurationfilesfordifferentplatforms.Theconfigurationfilesarelistedbelow:
CPU ConfigurationFile Arch Linux
Marvell6281Marvell6282 synoconfigs/88f6281 ARM 2.6.32
MarvellArmada370 synoconfigs/armada370 ARM 3.2.40
MarvellArmada375 synoconfigs/armada375 ARM 3.2.40
MarvellArmadaXP synoconfigs/armadaxp ARM 3.2.40
Annapurnalabs,AlpineAL212/AL314/AL514 synoconfigs/alpine(DS715,DS1515,DS2015xs)synoconfigs/alpine4k(DS215+,DS416) ARM 3.2.40
Mindspeed,Comcerto,C2000 synoconfigs/comcerto2k ARM 3.2.40
Freescale8533 synoconfigs/ppc8533 PowerPC 2.6.32
FreescaleQorIQ(P1022) synoconfigs/ppcQorIQ PowerPC 2.6.32
IntelAtomD525,D510,D410,D425 synoconfigs/x86_64 x86 3.2.40
IntelAtomD2700 synoconfigs/cedarview x86 3.2.40
IntelSoCCE5335 synoconfigs/evansport x86 3.2.40
IntelCorei3 synoconfigs/bromolow x86 3.2.40
SynologyDSM6.0DeveloperGuide
38CompileKernelModules
Pleasecopytheproperconfigurationfileto.config,andrunmakeoldconfigandmakemenuconfigtoselectyourkernelmodules.Accordingtotheplatformsyouwouldliketocompile,youwillhavetosettheproperARCHandCROSS_COMPILEintoenvironmentvariables.
Thefollowingisasamplescriptthatwillcompilethelinuxkernelmodulesforthe6281platform.
#!/bin/bash
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
#SynoBuildConf/build
case${MakeClean}in
[Yy][Ee][Ss])
[-fMakefile]&&makedistclean
;;
esac
case${CleanOnly}in
[Yy][Ee][Ss])
return
;;
esac
#prepareconfigfiles
cp-fsynoconfigs/88f6281.config
makeARCH=${ARCH}CC=${CC}oldconfig
#startcompilekernelmodules
echo"=====BuildSynologyLinuxkernel2.6Modules====="
makeARCH=${ARCH}CC=${CC}LD="${LD}"${MAKE_FLAGS}modules
#createtable
./scripts/syno_gen_usbmodem_table.shcreate-table
SynoBuildConf/install
Unlikethepreviousexample,thisexamplewillnotpackthewholekernelmoduleintoonesinglespkfile.Instead,itwillinstallthekernelmodulesin/images/modulesunderthechrootenvironment.Asaresult,theinstallationscriptbelowisslightlydifferentfromthepreviousexample.
#!/bin/bash
#Copyright(c)2000-2015SynologyInc.Allrightsreserved.
#SynoBuildConf/install
MODULES_DIR="${ImageDir}/modules"
PrepareDirs(){
[-d"${MODULES_DIR}"]||mkdir-p${MODULES_DIR}
rm-f${ImageDir}/modules/*
}
InstallModules(){
makeARCH=${ARCH}CC=${CC}LD="${LD}"INSTALL_MOD_PATH=$MODULES_DIRmodules_install
}
main(){
PrepareDirs
InstallModules
}
main"$@"
CompileKernelModules:
SynologyDSM6.0DeveloperGuide
39CompileKernelModules
Lastly,runthefollowingcommandstocompileandinstallthekernelmodulestothedestinationfolder.
/toolkit/pkgscripts-ng/PkgCreate.py-p6281-clinux-2.6.32
Afterthebuildprocess,youcanchecktheresultin/toolkit/ds.6281-6.0/image/modules.
VerifytheResult:YoucancopythekernelmoduleyouneedforyourDSMsystemandrunthefollowingcommandtoinstallthemodule.
insmod${module_name}
Usethefollowingcommandtoverifythatyourmodulehasbeeninstalledproperly.
lsmod|grep${module_name}
SynologyDSM6.0DeveloperGuide
40CompileKernelModules
AdvancedThissectionillustratesadvancedtypesofusageforthePackageToolkit.
PkgCreate.pyCommandOptionList
ThefollowingtablelistssomeofthePkgCreate.pycommands.
OptionName OptionPurpose
(default) Runbuildstageonlywhichincludelinkandcompilesourcecode.It'sthesameas-Uoption.
-p Specifytheplatformyouwanttopackyourproject.
-x Builddependentprojectlevel.
-c Runbothbuildstageandpackstagewhichincludelinksourcecode,compilesourcecode,packpackageandsignthefinalspk.
-U Runbuildstageonlywhichincludeslinkandcompilesourcecode.
-l Runbuildstageonly,butwillonlylinkyoursourcecode.
-L Runbuildstageonly,butwillcompileyoursourcecodeonly.
-I Runpackstageonly,whichwillpackandsignyourspk.
--no-sign TellsPkgCreat.pynottosignyourspkfile.forexample,PkgCreat.py-I--no-sign${project}
-z Runallplatformsconcurrently.
-J Compileyourprojectwith-Jmakecommandoptions.
-S Disablesilentmake.
Thefollowingtableshowstherelationshipbetweencommandoptionsindifferentstages.Youcanchoosetheproperoptionsbasedonyourneeds.Option-cisenoughformostcases.
Stage Action (default) -l -L -U -I--no-sign -I -c
BuildStage LinkSourcecode Yes Yes No Yes No No Yes
BuildStage CompileSourcecode Yes No Yes Yes No No Yes
PackStage PackPackage No No No No Yes Yes Yes
PackStage SignPackage No No No No No Yes Yes
Platform-SpecificDependency
Platform-specificdependencymeansyoucanhaveseveraldependentprojectsfordifferentplatformsbyappending":${platform}"tothefollowingsections:BuildDependentandReferenceOnly.Thefollowingexampleshows816xandaramda370projectsthatareonlibbar-1.0.
SynologyDSM6.0DeveloperGuide
41Advanced
#SynoBuildConf/depends
[BuildDependent]
libfoo-1.0
[BuildDependent:816x,armada370]
libfoo-1.0
libbar-1.0
[default]
all="6.0"
CollecttheSPKFileinYourOwnWayBydefault,PkgCreate.pywillmovetheSPKfileto/toolkit/result_spkaccordingto/toolkit/build_env/ds.${platform}-${version}/source/${project}/INFO.Youcanhaveyourowncollectoperationbyaddingahook,SynoBuildConf/collect.SynoBuildConf/collectcanbeanyexecutableshellscript(soremembertochmod+x)andPkgCreate.pywillpassthefollowingenvironmentvariablestoit:
SPK_SRC_DIR:SourcefolderoftargetSPKfile.SPK_DST_DIR:DefaultdestinationfoldertoputSPKfile.SPK_VERSION:Versionofpackage(accordingtoINFO).
ThecurrentworkingdirectoryofSynoBuildConf/collectis/source/${project}willbeunderchrootenvironment.
SynologyDSM6.0DeveloperGuide
42Advanced
PackageIntroductionInpackage,youdefinessomescriptsandmetadatatocontroltheinstallation,un-installation,upgrading,startingandstoppingprocessesaswellashowtocommunicatewithSynologyPackageCenterinDSM.SynologyPackageCenterprovidesuserinterfacetotheenduserandautomatestheprocessesandconfiguringpackagestomaketheenduserinstall,un-install,upgrade,startandstopyourpackageeasily.
SynologyDSM6.0DeveloperGuide
43SynologyPackage
PackageStructureASynologypackageisaSPKfileintarformat,containingmetadataandfilesasinthefollowing:
File/FolderName Description File/FolderType DSMRequirement
INFO
ThisfilecontainstheinformationdisplayedinPackageCenterortocontroltheflowofinstallation.(PleaserefertoINFOsectionformoreinformation)
File 2.0-0731
WIZARD_UIFILES
Optional.ThisfoldercontainsfileswheredescriptionsofUIcomponentsareshownduringtheinstallation,un-installation,andupgradingprocess.
(PleaserefertoWIZARD_UIFILESsectionformoreinformation)
Folder(Containsinstall_uifile,upgrade_uifile,uninstall_uifile,
...)
3.2-1922
package.tgz
Thisisacompressedfile,containingallthefilesthatarerequired,suchasexecutablebinary,library,orUIfiles.
(Pleaserefertopackage.tgzsectionformoreinformation)
.tgzFile 2.0-0731
scripts
Thisfoldercontainsshellscriptswhichareexecutedduringtheinstallation,uninstalling,upgrading,starting,andstoppingprocesses.
(Pleaseseethescriptssectionformoreinformation)
Folder(Containspreinst,postinst,
preuninst,postunist,preupgrade,postupgrade,
start-stop-status)
2.0-0731
conf
Optional.Thisfoldercontainsconfigurations.
Note:1.InDSM4.2~DSM5.2,ifyouwanttoconfigurefileswithinit,thesupport_conf_folderkeyintheINFOfilemustbesetto"yes".2.InDSM6.0,youdon'tneedtodefinethesupport_conf_folderkeyintheINFOfile.(Pleaserefertoconfsectionformoreinformation)
Folder(containsPKG_DEPS,
PKG_CONX,...)4.2-3160
LICENSE Optional.Thisfileisshownintheinstallationprocess,andmustbelessthan1MB. File 3.2-1922
PACKAGE_ICON.PNG 72x72.pngimageisshowninPackageCenter .pngfile 3.2-1922
PACKAGE_ICON_120.PNG
(Deprecated)
120x120.pngimageisshowninPackageCenter.
Note:ItisnotcompatiblewithallDSMversionsbecausetheiconwillnotbeinstalledinDSM4.1orolder.IfyourpackagecanbeinstalledinDSM4.1orolder,pleaserefertothenextsectiontodefinepackage_icon_120intheINFOfileinsteadoftakingPACKAGE_ICON_120.PNG.
.pngfile 4.2-3160~4.3-3810
PACKAGE_ICON_256.PNG
256x256.pngimageisshowninPackageCenter.
Note:ItisnotcompatiblewithallDSMversionsbecausetheiconwillnotbeinstalledinDSM4.3orolder.IfyourpackagecanbeinstalledinDSM4.3orolder,pleaserefernextsectiontodefinepackage_icon_256inINFOfiletoinsteadoftakingPACKAGE_ICON_256.PNG.
.pngfile 5.0-4400
SynologyDSM6.0DeveloperGuide
44PackageStructure
Note:
Allwordsarecasesensitive.YoucanusePkgCreate.pyandpkg_make_spktohelpyoucreatethepackage.Formoredetails,pleaserefertoBuildandCreatePackagePackStage:SynoBuildConf/install
SynologyDSM6.0DeveloperGuide
45PackageStructure
INFOThe“INFO”fileisusedtodescribetheinformationofthepackage.PackageCenterwillsearchforinformationonhowtocontroltheinstallation,un-installation,upgrading,startingandstoppingprocessesandlistingsinPackageCenter.Forexample,ifyouwouldlikethepackagetobedependentonsomeservices,youcandefinethekeyasinstall_dep_services.Ifyouwouldliketorestartsomeservicesaftertheinstallationprocess,youcandefinethekeyasinstuninst_restart_services.PackageCenterwillputthe“INFO”fileto/var/packages/[packageidentify]/INFOafterthepackageisinstalled.
INFOFieldFormat:
EachpieceofinformationintheINFOfileisdefinedbykey/valuepairsseparatedbyanequalssigne.g.key="value".
Note:Allwordsinkeyandvaluearecasesensitive.
INFOFieldList:
TherearemanyfieldsinanINFOfile.Wecandividethemintotwogroups:
Necessaryfields:NecessaryFieldsOptionalfields:OptionalFields
ThefollowingaresomeCodeWordsfortheINFOfieldlist:
apache-sys=apachedaemonlisteningonDSMports(e.g.5000or5001)apache-web=apachedaemonlisteningonWebStationports(e.g.80or443).mdns=MulticastDNSServiceDiscoverydb=MySQLandPostgreSQLapplenetwork=AppleNetworknfs=NFSssh=SSH,SecureShellpgsql=PostgreSQL
TheversionofDSMrequirementmeanskey/valuepairsinINFOworkscorrectlyintheminimumversionofDSM.
WritingINFOFile:
InsteadofwritingtheINFOfilebyyourself,wehaveprovidedusefulhelperfunctionsinPackageToolkitthatwillhelpyoucreatetheINFOfile.PleaserefertoPackStage:INFO.sh.
SynologyDSM6.0DeveloperGuide
46INFO
FieldName:package
Description:Packageidentity.Nomorethanoneversionofapackagecanexistatthesametimeintheenduser'sDSM;therefore,theidentificationisuniquetoidentifyyourpackage.Besides,PackageCenterwillcreatea/var/packages/[packageidentity]foldertoputpackagefiles.
Note:Thisvalueofthekeycannotcontainanyofthesespecialcharacters:,/,>,<,|or=.
Value:String
DefaultValue:(Empty)
Example:
package="DownloadStation"
DSMRequirement:2.0-0731
FieldName:displaynameDescription:PackageCentershowsthenameofthepackage.
Note:Ifdisplaynamekeyisempty,PackageCenterwilldisplaythevalueofpackagekey.
Value:StringDefaultValue:ThevalueofpackagekeyExample:NoneDSMRequirement:2.3-1118
FieldName:version
Description:Packageversion.Enduserscanidentifythepackageversion.
Note:
1. Eachversiondelimiterisonlyallowedtobe.-or_.2. Eachversionnumberwhichisdelimitedbydelimiterisonlyallowedtobenumber
Value:String
DefaultValue:(Empty)
Example:
version="3.6-3263"
DSMRequirement:2.0-0731
FieldName:firmwareDescription:EarliestversionofDSMfirmwarethatisrequiredtorunthepackage.Value:X.Y-ZDSMmajornumber,DSMminornumber,DSMbuildnumberDefaultValue:(Empty)Example:NoneDSMRequirement:2.3-1118
SynologyDSM6.0DeveloperGuide
47NecessaryFields
FieldName:description
Description:PackageCentershowsashortdescriptionofthepackage.
Value:String
DefaultValue:(Empty)
Example:
description="DownloadStationisaweb-baseddownloadapplicationwhichallowsyoutodownloadfilesfromtheInternetthroughBT,FTP,HTTP,NZB,Thunder,FlashGet,QQDL,andeMule,andsubscribetoRSSfeedstokeepyouupdatedonthehottestorlatestBT.ItofferstheautounzipservicetohelpyouextractcompressedfilestoyourSynologyNASwheneverfilesaredownloaded.WithDownloadStation,youcandownloadfilesfrommultiplefilehostingsites,andsearchfortorrentfilesviasystemdefaultsearchenginesaswellasself-addedengineswiththeBTsearchfunction."
DSMRequirement:2.3-1118
DSMRequirement:4.2-3160
FieldName:archDescription:ListtheCPUarchitectureswhichcanbeusedtoinstallthepackage.
Value:(archvaluesareseparatedwithaspace.PleasereferAppendixA:PlatformandArchValueMappingTabletomoreinformation)
DefaultValue:noarch
Note:
1. "noarch"meansthepackagecanbeinstalledandworkinanyplatform.Forexample,thepackageiswritteninPHPorshellscript.
2. Pleasenotpackallbinaryfileswithdifferentplatformstoonepackagespkfile.
Example:
arch="noarch"
or
arch="x86ppc853x".
DSMRequirement:2.0-0731
FieldName:maintainer
Description:PackageCentershowsthedeveloperofthepackage.
Value:String
DefaultValue:(Empty)
Example:
maintainer="SynologyInc."
DSMRequirement:2.0-0731
FieldName:package_iconDescription:72x72pngimagedataisencodedbyBase64.
SynologyDSM6.0DeveloperGuide
48NecessaryFields
Note:
1. ThisvaluewillbereplacedwhenaPACKAGE_ICON.PNGfileisstoredinthe[packagename].spk.2. IfthevalueisnotdefinedandnoPACKAGE_ICON.PNGfileisinthe[packagename].spk,thepackageiconwill
bethedefaultone.Value:Base64-encodedvalue
DefaultValue:adefaulticon
Example:None
DSMRequirement:3.2-1922
FieldName:package_icon_256Description:256x256pngimagedataisencodedbyBase64.
Note:
1. ThisvaluewillbereplacedwhenaPACKAGE_ICON_256.PNGfileisstoredinthe[packagename].spk.2. IfthevalueisnotdefinedandnoPACKAGE_ICON_256.PNGfileisinthe[packagename].spk,a72x72iconwill
bethedefault,andtheresultswilllookmorepixelatedandblurryinDSM.Value:Base64-encodedvalue
DefaultValue:adefaulticon
Example:None
DSMRequirement:5.0-4458
SynologyDSM6.0DeveloperGuide
49NecessaryFields
FieldName:displayname_[DSMlanguage]
Description:PackageCentershowsthenameintheDSMlanguagesetbytheend-user.DSMsupportsthefollowinglanguages:enu(English)cht(TraditionalChinese)chs(SimplifiedChinese)krn(Korean)ger(German)fre(French)ita(Italian)spn(Spanish)jpn(Japanese)dan(Danish)nor(Norwegian)sve(Swedish)nld(Dutch)rus(Russian)plk(Polish)ptb(BrazilianPortuguese)ptg(EuropeanPortuguese)hun(Hungarian)trk(Turkish)csy(Czech)
Value:StringDefaultValue:packagenameExample:
displayname_enu="HelloWorld"
displayname_cht=""
DSMRequirement:2.3-1118
FieldName:description_[DSMlanguage]Description:PackageCentershowsashortdescriptionintheDSMlanguagesetbytheend-user.DSMsupportsthefollowinglanguages:
enu(English)cht(TraditionalChinese)chs(SimplifiedChinese)krn(Korean)ger(German)fre(French)ita(Italian)spn(Spanish)jpn(Japanese)dan(Danish)nor(Norwegian)sve(Swedish)nld(Dutch)rus(Russian)
SynologyDSM6.0DeveloperGuide
50OptionalFields
plk(Polish)ptb(BrazilianPortuguese)ptg(EuropeanPortuguese)hun(Hungarian)trk(Turkish)csy(Czech)
Value:String
DefaultValue:descriptionExample:
description_enu="HelloWorld"
description_cht=""
DSMRequirement:2.3-1118
FieldName:maintainer_urlDescription:Ifapackagehasadeveloperwebpage,PackageCenterwillshowalinktolettheuseropenit.Value:StringDefaultValue:(Empty)Example:
maintainer_url="http://www.synology.com"
DSMRequirement:4.2-3160
FieldName:distributorDescription:PackageCentershowsthepublisherofthepackage.Value:StringDefaultValue:(Empty)Example:
distributor="SynologyInc."
DSMRequirement:4.2-3160
FieldName:distributor_url
Description:Ifapackageisinstalledandhasadistributerwebpage,PackageCenterwillshowalinktolettheuseropenit.Value:StringDefaultValue:(Empty)Example:
distributor_url="http://www.synology.com/enu/apps/3rd-party_application_integration.php"
DSMRequirement:4.2-3160
FieldName:support_url
Description:PackageCentershowsasupportlinktoallowuserstoseektechnicalsupportwhenneeded.
SynologyDSM6.0DeveloperGuide
51OptionalFields
Value:String
DefaultValue:(Empty)
Example:
support_url="https://myds.synology.com/support/support_form.php".
FieldName:support_centerDescription:Ifsetto“yes,”PackageCenterdisplaysalinktomaketheenduserlaunchSynologySupportCenterApplicationwhenyourpackageisinstalled.
Note:Ifsetto“yes,”thereport_urllinkwon’tshowinPackageCenter.
Value:"yes"/"no"DefaultValue:"no"Example:NoneDSMRequirement:5.0-4458
FieldName:model
Description:Listofmodelsonwhichpackagescanbeinstalledinspesificmodels.ItisorganizedbySynologystring,architectureandmodelname.Value:(modelsareseparatedwithaspace,e.g.synology_88f6281_209,synology_cedarview_rs812rp+,synology_x86_411+II,synology_bromolow_3612xs,synology_cedarview_rs812rp+,…)DefaultValue:(Empty)Example:
model="synology_bromolow_3612xssynology_cedarview_rs812rp+".
DSMRequirement:4.0-2219
FieldName:exclude_archDescription:ListtheCPUarchitectureswherethepackagecan'tbeusedtoinstallthepackage.
Note:Becarefultousethisexclude_archfield.Ifthepackagehasdifferentexclude_archvalueinthedifferentversions,theendusercaninstallthepackageinthespecificversionwithoutsomearchvaluesofexclude_arch.
Value:(archvaluesareseparatedwithaspace.PleasereferAppendixA:PlatformandArchValueMappingTabletomoreinformation)DefaultValue:(Empty)Example:NoneDSMRequirement:6.0Example:
exclude_arch="bromolowcedarview".
FieldName:checksumDescription:ContainsMD5stringtoverifythepackage.tgz.Value:StringDefaultValue:(Empty)
SynologyDSM6.0DeveloperGuide
52OptionalFields
Example:NoneDSMRequirement:3.2-1922
FieldName:adminport
Description:ApackagelistenstoaspecificporttodisplayitsownUI.Ifthepackageisdefinedbyaport,alinkwillbeopenedwhenthepackageisstarted.
Note:adminprotocol,adminportandadminurlkeysarecombinedtoadminprotocol://ip:adminport/adminurllink
Value:0~65536DefaultValue:80Example:
adminport="9002"
DSMRequirement:2.0-0731
FieldName:adminurlDescription:Ifapackageisinstalledandhasawebpage,alinkwillbeopenedwhenthepackageisstarted.
Note:adminprotocol,adminportandadminurlkeysarecombinedtoadminprotocol://ip:adminport/adminurllink
Value:StringDefaultValue:(Empty)Example:
adminurl="web"
DSMRequirement:2.3-1118
FieldName:adminprotocol
Description:ApackageusesaspecificprotocoltodisplayitsownUI.Ifapackageisinstalledandhasawebpage,aprotocolwillbeopenedwhenthepackageisstarted.
Note:adminprotocol,adminportandadminurlkeysarecombinedtoadminprotocol://ip:adminport/adminurllink
Value:http/https(Separatedwithaspace)DefaultValue:httpExample:
adminprotocol="http"
DSMRequirement:3.2-1922
FieldName:dsmuidir
Description:DSMUIfoldernameinpackage.tgz.TheUIfolderofthepackagein/var/packges/[packgename]/target/[dsmuidir]willbeautomaticallylinkedtotheDSMUIfolderin/usr/syno/synoman/webman/3rdparty/[packagename]toshowyourpackage'sshortcutinDSMafterthepackageisstarted.Toremovethelink,afterthepackageisstopped.
SynologyDSM6.0DeveloperGuide
53OptionalFields
Note:
1. Thiskeycannotcontain:or/.2. PleasereferIntegrateYourpackageintoDSMformoreinformation.
Value:StringDefaultValue:(Empty)Example:NoneDSMRequirement:3.2-1922
FieldName:dsmappname
Description:ThevalueofeachindividualapplicationwillbeequaltotheuniquepropertynameinDSM’sconfigfilesoastobeintegratedintoSynologyDiskStation.
Note:PleasereferConfiginIntegrateYourpackageintoDSMchapterformoreinformation.
Value:(Separatedwithaspace)DefaultValue:(Empty)Example:
dsmappname="SYNO.SDS.PhotoStationSYNO.SDS.PersonalPhotoStation"
DSMRequirement:3.2-1922
FieldName:checkport
Description:CheckifthereisanyconflictbetweentheadminportandtheportswhicharereservedorarelisteningonDSMexceptweb-serviceports(e.g.80,443)andDSMports(e.g.5000,5001).Value:"yes"/"no"DefaultValue:"yes"Example:NoneDSMRequirement:3.2-1922
FieldName:startable
Description:Whennoprograminthepackageprovidestheend-userwiththeoptionstoenableordisableitsfunction.Thiskeyissetto"no"andtheend-usercannotstartorstopthepackageinPackageCenter.
Note:If“startable”issetto“no”,start-stop-statusscriptwhichrunsinbootuporshotdownisstillrequired.
Value:"yes"/"no"DefaultValue:"yes"Example:NoneDSMRequirement:3.2-1922
FieldName:precheckstartstopDescription:Ifsetto"yes",letstart-stop-statuswithprestartorprestopargumentrunbeforestartorstopthepackage.Pleaserefertostart-stop-statusinscriptsformoreinformation.Value:"yes"/"no"DefaultValue:"yes"Example:NoneDSMRequirement:6.0
SynologyDSM6.0DeveloperGuide
54OptionalFields
FieldName:helpurl
Description:Ifapackageisinstalledandhasa"help"webpage,PackageCenterwilldisplayahyperlinktotheuser.Value:StringDefaultValue:(Empty)Example:
helpurl="https://www.synology.com/en-global/knowledgebase"
DSMRequirement:3.2-1922
FieldName:betaDescription:Ifthispackageisconsideredthebetaversion,thebetainformationwillbeshowninPackageCenter.Value:"yes"/"no"DefaultValue:"no"Example:NoneDSMRequirement:6.0
FieldName:report_urlDescription:Ifapackageisabetaversionandhasa"report"webpage,PackageCenterwilldisplayahyperlink.Ifthispackageisconsideredthebetaversion,thebetainformationwillbealsobeshowninPackageCenter.Value:StringDefaultValue:(Empty)Example:NoneDSMRequirement:3.2-1922
FieldName:install_rebootDescription:RebootDiskStationafterinstallingorupgradingthepackage.Value:"yes"/"no"DefaultValue:"no"Example:NoneDSMRequirement:3.2-1922
FieldName:install_dep_packagesDescription:Beforeapackageisinstalledorupgraded,thesepackagesmustbeinstalledfirst.Inaddition,theorderofstartingorstoppingpackagesisalsodependentonit.Theformatconsistsofapackagename.Ifmorethanonedependentpackagesarerequired,thepackagenameofthepackage(s)willbeseparatedwithacolon,e.g.install_dep_packages="packageA".Ifaspecificversionrangeisrequired,packagenamewillbefollowedbyoneofthespecialcharacters=,<,>,>=,<=andpackageversionwhichiscomposedbynumberandperiods,e.g.install_dep_packages="packageA>2.2.2:packageB".
Note:>=and<=operatoronlysupportedinDSM4.2ornewer.Don’tuse<=and>=ifapackagecanbeinstalledinDSM4.1orolderbecauseitcannotbecomparedcorrectly.Instead,thepackageversionshouldbesetlowerorhigher.
Value:PackagenamesNote:Eachpackagenameisseparatedwithacolon.
DefaultValue:(Empty)Example:
SynologyDSM6.0DeveloperGuide
55OptionalFields
install_dep_packages="packageA"
or
install_dep_packages="packageA>2.2.2:packageB"
DSMRequirement:3.2-1922
FieldName:install_conflict_packages
Description:Beforeyourpackageisinstalledorupgraded,theseconflictpackagescannotbeinstalled.Theformatconsistsofapackagename,e.g.install_conflict_packages="packageA".Ifmorethanoneconflictpackagesarerequiredwiththeformat,thenameofthepackage(s)willbeseparatedwithacolon,e.g.install_conflict_packages="packageA:packageB".Ifaspecificversionrangeisrequired,packagenamewillbefollowedbyoneofthespecialcharacters=,<,>,>=,<=andpackageversionwhichiscomposedbynumberandperiods,e.g.install_conflict_packages="packageA>2.2.2:packageB".
Note:>=and<=operatoronlysupportedinDSM4.2ornewer.Donotuse<=and>=ifapackagecanbeinstalledinDSM4.1becauseitcan’tbecomparedcorrectly.Instead,thepackageversionshouldbesetlowerorhigher.
Value:PackagenamesNote:Eachpackagenameisseparatedwithacolon.
DefaultValue:(Empty)Example:
install_conflict_packages="packageA:packageB"
or
install_conflict_packages="packageA>2.2.2:packageB"
DSMRequirement:4.1-2851
FieldName:instuninst_restart_services
Description:Reloadservicesafterinstalling,upgradinganduninstallingthepackage.Note:
1. Iftheserviceisnotenabledorstartedbytheend-user,serviceswon'tbereloaded2. Iftheinstall_rebootissetto“yes”,thisvalueisignoredintheinstallationprocess.
Value:DSM4.3orolder:apache-sys,apache-web,mdns,samba,db,applenetwork,cron,nfs,firewallDSM5.0~DSM5.2:apache-sys,apache-web,mdns,samba,applenetwork,cron,nfs,firewallDSM6.0:nginx,mdns,samba,applenetwork,cron,nfs,firewall
Note:Eachserviceisseparatedwithaspace.
DefaultValue:(Empty)Example:
instuninst_restart_services="apache-sysapache-web"
DSMRequirement:3.2-1922
FieldName:startstop_restart_services
Description:Reloadservicesafterstartingandstoppingthepackage.Note:
1. Iftheserviceisnotenabledorstartedbytheend-user,serviceswon'tbereloaded.2. Ifstartableissetto“no”,thevalueisignored.
SynologyDSM6.0DeveloperGuide
56OptionalFields
Value:DSM4.3orolder:apache-sys,apache-web,mdns,samba,db,applenetwork,cron,nfs,firewallDSM5.0~DSM5.2:apache-sys,apache-web,mdns,samba,applenetwork,cron,nfs,firewallDSM6.0:nginx,mdns,samba,applenetwork,cron,nfs,firewall
Note:Eachserviceisseparatedwithaspace.
DefaultValue:(Empty)Example:
startstop_restart_services="apache-sysapache-web"
DSMRequirement:3.2-1922
FieldName:install_dep_servicesDescription:Beforethepackageisinstalledorupgraded,theseservicesmustbestartedorenabledbytheend-user.Value:DSM4.2orolder:apache-web,mysql,php_disable_safe_exec_dirDSM4.3:apache-web,mysql,php_disable_safe_exec_dir,sshDSM5.0~DSM5.2:apache-web,php_disable_safe_exec_dir,ssh,pgsqlDSM6.0:ssh,pgsql
Note:Eachserviceisseparatedwithaspace.
DefaultValue:(Empty)Example:
install_dep_services="apache-webssh"
DSMRequirement:3.2-1922
FieldName:start_dep_services
Description:Beforethepackageisstarted,theseservicesmustbestartedorenabledbytheend-user.Ifstartableissetto“no”,thisvalueisignored.Value:DSM4.2orolder:apache-web,mysql,php_disable_safe_exec_dirDSM4.3:apache-web,mysql,php_disable_safe_exec_dir,sshDSM5.0~DSM5.2:apache-web,php_disable_safe_exec_dir,ssh,pgsqlDSM6.0:ssh,pgsql
Note:Eachserviceisseparatedwithaspace.
DefaultValue:(Empty)Example:
install_dep_services="apache-webssh"
DSMRequirement:3.2-1922
FieldName:extractsize
Description:Thisvalueindicatestheminimalspacetoinstallapackage.Itwillbeusedtoprompttheuserifthereisenoughfreespacetoinstallit.
SynologyDSM6.0DeveloperGuide
57OptionalFields
Note:
1. InDSM5.2ororder,thesizebasedonbyteunit.2. InDSM6.0ornewer,thesizebasedonkilobyteunit.
Value:SizeunitDefaultValue:ThebytesizeofSPKfileofpackageExample:
extractsize="253796"
DSMRequirement:4.0-2166
FieldName:support_conf_folderDescription:InDSM5.2ororder,ifyouwanttousesomespecialconfigurationfileswithina"conf"folder,thisvaluemustbesetto"yes".Moredetailsaregiveninthe"conf"section.Howerver,inDSM6.0ornewer,youdon'tneedtodefineitanymore.
Note:DeprecatedinDSM6.0
Value:"yes"/"no"DefaultValue:"no"Example:
support_conf_folder="yes"
DSMRequirement:4.2-3160~5.2
FieldName:install_type
Description:Ifsetto“system”,yourpackagewillbeinstalledintherootfilesystem,/usr/local/packages/@appstore/,evenifthereisnovolume.
Note:Becarefulwhensettingthis,asitmayresultintheDiskStationcrashingifyourpackagerunsoutofthespaceintherootfilesystem.
Value:"system"DefaultValue:(Empty)Example:
install_type="system"
DSMRequirement:5.0-4458
FieldName:silent_install
Description:Ifsetto“yes”,yourpackageisallowedtobeinstalledwithoutthepackagewizardinthebackground.ThisallowsCMS(CentralManagementSystem)todistributepackageinstallationtootherNASconnected.Value:"yes"/"no"DefaultValue:"no"Example:
silent_install="yes"
DSMRequirement:5.0-4458
SynologyDSM6.0DeveloperGuide
58OptionalFields
FieldName:silent_upgrade
Description:Ifsetto“yes”,yourpackageisallowedtobeupgradedwithoutthepackagewizardinthebackground.Endusercannotmodifyanyinformationforupgrading.ThisallowsnotonlyyourpackagetobeupgradedautomaticallybutalsoforCMS(CentralManagementSystem)todistributepackageupgradestootherNASconnected.Value:"yes"/"no"DefaultValue:"no"Example:
silent_upgrade="yes"
DSMRequirement:5.0-4458
FieldName:silent_uninstallDescription:Ifsetto“yes”,yourpackageisallowedtobeuninstalledwithoutthepackagewizardinthebackground.ThisallowsCMS(CentralManagementSystem)todistributepackageuninstallationtootherNASconnected.Value:"yes"/"no"DefaultValue:"no"Example:
silent_uninstall="yes"
DSMRequirement:5.0-4458
FieldName:auto_upgrade_fromDescription:Itissettoaversionofyourpackage.Ifyourpackageissettosilent_upgrade="yes"andthevalueisset,PackageCenteronlyupgradesyourpackageautomaticallyfromtheinstalledpackagewiththeversionorthenewerversion.However,iftheenduserinstallaolderversionthanit,PackageCenterwon'tupgradeitautomaticallyandtheusermustupgradeitbythemself.Value:(apackageversion)DefaultValue:(Emptystring)Example:
auto_upgrade_from="2.0"
DSMRequirement:5.2-5565
FieldName:offline_install
Description:Ifsetto"yes",afterthepackageispublishedinsynologyserver,itwon'tbeshowninthepackagelistofPackageCenterfromSynologyserver.However,theusercaninstallthepackagemanually.Value:"yes"/"no"DefaultValue:"no"Example:
offline_install="yes"
DSMRequirement:DSM6.0
FieldName:thirdparty
SynologyDSM6.0DeveloperGuide
59OptionalFields
Description:Ifsetto“yes”,yourpackageisathird-partypackageandisn'tdevelopedbySynology.InPackageCenter,third-parypacakgeswillbeshowninanotherpart.
Note:It'snotusedinDSM5.0ornewer.
Value:"yes"/"no"DefaultValue:"no"Example:
thirdparty="yes"
DSMRequirement:4.0~4.3
SynologyDSM6.0DeveloperGuide
60OptionalFields
package.tgzThepackage.tgzisacompressedfilecontainingallthefilesyouwouldneedwhenbuildingupyourapplications.Forexample,
executablefileslibrariesUIfilesconfigurationfiles
Youcanusepkg_make_packagefunctiontocreatethepackage.tgz.Formoredetailsabouthowtocreatethepackage.tgz,pleaserefertoPackStage:SynoBuildConf/install.
Afteryouinstallyourpackage,PackageCenterwillextractpackage.tgzto@appstorefolder(/volume?/@appstore/withtheassignedvolumeor/usr/local/packages/@appstore/).Inaddition,PackageCenterwillalsocreateasoftlinkin/var/packages/[packageidentity]/targetandpointtotheassignedfolder.
Note:
1. InDSM5.2orolder,package.tgzmustbetgzformat.2. InDSM6.0ornewer,package.tgzcanbetgzorxzformat,butthefilenamemustbepackage.tgz.
SynologyDSM6.0DeveloperGuide
61package.tgz
scriptsThisfoldercontainsshellscriptswhichwillbeexecutedduringtheinstallation,un-installation,upgrading,starting,andstoppingofpackages.PackageCenterwillputthescriptsto/var/packages/[packageidentify]/scripts/afterthepackageisinstalled.Therearesevenbasicscriptfilesstoredinthescriptsfolder.
1. preinst:Thisscriptisrunbeforethepackagefilesaretransferredto@appstore.YoucancheckiftheinstallationrequirementsmeettheDSMorpackageversion,orifsomeservicesareenabledinthisscript.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
2. postinst:Thisscriptisrunafterthepackagefilesaretransferredto@appstore.Youcanchangethefilepermissionandownershipinthisscript.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
3. preuninst:Thisscriptisrunbeforethepackageisremoved.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
4. postuninst:Thisscriptisrunafterthepackageisremovedfromthesystem.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
5. preupgrade:PackageCenterwillcallthisscriptbeforeuninstallingtheoldversionofyourpackage.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
6. postupgrade:PackageCenterwillcallthisscriptafterinstallingthenewversionofyourpackage.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Hello!!">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
7. start-stop-status:Thisscriptisusedtostartandstopapackage,detectrunningstatus,andgeneratethelogfile.Parametersusedbythescriptarelistedinbelow:
i. start:Whentheuserclicks"Run"torunthepackageortheNASisturnedon,thePackageCenterwillcallthisscriptwiththe"start"parameter.Areturnedvaluewillthenbeacquired.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Startfailed">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
ii. stop:Whentheuserclicks"Stop"tostoprunningthepackageortheNASisturnedoff,thePackageCenterwillcallthisscriptwiththe"stop"parameter.Areturnedvaluewillthenbeacquired.Fornon-zeroreturnedvalues,youcancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Stopfailed">$SYNOPKG_TEMP_LOGFILE).YoucanalsowritemessagesintheSYNOPKG_TEMP_LOGFILEfileforzeroreturnedvalueswhichrepresentthattheprocesswassuccessful.
iii. status:WhenPackageCenterisopenedtocheckpackagestatus,itwillsendarequesttoaskthestatusofthepackageusingthisparameter.Thefollowingexitstatuscodesshouldbereturned:
SynologyDSM6.0DeveloperGuide
62scripts
0:packageisrunning.
1:programofpackageisdeadand/var/runpidfileexists.
2:programofpackageisdeadand/var/locklockfileexists
3:packageisnotrunning
4:packagestatusisunknown
150:packageisbrokenandshouldbereinstalled.Pleasenote,brokenstatus(150)isonlysupportedbyDSM4.2andlater.
iv. log:WhenalogpageisopenedinPackageCenter,PackageCenterwillsendarequesttoaskthelogofthepackageusingthisparameter.WhenthelogfilenameissenttoSTDOUT,thecontentofthelogfilewillbedisplayed.
v. prestart:IfprecheckstartstopinINFOissetto"yes",itisrunforcheckingifit'sallowedtotheendusertostartyourpackageinsomesituationsornot.Forzeroreturnedvalue,theendusercanstartyourpackage.Fornon-zeroreturnedvalues,theenduserisn'tallowedtostartyourpackageandyoucancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Startfailed">$SYNOPKG_TEMP_LOGFILE)
Note:
i. ItonlyworksinDSM6.0ornewer.ii. Itwon'trunafterstartingapackageatbootingup.
vi. prestop:IfprecheckstartstopinINFOissetto"yes",itisrunforcheckingifit'sallowedtotheendusertostopyourpackageinsomesituationsornot.Forzeroreturnedvalue,theendusercanstopyourpackage.Fornon-zeroreturnedvalues,theenduserisn'tallowedtostopyourpackageandyoucancompileerrormessagesintheSYNOPKG_TEMP_LOGFILEfiletoprompttheuser(e.g.echo"Stopfailed">$SYNOPKG_TEMP_LOGFILE)
Note:
i. ItonlyworksinDSM6.0ornewer.ii. Itwon'trunbeforestoppingapackageatshuttingdown.
Toinstallapackage:
preinstpostinststart-stop-statuswithprestartargumentifenduserchoosestostartitimmediatelystart-stop-statuswithstartargumentifenduserchoosestostartitimmediately
Toupgradeapackage:
start-stop-statuswithprestopargumentifithasbeenstartedstart-stop-statuswithstopargumentifithasbeenstartedpreupgradepreuninstpostuninstpreinstpostinstpostupgradestart-stop-statuswithprestartargumentifitwasstartedbeforebeingupgradedstart-stop-statuswithstartargumentifitwasstartedbeforebeingupgraded
Touninstallapackage:
start-stop-statuswithprestopargumentifithasbeenstartedstart-stop-statuswithstopargumentifithasbeenstartedpreuninstpostuninst
Tostartapackage:
SynologyDSM6.0DeveloperGuide
63scripts
start-stop-statuswithprestartargumentstart-stop-statuswithstartargument
Tostopapackage:
start-stop-statuswithprestopargumentstart-stop-statuswithstopargument
Note:start-stop-statuswithprestartorprestopargumentisonlysupportedinDSM6.0ornewer.
SynologyDSM6.0DeveloperGuide
64scripts
ScriptEnvironmentVariablesSeveralvariablesareexportedbyPackageCenterandcanbeusedinthescripts.Descriptionsofthevariablesaregivenasbelow:
SYNOPKG_PKGNAME:PackageidentifywhichisdefinedinINFO.SYNOPKG_PKGVER:PackageversionwhichisdefinedinINFO.SYNOPKG_PKGDEST:Targetdirectorywherethepackageisstored.SYNOPKG_PKGDEST_VOL:Targetvolumewherethepackageisstored.
Note:It'sonlyavailableinDSM4.2orabove.
SYNOPKG_PKGPORT:adminportportwhichisdefinedinINFO.Thisportwillbeoccupiedbythispackagewithitsmanagementinterface.SYNOPKG_PKGINST_TEMP_DIR:Thetemporarydirectorywherethepackageareextractedwheninstallingorupgradingit.SYNOPKG_TEMP_LOGFILE:Atemporaryfilepathforascripttologinformationorerrormessages.SYNOPKG_TEMP_UPGRADE_FOLDER:Thetemporarydirectorywhenthepackageisupgrading.Youcanmovethefilesfromthepreviousversionofthepackagetoitinpreupgradescriptandmovethembackinpostupgrade.
Note:It'sonlyavailableinDSM6.0orabove.
SYNOPKG_DSM_LANGUAGE:Enduser'sDSMlanguage.SYNOPKG_DSM_VERSION_MAJOR:Enduser’smajornumberofDSMversionwhichisformattedas[DSMmajornumber].[DSMminornumber]-[DSMbuildnumber].SYNOPKG_DSM_VERSION_MINOR:Enduser’sminornumberofDSMversionwhichisformattedas[DSMmajornumber].[DSMminornumber]-[DSMbuildnumber].SYNOPKG_DSM_VERSION_BUILD:Enduser’sDSMbuildnumberofDSMversionwhichisformattedas[DSMmajornumber].[DSMminornumber]-[DSMbuildnumber].SYNOPKG_DSM_ARCH:Enduser’sDSMCPUarchitecture.PleasereferAppendixA:PlatformandArchValueMappingTabletomoreinformationSYNOPKG_PKG_STATUS:Packagestatuspresentedbythesevalues:INSTALL,UPGRADE,UNINSTALL,START,STOPorempty.1. INSTALLwillbesetasthestatusvalueinthepreinstandpostinstscriptswhilethepackageisinstalling.Iftheuserchooses
to“startafterinstallation”atthelaststepoftheinstallationwizard,thevaluewillbesettoINSTALLinthestart-stop-statusscriptwhenthepackageisstarted.
2. UPGRADEwillbesetasthestatusvalueinthepreupgrade,preuninst,postunist,preinst,postinstandpostupgradescriptssequentiallywhilethepackageisupgrading.Ifthepackagehasalreadystartedbeforeupgrade,thevaluewillbesettoUPGRADEinthestart-stop-statusscriptwhenthepackageisstartedorstopped.
3. UNINSTALLwillbesetasthestatusvalueinthepreuninstandpostunistscriptswhilethepackageisun-installing.Ifthepackagehasalreadystartedbeforeun-installation,thevaluewillbesettoUNINSTALLinthestart-stop-statusscriptwhenthepackageisstopped.
4. IftheuserstartsorstopsapackageinthePackageCenter,STARTorSTOPwillbesetasthestatusvalueinthestart-stop-statusscript.
5. WhentheNASisbootinguporshuttingdown,itsstatusvaluewillbeempty.Note:SYNOPKG_PKG_STATUSisonlyavailableforthestart-stop-statusscriptinDSM4.0orabove.
SYNOPKG_OLD_PKGVER:ExistingpackageversionwhichisdefinedinINFO(onlyinpreupgradescript).SYNOPKG_TEMP_SPKFILE:ThelocationofpackagespkfileistemporarilystoredinDSwhenthepackageisinstalling/upgrading.
Note:It'sonlyavailableinDSM4.2orabove.
SYNOPKG_USERNAME:Theusernamewhoinstalls,upgrades,uninstalls,startsorstopsthepackage.Ifthevalueisempty,theactionistriggeredbyDSM,notbytheenduser.
Note:It'sonlyavailableinDSM5.2orabove.
SYNOPKG_PKG_PROGRESS_PATH:Atemporaryfilepathforascripttoshowingtheprogressininstallingandupgradingapackage.
SynologyDSM6.0DeveloperGuide
65ScriptEnvironmentVariables
Note:
1. Theprogressvalueisbetween0and1.2. It'sonlyavailableinDSM5.2orabove.3. Example:
flock-x"$SYNOPKG_PKG_PROGRESS_PATH"-cecho0.80>"$SYNOPKG_PKG_PROGRESS_PATH"
OncetheenduserentersorselectssomevaluesoftheUIcomponentswhichareconfiguredininstall_uifile(.sh)/upgrade_uifile(.sh)/uninstall_uifile(.sh)(PleaserefertoWIZARD_UIFILESsectionformoreinformation),thenamesandvaluesofthecomponentswillbesetintheenvironmentvariables.Alsonotethatthenamesofthesecomponentscannotbethesameasthoseoftheenvironmentvariables.
SynologyDSM6.0DeveloperGuide
66ScriptEnvironmentVariables
confThe“conf”foldercontainsspecialconfigurationsincludingsomeinformationwhichcannotbedescribedintheINFOfilewithkey/pairformat.PackageCentercontrolstheflowofinstallation,upgrading,un-installation,starting,andstoppingprocessesaccordingtotheseconfigurations.
InDSM4.2,therearetwoconfigurations,PKG_DEPSandPKG_CONX,whicharestoredinthisfolder.Theyareusedtodefinedependencyorconflictbetweenthepackages.Thedependencyorconflictwillbecheckedaccordingtotheenduser’sDSMversion.Forexample,PerlwasbuiltonDSM4.1,butitdoesnotexistonDSM4.2.Therefore,ifyourpackagedependsonPerl,thePerlpackagemustbeinstalledonDSM4.2beforeyourpackagecanbeinstalled.YoucansetthePKG_DEPSconfigurationtoindicatethatthedependencyruleonlyworksonDSM4.2orlater.
Thedependencyorconflictissimilartoinstall_dep_packagesandinstall_conflict_packageskeysinINFOfile,buttheydonotdefinetherestrictionaccordingtospecificDSMversions.
PKG_DEPSandPKG_CONXalwayshavehigherprioritycomparedwiththekeysintheINFOfile.Thatis,ifyoudefinedependencyinthePKG_DEPSfile,thentheinstall_dep_packageskeyintheINFOfilewillbeignoredinDSM4.2orlater.IfyoudefinetheconflictinthePKG_CONXfile,thentheinstall_conflict_packageskeyintheINFOfilewillbeignoredinDSM4.2orlater.
Theconffoldercontainsthefollowingfiles:
File/FolderName Description File/Folder
TypeDSM
Requirement
PKG_DEPS
DefinedependencybetweenpackageswithrestrictionsofDSMversion.Beforeyourpackageisinstalledorupgraded,thesepackagesmustbeinstalledfirst.PackageCentercontrolstheorderofstartorstoppackagesaccordingtothedependency.
File 4.2-3160
PKG_CONXDefineconflictsbetweenpackageswithrestrictionsofDSMversion.Beforeyourpackageisinstalledorupgraded,theseconflictingpackagescannotbeinstalled.
File 4.2-3160
Note:Allwordsarecasesensitive.
Eachconfigurationfileisdefinedinstandard.inifileformatwithkey/valuepairsandsessions,forexample:
[session]
Asessiondescribesauniquenameofdependent/conflictingpackage.EachsessioncontainsinformationabouttherequirementsofpackageversionsandtherestrictionofDSMversions.
KeysconfiguredinPKG_DEPSfileeachdependentpackage(session)contains:
Key Description Value
pkg_min_ver Minimumversionofdependentpackage.Youmustinstallthisdependentpackagewiththisversionornewerbeforeinstallingyourpackage. Packageversion
pkg_max_ver Maximumversionofdependentpackage.Youmustinstallthisdependentpackagewiththeversionorolderbeforeinstallingyourpackage. Packageversion
dsm_min_verMinimumrequiredDSMversion.Ifyouhavethisversionornewerof
DSM,thisdependencywillbeconsidered,butitwillbeignoredinanolderDSM.
X.Y-ZDSMmajornumber,DSMminornumber,DSMbuild
number
dsm_max_verMaximumrequiredDSMversion.Ifyouhavethisversionorolderof
DSM,thisdependencywillbeconsidered,butitwillbeignoredinanewerDSM.
X.Y-ZDSMmajornumber,DSMminornumber,DSMbuild
number
SynologyDSM6.0DeveloperGuide
67conf
Example:
#YourpackagedependsonPackageAinanyversion
[PackageA]
#YourpackagedependsonPackageBversion2ornewer
pkg_min_ver=2
#YourpackagedependsonPackageCwithversion2orolder
[PackageC]
pkg_max_ver=2
#YourpackagedependsonPackageDwithversion2orolderbutitwillbeignoredwhenDSMversionisolderthan4.1-2668
[PackageD]
dsm_min_ver=4.1-2668
pkg_min_ver=2
#YourpackagedependsonPackageEwithversion2ornewerbutitwillbeignoredwhenDSMversionisnewerthan4.1-2668
[PackageE]
dsm_max_ver=4.1-2668
pkg_min_ver=2
KeysconfiguredinPKG_CONXfileeachconflictingpackage(session)contain:
Key Description Value
pkg_min_verMinimumversionofconflictingpackage.Ifenduserinstallsthisconflictingpackagewiththespecifiedversionornewer,hewillnotbeabletoinstallyour
package.PackageVersion
pkg_max_verMaximumversionofconflictingpackage.Ifenduserinstallsthisconflictingpackagewiththespecifiedversionorolder,hewillnotbeabletoinstallyour
package.PackageVersion
dsm_min_verMinimumrequriedDSMversion.Ifenduserhasthespecifiedversionor
newerofDSM,thisconflictwillbeconsidered,butitwillbeignoredinolderversionsofDSM.
X.Y-ZDSMmajornumber,DSMminornumber,DSMbuild
number
dsm_max_verMaximumrequriedDSMversion.IftheenduserhasthespecifiedversionorolderofDSM,thisconflictwillbeconsidered,butitwillbeignoredinnewer
DSM.
X.Y-ZDSMmajornumber,DSMminornumber,DSMbuild
number
Example:
#YourpackageconflictswithPackageAinanyversion
[PackageA]
#YourpackageconflictswithPackageBversion2ornewer
[PackageB]
pkg_min_ver=2
#YourpackageconflictswithPackageCversion2orolder
[PackageC]
pkg_max_ver=2
#YourpackageconflictswithPackageDversion2orolder,butitwillbeignoredwhenDSMversionisolderthan4.1-2668
[PackageD]
dsm_min_ver=4.1-2668
pkg_min_ver=2
#YourpackageconflictonPackageEwithversion2ornewerbutitwillbeignoredwhenDSMversionisnewerthan4.1-2668
[PackageE]
dsm_max_ver=4.1-2668
pkg_min_ver=2
SynologyDSM6.0DeveloperGuide
68conf
WIZARD_UIFILESinstall_uifile,upgrade_uifile,anduninstall_uifilearefileswhichdescribeUIcomponentsinJSONformat.Theyarestoredinthe“WIZARD_UIFILES”folder.Duringtheinstallation,upgrading,andun-installationprocesses,theseUIcomponentswillappearinthewizard.Oncethesecomponentsareselected,theirkeyswillbesetinthescriptenvironmentvariableswithtrue,false,ortextvalues.
Thesefilescanberegardedasusersettingsorusedtocontroltheflowofscriptexecution.
install_uifile:DescribesUIcomponentsfortheinstallationprocess.Duringtheprocessofthepreinstandpostinstscripts,thesecomponentkeysandvaluescanbefoundintheenvironmentvariables.upgrade_uifile:DescribesUIcomponentsfortheupgradeprocess.Duringtheprocessofthepreupgrade,postupgrade,preuninst,postuninst,preinstandpostinstscripts,thesecomponentkeysandvaluescanbefoundintheenvironmentvariables.uninstall_uifile:DescribesUIcomponentsfortheun-installationprocess.Duringtheprocessofthepreuninstandpostuninstscripts,thesecomponentkeysandvaluescanbefoundintheenvironmentvariables.
Ifyouwouldliketorunascripttogeneratethewizarddynamically,youcanaddinstall_uifile.sh,upgrade_uifile.shanduninstall_uifile.shfiles,theyarerunbeforeinstalling,upgrading,anduninstallingapackagerespectivelytogenerateUIcomponentsinJSONformatandwritetoSYNOPKG_TEMP_LOGFILE.Scriptenvironmentvariablesinthesescriptscanbegotteninthesescripts.Pleasereferto"ScriptEnvironmentVariables"formoreinformation.
IfyouwouldliketolocalizethedescriptionsofUIcomponents,youcanaddalanguageabbreviationsuffixtothefile“install_uifile_[DSMlanguage],”“upgrade_uifile_[DSMlanguage]”,“uninstall_uifile_[DSMlanguage]”,“install_uifile_[DSMlanguage].sh,”“upgrade_uifile_[DSMlanguage].sh”or“uninstall_uifile_[DSMlanguage].sh”inthisfolder.Forexample,inordertoperforminstallationinTraditionalChinese,[DSMlanguage]shouldbereplacedwith“cht”asfollows:“install_uifile_cht”.
ExampleofthefileinJSONformat:
[{
"step_title":"Step1",
"items":[{
"type":"singleselect",
"desc":"aradiogroup",
"subitems":[{
"key":"radio1",
"desc":"Radiobutton1",
"defaultVaule":false
},{
"key":"radio2",
"desc":"Radiobutton2",
"defaultVaule":true
}]
}]
},{
"step_title":"Step2",
"items":[{
"type":"multiselect",
"desc":"acheckgroup",
"subitems":[{
"key":"check1",
"desc":"Checkbutton1"
},{
"key":"check2",
"desc":"Checkbutton2",
"defaultVaule":true,
"validator":{
"fn":"{varv=arguments[0];if(!v)return'Checkthis';returntrue;}"
}
}]
},{
"type":"textfield",
"desc":"textfield",
"subitems":[{
"key":"textfield1",
SynologyDSM6.0DeveloperGuide
70WIZARD_UIFILES
"desc":"textfield1",
"defaultVaule":"default",
"validator":{
"allowBlank":false,
"minLength":2,
"maxLength":10
}
},{
"key":"textfield2",
"desc":"textfield2",
"emptyText":"[email protected]",
"validator":{
"vtype":"email",
"regex":{
"expr":"/[0-9]/i",
"errorText":"Error"
}
}
}]
}]
},{
"step_title":"Step3",
"invalid_next_disabled":true,
"activeate":"{console.log('activeate',arguments);}",
"deactivate":"{console.log('deactivate',arguments);}",
"items":[{
"type":"singleselect",
"desc":"Checkit",
"subitems":[{
"key":"id1",
"desc":"Notchooseit",
"defaultValue":true
},
{
"key":"id2",
"desc":"Chooseit",
"defaultValue":false,
"validator":{
"fn":"{returnarguments[0];}"
}
}]
}]
}]
ExampleofusingascripttogenerateafileinJSONformat:
SynologyDSM6.0DeveloperGuide
71WIZARD_UIFILES
#!/bin/sh
/bin/cat>/tmp/wizard.php<<'EOF'
<?php
$ini_array=parse_ini_file("/etc.defaults/synoinfo.conf");
$unique=$ini_array["unique"];
echo<<<EOF
[{
"step_title":"Step1",
"items":[{
"type":"textfield",
"desc":"modelname",
"subitems":[{
"key":"pkgwizard_db_name",
"desc":"name",
"defaultValue":"$unique"
}]
},{
"type":"combobox",
"desc":"Pleaseselectavolume",
"subitems":[{
"key":"volume",
"desc":"volumename",
"displayField":"display_name",
"valueField":"volume_path",
"editable":false,
"mode":"remote",
"api_store":{
"api":"SYNO.Core.Storage.Volume",
"method":"list",
"version":1,
"baseParams":{
"limit":-1,
"offset":0,
"location":"internal"
},
"root":"volumes",
"idProperty":"volume_path",
"fields":["display_name","volume_path"]
},
"validator":{
"fn":"{console.log(arguments);returntrue;}"
}
}]
}]
}];
EOF;
?>
EOF
/usr/bin/php-n/tmp/wizard.php>$SYNOPKG_TEMP_LOGFILE
rm/tmp/wizard.php
exit0
HerearethepropertiesforeachstepinthewizardinJSONformat:
SynologyDSM6.0DeveloperGuide
72WIZARD_UIFILES
Property Description DSMRequirement
step_title Optional.Describesthetitleofthecurrentstepperformedinthewizard. 3.2-1922
items Describesanarraycontainingthecomponentsof“singleselect”,“multiselect”,“textfield”,“password”,or“combobox”type. 3.2-1922
type
Mustbe“singleselect”,“multiselect”,“textfield”“password”or“combobox”.“singleselect”typerepresentsthecomponentsinthesub-itemswhichareallradiobuttons.Youcanselectonlyoneradioboxwithauniquekey.“multiselect”typerepresentsthecomponentsinthesub-itemswhichareallcheckboxes.Youcancheckmorethanonecheckbox.“textfield”typerepresentsthecomponentsinthesub-itemswhicharealltextfields.Youcantypetext.“password”typerepresentsthecomponentsinthesub-itemswhichareallpasswordfields.Youcantypepasswords.“combobox”typerepresentsthecomponentsinthesub-itemswhichareallcomboboxfields.Theusercanchooseaiteminthecomboboxfield.Note:“combobox”typeisonlyavailableinDSM5.2ornewer.
3.2-1922
desc Optional.Describeacomponentinthelabeltext. 3.2-1922
subitems Describeanarraycontainingradiobuttons,checkboxes,textfields,orpasswordcomponents. 3.2-1922
activeate JSON-stylestringtodescribeafunctionwhichisrunafterthestepofthewizardhasbeenvisuallyactivated. 5.2
deactivate JSON-stylestringtodescribeafunctionwhichisrunafterthestepofthewizardhasbeenvisuallydeactivated. 5.2
invalid_next_disabled Ifsettotrue,thenextbuttoninthestepofthewizardwillbedisabledbydefault.Itwillbeenabledifallitemsarevalidatedscucuessfullybyvalidatorinthisstep. 5.2
HerearethepropertiesforcomponentsinsubitemsinJSONformat:
Property Description DSMRequirement
key
AuniquecomponentkeyvaluerepresentsaUIcomponent.Ifyouselectacomponent,thiskeywillbesetinthescriptenvironmentvariablesofpreinst,postinst,preupgrade,postupgrade,preuninst,postuninst,start-stop-status(thestringvalueoftheselectedcheckboxorradiobuttonisalways“true”.).
3.2-1922
defaultVaule Optional.true/falsevaluetoinitialize“singleselect”or“multiselect”component,orastringvaluetoinitialize“textfield”or“password”component. 4.2-3160
emptyText Optional.Theprompttexttoplaceintoanempty“textfield”or“password”componenttoprompttheuserhowtofillinifdefaultVauleisnotset. 4.2-3160
validatorJSON-styleobjecttodescribevalidationfunctions.Ifthevalidationfailswiththeuser'svalue,theusercannotgotothenextstepofthewizard.Moredetailedpropertiesofvalidatoraregiveninthevalidatortable.
4.2-3160
disabled truetodisablethefield(defaultstofalse). 6.0
height Theheightofthiscomponentinpixels. 6.0
hidden truetohidethiscomponent. 6.0
invalidText Theerrortexttousewhenmarkingafieldinvalidandnomessageisprovided. 6.0
preventMark truetodisablemarkingthefieldinvalid.Defaultstofalse. 6.0
width Thewidthofthiscomponentinpixels. 6.0
Herearethepropertiesofvalidator:
SynologyDSM6.0DeveloperGuide
73WIZARD_UIFILES
Property Description Value
allowBlank Specifyfalsetovalidatethatthevalue'slengthof“textfield”or“password”componentis>0 true/false
minLength Minimumlengthof“textfield”or“password”component Number
maxLength Maximumlengthof“textfield”or“password”component Number
vtype
Specifypre-definedvalidationfunction,"alpha":validatealphavalue"alphanum":validatealphanumericvalue"email":validateemailaddress"url":validateURL
"alpha","alphanum","email","url"
regexDescribevalidationfunctioninregularexpressionandinvalidmessage.Propertiescontain:"expr":JavascriptRegularExpression"errorText":invalidstring
JSON-styleobject
fnDescribetheJavascriptfunctionwhichisencodedbyJSON-stylestringwithcurlybrackets.Inthisfunction,youcanusearguments[0]togetthevalueofthecomponent.Inaddition,thisfunctionwillreturntrueifthevalueisvalidorasaninvalidstringifthevalueisinvalid.
String
Herearetheotherpropertiesfortextfield,passwordorcomboboxcomponentinsubitemsinJSONformat:
Property Description DSMRequirement
blankText TheerrortexttodisplayiftheallowBlankvalidationfails 6.0
grow trueifthisfieldshouldautomaticallygrowandshrinktoitscontent 6.0
growMax Themaximumheighttoallowwhengrowistrue 6.0
growMin Theminimumheighttoallowwhengrowistrue 6.0
htmlEncode falsetoskipHTML-encodingthetextwhenrenderingit(defaultstofalse). 6.0
maxLengthText ErrortexttodisplayifthemaximumlengthvalidationusingmaxLengthfails. 6.0
minLengthText ErrortexttodisplayiftheminimumlengthvalidationusingminLengthfails. 6.0
HerearethepropertiesforcomboboxcomponentinsubitemsinJSONformat:
Property Description DSMRequirement
api_store
JSON-styleobjecttodescribetosendaWebAPIrequestandstoretheresponseinthedatastrustureforcomboboxuse.Moredetailedpropertiesofapi_storearegiveninthestoretable.Example:{
"api":"SYNO.Core.XXX","method":"list","version":1,"baseParams":{"offset":0,"limit":-1,},"root":"items","idProperty":"name","fields":["name"]}
6.0
autoSelect truetoselectthefirstresultgatheredbythedatastore(defaultstotrue).Afalsevaluewouldrequireamanualselectionfromthedropdownlisttosetthecomponentsvalue. 6.0
displayField Theunderlyingdatafieldnametobindtothiscombobox. 6.0
editable falsetopreventtheuserfromtypingtextdirectlyintothefield,thefieldwillonlyrespondtoaclickonthetriggertosetthevalue.(defaultstotrue). 6.0
forceSelection truetorestricttheselectedvaluetooneofthevaluesinthelist,falsetoallowtheusertosetarbitrarytextintothefield(defaultstofalse). 6.0
SynologyDSM6.0DeveloperGuide
74WIZARD_UIFILES
handleHeight Theheightinpixelsofthedropdownlistresizehandleifresizableistrue. 6.0
listAlign Avalidanchorpositionvalue. 6.0
listEmptyText Theemptytexttodisplayinthedataviewifnoitemsarefound. 6.0
listWidth Thewidthofthedropdownlist. 6.0
maxHeight Themaximumheightinpixelsofthedropdownlistbeforescrollbarsareshown. 6.0
minChars TheminimumnumberofcharacterstheusermusttypebeforeautocompleteandtypeAheadactivate 6.0
minHeight Theminimumheightinpixelsofthedropdownlistwhenthelistisconstrainedbyitsdistancetotheviewportedges. 6.0
minListWidth Theminimumwidthofthedropdownlistinpixels. 6.0
mode
Setto'loacl'toloadlocalstoretoloadlocalJSON-arraydata.Moredetailedpropertiesoflocalstorearegiveninthestoretable.Example:{
"mode":"local","valueField":"myId","displayField":"displayText","store":{"xtype":"arraystore","fields":["myId","displayText"],"data":[[1,"item1"],[2,"item2"]]}}
6.0
pageSizeIfgreaterthan0,apagingtoolbarisdisplayedinthefooterofthedropdownlistandthefilterquerieswillexecutewithpagestartandlimitparameters.Onlyapplieswhenusingapi_store(defaultsto0).
6.0
queryDelay Thelengthoftimeinmillisecondstodelaybetweenthestartoftypingandsendingthequerytofilterthedropdownlist. 6.0
resizable truetoaddaresizehandletothebottomofthedropdownlist(Defaultstofalse). 6.0
selectOnFocus truetoselectanyexistingtextinthefieldimmediatelyonfocus.Onlyapplieswheneditableistrue(defaultstofalse). 6.0
store
Adatastructuretostoredataincombobox(defaultstoundefined).Itcan'tbeusedwithapi_storeatthesametime.Acceptablevaluesforthispropertyare:1-dimensionalarray:e.g.,["Foo","Bar"]2-dimensionalarray:Fora2-dimensionalarray,thevalueinindex0ofeachitemwillbeassumedtobethevalueField,whilethevalueatindex1isassumedtobethedisplayField,e.g.,[["f","Foo"],["b","Bar"]].
6.0
title Ifsupplied,aheaderelementiscreatedcontainingthistextandaddedintothetopofthedropdownlist 6.0
typeAhead truetopopulateandautoselecttheremainderofthetextbeingtypedafteraconfigurabledelay(typeAheadDelay). 6.0
typeAheadDelay Thelengthoftimeinmillisecondstowaituntilthetypeaheadtextisdisplayed. 6.0
valueField Theunderlyingdatavaluenametobindtothiscombobox. 6.0
Herearethepropertiesforapi_storeorstoredatastructureinJSONformat:
SynologyDSM6.0DeveloperGuide
75WIZARD_UIFILES
Property Description DSMRequirement
baseParams AnobjectcontainingpropertieswhicharetobesentasparametersforeveryWebAPIrequestinapi_store. 6.0
data AninlinedataobjectreadablebythereaderinlocalstoretoloadlocalJSON-arraydata. 6.0
displayField Theunderlyingdatafieldnametobindtothiscombobox. 6.0
fields definedfieldsforthedatastoredinthisstoreorapi_store. 6.0
idProperty Identityofthepropertywithindatathatcontainsauniquevalue. 6.0
root Thenameofthepropertywhichcontainsthearrayofdata.Defaultstoundefined. 6.0
valueField Theunderlyingdatavaluenametobindtothiscombobox. 6.0
xtype OnlysupportarraystoretypeforlocalstoretoloadlocalJSON-arraydata. 6.0
Note:
1. Allwordsarecasesensitive.2. InDSM4.0orabove,ifboththetypeandsubitemspropertiesareempty,textinthedescpropertywillbedisplayedasone
ofthestepsofwizard.3. install_uifile.sh,upgrade_uifile.sh,uninstall_uifile.shand*.shscriptstogernatethewizarddynamicallyareonlysupported
inDSM5.2ornewer.
SynologyDSM6.0DeveloperGuide
76WIZARD_UIFILES
ManageStorageforApplicationFilesWhenapackageisinstalling,package.tgzwillbeextractedto/var/packages/[packageidentity]/target,whichisasymboliclinkpointingtoafolderinadatavolumeselectedbytheenduser./var/packages/[packageidentity]/targetisalsoavailableattheSYNOPKG_PKGDESTenvironmentvariable,oneofthesevenfilesinthescriptfolder.Pleaseseethe"scripts"formoreinformation.
Despitethefactthatthedirectory/var/packagesor/usr/localisreservedfor3rd-partyapplications,thestoragespaceofsystemvolumeislimited.Ifthesizeoffilestobeinstalledexceedsthecapacityofthesystemvolume,storagespacewillrunout.Hence,itisrecommendedthatyoudirectlyreadorwriteapplicationfilesin/var/packages/[packageidentity]/targetoranotherspaceofthedatavolume.Youcanalsomakeasymboliclinkin/usr/localtopointto/var/packages/[packageidentity]/targetoranotherspacewhenrunningthepostinstscript.Thepathcanbeaccessedeasierinalibraryoradaemon.Pleasenotethatyoumayneedtospecifythecorrectprefixwhenrunningaconfigurationscriptsothattheapplicationcanfindthecorrectpathinformationuponexecution.
SynologyreleasesDSMupdatesonaregularbasis.Giventhatapplicationfilesmightbeaffectedduringtheupdateprocedure,itisimportantthatyouinstallyourapplicationinthecorrectdirectorytopreventthemfrombeingdeletedwhenDSMisbeingupgradedinthesystempartition.
WhenDSMisbeingupgraded,thedirectory/var/packages/[packageidentity]and/usr/localwillbebackedupandrestoredautomatically.However,somelibraryfilesorbuilt-insoftwaremightbemodifiedduringtheupgradeprocedure.Inotherwords,ifyourapplicationdependsonthefileswhicharesubjecttochange,theapplicationmaynotworkafterward.Inthiscase,youshouldcheckthestatusofthesefilesorre-linktheminthestart-stop-statusscripttorepairthemifnecessary.Alternatively,youcaninstallthemdirectlyto/var/packages/[packageidentity]/target.
SynologyDSM6.0DeveloperGuide
78ManageStorageforApplicationFiles
IntegrateYourPackageintoDSMWebGUIWithSynologyDSM,integrating3rd-partyapplicationsintoyourNASiseasy.Whenanapplicationisintegrated,itsiconwillappearintheMainMenuofDSM.Userscanalsousetheirowncustomizediconsfortheseapplications.ToplaceanicononDSMdesktop,simplydraganddropitfromtheMainMenutotheDSMdesktop.
SynologyDSM6.0DeveloperGuide
79IntegrateYourPackageintoDSMWebGUI
StartupTointegrateanapplicationintoSynologyDSM3.0orlater,pleasefollowthestepsbelow:
1. Createafolderunderthedirectory/usr/syno/synoman/webman/3rdparty/.2. Createatextfilenamed"config"inyourfolder.3. Underthesamedirectory,createasub-foldernamedafteryourapplication,suchas
/usr/syno/synoman/webman/3rdpaty/[packagename]/.PutallUIrelatedcomponents,suchasimages,CSS,andCGIinthedirectory.
IntheINFOfile,youcandefinethekeydsmuidir,whosevalueisaDSMdirectorynameinthepackage.tgzfile.PackageCenterwillautomaticallylink/unlinkitto/usr/syno/synoman/webman/3rdparty/[packagename]basedonthekeywhenyoustart/stopthepackage.YoushouldalsodefinedsmappnameintheINFOfiletointegratethepackagewithDSMapplications.PleaserefertodsmuidiranddsmappnamekeyinOptionalFieldssectionformoreinformationtolinkthefolderautomatically.
NextwewilldiscussthedetailsofUIconfiguration.
SynologyDSM6.0DeveloperGuide
80Startup
ConfigThetextfile“config”isusedtoconfigureUIbehavior.ThecontentofconfigshouldbeinJSONformat.
Forexample:
{
".url":{
"com.company.App1":{
"type":"url",
"allUsers":true,
"title":"TestApp1",
"desc":"Description",
"icon":"images/app\_{0}.png",
"url":"http://www.yahoo.com"
},
"com.company.App2":{
"type":"legacy",
"allUsers":true,
"title":"TestApp2",
"desc":"Description2",
"icon":"images/app2\_{0}.png",
"url":"http://www.synology.com"
}
}
}
Detailsofapplication.cfgarestatedinbelow.
SynologyDSM6.0DeveloperGuide
81Config
Property Description
com.company.App1com.company.App2 In“.url”,eachobjectshouldhaveauniquepropertyname.
title(Required) “title”representstheapplicationnamethatwillbedisplayedinthemainmenu.
desc “desc”displaysmoredetailsaboutthisapplicationuponmouse-over.
icon(Required)
“icon”indicatestheiconfortheapplication.Itisatemplatestring.The“{0}”canbereplacedby“16”,“24”,“32”,“48”,“64”,“72”,“256”dependingontheresolutionoftheicon.Theiconmustbesavedunder/usr/syno/synoman/webman/3rdparty/xxx/wherexxxisthedirectorynameofyourpackage.Forexample,ifyoucreateadirectorynamed"images"andputtheiconimagefile“icon.png”init,thefullpathfortheiconwouldbe:/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_16.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_24.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_32.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_48.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_64.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_72.png/usr/syno/synoman/webman/3rdparty/xxx/images/icon\_256.pngTheiconvalueshouldalsobesetas"images/icon_{0}.png"
type(Required)
Whenyouclickthemenuitem,theaddressyouusetoconnecttotheDSMmanagementUIwillbeshownintherightframeofthemanagementUI.However,youcancustomizetheaddressasyouwish.The“type”valuecanbe"url"or"legacy"."url"meanswhenyouclicktheapplicationicon,theURLwillbeopenedinapop-upwindow,while"legacy"impliesthattheURLwillbeopenedinaniframewindowapplication.YoucanfollowthedescriptionsbelowtosetupyourcustomizedURL.
url(Required)ThefollowingisanexampleofvaluesettingforyourURLoftheapplication:“url”:http://www.synology.com/“url”:“3rdparty/xxx/index.html”
allUsers
Thiskeydetermineswhetherornotthemenuitemscanbeseenbyuserswhentheyloginwithanadminaccount.Ifyouwouldliketohaveallusersseethemenuitems,pleasesetthekeyvalueasbelow:"allUsers":trueThedefaultsettingisthatonlytheadmincanfindtheapplication.
SynologyDSM6.0DeveloperGuide
82Config
IntegrateHelpDocumentintoDSMHelpTointegrateahelpdocumentofyourapplicationintoDSMHelp,pleasedothefollowingsteps:
Classifythehelpdocumentsaccordingtolanguage,andputtheminthehelpfolderofyourapplication.Tohaveconsistentstyle,andourcustomizedscrollbar,youshouldaddthefollowinghtmltag:
<!DOCTYPEhtml>
<head>
<metacharset="UTF-8"/>
<metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1">
<linkhref="../../../../help/help.css"rel="stylesheet"type="text/css">
<linkhref="../../../../help/scrollbar/flexcroll.css"rel="stylesheet"type="text/css">
<scripttype="text/javascript"src="../../../../help/scrollbar/flexcroll.js"></script>
<scripttype="text/javascript"src="../../../../help/scrollbar/initFlexcroll.js"></script>
</head>
Note:Thejsfilesarerequiredbecausethenativebrowserscrollbarhasbeendisabled.
Youwillneedtoaddatextfile"helptoc.conf"intoyourapplication.Thistextfile"helptoc.conf"istoconfigurethestructureofyourhelpdocument.Thecontentofhelptoc.confshouldbeinJSONformat.Forexample:
{
"app":"SYNO.App.TestAppInstance",
"title":"app_tree:index_title"
"helpset":"help",
"stringset":"texts",
"content":"testapp_index.html",
"toc":[{
"title":"app_tree:node_1"
"content":"testapp_node1.html",
"nodes":[{
"title":"app_tree:node_1_child"
"content":"testapp_node1_child.html"
}]
},{
"title":"app_tree:node_2"
"content":"testapp_node2.html"
}]
}
Detailsofhelptoc.confarestatedinbelow.
Property Description
stringset(Required) "stringset"isthefolderthatstoresyourapplicationstrings.
app "app"representstheapplicationinstance.
helpset "helpset"displaysmoredetailsabouttheapplicationuponmouse-over.
title(Required) "title"isthetextthatwillbedisplayedintheDSMHelptree.Itconsistsoftwoparts-sectionandkey,andisseparatedbyacolon.
content(Required) "content"representstheurlofthenode.
toc "toc"arethechildnodesforyourapplication.(useemptyarrayifyourapplicationdoesn'thaveone)
nodes "nodes"arethechildnodesoftoc.(notnecessaryifthereisnochildnodes)
SynologyDSM6.0DeveloperGuide
83IntegrateHelpDocumentintoDSMHelp
Addthefollowingcontenttotheresourcespecificationfile.PleaserefertoIndexDBformoredetail.
"indexdb":{
"app-index":{
"conf-relpath":"ui/index.conf",
"db-relpath":"indexdb/appindexdb"
},
"help-index":{
"conf-relpath":"ui/helptoc.conf",
"db-relpath":"indexdb/helpindexdb"
}
}
SynologyDSM6.0DeveloperGuide
84IntegrateHelpDocumentintoDSMHelp
IntegratewithDSMWebAuthenticationAfterintegratingyourapplicationintoSynologyDSM,youmaywanttoperformanauthenticationchecktoensureonlylogged-inuserscanaccessthepage.
Tocheckwhetherauserhasloggedin,runtheCGIcommandinbelow.
/usr/syno/synoman/webman/modules/authenticate.cgi
The“authenticate.cgi”willoutputtheusernameiftheuserhasloggedin.Therewillbenooutputiftheuserhasnotbeenauthenticated.
Belowisanexample:
SynologyDSM6.0DeveloperGuide
85IntegratewithDSMWebAuthentication
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
/**
*Checkwhetheruserisloggedin.
*
*Ifuserhasloggedin,puttheusernameinto"user".
*
*@paramuserThebufferforgetusername
*@parambufsizeThebuffersizeofuser
*
*@return0:Usernotloggedinorerror
*1:Userloggedin.Theusernameiswrittentogiven"user"
*/
intIsUserLogin(char*user,intbufsize)
{
FILE*fp=NULL;
charbuf[1024];
intlogin=0;
bzero(user,bufsize);
fp=popen("/usr/syno/synoman/webman/modules/authenticate.cgi","r");
if(!fp){
return0;
}
bzero(buf,sizeof(buf));
fread(buf,1024,1,fp);
if(strlen(buf)>0){
snprintf(user,bufsize,"%s",buf);
login=1;
}
pclose(fp);
returnlogin;
}
intmain(intargc,char**argv)
{
charuser[256];
printf("Content-type:text/html\r\n\r\n");
if(IsUserLogin(user,sizeof(user))==1){
printf("Userisauthenticated.Name:%s\n",user);
}else{
printf("Userisnotauthenticated.\n");
}
return0;
}
DSMmightrequirearandomvaluecalledSynoTokentopreventaCSRF(cross-siterequestforgery)attackafter4.3.WhenCSRFprotectionisenabledinthecontrolpanel,youmustappendSynoTokentothequerystringorheaderoftheHTTPrequest.
Inthequerystring:
http://192.168.1.1:5000/webman/3rdparty/DownloadStation/webUI/downloadman.cgi?SynoToken=9WuK4Cf50Vw7Q
Intherequestheader:
X-SYNO-TOKEN:9WuK4Cf50Vw7Q
ThevalueofSynoTokencanbeobtainedfromlogin.cgiiftheuserisloggedin.
SynologyDSM6.0DeveloperGuide
86IntegratewithDSMWebAuthentication
Request:
http://192.168.1.1:5000/webman/login.cgi
Response:
{"SynoToken":"9WuK4Cf50Vw7Q","result":"success","success":true}
IfyourapplicationisbasedonExtJsofDSM,pleaseincludedsmtoken.cgiinyourheadersection.
<header>
<scriptsrc="/webman/dsmtoken.cgi"></script>
</header>
Oncethedsmtoken.cgiisincluded,Ext.Ajax.Request,Ext.data.Connection,Ext.form.basicFormandExt.urlAppendwillappendSynoTokentotheHTTPrequestautomatically.
<script>
Ext.Ajax.Request({…})//addSynoTokenatevent'beforerequest'
Ext.data.Connection({…})//addSynoTokenatevent'beforerequet'
newExt.form.basicForm({…})//addSynoTokenatevent'beforeaction'
//Ext.urlAppendwilladdSynoTokeninternally
url=Ext.urlAppend('http://192.168.1.1',Ext.urlEncode({…}));
</script>
SynologyDSM6.0DeveloperGuide
87IntegratewithDSMWebAuthentication
DSMBackwardCompatibilityWeaklinkisapropertyofApple’sdevelopmentframeworkwhichensuresbackwardcompatibility.GCChasasimilarpropertycalled“weaksymbol.”Weutilizethiscapabilitytoprovideaweaklinkframeworkinlibsynosdkforbackwardcompatibilityaswell.Youcanfindavailableheadersinusr/syno/include/libsynosdkunderchrootenvironment.Eachfunctionprototypeinsynosdk/*_p.hislabeledwithamacrotellingyouwhenthisfunctionisaddedintolibsynosdk.Therefore,youcaninputafunctioninDSM4.2asfollows:
/*DONOTinclude*_p.hdirectly*/
#include<synosdk/user.h>
#include<synosdk/service.h>
/*example,SYNOServiceHomePathCheckisavailablesinceDSM4.2*/
if(SYNOServiceHomePathCheck){
SYNOServiceHomePathCheck(szPath,TRUE,TRUE,&pResult);
}else{
/*implementalternativetoSYNOServiceHomePathCheckhere*/
}
Asaresult,whenyourapplicationrunsinDSM4.2andlater,functionSYNOServiceHomePathCheckinlibsynosdk.soisinvoked.InDSM4.2andolder,else-partwillbeexecutedasareplacementtoSYNOServiceHomePathCheck.
SynologyDSM6.0DeveloperGuide
88DSMBackwardCompatibility
ShowMessagestoUsersIfyouwanttopromptuserswithamessagebeforetheyinstall,upgrade,orun-installapackageinPackageCenter,youcanwritethesemessagesinthedesckeyininstall_uifile,upgrade_uifile,oruninstall_uifile.Pleasereferto"WIZARD_UIFILES"formoreinformation.
Ifyouwanttosendapromptmessagetousersaftertheyinstall,upgrade,un-install,start,orstopapackageinPackageCenter,youcanimplementthemintothe$SYNOPKG_TEMP_LOGFILEvariableintherelatedscripts.Forexample,
echo"HelloWorld!!">$SYNOPKG_TEMP_LOGFILE
IfyouwanttopromptusersinthelanguagespecifiedintheirDSMsettings,youcanrefertothe$SYNOPKG_DSM_LANGUAGEvariableforlanguageabbreviationasshowninthescriptsbelow:
SynologyDSM6.0DeveloperGuide
89ShowMessagestoUsers
case$SYNOPKG_DSM_LANGUAGEin
chs)
echo"" >$SYNOPKG_TEMP_LOGFILE
;;
cht)
echo"" >$SYNOPKG_TEMP_LOGFILE
;;
csy)
echo"Český">$SYNOPKG_TEMP_LOGFILE
;;
dan)
echo"Dansk">$SYNOPKG_TEMP_LOGFILE
;;
enu)
echo"English">$SYNOPKG_TEMP_LOGFILE
;;
fre)
echo"Français">$SYNOPKG_TEMP_LOGFILE
;;
ger)
echo"Deutsch">$SYNOPKG_TEMP_LOGFILE
;;
hun)
echo"Magyar">$SYNOPKG_TEMP_LOGFILE
;;
ita)
echo"Italiano">$SYNOPKG_TEMP_LOGFILE
;;
jpn)
echo"" >$SYNOPKG_TEMP_LOGFILE
;;
krn)
echo"" >$SYNOPKG_TEMP_LOGFILE
;;
nld)
echo"Nederlands">$SYNOPKG_TEMP_LOGFILE
;;
nor)
echo"Norsk">$SYNOPKG_TEMP_LOGFILE
;;
plk)
echo"Polski">$SYNOPKG_TEMP_LOGFILE
;;
ptb)
echo"PortuguêsdoBrasil">$SYNOPKG_TEMP_LOGFILE
;;
ptg)
echo"PortuguêsEuropeu">$SYNOPKG_TEMP_LOGFILE
;;
rus)
echo"Русский">$SYNOPKG_TEMP_LOGFILE
;;
spn)
echo"Español">$SYNOPKG_TEMP_LOGFILE
;;
sve)
echo"Svenska">$SYNOPKG_TEMP_LOGFILE
;;
trk)
echo"Türkçe">$SYNOPKG_TEMP_LOGFILE
;;
*)
echo"English">$SYNOPKG_TEMP_LOGFILE
;;
esac
Pleaseseethe"scripts"and"ScriptEnvironmentVariables"sectionsformoreinformation.
Otherwise,youcanuse/usr/syno/bin/synodsmnotifytosendmessagestoDSMusers.Forexample,thestrings“title”and“messages”aresenttothe“administrators”group.
SynologyDSM6.0DeveloperGuide
90ShowMessagestoUsers
CreatePHPApplicationApache/NginxandPHPengineswhichallowyoutodevelopwebapplicationsandstorefilesinthewebspacetobuildyourownwebsite.Hence,thesefilesshouldbecompressedintopackage.tgz.Inthestart-stop-statusscript,youshouldlinkorcopythemtothewebspacewhenstartingapackage.InDSM,thedefaultwebspaceisthewebsharedfolder.Youcangetthepathvia/var/services/webwhichisasymboliclinkpointingtotheactualpathinthevolume.
InDSM5.2orolder,thewebapplicationworksaftertheadministratorenablesWebStation.Youcanconfiguretheinstall_dep_servicesandstart_dep_serviceskeyswiththeapache-webvalueintheINFOfiletomakesureWebStationisenabledbeforethepackageinstallation.InDSM6.0ornewer,thewebapplicationworksaftertheadministratorinstallsandstartsWebStationandPHPpackage.Youcanconfiguretheinstall_dep_packageswith"WebStation:PHP5.6"valueintheINFOfiletomakesurethesepackagesinstalledandstartedbeforethepackageinstallation.
YoucanthenprovideaURLinordertoaccessyourpagetoadminurl(ex:"/myapp/index.html")inINFOwhichwillbedisplayedinPackageCentertotelltheclientwhichURLtoopen.Whenthepackagestops,thisURLshouldnotbeaccessible.Youcanremoveorunlinkthewebsitefolderinthewebspace,orletthewebpageredirecttoanerrorpage.
Inaddition,itisrecommendedtoaddanicontoDSM’smainmenusothatuserscanclicktheicontolaunchtheapplicationintuitively.
TocustomizetheconfigsettingsforApache,NginxorPHP,pleasedonotmodifyanyoftheconfigfilesbelongingtoDSM.Instead,youshouldcreatesymboliclinksforyourconfigfilesinthecorrespondinglocations.ForApache/Nginx,linkyourconfigtothefolder/etc/httpd/sites-enabled-user/your_package_name.conf.ForPHP,pleaserefertoPHPINIformoredetail.
Inaddition,addtheapache-webinDSM5.2ororder,ornginxinDSM6.0ornewertothestart_stop_restart_servicestomakeApache/Nginxreloadconfigfiles.Otherwise,thesesymboliclinksshouldberemovedalongwiththepackage.
Hereisanexampleofapacheconfig:
<Directory"/var/services/photo">
OptionsMultiViews
AllowOverrideNone
Orderallow,deny
Allowfromall
</Directory>
SynologyDSM6.0DeveloperGuide
92CreatePHPApplication
RunScriptsWhentheSystemBootsIfyouwouldliketorunscriptswhenthesystemisbootinguporshuttingdown,youcanwritescriptsinstart-stop-status.Thisscriptwillbeexecutedwiththe"start"or"stop"parameter,whenthepackageisenabled.Ifyouwanttoexecuteascriptduringtheboot-uporshut-downprocess,youcanputastart-upscriptin/usr/local/etc/rc.d/.Belowaretherulesforthestart-upscript:
1. Itmustcontainthesuffix".sh".Forexample,"myprog.sh".2. Thepermissionmustbe755.3. Itmustcontaintheoptionsof"start"and"stop".Whenthesystembootsup,itwillcallmyprog.shstart;whenitshutsdown,it
willcallmyprog.shstop.
SynologyDSM6.0DeveloperGuide
93RunScriptsWhentheSystemBoots
LocaleSupportDSMprovideslocalesupportafterversion4.3.YoudonotneedtoaddorremovelocalerelatedfilesontheNASafterthisversion.
SynologyDSM6.0DeveloperGuide
94LocaleSupport
InstallPackageRelatedPortsInformationintoDSMIfyourpackageserviceusesspecificportsforcommunication(e.g.SurveillanceStationusesports19997/udpforsourceportand19998/udpfordestinationport),youshouldprepareaserviceconfigurationfileforthispackagetodescribewhichportswillbeused.Afterthat,oncetheusercreatesfirewallrulesorportforwardingrulesfromthebuild-inapplication,yourpackageservicewillalsobelistedforselection.
ServiceConfigureFileName
ThefilenameshouldfollowthenamingconventionSYNOPKG.sc(ex:SurveillanceStation.sc).SYNOPKGshouldbethepackagenamethatisspecifiedbythekey"package"intheINFOfile,andscmeansServiceConfigurefile.
ConfigureFormatTemplate
Pleaseseethefollowingexample:
[service_name]
title="Englishtitle"
desc="Englishdescription"
port_forward="yes"or"no"
src.ports="ports/protocols"
dst.ports="ports/protocols"
[service_name2]
…
Section/KeyDescriptions
Pleaseseethefollowingstatementsforthestringsandkeys:
SynologyDSM6.0DeveloperGuide
95InstallPackageRelatedPortsInformationintoDSM
Section/Key Description Value DefaultValue
DSMRequirement
service_name
Required
Usuallyapackageonlyhasoneuniqueservicename.Ifyourpackageneedsmorethanoneportdescription,youcandefineservice_name2,service_name3,…
Note:service_namecannotbeemptyandcanonlyincludecharacters“a~z”,“A~Z”,“0~9”,“-”,“\”,“.”
Uniqueservicename N/A 4.0-2206
title
Required
EnglishtitlewhichwillbeshownonfieldProtocolatfirewallbuild-inselectionmenu.
Englishtitle N/A 4.0-2206
desc
Required
EnglishdescriptionwhichwillbeshownonfieldApplicationsatfirewallbuild-inselectionmenu.
Englishdescription N/A 4.0-2206
port_forward
Optional
Ifsetto“yes,”yourpackageservicerelatedportswillbelistedwhenuserssetportforwardingrulefrombuild-inapplications.Otherwisetheywillnotbelisted.
“yes”or“no” “no” 4.0-2206
src.ports
Optional
Ifyourpackageservicehasspecifiedsourceports,youcansettheminthiskey.Thevalueshouldcontainatleasttheportnumbers,andadefaultprotocolthatistcp+udp.
Ex:6000,7000:8000/tcp,udpmeanssourceportsare6000,7000to8000,allportsaretcp+udp.
ports/protocolsports:1~65535(separatedby‘,’anduse‘:’torepresentportrange)protocols:tcp,udp(separatedby‘,’)
ports:N/A
protocols:tcp,udp
4.0-2206
dst.ports
Required
Eachserviceshouldhavedestinationports.Thevalueshouldcontainatleasttheportnumbers,andadefaultprotocolthatistcp+udp.
Ex:6000,7000:8000/tcp,udpmeansdestinationportsare6000,7000to8000,allportsaretcp+udp.
ports/protocolsports:1~65535(separatedby‘,’anduse‘:’torepresentportrange)protocols:tcp,udp(separatedby‘,’)
ports:N/A
protocols:tcp,udp
4.0-2206
Pleaseseethefollowingexample(SurveillanceStation.sc):
[ss_findhostd_port]
title="SearchSurveillanceStation"
desc="SurveillanceStation"
port_forward="yes"
src.ports="19997/udp"
dst.ports="19998/udp"
Aftertheserviceconfigurationfileisready,addthefollowingcontenttotheresourcespecificationfile.PleaserefertoPortConfigformoredetail.
"port-config":{
"protocol-file":"port_conf/xxdns.sc"
}
SynologyDSM6.0DeveloperGuide
96InstallPackageRelatedPortsInformationintoDSM
LowerPrivilegeToreducesecurityrisks,wenowprovideaframeworktorunpackageswithalowerprivileged"packageuser"insteadofroot.Belowisasummaryofhowtojointheframeworkandwhatpackagecenterdoesforyou:
1. Packagedevelopersprovideprivilegespecificationtospecifywhatprivilegeisneededduringprogramexecution.2. Duringpackageinstallation,packagecentercreatescorrespondinguserandgroup.SeePackageUser&Groupformoredetail.3. Accordingtotheprivilegespecification,packagecenterchownfilesunder/var/packages/${package}/target.(Thesetuidand
setgidbitwillbecleared)4. Packageexecutablesarerunwithprivilege(packageuser,systemorroot)accordingtoitsfileownerandgroup.SeeMechanism
formoredetail.
Withthisframework,packagedeveloperiscapableof:
Configurewhichexecutableshouldberunwithwhatprivilegewithasimpleprivilegespecificationfile.ResourceAcquistioncanbeusedtohelpmaintainsomechoresthatrequiresrootprivilege.
Whethertolowerthepackage'sprivilegeandcreatecorrespondinguser/groupisoptional.Thepackagehastoprovideprivilegespecificationtojointhisframework,otherwisethepackagewillstillberunwithrootprivilege,andnouser/groupwillbecreated.
SynologyDSM6.0DeveloperGuide
98LowerPrivilege
PackageUser&Group
Duringpackageinstallation,packagecenterusesthepackagenametocreateauserandgroupforthepackage.Andtheiruid/gidwillbethesamenumber,whichliesbetween100000and300000.Failureonuser/groupcreationwillcausepackageinstallationtoabort.Ifacustomuserandgroupnameispreferred,seeprivilegespecification.
User&GroupCreation
Newlycreateduserandgroupwillhavethebelowconfiguration:
#/etc/passwd
${package}:x:${uid}:${gid}::/var/packages/${package}/target:/sbin/nologin
#/etc/shadow
${package}:*:10933:0:99999:7:::
#/etc/group
${package}:x:${gid}:
UIBehavior
PackageusersandgroupswillnotappearonmostUIsettings.Includingthefollowing:
Applicationprivilege'spermissionviewerFPT'schrootuserselectorFileStations's
ChangeownerSharedLinksManager->Enablesecuresharing
Theonlyexceptionsare:
ControlPanel>SharedFolder>Edit>Permission>SysteminternaluserACLeditor
CreationPolicy
Whenthepackageuser/groupnameconflictswithalocaluser/group,itwillberenamedbyaddinga$PKG${time}postfixattheend.Therenamingpolicyisshowedbelow:
SynologyDSM6.0DeveloperGuide
99PackageUser&Group
Mechanism
Apackagemaycontainmultipleexecutables,eachofthemtriggeredindifferenttimesbytheDSM.Forexample,CGIswillbespawnbythecgidaemon,andcontrolscripts(preinst,start_stop_status...)willbecalledbypackagecenter.Ourframeworkusestheowneruserandgroupoftheexecutabletodecidewhatuserprivilegetogrant.
Supposetheowneruseris```${package}:
Iftheownergroupissystem,thenusesetresuid(-1,${package},-1),whichgivestheprocessabilitytochangebacktoroot```.Otherwise,usesetresuid(${package},${package},${package}),dropitsprivilege.
ASummoryoffileowneruser/groupandgrantedprivilegeisshownbelow:
run-as owner euid ruid
package ${package}:${package} ${package} ${package}
system ${package}:system ${package} 0
root root:root 0 0
SynologyDSM6.0DeveloperGuide
101Mechanism
PrivilegeSpecification
Duringpackageinstallation,packagefileswillbechownwith${package}:${package}.AsmentionedinMechanism,thisresultsinpackageexecutablestoberunas${package}.Butsomeexecutablesmightrequirehigherprivilege.HereweprovideaJsonconfigfilecalledprivilegespecification,locatedintheSPK'sconf/privilege.Thisprivilegespecificationspecifieswhatkindofprivilegetheexecutablesneed.
NOTEForpackagesthatdoesnotsupportrunningwithlowerprivileges,simplydonotsupplythisprevilegespecification.Thenpackagecenterwillnotapplychownonthefiles.
Thecontentofprivilegespecificationisshownbelow.defaultsspecifiesthedefaultprivilegeanddecideshowtoapplychownonfiles.."username"andgroupnameareoptional,usedforcustomuser/groupname.Therestofthekeyisusedtooverwritethedefaultsetting.
{
"defaults":{
"run-as":"<run-as>"
},
"username":"<username>",
"groupname":"<groupname>",
"ctrl-script":[{
"action":"<action>",
"run-as":"<run-as>"
},...],
"executable":[{
"relpath":"<relpath>",
"run-as":"<run-as>"
},...],
"tool":[{
"relpath":"<relpath>",
"user":"<user>",
"group":"<group>",
"permission":"<mode>"
},...]
}
<run-as>
Canbepackage,system,orroot,determineswhatprivilegewilltheexecutablebegranted:
run-as description
package Runas${package}anddropprivilege.
system Runas${package},butpreservetheabilitytograntprivilege.
root Runasroot.
defaults
Userun-astospecifywhatprivilegetobegranted,alsodecideshowtochown.
run-as description
package chown-hR"${package}:${package}"
system chown-hR"${package}:system"
root Donotchown.
SynologyDSM6.0DeveloperGuide
102PrivilegeSpecification
Categories
Inhereweintroducewhatcategoriesprivilegespecificationsupportstooverwritethesettingofdefaults.Afterapplyingchownaccordingtodefaults'ssettings,chownagainwiththecaterogy'ssettings:
ctrl-scriptexecutabletool
Eachcategoryisakeyoftheprivilegespecificationjsonobject,andthecorrespondingvalueisajsonobjectarray.Anobjectinthearrayrepresentstheconfigurationofanexecutable.
ctrl-script
Controlscripts(preinst,post_inst,start_stop_status...)arespawnedbythePackageCenter:
"ctrl-script":[{
"action":"<action>",
"run-as":"<run-as>"
},...]
Member Since Description
action6.0-5891
String,canonlybeoneof"preinst","postinst","preuninst","postuninst","preupgrade","postupgrade","start","stop,"status","prestart,"prestop",or"log"
run-as6.0-5891 Seedefaults.
executable
ExecutablesdirectlyspawnedbytheDSMframeworkbelongstothiscategory:
"executable":[{
"relpath":"<relpath>",
"run-as":"<run-as>"
},...]
Member Since Description
relpath 6.0-5891 String,thefile'srelativepathunder/var/packages/${package}/target/.
run-as 6.0-5891 Seedefaults.
tool
ExecutablesindirectlycalledbytheDSMframeworkspawnbelongstothiscategory(Forexample,commandlinetoolcalledbyaCGI):
"tool":[{
"relpath":"<relpath>",
"user":"<user>",
"group":"<group>",
"permission":"<mode>"
},...]
SynologyDSM6.0DeveloperGuide
104PrivilegeSpecification
Member Since Description
relpath 6.0-5891 String,thefile'srelativepathunder/var/packages/${package}/target/.
user 6.0-5891 String,file'sowneruser,canonlybe"package"or"root".
group 6.0-5891 String,file'sownergroup,canonlybe"package"or"root".
permission 6.0-5891 4digitnumbertosetfilepermission,forexample:4750
SynologyDSM6.0DeveloperGuide
105PrivilegeSpecification
ResourceAcquisitionDuringpackageinstallationandstart-up,weoftenneedtoinstallconfigfiles(e.g.php.ini,apache.conf)orregisterservices(e.g.portconfig,datashare)ontotheDSM.Aftersettingpackagetorunwithlowerprivilege,youmightlosetheabilitytodothesejobinthecontrolscripts.Insteadofwritingthesejobsintheinstallationscripts(preinst,postinst...),weprovideaframeworktosimplifytheprocess.
Theconfigfilesandservicesthatneedstobeinstalledandregisteredarecalledresource.Eachresourcehasacorrespondingworker,whichisresponsibleforinstallingtheresourceontotheDSM.Packagedevelopersjustneedtofollowapredefinedsyntaxandprovidetheresourcespecification,PackageCenterwillthencallthecorrespodingworkertofinishthejob.
NOTEIfapackageisusingthisframework,pleaseremembertoadjusttheINFOfile'sfirmwaretomeettheworker'srequirement
SynologyDSM6.0DeveloperGuide
106ResourceAcquisition
ResourceSpecificationThejsonfileresourceisusedtospecifyapackage'srequiredresources,anditshouldbeplacedintheconffolder.Afterpackageinstallation,thisfilewillbelocatedat/var/packages/${package}/conf/resource.Thecontentofthefileshouldbesomethinglike:
{
"<resource-id>":<specification>,
...
}
<resource-id>
String,representstheresource'sID.<specification>
Jsonobject,describestheresourcerequirements.
Takethebelow/usr/locallinkerworkerforexample:
{
"usr-local-linker":{
"lib":["lib/foo"],
"bin":["bin/foo"],
"etc":["etc/foo"],
}
}
"usr-local-linker"istheresourceIDandthecorrepondingJsonobjectisthespecification,whichspecifieswhatfilesshouldbeinstalledintotheDSM.
DatafromWizard
AsmentionedinWIZARD_UIFILES,installationscriptscanoptainuser'sinputfromtheUIwizard,someworkersarealsocapableofdoingthis.Intheresourcefile,variablessurroundedby{{}}willbereplacedbytheuserinput.
TakethebelowDataShareworkerforexample:
"data-share":{
"name":"{{pkgwizard_share_name}}",
"permission":{
"ro":["admin"]
}
}
{{pkgwizard_share_name}}willbereplacedbyWIZARD_UIFILES/install_uifile'sorWIZARD_UIFILES/upgrade_uifiles'spkgwizard_share_name
SynologyDSM6.0DeveloperGuide
107ResourceSpecification
TimingEveryworkeracquiresresourcesatcertaintimingsandholdsitduringaninterval.Forexample,/usr/locallinkerholdstheresourceduringtheintervalFROM_ENABLE_TO_DISABLE,whichmeansitacquiresresourceatWHEN_ENABLEandreleasesitatWHEN_DISABLE.Thetimingsarelistedandexplainedbelow:
SynologyDSM6.0DeveloperGuide
108Timing
timing descrioption whenFailure
WHEN_PREINST beforepreinst abortinstallation,rollback,showalertmessageonUI
WHEN_POSTINST beforepostinst finishinstallation,showalertmessageonUI
WHEN_ENABLEbeforeWHEN_STARTUP,won'tprocessduringbootup abortstartup,rollback,showalertmessageonUI
WHEN_STARTUP beforestart abortstartup,rollback,showalertmessageonUI
WHEN_PREUNINST afterpreuninst finishuninstallation,showalertmessageonUI
WHEN_POSTUNINST beforepostuninst finishuninstallation,showalertmessageonUI
WHEN_DISABLEafterWHEN_HALT,won'tprocessduringshutdown ignore
WHEN_HALT afterstop ignore
NOTEToletthepackageitselfdecidewhetheruninstallationshouldcontinueornot,WHEN_PREUNINSTisprocessedafterthepreuninstscript.
SynologyDSM6.0DeveloperGuide
109Timing
ConfigUpdateSomeworkerssupportconfigupdateafterpackageinstallation./usr/syno/sbin/synopkghelershouldbeusedtoaccomplishthejob.Belowarethestepstoupdatetheconfig:
1. Updatethecontentofconfigfileunder/var/packages/${package}/target/.2. Executethecommand/usr/syno/sbin/synopkghelperupdate<package><resource-id>totriggerthecorrespondingworkerto
updatetheconfig.
Forexample,supposeapackageallowstheusertoedititslisteningportandneedstotriggerthePortconfigworkerforupdate:
1. ProvidetheusersomeUItoinputtheportnumber.2. Afterreceivingthenewportnumber,updatetheconfigfileunder/var/packages/${package/target/.3. Executethecommand/usr/syno/sbin/synopkghelperupdate${package}protocol_file,theworkerwillre-readtheconfigfile
andreloadfirewallandportforwarding.
NOTENotallworkersupportsconfigupdate,pleaserefertotheUpdatablesectionofeachworker.
SynologyDSM6.0DeveloperGuide
110ConfigUpdate
AvailableWorkersAsmentionedinthesectionResourceAcquisition,aworkerisneededforresourcemanagement.GivenaResourceSpecificationconfigurationfile,theworkerwillinstall\/uninstallthedescribedresourceatcertaintime.ThissectiondescribestheavailableworkersontheDSM.
SynologyDSM6.0DeveloperGuide
111AvailableWorkers
/usr/locallinker
Description
Package'sexecutablesandlibraryfilesshouldbeinstalledto/usr/local.Thisworkerlink/unlinkfilesto/usr/local/{bin,lib,etc}duringpackagestart/stop.
Acquire():Createsymboliclinksunder/usr/local/{bin,lib,etc}/thatpointstofilesin/var/packages/${package}/target/.Filesnotfoundunder/var/packages/${package}/target/willbeignored.Ifthetargetfilealreadyexistsin/usr/local/{bin,lib,etc},itwillbeunlink()first.Failureonanyfilelinkresultsinthisworkertoabortandtriggersrollback.
Release():Deletethelinksunder/usr/local/{bin,lib,etc}/.Ignorefilesthatarenotfound.Ignoreunlink()failure.
Provider
DSM
TimingFROM_ENABLE_TO_DISABLE
EnvironmentVariables
None
Updatable
No
Syntax
"usr-local-linker":{
"bin"["<relpath>",...],
"lib"["<relpath>",...],
"etc"["<relpath>",...]
}
Member Since Description
bin 6.0-5941 Stringarray,listoffilestobelinkedunder/usr/local/bin/.
lib 6.0-5941 Stringarray,listoffilestobelinkedunder/usr/local/lib/.
etc 6.0-5941 Stringarray,listoffilestobelinkedunder/usr/local/etc/.
relpath 6.0-5941 String,targetfile'srelativepathunder/var/packages/${package}/target/.
Example
"usr-local-linker":{
"bin":["usr/bin/a2p","usr/bin/perl"],
"lib":["lib/perl5"]
}
SynologyDSM6.0DeveloperGuide
112AvailableWorkers
TheabovespecificationsgeneratesthefollowingsymboliclinksforthePerlpackage:
root@DS$ls-l/usr/local/{bin,lib,etc}
/usr/local/bin/:
total0
lrwxrwxrwx1rootroot30Aug1306:32a2p->/var/packages/Perl/target/usr/bin/a2p
lrwxrwxrwx1rootroot31Aug1306:32perl->/var/packages/Perl/target/usr/bin/perl
/usr/local/lib/:
total0
lrwxrwxrwx1rootroot28Aug1306:32perl5->/var/packages/Perl/target/lib/perl5
/usr/local/etc/:
total0
SynologyDSM6.0DeveloperGuide
113AvailableWorkers
Apache2.2Config
Description
Packagescancarrysites-enabled/*.conffilesforApacheHTTPServer2.2.Thisworkerinstalls/uninstallstheseconfigfilesduringpackagestart/stop.
Acquire():Copytheconffilesto/usr/local/etc/httpd/sites-enabled/.ThenreloadApache2.2.Thefilesshouldhave.confextension,otherwiseitwillbeignoredFileswillbeprefixedby${package}.Existingfileswillbeunlink()first.Failureonanyfilecopyresultsinthisworkertoabortandtriggersrollback.
Release():DeletepreviouslycreatedlinksIgnorefilesthatarenotfound.Ignoreunlink()failure.
Provider
WebStation
TimingFROM_ENABLE_TO_DISABLE
EnvironmentVariables
None
Updatable
No
Syntax
"apache22":{
"sites-enabled":[{
"relpath":"<conf-relpath>",
},...]
}
Member Since Description
sites-enabled WebStation-1.0-0049 Objectarray,listofconffilestoinstall.
relpath WebStation-1.0-0049 Targetfile'srelativepathunder/var/packages/${package}/target/.
Example
SynologyDSM6.0DeveloperGuide
114AvailableWorkers
{
"apache22":{
"sites-enabled":[{
"relpath":"synology_added/test_1.conf"
},{
"relpath":"synology_added/test_2.conf"
},{
"relpath":"synology_added/test_3.conf"
}]
}
}
SynologyDSM6.0DeveloperGuide
115AvailableWorkers
DataShare
Description
Thisworkercreatessharedfolderandsetitspermissionduringpackagestartup.Thesharenamecanbehard-codedinthespecificationorgivenbyuserinputfromtheUIwizard.Thesharedfolderwillnotberemovedafterpackageuninstallation,sinceitmightdeletetheuser’spersonaldataaswell.
Acquire():Createsharedfolderandsetitspermission.Ifthesharedfolderalreadyexists,skipsharecreationandsetthepermission.
Release():Doesnothing.
Provider
DSM
TimingFROM_ENABLE_TO_POSTUNINST
EnvironmentVariables
None
Updatable
No
Syntax
"data-share":{
"shares":[{
"name":"<share-name>",
"permission":{
"ro":["<user-name>",...],
"rw":["<user-name>",...]
},
"once":"<once>"
},...]
}
Member Since Description
shares 6.0-5914 Objectarray,arrayofsharestocreate
name 6.0-5914 String,nameoftheshare,canbeobtainedfromtheUIwizard
permission 6.0-5914 Jsonobject,permissionoftheshare.(optional)
ro 6.0-5914 Stringarrayuserstobeassignedwithread-onlypermission.
rw 6.0-5914 Stringarrayuserstobeassignedwithread/writepermission.
once 6.0-5914 Boolean,onlytrytocreateshareonpackage'sfirststart.(optional,default=false)
Example
SynologyDSM6.0DeveloperGuide
116AvailableWorkers
Thefollowingspecificationcreatesasharemusic,andgivestheuserAudioStationread-onlypermission.Sinceoncedefaultstofalse,theaboveprocedureisraneverytimethepackagestarts.
"data-share":{
"shares":[{
"name":"music",
"permission":{
"ro":["AudioStation"]
}
}]
}
ThefollowingspecificationreadsthesharenamefromWIZARD_UIFILES/install_uifile'spkgwizard_share_name,andgivestheuseradminread-onlypermission.
"data-share":{
"shares":[{
"name":"{{pkgwizard_share_name}}",
"permission":{
"ro":["admin"]
}
}]
}
SynologyDSM6.0DeveloperGuide
117AvailableWorkers
IndexDB
Description
Index/unindexpackagehelpandappindexduringpackagestart/stop.
Fordetaileddescriptiononpackageappindexandhelpindex,pleaserefertoIntegegrateHelpDocumentintoDSMHelp.
Acquire():Indexpackagehelpandappcontent.Release():Un-indexpackagehelpandappcontent.
Provider
DSM
TimingFROM_ENABLE_TO_DISABLE
EnvironmentVariables
None
Updatable
No
Syntax
"indexdb":{
"app-index":{
"conf-relpath":"<confrelpath>",
"db-relpath":"<appdbrelpath>"
},
"help-index":{
"conf-relpath":"<confrelpath>",
"db-relpath":"<helpdbrelpath>"
}
}
Member Since Description
app-index 6.0-5924 Object,appindexinfo.
help-index 6.0-5924 Object,helpindexinfo.
conf-relpath 6.0-5924 String,configfile'srelativepathunder/var/packages/${package}/target/.
db-relpath 6.0-5924 String,dbfolder'srelativepathunder/var/packages/${package}/target/.
Example
SynologyDSM6.0DeveloperGuide
118AvailableWorkers
"indexdb":{
"app-index":{
"conf-relpath":"app/index.conf",
"db-relpath":"indexdb/appindexdb"
},
"help-index":{
"conf-relpath":"app/helptoc.conf",
"db-relpath":"indexdb/helpindexdb"
}
}
SynologyDSM6.0DeveloperGuide
119AvailableWorkers
MariaDB
Description
Create/deletedatabaseanddb-userduringpackageinstall/uninstall.Thedatabasenamecanbehard-coded,readfromconfigfileorgivenbytheuserfromUIwizard.Packagedevelopercandecideifcreatingacorrespondingdb-userisneededornot.
Acquire():Createdatabaseanddb-useraccrodingtoresourcespecification.database:resourcespecificationcanspecifywhatactiontotakeifadatabasewiththesamenamealreadyexists:1. drop:Deletetheexistingdatabase.2. skip:Ignoredatabasecreation,keeptheexistingdatabaseandconitinueinstallation.3. error:Returnerrorandrollback.(Default:error)
db-user:Createdb-userandgrantaccesstothedatabaseaccordingtotheresourcespecification.Thedefaultdb-usertocreateis'${package}'@'localhost'
Release():Deletedatabaseanddb-useraccrodingtotheresourcespecification.Defaultistokeepthedatabaseanddb-user.Duringpackageupgrade,MariaDBworkerprovidestheget_key_valuemethodtoobtainpreviouslycreatedatabase'sname,andtherewillbenocreate/deletefordatabaseanddb-user
Provider
MariaDB
TimingFROM_PREINST_TO_PREUNINST
EnvironmentVariables
Variable Since Description
SYNOPKG_DB_USER_RAND_PW 6.0-5920 Therandompasswordgeneratedduringdatebaseusercreation.
Updatable
No
Syntax
((*)required)
SynologyDSM6.0DeveloperGuide
120AvailableWorkers
"mysql-db":{
"info":{
"db-name":"<dbname>",(*)
"conf":"<conf>",
"key":"<key>"
},
"root-pw":"<dbpassword>",(*)
"create-db":{
"char-set":"<character-set>",
"collate":"<collate>",
"db-collision":"drop"|"skip"|"error"
},
"grant-user":{
"user-name":"<dbusername>",
"host":"<dbuserhost>",
"user-pw":"<userpassword>",
"rand-pw":true|false
},
"drop-db-uninst":true|false,
"drop-user-uninst":true|false
}
SynologyDSM6.0DeveloperGuide
121AvailableWorkers
Member Since Description
info5.5.47-0062
Object,infoofdb-name.Thepriorityofretrievingdatabase'snameisdb-name>conf.Whichmeans,ifdb-nameisgiven,confandkeywillbeignored.
db-name5.5.47-0062 String,databasename,canbegivenbyUIwizard.
conf5.5.47-0062 String,filecontainingthedatabasename'skey-value-pair.
key5.5.47-0062 String,thekeyinconffiletolookfordb-name.
root-pw5.5.47-0062 String,rootpasswordofMariaDB.
create-db5.5.47-0062 Object,infoofdatabase.Ifdoesnotexist,databasewillnotbecreatedduringAcquire().
character-
set
5.5.47-0062 String,database'sCHARACTERSET.(default=utf8)
collate5.5.47-0062 String,database'sCOLLATE.(default=utf8_unicode_ci)
db-
collision
5.5.47-0062 String,actiontotakeifthedatabaseexists.Canbedrop/skip/error.
grant-
user
5.5.47-0062 Object,infoofdb-user.Ifdoesnotexist,db-userwillnotbecreatedduringAcquire().
user-name5.5.47-0062 String,db-username.(default=${package})
host5.5.47-0062 String,db-user'shost.(defaults=localhost)
user-pw5.5.47-0062
String,db-user'spassword.Ifemptyornull,db-user'spasswordwillnotbeset.Overridesexistinguser'spassword.
rand-pw5.5.47-0062
Boolean,whethertogeneratearandompassword.Ifsettotrue,thedb-userwillbegivenarandompasswordandbepassedtoenvironmentvariableSYNOPKG_DB_USER_RAND_PW.Ifuser-pwexists,thisvaluewillbeignored.
drop-db-
uninst
5.5.47-0062
Boolean,whethertodeletedatabaseduringRelease().CanbegivenbyUIwizard.(defaults=false)
drop-user-
uninst
5.5.47-0062
Boolean,whethertodeletedb-userduringRelease().CanbegivenbyUIwizard.(defaults=false)
Example
"mysql-db":{
"info":{
"db-name":"wordpressblog"
},
"root-pw":"{{pkgwizard_mysql_password}}",
"create-db":{
"db-collision":"skip"
},
"grant-user":{
"user-name":"wordpress"
},
"drop-db-uninst":"{{pkgwizard_remove_mysql}}",
"drop-user-uninst":"{{pkgwizard_remove_mysql}}"
}
SynologyDSM6.0DeveloperGuide
122AvailableWorkers
PHPINI
Description
Packagescancarrycustomphp.iniandfpm.conffiles.Thisworkerinstalls/uninstallstheseconfigfilesduringpackagestart/stop.
Acquire():Copythephp.iniandfpm.conffilesto/usr/local/etc/php56/conf.d/and/usr/local/etc/php56/fpm.d/.Thenreloadphp56-fpm.
php.ini/fpm.conffilesshouldhave.ini/.confextension,otherwiseitwillbeignoredFileswillbeprefixedby${package}.Existingfileswillbeunlink()first.Failureonanyfilecopyresultsinthisworkertoabortandtriggersrollback.
Release():DeletepreviouslycreatedlinksIgnorefilesthatarenotfound.Ignoreunlink()failure.
Provider
PHP5.6
TimingFROM_ENABLE_TO_DISABLE
EnvironmentVariables
None
Updatable
No
Syntax
"php":{
"php-ini":[{
"relpath":"<ini-relpath>",
},...],
"fpm-conf":[{
"relpath":"<conf-relpath>",
},...]
}
Member Since Description
php-ini PHP5.6-5.6.17-0020 Objectarray,listofphp.inifilestoinstall.
fpm-conf PHP5.6-5.6.17-0020 Objectarray,listoffpm.conffilestoinstall.
relpath PHP5.6-5.6.17-0020 Targetfile'srelativepathunder/var/packages/${package}/target/.
Example
SynologyDSM6.0DeveloperGuide
124AvailableWorkers
{
"php":{
"php-ini":[{
"relpath":"synology_added/etc/php/conf.d/test_1.ini"
},{
"relpath":"synology_added/etc/php/conf.d/test_2.ini"
},{
"relpath":"synology_added/etc/php/conf.d/test_3.ini"
}],
"fpm-conf":[{
"relpath":"synology_added/etc/php/fpm.d/test_1.conf"
},{
"relpath":"synology_added/etc/php/fpm.d/test_2.conf"
},{
"relpath":"synology_added/etc/php/fpm.d/test_3.conf"
}]
}
}
SynologyDSM6.0DeveloperGuide
125AvailableWorkers
PortConfig
Description
Install/uninstallserviceportconfigfileduringpackageinstall/uninstall.
Fordetaileddescriptiononwhatisandhowtowriteaportconfigfile,pleaserefertoInstallPackageRelatedPortsInformationintoDSM.
Acquire():copythe.scfileto/usr/local/etc/service.d/Ifthedestinationfileexists,skipfilecopy.
Release():removethe.scfileandreloadthefirewallandportforward.Update():updatethe.scfileandreloadfirewallandportforward.
TimingFROM_POSTINST_TO_POSTUNINST
EnvironmentVariables
None
Updatable
Yes,pleaserefertoConfigUpdateonhowtotriggerupdate.
Syntax
"port-config":{
"protocol-file":<protocol_file>
}
Member Since Description
protocol_file 6.0-5936 .scfile'srelativepathunder/var/package/{$package}/target/
Example
"port-config":{
"protocol-file":"port_conf/xxdns.sc"
}
SynologyDSM6.0DeveloperGuide
126AvailableWorkers
SyslogConfig
Description
Install/uninstallthesyslog-ngandlogrotateconfigfileduringpackagestart/stop.
Pleaserefertosyslog-ngonhowtowritethesyslog-ng'sconfigfile.
Acquire():Copypatterndb/logratoateto/usr/local/etc/syslog-ng/patterndb.d///usr/local/etc/logrotate.d/.Thenreloadsyslog-ng.
Iffileexists,unlink()itfirst.Failureonanyfilecopyresultsinthisworkertoabortandtriggersrollback.
Release():Deletetheconfigfilesandreloadsyslog-ng.Ignoreunlink()failure.
Provider
DSM
TimingFROM_ENABLE_TO_DISABLE
EnvironmentVariables
None
Updatable
No
Syntax
"syslog-config":{
"patterndb-relpath":"<relpath>",
"logrotate-relpath":"<relpath>"
}
Member Since Description
patterndb-
relpath
6.0-7145
String,syslog-ng'sconfigfile'srelativepathunder/var/packages/${package}/target/,ignorethisifthelogisnotgeneratedbysyslog-ng(optional)
logrotate-
relpath
6.0-5911
String,logrotate'sconfigfile'srelativepathunder/var/packages/${package}/target/,ignorethisiflogissavedtodatabase(optional)
Example
"syslog-config":{
"patterndb-relpath":"etc/syslog-ng.conf",
"logrotate-relpath":"etc/logrotate.conf"
}
SynologyDSM6.0DeveloperGuide
127AvailableWorkers
GetStartedwithPublishingTopublishinSynologyPackageCenterrequiresafewsimplesteps.Hereishowtodoit:
1. AcquireaSynologyCheckoutMerchantAccountviaaSynologyspecialist([email protected]).
2. ReadandaccepttheDeveloperDistributionAgreement.NotethatpackagesthatyoupublishonPackageCentermustcomplywiththeTermsofServiceinPackageCenter.
Pleasenotethatthepackagequalitydirectlyinfluencesthelong-termsuccessofyourpackageintermsofinstallation,onlinereviews,engagement,anduserretention.
SynologyDSM6.0DeveloperGuide
130GetStartedwithPublishing
SubmittingthePackageforApprovalBeforeyoupublishyourpackageinPackageCenteranddistributeittousers,youneedtogetthepackage(theSPKfile)ready,testit,andprepareyourpromotionmaterialsifneeded.Pleaseseethechecklistbelowbeforesubmittingyourpackagetous.
ConfirmPackageSize
TheoverallsizeofyourpackagecanaffectitsdesignandhowyoupublishitinPackageCenter.Currently,themaximumsizeforaSPKfilepublishedonPackageCenteris100MB.
FreeorPaidPackage
InPackageCenter,youcanpublishfreeorpaidpackages.FreepackagescanbedownloadedbyanyuserinPackageCenter.PaidappscanbedownloadedonlybyuserswhohavearegisteredSynologyAccount.
Decidingwhetheryourpackagewillbefreeorpaidisimportantbecausefreepackagesmustremainfree.
Onceyourpackageispublishedasafreeone,youcannotchangeittoapaidpackage.Ifyoupublishyourpackageasapaidone,youcanchangeittofreeatanytime(butcannotbechangedbacktopaid).Ifyourpackageispaid,youneedtosetupaSynologyCheckoutMerchantAccountbeforethepackagecanbepublished.ForqueriesabouttheSynologyCheckoutMerchantAccount,[email protected].
SetaPriceforYourPackageIfyouhaveapaidpackage,SynologyletsyousetpricesforyourpackageonlyinUScurrencyforusersinmarketsaroundtheworld.Beforeyoupublish,considerhowyouwillpriceyourpackageandwhatyourpricewillbeinvariouscurrencies.
PrepareScreenshotsWhenyoupublishinPackageCenter,youmustsupplyavarietyofhigh-qualityscreen-shotstoshowcaseyourpackageorbrand.Afteryoupublish,theywillappearonyourpackagedetailspage,orelsewhere.Thesescreen-shotsareakeypartofasuccessfulpackagedetailspagethatwillattractandengageusers.Therefore,youmayalsoconsiderhiringaprofessionaltoproducethemforyou.
SubmitYourPackageWhenyouarereadytopublish,sendanemailtoaSynologyspecialistpackage@synology.comtomakeyoursubmission.
Makesurethat:
YouhaveappliedthroughSynologyDevCenterandbecomeanauthorizeddeveloper.Yourpackageistherightversion.Youprovideadownloadlinkforyourpackage.Youprovideapackagedescriptionwithwhatitdoes.Youprovideachangelogwithwhatwasupdatedinthisversion.Packagepricingissettobefreeorpaid(forthefirsttimesubmission).Thelinktoyourwebsiteandthesupportemailaddressiscorrect.YouhaveacknowledgedthatyourpackagemeetstheDeveloperDistributionAgreementandalsotheTermsofServicefromPackageCenter.
SynologyDSM6.0DeveloperGuide
131SubmittingthePackageforApproval
RespondingtoUserIssuesAfteryoupublishapackage,ititcrucialforyoutooffersupporttoyourcustomers.Promptandcourteoussupportcanprovideabetterexperienceforusers,whichcanresultinmoredownloadsandmorepositiveonlinereviewsforyourpackages.Usersaremorelikelytobemoreengagedwithyourpackageandrecommenditifyouareresponsivetotheirneedsandfeedback.
Therearemanywaysthatyoucankeepintouchwithusersandofferthemsupport.Themostcommonwayistoprovideasupportemailaddressinyourpackagedetailspage.Youcanalsoprovidesupportinotherways,suchasaforumoramailinglist.TheSynologytechnicalsupportteamprovidesusersupportfordownloading,installingandpaymentsissues,butissuesthatfalloutsideofthesetopicswillfallunderyourdomain.Examplesofissuesyoucansupportinclude:featurerequests,questionsaboutusingtheappandquestionsaboutcompatibilitysettings.
Afterpublishing,pleaseplanto:
Providealinktoyoursupportresourcesandsetupanyothersupportoutletssuchasaforum.Provideanappropriatesupportemailaddressonyourpackagedetailpageandrespondtouserswhentheyemailyou.Acknowledgeandfixissueswithyourpackage.Ithelpstobetransparentandlistknownissuesonyourpackagedetailspageregularly.Publishupdatesfrequently,withoutsacrificingqualityorannoyinguserswithtoo-frequentupdates.Witheachupdate,makesureyouprovideasummaryofwhatisnew.Userswillreaditandappreciatethatyouareseriousaboutimprovingthequalityofyourpackage.
SynologyDSM6.0DeveloperGuide
133RespondingtoUserIssues
AppendixA:PlatformandArchValueMappingTableThearchitectureoftheNASisdevelopeduponvariousplatformsonwhichyourpackageisdesignedandneedstobeaddressedintheINFOfileinthepackage.
Inthebelowtable,youwillfindthestringvaluecorrespondingtotheplatforminquestion.Forexample,iftheplatformofyourNASisMarvellKirkwood,88F6281,thevaluethatshouldtobeprovidedasapairofthearchkeyis88f6281.
PleasechecktheplatformsoftheNAStobesupportedandrefertothetablebelowfortheircorrespondingstringvalues:
PlatformName ArchValue
MarvellKirkwood,88F6281 88f6281
MarvellKirkwood,88F6282 88f6282
IntelAtomD410/D510(Pineview) x86
IntelAtomD2700(Cedarview) cedarview
IntelSandyBridge,IntelIvyBridge,IntelHaswell bromolow
MarvellArmada370 armada370
MarvellArmada375 armada375
MarvellArmadaXP armadaxp
Annapurnalabs,Alpine alpine/alpine4k
Mindspeed,Comcerto,C2000 comcerto2k
IntelAtomCESoC evansport
FreescalePowerQUICCIII ppc853x
Noplatformdependency noarch
SynologyDSM6.0DeveloperGuide
134AppendixA:PlatformandArchValueMappingTable
RevisionHistoryThistabledescribesthechangestotheSynologyDSM3rdPartyAppsDeveloperGuide.
SynologyDSM6.0DeveloperGuide
135RevisionHistory
Date Note
2008/06/16 1.Originalreleasedateofdocument.
2009/02/09 1.AddedFreescale8533toolchaininformation.
2009/03/09 1.AddedMarvell6281toolchaininformation.2.AddedDesktopIconchapter.
2010/05/20
1.Addedrelatedinformationfor10models.2.ChangedallDSM2.0&2.1toDSM2.3.3.Newscreenshotsfordesktopicon&DSMapplication.4.Changedconfigurationfilesandtoolchains.5.DS1010+usesIntelAtomD510.
2010/05/281.RevisedToolChaindescription2.Revised88f5182-configto88f5281-configinKernelModule.3.Revisedpathdescriptionofapplication.cfg/desktop.cfg.
2010/11/29 1.Renamedthedocumentto“SynologyDiskStationManager3rd-PartyAppsDeveloperGuide”.2.AddedDSM3.0Integrationsection.
2011/10/31 1.AddedSynologypackagecreationsection.2.UpdatedDSMtoolchaininformation.
2012/03/20 Addedtheguidelinetoapplicationstorage,webapplicationrunningonApacheandcreatedasharedfolder.
2012/09/19 AddedFreescaleQorIQtoolchaininformation.
2013/03/111.GeneralupdateforDSM4.2release.2.Addedsectionregardingpaymentframework.3.Updatedformatting.
2013/05/06 AddedMarvellArmada370toolchaininformation.
2013/05/29 AddedMarvellArmadaXPandEvansporttoolchaininformation.
2013/06/05 UpdatedQorIQ,ArmadaXP,Armada370,Evansport$CCvariable.
2013/07/09 1.Updatedinstall_dep_servicesandstart_dep_servicesinINFOsection.2.AddedLocaleSupport.
2013/07/25 1.UpdatedLinuxkernelversion.2.AddedCSRFprotectioninDSMWebAuthenticationsection.
2013/08/29 Generalupdateontoolchain,toolkit,andGPLkernelsourceforDSM4.3release.
2014/02/25
1.UpdatedkeysinINFOsectionforDSM5.0.2.AddedDSM5.0supportinplatformchart.3.UpdatedCreatePHPApplicationwithDSM5.0change.4.AddedCreateUserAccountandSharePermission.5.Minorcorrections.
2014/03/26 1.AddedAppendixforPlatformandArchstringmappingtable.2.AddedcompilationinstructionforDSM5.0build.
2014/08/17 1.Addedcodesignmechanismforpackages.
2014/10/29 1.AddedChapter:QuickStartGuide.2.Removedtheduplicatedcontent.
2015/09/10 1.AdedMarvellArmada375ANNAPURNALABS,AlpineAL212/AL314/AL514andMINDSPEED,Comcerto,C2000toolchaininformation.
2016/01/14 1.Contentrevised.2.ChangedtoformattoGitbook.
SynologyDSM6.0DeveloperGuide
136RevisionHistory
CompileApplicationsTheSynologyNASemploysembeddedSoCorx86-basedCPUs,implementingseveralplatforms--suchasARMandPowerPC--onavarietyofSynologyNASmodels.Inordertorun3rd-partyapplicationsontheSynologyNAS,itisnecessarytocompileapplicationsintoanexecutableformatforthecorrespondingplatform.
ThetablebelowliststheCPU,architecture,Endianness,andLinuxkernelversionofeachSynologyNASmodel.ThisinformationwillhelpyoudeterminewhichDSMtoolchain(pleaserefertothe“DownloadDSMToolChain”section)todownloadforeachmodel.
PleaserefertoWhatkindofCPUdoesmyNAShaveNeedtoupdatethehyperlinkforacompletemodellist.
Model(Tonameafew) CPU Arch Endianness Linux
DS112j,DS112,DS112+,DS411slim,DS213,DS212j Marvell6281Marvell6282 ARM Little
Endian 2.6.32
DS213j MarvellArmada370 ARM LittleEndian 3.2.40
DS214,DS214+ MarvellArmadaXP ARM LittleEndian 3.2.40
DS215+,DS416 Annapurnalabs,AlpineAL212 ARM Little
Endian 3.2.40
DS715,DS1515 Annapurnalabs,AlpineAL314 ARM Little
Endian 3.2.40
DS2015xs Annapurnalabs,AlpineAL514 ARM Little
Endian 3.2.40
DS115,DS215j MarvellArmada375 ARM LittleEndian 3.2.40
DS414j Mindspeed,Comcerto,C2000 ARM Little
Endian 3.2.40
DS712+,DS2412+,RS2212+,DS1512+,DS1812+,DS412+,RS812+ IntelAtom Intelx86 Little
Endian 3.2.40
DS3612xs,RS3412xs,RS3412RPxs IntelCorei3 Intelx86 LittleEndian 3.2.40
DS214play IntelSoC Intelx86 LittleEndian 3.2.40
DS213+,DS413 FreescaleQorIQP1022 PowerPC BigEndian 2.6.32
DS110+,DS210+,DS410 Freescale8533Freescale8533E PowerPC BigEndian 2.6.32
TocompileanapplicationfortheSynologyNAS,acompilerthatrunsonLinuxPCisrequiredinordertogenerateanexecutablefilefortheSynologyNAS.Thiscompilingprocedureiscalledcross-compiling,andthesetofcompilingtools(compiler,linker,etc)usedtocompiletheapplicationiscalledatoolchain.
SynologyDSM6.0DeveloperGuide
137AppendixB:CompileApplicationsManually
DownloadDSMToolChainTodownloadtheDSMtoolchain,pleasegotoSourceForge.ThetablebelowshowsthefilenameoftoolchainsforNASwithdifferentCPUs:
CPU ToolChain Linux
Marvell6281 Marvell88F628xLinux2.6.32 2.6.32
MarvellArmada370 MarvellArmada370Linux3.2.403 3.2.40
MarvellArmadaXPMarv MarvellArmadaxpLinux3.2.40 3.2.40
MarvellArmada375 MarvellArmada370Linux3.2.40 3.2.40
Annapurnalabs,AlpineAL212/AL314/AL514 Annapurnalabs,AlpineLinux3.2.40 3.2.40
Mindspeed,Comcerto,C2000 Mindspeed,Comcerto,C2000Linux3.2.40 3.2.40
Freescale8533Freescale8533E PowerPC853xLinux2.6.32 2.6.32
FreescaleQorIQ(P1022) PowerPCQorIQLinux2.6.32 2.6.32
IntelAtom Intelx86Linux3.2.40(Pineview)Intelx86Linux3.2.40(Cedarview) 3.2.40
IntelCorei3 Intelx86Linux3.2.40(Bromolow) 3.2.40
IntelSoC Intelx86Linux3.2.40(Evansport) 3.2.40
Ifyouarenotsureaboutwhichtoolchainyouneed,pleaseexecutethefollowingcommandonyourSynologyNAS.
#uname-a
Linuxmyds3.2.40#3503SMPThuMar2115:17:31CST2013x86_64
GNU/Linuxsynology_x86_712+
Thelast“synology_x64_712+”tellsyouwhichtoolchainisappropriate.Forexamples,x86meansyouneedthetoolchainforPineview.
AfteryoudownloadtheDSMtoolchain,extractittowhereyouwantitonyourcomputer.Forthefollowinginstructionswewillextractto/usr/local/asanexample.Youcanextractthetoolchainbyusingthefollowingcommand:
#tarzxpfgcc343_glibc232_88f5281.tgz–C/usr/local/
Pleasemakesurethetoolchainislocatedinthedirectory/usr/localonyourcomputertoensureproperintegration.
SynologyDSM6.0DeveloperGuide
138DownloadDSMToolChain
CompileYoucanstartcompilinganapplicationcalled“minimalPkg.c”,forexample,thatlookslikethis:
#include<sys/sysinfo.h>
intmain()
{
structsysinfoinfo;
intret;
ret=sysinfo(&info);
if(ret!=0){
printf("Failedtogetsysteminformation.\n");
return-1;
}
printf("TotalRAM:%u\n",info.totalram);
printf("FreeRAM:%u\n",info.freeram);
return0;
}
Tocompiletheapplication,runthefollowingcommand:
/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabigccminimalPkg.c–osysinfo
YoucanalsowriteaMakefileforit:
EXEC=sysinfo
OBJS=sysinfo.o
CC=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-gcc
LD=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ld
CFLAGS+=-I/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/include
LDFLAGS+=-L/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/lib
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC)$(CFLAGS)$(OBJS)-o$@$(LDFLAGS)
clean:
rm-rf*.o$(PROG)*.core
SynologyDSM6.0DeveloperGuide
139Compile
CompileOpenSourceProjectsTocompileanapplicationonmostopensourceprojects,youwillbeaskedtoexecutethefollowingthreesteps:
1. configure2. make3. makeinstall
Theconfigurescriptbasicallyconsistsofmanylineswhichareusedtocheckdetailsaboutthemachineonwherethesoftwareisgoingtobeinstalled.Thescriptwillcheckforalotofdependenciesonyoursystem.Whenyouruntheconfigurescript,youwillseealotofoutputonthescreen,eachbeingsomesortofquestionwitharespectiveyes/noreply.Ifthereareanymajorrequirementsmissingonyoursystem,theconfigurescriptwillexitandyouwillnotbeabletoproceedwiththeinstallationuntilyoumeetalltherequirements.Inmostcases,compileapplicationsonsomeparticulartargetmachineswillrequireyoutomodifytheconfigurescriptmanuallytoprovidethecorrectvalues.
Whenrunningtheconfigurescripttoconfiguresoftwarepackagesforcross-compiling,youwillneedtospecifytheCC,LD,RANLIB,CFLAGS,LDFLAGS,host,target,andbuild,etc.Someexamplesaregivenbelow.
ForPowerPC8544/8533platforminDSM5.0:
envCC=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-gcc\
LD=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-ld\
RANLIB=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-ranlib\
CFLAGS="-I/usr/local/powerpc-none-linux-gnuspe/include-mcpu=8548-mhard-float-mfloat-gprs=double"\
LDFLAGS="-L/usr/local/powerpc-none-linux-gnuspe/lib"\
./configure\
--host=powerpc-unknown-linux\
--target=powerpc-unknown-linux\
--build=i686-pc-linux\
--prefix=/usr/local
ForPowerPCQorIQplatforminDSM5.0:
envCC=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-gcc\
LD=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-ld\
RANLIB=/usr/local/powerpc-none-linux-gnuspe/bin/powerpc-none-linuxgnuspe-ranlib\
CFLAGS="-I/usr/local/powerpc-none-linux-gnuspe/include-mcpu=8548-mhard-float-mfloat-gprs=double"\
LDFLAGS="-L/usr/local/powerpc-none-linux-gnuspe/lib"\
./configure\
--host=powerpc-unknown-linux\
--target=powerpc-unknown-linux\
--build=i686-pc-linux\
--prefix=/usr/local
ForMarvell6281platforminDSM5.0:
envCC=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-gcc\
LD=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ld\
RANLIB=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ranlib\
CFLAGS="-I/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/include"\
LDFLAGS="-L/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/lib"\
./configure\
--host=armle-unknown-linux\
--target=armle-unknown-linux\
--build=i686-pc-linux\
--prefix=/usr/local
ForMarvellArmada370platforminDSM5.0:
SynologyDSM6.0DeveloperGuide
140CompileOpenSourceProjects
envCC=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-gcc\
LD=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ld\
RANLIB=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ranlib\
CFLAGS="-I/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/include-mhard-float-mfpu=vfpv3-d16"\
LDFLAGS="-L/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/lib"\
./configure\
--host=armle-unknown-linux\
--target=armle-unknown-linux\
--build=i686-pc-linux"\
--prefix=/usr/local
ForMarvellArmada375platforminDSM5.1:
envCC=/usr/local/armv7-marvell-linux-gnueabi-hard/bin/arm-marvelllinux-gnueabi-ccache-gcc\
LD=/usr/local/armv7-marvell-linux-gnueabi-hard/bin/arm-marvell-linuxgnueabi-ld\
RANLIB=/usr/local/armv7-marvell-linux-gnueabi-hard/bin/arm-marvelllinux-gnueabi-ranlib\
CFLAGS="-I/usr/local/armv7-marvell-linux-gnueabi-hard/arm-marvelllinux-gnueabi/libc/usr/include-mhard-float-mfpu=vfpv3"
LDFLAGS="-L/usr/local/armv7-marvell-linux-gnueabi-hard/arm-marvelllinux-gnueabi/libc/lib"\
./configure\
--host=armle-unknown-linux\
--target=armle-unknown-linux\
--build=i686-pc-linux"\
--prefix=/usr/local
ForMarvellArmadaXPplatforminDSM5.0:
envCC=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-gcc\
LD=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ld\
RANLIB=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linuxgnueabi-ranlib\
CFLAGS="-I/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/include-mhard-float-mfpu=vfpv3-d16"\
LDFLAGS="-L/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linuxgnueabi/libc/lib"\
./configure\
--host=armle-unknown-linux\
--target=armle-unknown-linux\
--build=i686-pc-linux"\
--prefix=/usr/local
ForAnnapurnalabs,AlpineplatforminDSM5.1:
envCC=/usr/local/arm-cortex_a15-linux-gnueabi/bin/arm-cortex_a15-linux-gnueabi-ccache-gcc\
LD=/usr/local/arm-cortex_a15-linux-gnueabi/bin/arm-cortex_a15-linuxgnueabi-ld\
RANLIB=/usr/local/arm-cortex_a15-linux-gnueabi/bin/arm-cortex_a15-linux-gnueabi-ranlib\
CFLAGS="-I/usr/local/arm-cortex_a15-linux-gnueabi/arm-cortex_a15-linux-gnueabi/sysroot/usr/include-mfloat-abi=hard-mtune=cortex-a15-mfpu=neon-vfpv4-mthumb"
LDFLAGS="-L/usr/local/arm-cortex_a15-linux-gnueabi/arm-cortex_a15-linux-gnueabi/sysroot/lib"\
./configure\
--host=arm-cortex_a15-linux-gnueabi\
--target=arm-cortex_a15-linux-gnueabi\
--build=i686-pc-linux"\
--prefix=/usr/local
ForMindspeed,Comcerto,C2000platforminDSM5.0:
SynologyDSM6.0DeveloperGuide
141CompileOpenSourceProjects
envCC=/usr/local/arm-cortexa9-linux-gnueabi/bin/arm-cortexa9-linuxgnueabi-ccache-gcc\
LD=/usr/local/arm-cortexa9-linux-gnueabi/bin/arm-cortexa9-linuxgnueabi-ld\
RANLIB=/usr/local/arm-cortexa9-linux-gnueabi/bin/arm-cortexa9-linuxgnueabi-ranlib\
CFLAGS="-I/usr/local/arm-cortexa9-linux-gnueabi/arm-cortexa9-linuxgnueabi/sysroot/include-mcpu=cortex-a9-march=armv7-a-mfpu=neon-mfloat-abi=hard-mthumb"
LDFLAGS="-L/usr/local/arm-cortexa9-linux-gnueabi/arm-cortexa9-linuxgnueabi/sysroot/lib"\
./configure\
--host=armle-unknown-linux\
--target=armle-unknown-linux\
--build=i686-pc-linux"\
--prefix=/usr/local
ForIntelX86platforminDSM5.0:
envCC=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-gcc\
LD=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-ld\
RANLIB=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-ranlib\
CFLAGS="-I/usr/local/i686-pc-linux-gnu/i686-pc-linux-gnu/sysroot/usr/include"\
LDFLAGS="-L/usr/local/i686-pc-linux-gnu/i686-pc-linux-gnu/sysroot/lib"\
./configure\
--host=i686-pc-linux-gnu\
--target=i686-pc-linux-gnu\
--build=i686-pc-linux\
--prefix=/usr/local
ForIntelAtomEvansportplatforminDSM5.0:
envCC=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-gcc\
LD=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-ld\
RANLIB=/usr/local/i686-pc-linux-gnu/bin/i686-pc-linux-gnu-ranlib\
CFLAGS="-I/usr/local/i686-pc-linux-gnu/i686-pc-linux-gnu/sysroot/usr/include"\
LDFLAGS="-L/usr/local/i686-pc-linux-gnu/i686-pc-linux-gnu/sysroot/lib"\
./configure\
--host=i686-pc-linux-gnu\
--target=i686-pc-linux-gnu\
--build=i686-pc-linux\
--prefix=/usr/local
SynologyDSM6.0DeveloperGuide
142CompileOpenSourceProjects
CompileKernelModulesIfyouwouldliketocompilekernelmodules,youwillneedtoobtainaSynologyGPLtoaccessthekernelsourcecode.PleaserefertoSourceForgeformoredetails.
Inthekernelsourcecode,therearemanyconfigurationfilesfordifferentplatforms.Theconfigurationfilesarelistedinbelow:
CPU ConfigurationFile Arch Linux
Marvell6281Marvell6282 synoconfigs/88f6281 ARM 2.6.32
MarvellArmada370 synoconfigs/armada370 ARM 3.2.40
MarvellArmada375 synoconfigs/armada375 ARM 3.2.40
MarvellArmadaXP synoconfigs/armadaxp ARM 3.2.40
Annapurnalabs,AlpineAL212/AL314/AL514 synoconfigs/alpine(DS715,DS1515,DS2015xs)synoconfigs/alpine4k(DS215+,DS416) ARM 3.2.40
Mindspeed,Comcerto,C2000 synoconfigs/comcerto2k ARM 3.2.40
Freescale8533 synoconfigs/ppc8533 PowerPC 2.6.32
FreescaleQorIQ(P1022) synoconfigs/ppcQorIQ PowerPC 2.6.32
IntelAtomD525,D510,D410,D425 synoconfigs/x86_64 x86 3.2.40
IntelAtomD2700 synoconfigs/cedarview x86 3.2.40
IntelSoCCE5335 synoconfigs/evansport x86 3.2.40
IntelCorei3 synoconfigs/bromolow x86 3.2.40
Pleasecopytheproperconfigurationfileto.config,andrunmakeoldconfigandmakemenuconfigtoselectyourkernelmodules.Dependingontheplatformyouwouldliketocompile,youwillhavetosettheproperARCHandCROSS_COMPILEintoenvironmentvariables.
Forexample,thebelowcommandsaretocompile3.xkernelmodulesforbromolowplatform.
cdlinux-3.x
cpsynoconfigs/bromolow.config
makeARCH="x86_64"CROSS_COMPILE="/usr/local/x86_64-pc-linuxgnu/bin/x86_64-pc-linux-gnu-"oldconfig
makeARCH="x86_64"CROSS_COMPILE="/usr/local/x86_64-pc-linuxgnu/bin/x86_64-pc-linux-gnu-"menuconfig
makeARCH="x86_64"CROSS_COMPILE="/usr/local/x86_64-pc-linuxgnu/bin/x86_64-pc-linux-gnu-"modules
SynologyDSM6.0DeveloperGuide
143CompileKernelModules