Subversion Repositories DevTools

Rev

Rev 5752 | Rev 5771 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5752 Rev 5767
Line 70... Line 70...
70
#                       --Comment=xxx           - Add comment to Manifst
70
#                       --Comment=xxx           - Add comment to Manifst
71
#                       --NoManifestVersion     - Create unversioned Manifest File
71
#                       --NoManifestVersion     - Create unversioned Manifest File
72
#                       --PkgSubdir=xxx         - Specifies packaging subdir
72
#                       --PkgSubdir=xxx         - Specifies packaging subdir
73
#                       --ImportManifest=Package[,--Subdir=subdir,--ReWrite] - Import Manifest from package
73
#                       --ImportManifest=Package[,--Subdir=subdir,--ReWrite] - Import Manifest from package
74
#                       --Md5                   - Add MD5 checksums to the Manifest File
74
#                       --Md5                   - Add MD5 checksums to the Manifest File
-
 
75
#                       --Dmf                   - Generate the Device Management Framework
-
 
76
#                                                 combined archive ZIP file.
-
 
77
#                       --DmfVersion=xxxx       - Generate the Device Management Framework
-
 
78
#                                                 combined archive ZIP using a modified
-
 
79
#                                                 version number; only for testing!
75
#
80
#
76
# Returns         : Nothing
81
# Returns         : Nothing
77
#
82
#
78
sub ManifestFiles
83
sub ManifestFiles
79
{
84
{
Line 87... Line 92...
87
    my $mug_dir;
92
    my $mug_dir;
88
    my $default_arch = $::ScmPlatform;
93
    my $default_arch = $::ScmPlatform;
89
    my $default_prod = '';
94
    my $default_prod = '';
90
    my $imported_manifest = 0;
95
    my $imported_manifest = 0;
91
    my $include_md5 = 0;
96
    my $include_md5 = 0;
-
 
97
    my $generate_dmf = 0;
-
 
98
    my $dmf_version = $::ScmBuildVersion;
92
 
99
 
93
    #
100
    #
94
    #   Collect user options
101
    #   Collect user options
95
    #
102
    #
96
    foreach ( @elements )
103
    foreach ( @elements )
Line 164... Line 171...
164
            $imported_manifest = 1;
171
            $imported_manifest = 1;
165
 
172
 
166
        } elsif (m/^--Md5/i) {
173
        } elsif (m/^--Md5/i) {
167
            $include_md5 = 1
174
            $include_md5 = 1
168
 
175
 
-
 
176
        } elsif (m/^--Dmf/i) {
-
 
177
            $generate_dmf = 1
-
 
178
 
-
 
179
        } elsif ( m/^--DmfVersion=(.+)/ ) {
-
 
180
            $generate_dmf = 1;
-
 
181
            $dmf_version = $1;
-
 
182
 
169
        } else {
183
        } else {
170
            ReportError ("ManifestFiles: Unknown option or argument: $_");
184
            ReportError ("ManifestFiles: Unknown option or argument: $_");
171
 
185
 
172
        }
186
        }
173
    }
187
    }
Line 195... Line 209...
195
    $data{name} = $name;
209
    $data{name} = $name;
196
    $data{files} = \@files;
210
    $data{files} = \@files;
197
    $data{mugdir} = $mug_dir;
211
    $data{mugdir} = $mug_dir;
198
    $data{pkgsubdir} = $pkg_subdir;
212
    $data{pkgsubdir} = $pkg_subdir;
199
    $data{md5} = $include_md5;
213
    $data{md5} = $include_md5;
-
 
214
    $data{dmf} = $generate_dmf;
-
 
215
    $data{arch} = $default_arch;
-
 
216
    $data{dmf_version} = $dmf_version;
-
 
217
 
200
#DebugDumpData("DirectiveData", \%data );
218
#DebugDumpData("DirectiveData", \%data );
201
 
219
 
202
    push @Manifests, \%data;
220
    push @Manifests, \%data;
203
    return;
221
    return;
204
 
222
 
Line 572... Line 590...
572
    PackageFile ('*', $manifest_file, '--Subdir=' . $pkgdir, '--Strip' );
590
    PackageFile ('*', $manifest_file, '--Subdir=' . $pkgdir, '--Strip' );
573
 
591
 
574
    open (MF, '>', $manifest_file ) || Error ("Cannot create the Manifest file: $manifest_file");
592
    open (MF, '>', $manifest_file ) || Error ("Cannot create the Manifest file: $manifest_file");
575
 
593
 
576
    binmode (MF);
594
    binmode (MF);
577
    
595
 
578
    print_mf ("# PackageName: $::ScmBuildPackage");
596
    print_mf ("# PackageName: $::ScmBuildPackage");
579
    print_mf ("# PackageVersion: $::ScmBuildVersion");
597
    print_mf ("# PackageVersion: $::ScmBuildVersion");
580
    print_mf ("# BuildDate: $::CurrentTime");
598
    print_mf ("# BuildDate: $::CurrentTime");
581
    print_mf ("#");
599
    print_mf ("#");
582
    print_mf ("[Version],$::ScmBuildVersion");
600
    print_mf ("[Version],$::ScmBuildVersion");
Line 594... Line 612...
594
 
612
 
595
        my $tier = $entry->{tier};
613
        my $tier = $entry->{tier};
596
        my $name = $entry->{name};
614
        my $name = $entry->{name};
597
        my $include_md5 = $entry->{md5};
615
        my $include_md5 = $entry->{md5};
598
 
616
 
-
 
617
        if ( $entry->{dmf} )
-
 
618
        {
-
 
619
        	DmfGenerate($entry);
-
 
620
        }
-
 
621
 
599
        #
622
        #
600
        #   Insert all the files that have been specified
623
        #   Insert all the files that have been specified
601
        #   The user specified order is preserved
624
        #   The user specified order is preserved
602
        #
625
        #
603
        #   Entries may be either a file or a comment
626
        #   Entries may be either a file or a comment
Line 735... Line 758...
735
            print MF $_ . "\n";
758
            print MF $_ . "\n";
736
        }
759
        }
737
    }
760
    }
738
}
761
}
739
 
762
 
-
 
763
# Bring in the DMF build requirements.
-
 
764
my $directory;
-
 
765
BEGIN {
-
 
766
    use File::Spec::Functions qw(rel2abs);
-
 
767
    use File::Basename qw(dirname);
-
 
768
 
-
 
769
    my $path = rel2abs( __FILE__ );
-
 
770
    $directory = dirname( $path );
-
 
771
}
-
 
772
use lib $directory;
-
 
773
 
-
 
774
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
-
 
775
use JSON;
-
 
776
 
-
 
777
#-------------------------------------------------------------------------------
-
 
778
# Function        : DmfGenerate
-
 
779
#
-
 
780
# Description     : Import an existing manifest
-
 
781
#
-
 
782
# Inputs          : entry   - The manifest that is being processed.
-
 
783
#
-
 
784
# Returns         : Nothing
-
 
785
#
-
 
786
sub DmfGenerate
-
 
787
{
-
 
788
    my ($entry) = @_;
-
 
789
 
-
 
790
    # Get the generation time.
-
 
791
    my $gen_time = time();
-
 
792
 
-
 
793
    my $work_dir = "$::ScmPlatform.BIN/";
-
 
794
    System( "$::GBE_BIN/mkdir -p $work_dir" );
-
 
795
 
-
 
796
    my $name = $entry->{name};
-
 
797
    my $version = $entry->{dmf_version};
-
 
798
 
-
 
799
    # Configure base manifest information.
-
 
800
    my %manifest;
-
 
801
    $manifest{'name'} = $name;
-
 
802
    $manifest{'version'} = $version;
-
 
803
    $manifest{'package_name'} = $::ScmBuildPackage;
-
 
804
    $manifest{'package_version'} = $::ScmBuildVersion;
-
 
805
    $manifest{'datetime'} = localtime($gen_time);
-
 
806
    $gen_time *= 1000;  # Make to milliseconds
-
 
807
    $manifest{'timestamp'} = $gen_time;
-
 
808
    $manifest{'architecture'} = $entry->{arch};
-
 
809
    $manifest{'tier'} = $entry->{tier};
-
 
810
 
-
 
811
    # Process each file.
-
 
812
    my @files = @{ $entry->{files} };
-
 
813
    my $zip = Archive::Zip->new();
-
 
814
    my $i = 0;
-
 
815
    foreach my $fentry ( @files )
-
 
816
    {
-
 
817
        if ( my $file = $fentry->{'file'} )
-
 
818
        {
-
 
819
        	my $order = $i + 1;
-
 
820
            my $base_file = StripDir( $file );
-
 
821
            my $publish_file = $name . '_' . $version . '_' . $order . '.aup';
-
 
822
            my $aup_file = $work_dir . $publish_file;
-
 
823
 
-
 
824
            GenerateCesFile($file, $aup_file, 0x3, $gen_time, $publish_file);
-
 
825
 
-
 
826
            my $file_member = $zip->addFile( $aup_file, $publish_file );
-
 
827
 
-
 
828
            $manifest{'tasks'}[$i]{'order'} = 1 * $order;
-
 
829
            $manifest{'tasks'}[$i]{'filename'} = $base_file;
-
 
830
            $manifest{'tasks'}[$i]{'download'} = $publish_file;
-
 
831
            if ($base_file =~ /\.sh$/)
-
 
832
            {
-
 
833
                $manifest{'tasks'}[$i]{'action'} = 'exec-shell';
-
 
834
            }
-
 
835
            elsif ($base_file =~ /\.deb$/)
-
 
836
            {
-
 
837
                $manifest{'tasks'}[$i]{'action'} = 'dpkg-install';
-
 
838
            }
-
 
839
            else
-
 
840
            {
-
 
841
                ReportError ("Manifest entry $base_file does not have a supported DMF install action");
-
 
842
            }
-
 
843
 
-
 
844
            $i = $i + 1;
-
 
845
        }
-
 
846
    }
-
 
847
 
-
 
848
    # Encode and commit the JSON.
-
 
849
    my $json_encoder = JSON->new->allow_nonref;
-
 
850
    my $json = $json_encoder->pretty->encode( \%manifest );
-
 
851
 
-
 
852
    my $manifest_filename = $name . '_' . $version;
-
 
853
    my $aum_filename = $manifest_filename . '_0.aum';
-
 
854
    my $manifest_file = $work_dir . $manifest_filename . '.json';
-
 
855
    my $aum_file = $work_dir . $aum_filename;
-
 
856
 
-
 
857
    # Save our manifest.
-
 
858
    open (J, '>', $manifest_file ) || Error ("Cannot create the DMF Manifest file");
-
 
859
    binmode (J);
-
 
860
    print J $json;
-
 
861
 
-
 
862
    close J;
-
 
863
 
-
 
864
    GenerateCesFile($manifest_file, $aum_file, 0x2, $gen_time, $aum_filename);
-
 
865
 
-
 
866
    $zip->addFile($aum_file, $aum_filename);
-
 
867
 
-
 
868
    my $zip_filename = $work_dir . $name . '_' . $version . '.zip';
-
 
869
    if ( $zip->writeToFileNamed($zip_filename) != AZ_OK )
-
 
870
    {
-
 
871
        ReportError("DMF ZIP file creation failed");
-
 
872
    }
-
 
873
    PackageFile('*', $zip_filename, '--Strip');
-
 
874
    PackageFile('*', $manifest_file, '--Strip');
-
 
875
 
-
 
876
}
-
 
877
 
-
 
878
#-------------------------------------------------------------------------------
-
 
879
# Function        : DmfGenerate
-
 
880
#
-
 
881
# Description     : Import an existing manifest
-
 
882
#
-
 
883
# Inputs          : src_file     - The input file.
-
 
884
#                   dst_file     - The output CES file.
-
 
885
#                   content_type - The content type to report.
-
 
886
#                   gen_time     - The generation time for the file.
-
 
887
#                   filename     - The filename to embed in the CES file.
-
 
888
#
-
 
889
#
-
 
890
# Returns         : Nothing
-
 
891
#
-
 
892
sub GenerateCesFile
-
 
893
{
-
 
894
    my ($src_file, $dst_file, $content_type, $gen_time, $filename) = @_;
-
 
895
 
-
 
896
    open (INF, '<', $src_file ) || Error ("Cannot open file $src_file for reading");
-
 
897
    binmode (INF);
-
 
898
 
-
 
899
    open (OUTF, '>', $dst_file ) || Error ("Cannot open file $dst_file for writing");
-
 
900
    binmode (OUTF);
-
 
901
 
-
 
902
    my $signing_key_name = "";
-
 
903
    my $signature_size = 0;
-
 
904
    my $format_version = 0xCE500000;
-
 
905
    my $compression_method = 0;
-
 
906
    my $encryption_method = 0;
-
 
907
    my $kek_name = "";
-
 
908
    my $encryption_key_size = 0;
-
 
909
    my $filename_size = length($filename);
-
 
910
 
-
 
911
    print OUTF pack("Z32", $signing_key_name);
-
 
912
    print OUTF pack("n", $signature_size);
-
 
913
    print OUTF pack("N", $format_version);
-
 
914
    print OUTF pack("N", $content_type);
-
 
915
    print OUTF pack("Q>", $gen_time);
-
 
916
    print OUTF pack("N", $compression_method);
-
 
917
    print OUTF pack("N", $encryption_method);
-
 
918
    print OUTF pack("Z32", $kek_name);
-
 
919
    print OUTF pack("n", $encryption_key_size);
-
 
920
    print OUTF pack("n", $filename_size);
-
 
921
    # Encryption key HERE
-
 
922
    print OUTF pack("A$filename_size", $filename);
-
 
923
 
-
 
924
    my $buf;
-
 
925
    while (read(INF,$buf,65536))
-
 
926
    {
-
 
927
        print OUTF $buf;
-
 
928
    }
-
 
929
    print OUTF $buf;
-
 
930
    close INF;
-
 
931
 
-
 
932
    # Signature HERE
-
 
933
 
-
 
934
    # Finish with file.
-
 
935
    close OUTF;
-
 
936
}
-
 
937
 
740
1;
938
1;